Skip to content

VenomHzp/Molecular-generation-algorithm

Repository files navigation

TADF 分子生成器使用说明文档

项目概述

本程序是一个基于 STONED-SELFIES 算法的 TADF(热激活延迟荧光)分子生成器和可视化工具。它能够从一个已知的 TADF 分子出发,通过随机突变生成结构相似但不完全相同的新分子变体,并提供全面的化学过滤、相似度计算和可视化功能。

核心功能

  • 分子变体生成:基于 SELFIES 表示进行随机突变
  • 化学过滤器:过滤不符合要求的分子结构
  • 相似度计算:使用 Tanimoto 相似度评估变体与原分子的相似程度
  • 可视化:生成高分辨率分子结构图和相似度分布图
  • 批量导出:保存结果为 CSV 文件供后续分析

技术原理

STONED-SELFIES 算法

  1. SMILES → SELFIES 转换:将分子的 SMILES 表示转换为 SELFIES(Self-Referencing Embedded Strings)格式
  2. 随机化:生成多个随机 SMILES 排序以增加多样性
  3. 突变操作:对 SELFIES 字符串进行插入、替换、删除操作
  4. SELFIES → SMILES 回转:将突变后的 SELFIES 转换回 SMILES 格式
  5. 标准化和去重:确保生成的分子结构有效且唯一

化学过滤器

程序内置了 5 个化学过滤器,确保生成的分子具有合理的化学性质:

  1. 元素过滤:只允许特定元素(默认:C, H, N, O, F, B)
  2. 小环过滤:禁止 3 元环、4 元环等小环结构(默认最小环尺寸:5)
  3. 碎片过滤:过滤掉分子碎片(断裂的分子)
  4. 自由基过滤:禁止包含未成对电子的分子
  5. 电荷过滤:禁止包含带电荷原子(如 B+, N+, O- 等)

安装依赖

必需的 Python 库

pip install numpy pandas rdkit-pypi matplotlib selfies

版本要求

  • Python >= 3.7
  • RDKit >= 2020.03
  • selfies >= 2.0.0
  • numpy >= 1.19
  • pandas >= 1.1
  • matplotlib >= 3.3

使用方法

基本使用

from TADF_generator import generate_tadf_variants, visualize_molecules, plot_similarity_distribution

# 1. 定义起始 TADF 分子(SMILES 格式)
starting_molecule = 'CC(C)(C)c6ccc5OC7=CC(N3c1ccccc1C(C)(C)c2ccccc23)=CC8Oc4ccc(C(C)(C)C)cc4B(c5c6)C78'

# 2. 生成变体
df_variants = generate_tadf_variants(
    starting_smi=starting_molecule,
    num_variants=100,              # 生成 100 个变体
    num_random_samples=200,        # 使用 200 个随机 SMILES
    num_mutations=1,               # 突变 1 次
    apply_filters=True,            # 启用化学过滤器
    allowed_elements={'C', 'H', 'N', 'O', 'F', 'B'},
    min_ring_size=5
)

# 3. 保存结果
df_variants.to_csv('tadf_variants.csv', index=False)

# 4. 可视化分子结构
top_molecules = df_variants.head(20)  # 取前 20 个
visualize_molecules(
    smiles_list=top_molecules['SMILES'].tolist(),
    save_path='molecules.png',
    reference_mol=starting_molecule,  # 对齐到原分子
    align=True,
    dpi=300
)

# 5. 绘制相似度分布图
plot_similarity_distribution(df_variants, save_path='similarity_dist.png')

核心函数说明

1. generate_tadf_variants()

主要功能:生成 TADF 分子变体

参数说明

参数 类型 默认值 说明
starting_smi str - 起始分子的 SMILES 字符串(必需)
num_variants int 100 要生成的变体数量
num_random_samples int 50 随机 SMILES 排序的数量(影响多样性)
num_mutations int 3 突变次数(越多变化越大)
fp_type str 'ECFP4' 分子指纹类型
apply_filters bool True 是否启用化学过滤器
allowed_elements set {'C','H','N','O','F','B'} 允许的化学元素
min_ring_size int 5 允许的最小环尺寸

返回值

  • pd.DataFrame:包含以下列:
    • SMILES:生成的分子 SMILES 字符串
    • Similarity:与起始分子的 Tanimoto 相似度(0-1)

