1. 项目概述:为什么我们需要ZINC15?
如果你正在做药物发现、计算化学或者机器学习模型训练,那你一定绕不开一个核心问题:数据从哪里来?高质量的、结构化的、可批量获取的小分子数据集是这一切的起点。几年前,我刚开始接触虚拟筛选时,最头疼的就是找分子。一个个从文献里扒,效率低不说,格式还五花八门,光是数据清洗就能耗掉大半天。直到我开始系统性地使用ZINC15,整个工作流才真正顺畅起来。
ZINC15不是一个简单的数据库,它是一个经过精心设计和维护的“类药性”分子商业库。简单来说,它把市面上能买到的、具有潜在成药可能的小分子化合物,进行了标准化处理,并提供了极其友好的下载接口。对于研究者而言,它的价值在于“即用性”。你不需要再担心分子的电荷状态是否正确、3D构象是否合理、文件格式是否兼容你的计算软件。ZINC15已经帮你做好了预处理,你只需要关心你的科学问题本身。
这个项目,就是带你从零开始,掌握从ZINC15这个宝库中,精准、高效地下载你所需小分子数据集的完整流程。无论你是想下载一个特定靶点的片段库用于虚拟筛选,还是想获取数百万个分子用于训练生成式AI模型,亦或是仅仅需要一些特定理化性质的分子做测试,这套方法都能帮你搞定。我会把我在实际项目中踩过的坑、总结的技巧,以及如何根据你的真实需求制定下载策略,毫无保留地分享出来。
2. ZINC15数据库深度解析与下载策略制定
在动手点击下载按钮之前,花点时间理解ZINC15的底层逻辑和数据结构,能让你事半功倍,避免下载到一堆无用的“垃圾数据”。
2.1 ZINC15的核心架构与数据分类
ZINC15将其海量分子(超过2.3亿个可购买化合物)进行了多维度、层级化的分类,这本身就是一种强大的筛选器。理解这些分类,是你构建精准查询的基础。
1. 子集(Subsets)这是最顶层的分类,根据分子的“用途”或“特性”进行划分。常用的子集包括:
- “Drug-Like”:这是最常用的子集,包含了符合类药五原则(Lipinski‘s Rule of Five)的分子,是进行虚拟筛选的首选起点。
- “Fragment-Like”:分子量较小(通常<250 Da)、极性较大的分子集合,用于基于片段的药物发现(FBDD)。
- “Lead-Like”:性质介于“Drug-Like”和“Fragment-Like”之间,是苗头化合物优化的常见起点。
- “Peptides”:包含各种环肽、线性肽等。
- “Natural Products”:天然产物及其衍生物库。
- “All Purchasable”:顾名思义,所有可购买的化合物。除非你有强大的计算资源和明确目标,否则不建议新手直接从这里开始,数据量太庞大了。
注意:选择子集是你过滤数据的第一步,也是最关键的一步。如果你研究的是GPCR靶点,从“Drug-Like”开始是稳妥的;如果你在做共价抑制剂设计,可能需要关注“Electrophiles”子集。选错了子集,后续所有筛选都可能是在错误的方向上努力。
2. 目录(Catalogs)这指的是提供这些化合物的供应商。ZINC15整合了全球上百家供应商的库存,如Enamine、MolPort、ChemDiv等。有时,你的合作实验室或公司可能有特定的供应商偏好或采购协议,这时就可以通过选择特定目录来筛选分子。
3. 理化性质与类药性过滤器这是ZINC15最强大的功能之一。你可以在网页上通过滑动条或输入框,实时过滤分子的:
- 分子量(Molecular Weight)
- LogP(脂水分配系数)
- 氢键供体/受体数量(HBD/HBA)
- 可旋转键数量(Rotatable Bonds)
- 极性表面积(TPSA)
- 类药性评分(如QED)
这些过滤器是联动的。例如,你可以轻松筛选出“分子量在300-500之间、LogP在2-4之间、且氢键供体不超过3个”的所有分子。这种交互式筛选能力,让你在下载前就能对数据集有一个直观的把握。
2.2 明确需求:定义你的“完美”数据集
下载数据不是目的,服务你的研究目标才是。在打开ZINC15网站前,请先问自己几个问题:
- 规模预期:我需要多少分子?是几千个用于高精度对接,还是几百万个用于机器学习?
- 性质范围:我的目标分子需要满足哪些具体的理化性质区间?(参考已有的活性化合物或专利)
- 结构特征:是否需要包含特定的药效团或骨架?是否需要排除某些不良结构(如PAINS)?
- 输出格式:下游软件需要什么格式?
.sdf,.mol2,.pdbqt(用于AutoDock),还是.smi(简化分子线性输入规范)? - 3D构象:我需要预先生成的低能量3D构象吗?还是只需要2D结构,自己用Open Babel或RDKit去生成?
实操心得:我建议新手从一个中等规模、定义清晰的数据集开始。例如:“从‘Drug-Like’子集中,下载分子量在250-450之间、LogP在1-4之间的前5万个分子(按ZINC ID排序)”。这样的数据集既不会太大导致处理困难,又具有明确的化学空间代表性,非常适合方法测试和初步探索。
2.3 制定下载策略:分而治之的艺术
ZINC15允许你下载整个筛选结果,但面对动辄数十万、数百万的命中结果,直接下载一个巨大的文件往往是灾难性的——下载可能中断,文件可能损坏,后续处理也极其缓慢。
我的策略是“分而治之”:
- 利用“Tranches”:在ZINC15的筛选结果页面,你会发现数据被自动分成了多个“块”(Tranches),每个块通常包含几千到几万个分子。这是系统自带的优化。不要试图一次性下载所有块,而应该逐个或分批下载。
- 利用“随机子集”:如果你的初始筛选结果过大(比如超过100万),ZINC15提供了“随机选择”功能。你可以先随机下载一个子集(例如1%或10万分子)进行初步分析或模型训练,验证可行性后再考虑全量数据。
- 按性质分段:如果你需要的分子跨度很大,可以分成多个查询。例如,分别下载LogP 0-2, 2-4, 4-6的分子,这样你不仅得到了数据,还天然获得了按性质分布的数据集,便于后续分析。
3. 手把手实操:从筛选到下载的完整流程
现在,我们进入实战环节。我会以一个具体的场景为例:我们需要为某个激酶靶点虚拟筛选,下载一个约10万规模的“类药”分子库,并要求包含3D坐标。
3.1 访问与初始筛选
- 打开官网:访问 ZINC15 的官方网站(此处不提供具体链接,请自行搜索“ZINC15”)。
- 选择子集:在首页,点击“Subsets”菜单,选择“Drug-Like”。这会将我们的搜索范围限制在约1亿个类药分子内,这是一个非常理想的起点。
- 应用属性过滤器:页面会跳转到筛选界面。在左侧的过滤器面板中,进行如下设置:
- Molecular Weight: 设置为 250 - 500 Da。激酶抑制剂的分子量通常在这个范围。
- LogP: 设置为 1 - 5。保证一定的亲脂性以结合靶点,又避免过高导致代谢过快或毒性。
- HBD (Hydrogen Bond Donors): 设置为 <= 5。
- HBA (Hydrogen Bond Acceptors): 设置为 <= 10。
- Rotatable Bonds: 设置为 <= 10。减少柔性有助于提高口服生物利用度。
设置完成后,页面顶部的计数器会实时显示符合当前条件的分子总数。例如,经过上述过滤,总数可能降至约500万个。
3.2 精细筛选与结果处理
500万个仍然太多。我们需要进一步缩小范围。
- 添加结构过滤器(可选但推荐):
- 点击“Draw Query”按钮,会弹出一个分子编辑器。
- 如果你有已知的药效团或核心骨架,可以在这里绘制。例如,绘制一个常见的激酶铰链区结合片段(如嘌呤类似物),然后选择“Substructure”搜索模式。这会将分子限制在含有该子结构的范围内,数量会急剧下降。
- 如果没有特定结构,这一步可以跳过。我们改用另一种策略。
- 排序与限制数量:
- 在结果列表上方,找到排序(Sort)选项。选择“Random”。这样我们可以获得一个化学空间上的随机样本,避免偏差。
- 在“Max Molecules”输入框中,填入100000。这告诉ZINC15,我们只从所有命中结果中,随机取10万个分子。
- 选择输出格式与选项:这是关键步骤,直接影响下游使用。
- Format: 选择“SDF”。这是最通用的结构数据格式,包含原子坐标、键连接和属性,几乎所有化学信息学软件都支持。
- Conformation: 选择“3D”。ZINC15会为每个分子提供一种预计算的低能量3D构象。对于虚拟筛选对接,这是必需的。如果你选择“2D”,则需要自己用软件生成3D构象,费时且可能引入构象偏差。
- Charge: 选择“Neutralize”。让ZINC15帮你将分子处理为中性状态(添加或去除质子),这能避免因电荷问题导致对接评分异常。对于高级用户,可以选择“As Is”或指定pH值计算电离状态。
- Tautomers: 选择“One per compound”。每个化合物只输出一个主要的互变异构体,简化数据集。
3.3 执行下载与文件管理
- 创建下载任务:
- 点击页面下方大大的“Download”按钮。
- 系统会提示你输入一个邮箱地址。务必填写真实邮箱。ZINC15不会立即给你一个下载链接,因为生成10万个分子的3D SDF文件需要时间(可能是几分钟到几十分钟)。系统会在后台处理,完成后将下载链接发送到你的邮箱。
- 等待与获取文件:
- 去处理其他工作,检查邮箱。
- 收到标题为“Your ZINC15 download is ready”的邮件后,点击里面的下载链接。链接通常有效期为几天。
- 下载得到的可能是一个
.sdf.gz或.tar.gz的压缩文件。解压后,你会得到一个巨大的.sdf文件(可能高达几百MB甚至几GB)。
- 本地验证与分割:
- 使用简单的命令行工具验证文件。在终端(Linux/Mac)或命令提示符/PowerShell(Windows)中,使用
grep命令可以快速统计分子数量:# 统计 .sdf 文件中 “$$$$” 的数量,每个分子以该分隔符结束 grep -c “\$\$\$\$” your_downloaded_file.sdf - 如果文件太大,可以用开源工具如Open Babel或RDKit(通过Python脚本)将其分割成多个小文件,便于后续并行处理。
# 使用Open Babel将大SDF分割成每个包含10000个分子的小文件 obabel your_downloaded_file.sdf -O chunk_.sdf -m 10000
- 使用简单的命令行工具验证文件。在终端(Linux/Mac)或命令提示符/PowerShell(Windows)中,使用
重要提示:ZINC15的下载链接有时效性,且服务器可能对单个IP的请求频率有限制。如果下载中断,需要从邮箱的链接重新开始。对于超大数据集,强烈建议使用其提供的“curl” 或 “wget” 命令行脚本(在下载页面可生成),它支持断点续传,更加稳定可靠。
4. 超越基础:高级技巧与自动化脚本
当你需要定期、批量地从ZINC15获取数据,或者查询条件非常复杂时,手动操作就显得力不从心了。这时,我们需要借助一些高级方法和自动化手段。
4.1 使用ZINC20 API进行程序化访问
ZINC15的继任者ZINC20提供了更强大的API接口,允许你通过编程方式查询和下载数据。虽然本项目聚焦ZINC15,但其查询逻辑是相通的。了解API是迈向自动化的重要一步。
一个典型的查询URL结构如下(以ZINC20为例,概念类似):https://zinc20.docking.org/substances.csv?count=all&q={你的查询表达式}
查询表达式q非常强大,它使用一种类似Lucene的语法。例如:
q=weight:250+500 logp:1+5查询分子量250-500且LogP为1-5的分子。q=substructure:c1ccccc1查询所有含苯环的分子。q=catalog:enamine查询来自Enamine目录的分子。
你可以用Python的requests库轻松构建这样的查询,并解析返回的CSV或SDF数据。
实操心得:对于简单的属性筛选,网页界面足够好用。但对于需要集成到自动化流水线中的任务,或者需要基于复杂的逻辑(如“A属性且B属性,或C属性但不包括D子结构”)进行查询时,学习并使用API是唯一高效的解决方案。它让你能像操作本地数据库一样操作ZINC。
4.2 利用RDKit进行本地后处理与筛选
下载得到的SDF文件只是一个开始。通常我们需要进行进一步的精筛和格式化,RDKit是完成这项工作的瑞士军刀。
以下是一个Python脚本示例,演示如何读取下载的SDF,进行PAINS筛选(排除假阳性结构),并计算一些额外的描述符:
from rdkit import Chem from rdkit.Chem import PandasTools, Descriptors, rdMolDescriptors from rdkit.Chem.FilterCatalog import FilterCatalog, FilterCatalogParams # 1. 读取SDF文件 suppl = Chem.SDMolSupplier(‘your_downloaded_file.sdf’) mols = [] for mol in suppl: if mol is not None: # 跳过无法读取的分子 mols.append(mol) print(f”成功读取 {len(mols)} 个分子”) # 2. 初始化PAINS过滤器 params = FilterCatalogParams() params.AddCatalog(FilterCatalogParams.FilterCatalogs.PAINS) catalog = FilterCatalog(params) # 3. 进行筛选并计算描述符 data = [] for mol in mols: zinc_id = mol.GetProp(‘_Name’) # 获取ZINC ID # 检查PAINS if catalog.HasMatch(mol): pains_flag = ‘Yes’ else: pains_flag = ‘No’ # 计算一些描述符 mol_weight = Descriptors.MolWt(mol) logp = Descriptors.MolLogP(mol) tpsa = Descriptors.TPSA(mol) num_rotable_bonds = Descriptors.NumRotatableBonds(mol) data.append([zinc_id, mol_weight, logp, tpsa, num_rotable_bonds, pains_flag]) # 4. 保存结果到CSV import pandas as pd df = pd.DataFrame(data, columns=[‘ZINC_ID’, ‘MW’, ‘LogP’, ‘TPSA’, ‘NumRotBonds’, ‘IsPAINS’]) df.to_csv(‘processed_molecules.csv’, index=False) print(“后处理完成,结果已保存至 ‘processed_molecules.csv’”) # 5. (可选) 保存过滤后的分子 writer = Chem.SDWriter(‘filtered_no_pains.sdf’) for mol in mols: if not catalog.HasMatch(mol): writer.write(mol) writer.close()这个脚本完成了从读取、过滤到分析的全过程。你可以根据需要,轻松添加更多的过滤规则,如基于QED分数的筛选、基于合成可及性(SA Score)的过滤等。
4.3 处理超大数据集的分批下载策略
当你需要的数据集超过50万甚至上百万时,直接通过网页下载几乎肯定会失败。这时必须采用分批策略。
- 利用“Tranche”编号:在ZINC15的下载页面,仔细观察下载链接。你会发现每个Tranche都有独立的编号。你可以写一个简单的脚本,循环生成每个Tranche的下载链接。
- 使用命令行工具:
wget或curl支持断点续传和批量下载。你可以将多个下载链接写到一个文本文件url_list.txt中,然后使用:
参数wget -i url_list.txt -c --wait=2-c支持断点续传,--wait=2表示每次请求间隔2秒,避免对服务器造成压力。 - 属性分段法:如前所述,将大范围的LogP或分子量分成几个小段,分别查询和下载。例如,将LogP从0到8,每1个单位下一个查询。这样不仅降低了单次下载量,还让你在下载过程中就完成了数据的初步分箱。
5. 常见问题、故障排查与避坑指南
即使按照流程操作,你也可能会遇到各种问题。下面是我在实践中总结的“血泪教训”和解决方案。
5.1 下载与文件相关问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 收不到下载链接邮件 | 1. 邮箱地址输错 2. 邮件被归类为垃圾邮件 3. ZINC15服务器队列繁忙,延迟极高 | 1. 检查邮箱拼写 2. 检查垃圾邮件箱 3. 等待数小时,如超过24小时未收到,用更简单的查询条件重试一次 |
| 下载链接失效 | 链接过期(通常有效期为48-72小时) | 重新提交下载请求,生成新的链接 |
| 下载的文件损坏或无法打开 | 1. 网络传输中断导致文件不完整 2. 文件格式不兼容 | 1. 使用wget -c命令重新下载(断点续传)2. 用文本编辑器打开SDF文件头部,检查格式;或用 obabel -i sdf file.sdf -o smi尝试转换,看是否报错 |
| SDF文件无法被RDKit/PyMOL读取 | 文件中存在个别非标准或错误的分子记录 | 使用RDKit的SDMolSupplier时,务必加入None值检查(如前述脚本)。可以写一个清洗脚本,跳过错误行,只保存能成功读取的分子。 |
5.2 数据与筛选相关问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 下载的分子数量远少于页面显示数量 | 1. 选择了“3D”构象,但部分分子无法生成有效3D结构被静默跳过 2. 在“Download”页面限制了输出数量 3. 供应商库存变动 | 1. 这是正常现象。可尝试下载“2D”格式,然后用本地工具(如OMEGA, RDKit)生成3D构象,成功率可能更高。 2. 检查“Max Molecules”设置。 3. ZINC15数据是动态的,以最终下载文件为准。 |
| 分子属性与筛选条件不符 | 1. 对过滤器逻辑理解有误(如“HBD <= 3”是小于等于3) 2. 分子预处理(如中和电荷)改变了原始属性 | 1. 仔细阅读筛选面板的说明。使用“=”表示等于,“+”表示范围(如“250+500”)。 2. 这是ZINC15提供的服务。如果需要对原始属性进行严格筛选,可能需要下载原始数据后用本地脚本处理。 |
| 虚拟筛选结果很差,活性分子很少 | 1. 初始化学空间选择不当(子集或属性范围不对) 2. 未进行类药性/PAINS过滤,库中噪音分子过多 3. 对接参数或流程有问题 | 1. 回顾你的靶点特征和已知活性分子,重新调整筛选条件,可能要从“Lead-Like”或更小的子集开始。 2.务必进行PAINS和反应性官能团过滤,这是提高筛选质量的关键一步。 3. 检查对接流程,用已知活性分子作为阳性对照进行验证。 |
5.3 性能与效率优化建议
- 预处理优于后处理:尽量在ZINC15网页端利用其强大的过滤器完成尽可能多的筛选。服务器端的过滤比你在本地用Python脚本处理几百万个分子要快得多。
- 优先使用2D格式:如果你有本地可靠的3D构象生成工具(如OMEGA, RDKit的ETKDG方法),下载“2D”格式的SDF或SMILES文件会小很多,下载和处理速度更快,然后再在本地批量生成3D构象。
- 善用“Random”排序:当你不确定如何选择时,下载一个随机子集进行初步测试(对接、模型训练),可以最快速度验证你的流程和假设,避免在错误的全量数据上浪费大量时间。
- 建立本地缓存:对于常用的子集(如“Drug-Like”的某个标准切片),可以下载一次后,在本地服务器或工作站上建立备份。这样不仅节省后续时间,也便于进行定制化的预处理和索引,方便团队共享使用。
通过这套从理论到实践,从基础操作到高级自动化,再到问题排查的完整流程,你应该能够自信、高效地从ZINC15这座金矿中挖掘出任何你需要的分子数据。记住,关键不在于一次下载多少数据,而在于你下载的数据是否精准地服务于你的科学目标。