本程序是一个基于 STONED-SELFIES 算法的 TADF(热激活延迟荧光)分子生成器和可视化工具。它能够从一个已知的 TADF 分子出发,通过随机突变生成结构相似但不完全相同的新分子变体,并提供全面的化学过滤、相似度计算和可视化功能。
- 分子变体生成:基于 SELFIES 表示进行随机突变
- 化学过滤器:过滤不符合要求的分子结构
- 相似度计算:使用 Tanimoto 相似度评估变体与原分子的相似程度
- 可视化:生成高分辨率分子结构图和相似度分布图
- 批量导出:保存结果为 CSV 文件供后续分析
- SMILES → SELFIES 转换:将分子的 SMILES 表示转换为 SELFIES(Self-Referencing Embedded Strings)格式
- 随机化:生成多个随机 SMILES 排序以增加多样性
- 突变操作:对 SELFIES 字符串进行插入、替换、删除操作
- SELFIES → SMILES 回转:将突变后的 SELFIES 转换回 SMILES 格式
- 标准化和去重:确保生成的分子结构有效且唯一
程序内置了 5 个化学过滤器,确保生成的分子具有合理的化学性质:
- 元素过滤:只允许特定元素(默认:C, H, N, O, F, B)
- 小环过滤:禁止 3 元环、4 元环等小环结构(默认最小环尺寸:5)
- 碎片过滤:过滤掉分子碎片(断裂的分子)
- 自由基过滤:禁止包含未成对电子的分子
- 电荷过滤:禁止包含带电荷原子(如 B+, N+, O- 等)
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')主要功能:生成 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
)主要功能:可视化分子结构
参数说明:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
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
)主要功能:绘制相似度分布直方图
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
df |
pd.DataFrame | 包含 'Similarity' 列的数据框 |
save_path |
str | 保存路径(可选) |
输出:
- 显示相似度直方图
- 标注平均值和中位数
- 保存为高分辨率图片(如果提供 save_path)
主要功能:计算两个分子的 Tanimoto 相似度
参数:
smi1(str):第一个分子的 SMILESsmi2(str):第二个分子的 SMILESfp_type(str):指纹类型(默认:'ECFP4')
返回:
float:相似度值(0-1,1 表示完全相同)
主要功能:应用所有化学过滤器
参数:
mol:RDKit 分子对象allowed_elements(set):允许的元素集合min_ring_size(int):最小环尺寸
返回:
(bool, str):(是否通过, 失败原因)
包含两列:
| 列名 | 说明 |
|---|---|
| SMILES | 生成的分子 SMILES 字符串 |
| Similarity | 与起始分子的相似度(0-1) |
示例:
SMILES,Similarity
CC(C)(C)c1ccc2...,0.923
CC(C)(C)c1ccc2...,0.887
...
- 高分辨率(300 DPI)PNG 图片
- 网格布局显示原分子和生成的变体
- 每个分子下方显示序号和相似度
- 使用骨架对齐功能,便于结构比较
- 直方图显示相似度分布
- 红色虚线:平均相似度
- 绿色虚线:中位数相似度
- 统计信息一目了然
| 目标 | 参数配置 |
|---|---|
| 高相似度变体 | num_mutations=1,num_random_samples=100-200 |
| 中等多样性 | num_mutations=2-3,num_random_samples=200-500 |
| 高多样性 | num_mutations=4-5,num_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
)原因:化学过滤器太严格,大量分子被过滤掉
解决方案:
- 增加
num_random_samples(如 500-1000) - 放宽过滤条件(增加
allowed_elements,减小min_ring_size) - 设置
apply_filters=False查看未过滤的结果
原因:突变次数太多
解决方案:
- 减少
num_mutations参数(如设为 1) - 减少
num_random_samples参数
原因:突变次数太少
解决方案:
- 增加
num_mutations参数(如 3-5) - 增加
num_random_samples参数
建议:
- 减少
num_random_samples(如 50-100) - 减少
num_mutations(如 1-2) - 使用多核并行计算(需修改代码)
原因:原分子与变体差异太大,无法找到公共子结构
解决方案:
- 设置
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() # 打印统计信息
- 药物设计:从已知活性分子生成新的候选化合物
- 材料科学:设计新的 TADF 发光材料
- 化学空间探索:系统性探索相似分子的化学空间
- 分子优化:在保持核心结构的同时优化分子性质
- 虚拟筛选:生成大量候选分子用于计算筛选
- 起始分子要求:必须是有效的 SMILES 字符串
- 内存消耗:当
num_random_samples很大(>1000)时可能消耗大量内存 - 运行时间:生成大量变体(>1000)需要较长时间
- 化学有效性:即使通过所有过滤器,生成的分子也需要进一步的化学验证
- 中文显示:使用 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 许可证开源。
祝您使用愉快!