使用示例

# 生成高度相似的变体(小突变)
df_similar = generate_tadf_variants(
    starting_smi=my_molecule,
    num_variants=50,
    num_mutations=1,           # 只突变 1 次
    num_random_samples=100
)

# 生成多样化的变体(大突变)
df_diverse = generate_tadf_variants(
    starting_smi=my_molecule,
    num_variants=50,
    num_mutations=5,           # 突变 5 次
    num_random_samples=200
)

2. visualize_molecules()

主要功能:可视化分子结构

参数说明

参数 类型 默认值 说明
smiles_list list - SMILES 字符串列表
titles list None 每个分子的标题(可选)
mols_per_row int 5 每行显示的分子数
img_size tuple (300, 300) 每个分子的图片尺寸
save_path str None 保存路径(可选)
reference_mol str/mol None 参考分子(用于骨架对齐)
align bool True 是否对齐到参考分子
dpi int 300 图片分辨率

使用示例

# 可视化前 10 个变体,并对齐到原分子
visualize_molecules(
    smiles_list=df_variants.head(10)['SMILES'].tolist(),
    titles=[f"Variant {i+1}" for i in range(10)],
    mols_per_row=5,
    save_path='top_variants.png',
    reference_mol=starting_molecule,
    align=True,
    dpi=300
)

3. plot_similarity_distribution()

主要功能:绘制相似度分布直方图

参数说明

参数 类型 说明
df pd.DataFrame 包含 'Similarity' 列的数据框
save_path str 保存路径(可选)

输出

  • 显示相似度直方图
  • 标注平均值和中位数
  • 保存为高分辨率图片(如果提供 save_path)

4. calculate_similarity()

主要功能:计算两个分子的 Tanimoto 相似度

参数

  • smi1 (str):第一个分子的 SMILES
  • smi2 (str):第二个分子的 SMILES
  • fp_type (str):指纹类型(默认:'ECFP4')

返回

  • float:相似度值(0-1,1 表示完全相同)

5. apply_chemical_filters()

主要功能:应用所有化学过滤器

参数

  • mol:RDKit 分子对象
  • allowed_elements (set):允许的元素集合
  • min_ring_size (int):最小环尺寸

返回

  • (bool, str):(是否通过, 失败原因)

输出结果说明

