ZINC15数据库实战指南:从筛选到下载化合物数据的完整流程
1. 从零开始为什么我们需要ZINC15这样的数据库如果你正在做药物发现、计算化学或者机器学习模型训练那你一定遇到过这个头疼的问题上哪去找靠谱的、海量的、结构清晰的化合物数据自己合成不现实。从零开始画结构效率太低。从文献里扒格式五花八门还得手动整理一个项目没开始半条命先搭进去了。这就是ZINC15这类数据库存在的核心价值。它不是一个简单的文件下载站而是一个经过深度处理和标准化的“化合物超市”。想象一下你需要研究一万个能与某个蛋白质靶点可能结合的小分子如果每个分子你都得去查它的CAS号、确认它的三维构象、计算它的物化性质那这个项目基本可以宣告无限期搁置了。ZINC15帮你完成了所有这些脏活累活。它从全球各大供应商的目录中收集了超过2.3亿个可实际购买或虚拟合成的化合物并对它们进行了质子化状态枚举、3D构象生成、物化性质计算如分子量、LogP、可旋转键数量等以及类药性筛选。更重要的是它提供了极其灵活的筛选和下载接口。你可以根据分子量范围、氢键供体/受体数量、类药五规则Rule of Five、甚至特定的子结构或药效团来进行筛选精准定位到你研究所需的那一批化合物。对于做虚拟筛选Virtual Screening的人来说这就是弹药库对于做机器学习模型尤其是生成模型或预测模型的人来说这就是高质量的训练数据来源。我刚开始接触这个领域时曾试图从各种小网站拼凑数据集结果在数据清洗和格式统一上花了几个月后来转向ZINC15才发现之前的工作大部分都是在重复造轮子。2. 实战准备访问ZINC15与理解其数据组织逻辑在动手下载之前我们得先搞清楚ZINC15的门朝哪开以及里面的货是怎么摆的。直接访问其官网zinc15.docking.org即可。网站界面看起来有点年头但功能非常强大和直接。2.1 核心概念Subsets、Catalogs和TranchesZINC15的数据不是乱扔一气的它有自己的组织逻辑理解这个能让你下载时事半功倍。Subsets子集这是最高层级的分类相当于超市的不同大区。最常用的是“Drug-Like”和“Lead-Like”。Drug-Like符合类药性规则的化合物通常分子量在250-500 Da之间LogP适中是进行初步筛选的常用集合。Lead-Like比“Drug-Like”更严格分子量更小通常350 Da复杂性更低旨在筛选出更容易进行后续化学优化的“先导化合物”起点。其他子集还包括“Fragment-Like”片段化合物、“Macrocycle”大环化合物等针对特定研究领域。Catalogs目录这指的是化合物的来源供应商比如“MolPort”、“Enamine”、“Mcule”等。你可以选择只下载来自某个特定供应商的化合物如果你后续有实际购买需求这个筛选就非常关键。Tranches批次这是ZINC15为了管理海量数据而引入的概念。由于化合物数量巨大ZINC15将每个子集下的数据进一步分割成许多个“Tranche”每个Tranche包含数十万到数百万个化合物。当你进行筛选后结果往往会分布在多个Tranches中。下载时你需要逐个Tranche进行或者使用脚本批量处理。2.2 筛选器如何精准定位你的目标分子网站左侧提供了强大的筛选面板这是你获取目标数据集的核心工具。你需要像设置数据库查询条件一样使用它物化性质筛选这是最基础的。分子量MW拖动滑块设置范围例如 200-500 Da。LogP脂水分配系数预测化合物的亲脂性通常设置在 -2 到 5 之间。氢键供体HBD与受体HBA遵守类药五规则通常 HBD ≤ 5 HBA ≤ 10。可旋转键Rotatable Bonds与分子柔性相关通常 ≤ 10。形式电荷Formal Charge可以筛选特定电荷状态的分子如中性、正电、负电。子结构筛选这是寻找具有特定核心骨架分子的利器。点击 “Substructure” 选项卡。你可以直接绘制一个分子片段比如一个苯环连着一个酰胺键然后选择匹配模式如“精确匹配”、“包含此片段”。更高级的用法是使用SMARTS 表达式。SMARTS是一种描述分子子结构模式的语言比图形绘制更精确。例如[#6]1:[#6]:[#6]:[#6]:[#6]:[#6]:1表示一个苯环。药效团筛选如果你有特定的蛋白活性位点信息可以定义药效团特征如氢键供体、受体、疏水团、芳环等来筛选可能具有相互作用的分子。注意筛选条件不要一开始就设置得过于严苛。建议先使用较宽的范围进行一次搜索看看返回的化合物数量网站会显示预估数量。如果数量太大如上千万再逐步增加限制条件如果数量太少如几百个则放宽条件。目标是获得一个规模适中例如1万到100万个、质量可控的数据集。3. 分步详解从筛选到下载的完整操作流程假设我们的任务是下载一批分子量在300-500之间、符合类药五规则、且包含吲哚骨架Indole的化合物用于后续的机器学习模型训练。3.1 第一步配置筛选条件访问 ZINC15 官网在主页就能看到筛选面板。在 “Subsets” 中选择 “Drug-Like”。在 “Physicochemical” 下设置MW: 300 - 500LogP: -2 - 5HBD: 0 - 5HBA: 0 - 10Rotatable Bonds: 0 - 10切换到 “Substructure” 选项卡。我们需要绘制一个吲哚环。点击绘制面板画一个苯环并合一个吡咯环五元含氮杂环。或者如果你知道吲哚的SMILES表达式可以直接输入c1ccc2c(c1)[nH]cc2。选择匹配模式为 “Substructure”子结构匹配。点击页面下方或右侧的 “Search” 按钮。3.2 第二步解读搜索结果与选择Tranches搜索完成后页面会跳转到结果概览。这里你会看到几个关键信息预估化合物总数比如显示 “~150,000 compounds”。这150,000个分子分布在多个Tranches中。Tranches列表下方会列出包含符合条件化合物的所有Tranche ID如drug-like~10。每个Tranche后面会标注该批次中包含的命中分子数量。这里有一个非常重要的技巧ZINC15默认的Tranche排序可能是乱序的。为了高效管理我强烈建议你按照Tranche ID进行排序点击表头。这样你可以有顺序地下载例如从drug-like~0到drug-like~20避免遗漏或重复。3.3 第三步选择下载格式与配置点击任意一个Tranche比如drug-like~10进入该批次的详细页面。页面上方有一个 “Download” 下拉菜单这里是核心。选择文件格式.smi 或 .smi.gz最简单只包含化合物的SMILES表达式和ZINC ID。文件小适合快速导入或用于某些只需要线信息的流程。.sdf 或 .sdf.gz最推荐、最通用的格式。SDFStructure-Data File不仅包含2D或3D分子结构还可以在文件中嵌入我们筛选的所有物化性质如MW, LogP等作为属性字段。这对于后续分析至关重要。gz是压缩格式下载更快。.mol2 或 .pdbqt特定于某些分子对接软件如AutoDock Vina的格式。如果你明确下一步就是做对接可以选这个。选择结构类型2D只有二维平面结构文件小。3D包含三维坐标。对于大多数计算任务如对接、构象分析、机器学习必须选择3D。ZINC15提供的3D结构是经过能量最小化优化的比较可靠。选择质子化状态pH 7.4模拟生理条件是最常用的选择。ZINC15会使用算法如MOE预测在此pH下各可离子化基团最可能的状态如羧基去质子化带负电氨基质子化带正电。其他pH值你可以根据研究需要选择比如模拟胃液酸性环境pH 2.0。Unprotonated所有可离子化基团都不带电荷中性形式很少用。嵌入物化性质务必勾选 “Include physicochemical properties”。这样下载的SDF文件中每个分子都会带有MW、LogP、HBD等属性省去你后续重新计算的麻烦。配置好后点击下载按钮浏览器就会开始下载这个Tranche的压缩包例如zinc15_drug-like~10_pH7.4_3D.sdf.gz。3.4 第四步批量下载与自动化脚本一个Tranche可能包含几万个分子而我们的筛选结果分布在几十个Tranche中。手动一个个点下载是不现实的。ZINC15提供了批量下载的清单文件。在搜索结果页面显示所有Tranches的页面寻找 “Download Cartesian products” 或类似的链接。点击它会下载一个.txt文件。这个文本文件里每一行都是一个下载链接对应一个Tranche的SDF文件。例如http://files.docking.org/zinc15/data/drug-like~10/3D_pH7.4.sdf.gz你可以使用下载工具进行批量抓取Linux/macOS (终端)使用wget或curl命令。# 假设清单文件叫 download_list.txt wget -i download_list.txt -c --wait2-c支持断点续传--wait2表示每次下载间隔2秒避免对服务器造成压力。Windows可以使用wgetfor Windows或者使用图形化下载器如IDM、FDM它们都支持导入URL列表进行批量下载。Python脚本对于程序员写个Python脚本是最灵活的方式。import requests import time with open(download_list.txt, r) as f: urls f.readlines() for url in urls: url url.strip() filename url.split(/)[-1] print(fDownloading {filename}...) response requests.get(url, streamTrue) with open(filename, wb) as f: for chunk in response.iter_content(chunk_size8192): f.write(chunk) time.sleep(1) # 礼貌间隔4. 数据到手后清洗、验证与格式转换下载完一堆.sdf.gz文件工作只完成了一半。接下来的数据清洗和准备才是决定你后续研究是否顺利的关键。4.1 解压与合并首先解压所有.gz文件。在Linux下可以一条命令搞定gunzip *.gz。 然后你需要将几百个SDF文件合并成一个。SDF文件的特点是每个分子以$$$$分隔。因此合并很简单cat *.sdf combined_all.sdf在Windows下可以用PowerShellGet-Content *.sdf | Set-Content combined_all.sdf4.2 数据清洗与去重合并后的文件可能存在问题必须清洗。检查并修复无效分子有些分子在3D生成过程中可能失败导致结构异常。可以使用开源化学信息学工具包RDKit进行处理。from rdkit import Chem from rdkit.Chem import SDMolSupplier, SDWriter supplier SDMolSupplier(combined_all.sdf) writer SDWriter(cleaned.sdf) for mol in supplier: if mol is not None: # 过滤掉无法读取的分子 # 可选进行一些标准化操作如芳环键级感知、移除氢原子等 Chem.SanitizeMol(mol) writer.write(mol) writer.close()基于ZINC ID去重同一个化合物可能出现在多个供应商目录中导致重复。SDF属性中的zinc_id字段是唯一标识。seen_ids set() unique_mols [] for mol in supplier: if mol is not None: zinc_id mol.GetProp(zinc_id) if mol.HasProp(zinc_id) else None if zinc_id and zinc_id not in seen_ids: seen_ids.add(zinc_id) unique_mols.append(mol) # 将unique_mols写入新的SDF基于分子骨架去重有时你需要的是结构多样性。可以使用RDKit生成分子的InChIKey或摩根指纹Morgan Fingerprints然后进行聚类或直接去重保留结构独特的分子。4.3 格式转换以备他用清洗后的SDF是你的主文件。但不同的下游任务可能需要不同的格式转换为CSV如果你只需要分子的SMILES和性质做机器学习如使用scikit-learn。import pandas as pd from rdkit import Chem data [] for mol in SDMolSupplier(cleaned.sdf): if mol: row {} row[smiles] Chem.MolToSmiles(mol) row[zinc_id] mol.GetProp(zinc_id) row[mw] float(mol.GetProp(MW)) if mol.HasProp(MW) else None row[logp] float(mol.GetProp(LogP)) if mol.HasProp(LogP) else None # ... 添加其他属性 data.append(row) df pd.DataFrame(data) df.to_csv(zinc_dataset.csv, indexFalse)转换为PyTorch Geometric或DGL图数据如果你想用图神经网络GNN处理分子。这需要将每个分子表示为图原子是节点键是边并将原子特征原子类型、杂化、电荷等和键特征键类型、是否共轭等提取出来。RDKit结合专门的库如torch_geometric的from_rdkit可以完成。5. 避坑指南与高级技巧在实际操作中我踩过不少坑也总结出一些能极大提升效率的技巧。5.1 网络与下载稳定性问题下载大型Tranche几百MB时容易中断。解决务必使用支持断点续传的下载工具如wget -c。批量下载时在脚本中加入重试机制和更长的等待间隔如3-5秒。5.2 筛选条件“过犹不及”问题设置了非常严格的类药五规则如RotBonds 5结果发现很多已知的成功药物也被筛掉了导致数据集有偏。解决理解规则的指导意义而非绝对标准。对于早期虚拟筛选可以适当放宽标准如RotBonds 10。你的筛选条件应该服务于你的科学问题而不是被工具的限制框死。5.3 3D构象的单一性问题ZINC15默认只提供一个能量较低的3D构象。但对于柔性分子这个构象可能不是其与靶点结合时的活性构象。解决对于关键分子或后续对接失败率高的分子需要考虑构象采样。可以使用RDKit的EmbedMultipleConfs功能或专业的构象生成工具如OMEGA来生成多个低能构象作为对接的输入。5.4 数据集的规模与管理问题盲目追求大数据集下载了上千万个分子导致存储、计算和处理成本剧增。解决根据计算资源合理规划数据集规模。对于初步的机器学习模型训练或虚拟筛选10万到100万个高质量分子通常是一个很好的起点。你可以先下载一个小子集如1%进行流程测试和验证确保整个数据处理pipeline畅通后再扩展至全量数据。5.5 利用ZINC20的更新注意ZINC15虽然经典且足够使用但其数据截止于2015年左右。目前已有ZINC20版本包含了更新、更多的化合物超过2.5亿个并改进了筛选界面和算法。其基本操作逻辑与ZINC15相似。如果你的研究对化合物新颖性要求较高建议直接使用ZINC20。访问地址通常为zinc20.docking.org。本文的核心方法论在两个版本上完全通用。