1. CSV 文件(tadf_variants.csv

包含两列:

列名 说明
SMILES 生成的分子 SMILES 字符串
Similarity 与起始分子的相似度(0-1)

示例

SMILES,Similarity
CC(C)(C)c1ccc2...,0.923
CC(C)(C)c1ccc2...,0.887
...

2. 分子结构图(tadf_variants_with_Original.png

  • 高分辨率(300 DPI)PNG 图片
  • 网格布局显示原分子和生成的变体
  • 每个分子下方显示序号和相似度
  • 使用骨架对齐功能,便于结构比较

3. 相似度分布图(similarity_dist.png

  • 直方图显示相似度分布
  • 红色虚线:平均相似度
  • 绿色虚线:中位数相似度
  • 统计信息一目了然

参数调优建议

调整生成变体的多样性

目标 参数配置
高相似度变体 num_mutations=1num_random_samples=100-200
中等多样性 num_mutations=2-3num_random_samples=200-500
高多样性 num_mutations=4-5num_random_samples=500-1000

调整过滤器严格程度

# 宽松过滤(允许更多元素)
df = generate_tadf_variants(
    starting_smi=my_molecule,
    allowed_elements={'C', 'H', 'N', 'O', 'F', 'B', 'S', 'P'},  # 添加 S, P
    min_ring_size=4  # 允许 4 元环
)

# 严格过滤(只允许少数元素)
df = generate_tadf_variants(
    starting_smi=my_molecule,
    allowed_elements={'C', 'H', 'N', 'O'},  # 只允许 C, H, N, O
    min_ring_size=6  # 只允许 6 元环及以上
)

# 完全禁用过滤器
df = generate_tadf_variants(
    starting_smi=my_molecule,
    apply_filters=False
)

常见问题 (FAQ)

Q1: 生成的分子数量少于预期怎么办?

原因:化学过滤器太严格,大量分子被过滤掉

解决方案

  1. 增加 num_random_samples(如 500-1000)
  2. 放宽过滤条件(增加 allowed_elements,减小 min_ring_size
  3. 设置 apply_filters=False 查看未过滤的结果

Q2: 生成的分子与原分子差异太大怎么办?

原因:突变次数太多

解决方案

  • 减少 num_mutations 参数(如设为 1)
  • 减少 num_random_samples 参数

Q3: 生成的分子与原分子太相似怎么办?

原因:突变次数太少

解决方案

  • 增加 num_mutations 参数(如 3-5)
  • 增加 num_random_samples 参数

Q4: 如何加速生成过程?

建议

  1. 减少 num_random_samples(如 50-100)
  2. 减少 num_mutations(如 1-2)
  3. 使用多核并行计算(需修改代码)

Q5: 生成的分子结构图无法对齐怎么办?

原因:原分子与变体差异太大,无法找到公共子结构

解决方案

  • 设置 align=False 禁用对齐功能
  • 减少突变次数,生成更相似的变体

代码结构

TADF_generator.py
├── 分子处理函数
│   ├── sanitize_smiles()          # SMILES 标准化
│   ├── randomize_smiles()         # SMILES 随机化
│   └── get_selfie_chars()         # SELFIES 字符解析
│
├── 突变函数
│   ├── mutate_selfie()            # 单次 SELFIES 突变
│   └── get_mutated_SELFIES()      # 批量突变
│
├── 化学过滤器
│   ├── check_allowed_elements()   # 元素过滤
│   ├── check_small_rings()        # 小环过滤
│   ├── check_fragments()          # 碎片过滤
│   ├── check_radicals()           # 自由基过滤
│   ├── check_charges()            # 电荷过滤
│   └── apply_chemical_filters()   # 应用所有过滤器
│
├── 相似度计算
│   └── calculate_similarity()     # Tanimoto 相似度
│
├── 主要功能函数
│   └── generate_tadf_variants()   # 生成 TADF 变体
│
└── 可视化函数
    ├── visualize_molecules()      # 分子结构可视化
    ├── plot_similarity_distribution()  # 相似度分布图
    └── print_statistics()         # 打印统计信息

应用场景

  1. 药物设计:从已知活性分子生成新的候选化合物
  2. 材料科学:设计新的 TADF 发光材料
  3. 化学空间探索:系统性探索相似分子的化学空间
  4. 分子优化:在保持核心结构的同时优化分子性质
  5. 虚拟筛选:生成大量候选分子用于计算筛选

注意事项

  1. 起始分子要求:必须是有效的 SMILES 字符串
  2. 内存消耗:当 num_random_samples 很大(>1000)时可能消耗大量内存
  3. 运行时间:生成大量变体(>1000)需要较长时间
  4. 化学有效性:即使通过所有过滤器,生成的分子也需要进一步的化学验证
  5. 中文显示:使用 SimHei 字体显示中文,确保系统已安装该字体

引用

如果本程序对您的研究有帮助,请引用 STONED-SELFIES 算法的原始论文:

@article{nigam2021beyond,
  title={Beyond generative models: superfast traversal, optimization, novelty, exploration and discovery (STONED) algorithm for molecules using SELFIES},
  author={Nigam, AkshatKumar and Pollice, Robert and Krenn, Mario and dos Passos Gomes, Gabriel and Aspuru-Guzik, Al{\'a}n},
  journal={Chemical science},
  volume={12},
  number={20},
  pages={7079--7090},
  year={2021},
  publisher={Royal Society of Chemistry}
}

以及 TADF 分子数据来源:

Nature Photonics (2019) 13, 678-682
DOI: 10.1038/s41566-019-0415-5

更新日志

  • v1.0:初始版本,包含基本的分子生成和可视化功能
  • 添加了完整的化学过滤器系统
  • 添加了骨架对齐功能
  • 添加了高分辨率图像导出
  • 添加了中文注释和输出支持

联系方式

如有问题或建议,请通过以下方式联系:

  • GitHub Issues
  • Email: [您的邮箱]

许可证

本程序基于 MIT 许可证开源。


祝您使用愉快!

About

基于 STONED-SELFIES 算法的分子生成器和可视化工具

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors