commit c5620ad4e3a7eae22c1d30aa4c0864d0b2db8c9b Author: mm644706215 Date: Wed Aug 27 21:16:45 2025 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98b4644 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +admet_ai +*.sdf \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7fb2726 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +## 使用admet-ai预测 + +```bash +git clone https://github.com/swansonk14/admet_ai +cd admet_ai +micromamba create -n admet_ai python=3.10 +micromamba activate admet_ai +pip install -r requirements.txt +pip install -e . +python fix_admet_load.py --data_path ./data/molecules.csv --save_path ./data/preds.csv --smiles_column smiles +``` \ No newline at end of file diff --git a/data/molecules.csv b/data/molecules.csv new file mode 100644 index 0000000..531ac05 --- /dev/null +++ b/data/molecules.csv @@ -0,0 +1,56 @@ +smiles +CC[C@H](C)[C@H](NC(=O)CNC(=O)[C@H](CC(=O)[O-])NC(=O)[C@H](CC(C)C)NC(=O)[C@H](CCC(=O)[O-])NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)[C@H](CC(N)=O)NC(=O)[C@@H]1CCCN1C(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@H](CC(=O)[O-])NC(=O)[C@@H](NC(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](CCC(=O)[O-])NC(=O)[C@H](CCSC)NC(=O)[C@H](CO)NC(=O)[C@H](CCSC)NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](Cc1c[nH]cn1)NC(=O)[C@@H]1CCCN1C(=O)[C@H](CO)NC(=O)[C@@H](NC(=O)[C@H](CS)NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@@H](NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@@H](NC(=O)CNC(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@@H]1CCCN1C(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@@H](NC(=O)[C@@H](NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@@H](NC(=O)[C@H](CCSC)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@H](C)NC(=O)[C@H](CCC(N)=O)NC(=O)[C@H](CCC(=O)[O-])NC(=O)[C@H](CO)NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)[C@@H](NC(=O)[C@H](CC(C)C)NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](CCCC[NH3+])NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](CC(=O)[O-])NC(=O)[C@@H](NC(=O)CNC(=O)[C@H](CCC(N)=O)NC(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)CNC(=O)[C@@H](NC(=O)[C@@H]1CCCN1C(=O)[C@H](C)NC(=O)[C@H](CC(C)C)NC(=O)[C@@H](NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](CCC(=O)[O-])NC(=O)[C@H](CCSC)NC(=O)[C@@H](NC(=O)[C@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)[C@H](CC(C)C)NC(=O)CNC(=O)[C@@H](NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@H](CC(C)C)NC(=O)[C@@H](NC(=O)[C@@H](NC(=O)[C@H](CS)NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@@H](NC(=O)[C@@H](NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](C)NC(=O)[C@H](CC(=O)[O-])NC(=O)[C@H](CC(=O)[O-])NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)CNC(=O)[C@@H](NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](CCC(N)=O)NC(=O)CNC(=O)[C@H](CO)NC(=O)[C@H](CCC(N)=O)NC(=O)[C@H](CO)NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](Cc1c[nH]cn1)NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](CO)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](Cc1cnc[nH]1)NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@H](CCCC[NH3+])NC(=O)[C@H](CCC(N)=O)NC(=O)[C@@H](NC(=O)[C@H](Cc1ccc(O)cc1)NC(=O)[C@H](CC(=O)[O-])NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)[C@H](C)NC(=O)[C@H](CCCC[NH3+])NC(=O)[C@@H]1CCCN1C(=O)[C@@H](NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@@H](NC(=O)[C@H](CCC(N)=O)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@@H](NC(=O)[C@H](CC(C)C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@H](CO)NC(=O)[C@H](CC(C)C)NC(=O)CNC(=O)[C@@H](NC(=O)[C@H](CCC(N)=O)NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](CCC(=O)[O-])NC(=O)[C@@H](NC(=O)[C@H](Cc1ccccc1)NC(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@H](CCCNC(N)=[NH2+])NC(=O)[C@H](CO)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](Cc1cnc[nH]1)NC(=O)[C@H](CCCC[NH3+])NC(=O)[C@H](Cc1c[nH]c2ccccc12)NC(=O)[C@@H](NC(=O)[C@@H](N)CO)[C@@H](C)O)C(C)C)[C@@H](C)CC)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)CC)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)CC)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)O)C(C)C)[C@@H](C)CC)C(C)C)[C@@H](C)O)C(C)C)[C@@H](C)O)C(C)C)C(C)C)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)O)C(=O)N[C@@H](CCSC)C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](C)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](CS)C(=O)N[C@@H](CCC(N)=O)C(=O)N[C@@H](Cc1c[nH]c2ccccc12)C(=O)N[C@@H](C)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H](Cc1c[nH]c2ccccc12)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](CCC(N)=O)C(=O)N[C@@H](CCC(N)=O)C(=O)N[C@@H](CCSC)C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](CC(N)=O)C(=O)N[C@H](C(=O)N[C@@H](CCC(=O)[O-])C(=O)N[C@@H](CCC(=O)[O-])C(=O)N[C@@H](CCCNC(N)=[NH2+])C(=O)N[C@@H](CCCNC(N)=[NH2+])C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](CC(=O)[O-])C(=O)N[C@@H](Cc1c[nH]cn1)C(=O)N[C@@H](Cc1c[nH]c2ccccc12)C(=O)N[C@@H](CCC(N)=O)C(=O)N[C@@H](CCSC)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@H](C(=O)N[C@@H](Cc1c[nH]cn1)C(=O)N[C@@H](Cc1cnc[nH]1)C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](C)C(=O)N[C@@H](CC(C)C)C(=O)N[C@H](C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H](C)C(=O)N[C@@H](CS)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@@H](C)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@@H](Cc1cnc[nH]1)C(=O)N[C@@H](Cc1cnc[nH]1)C(=O)N[C@H](C(=O)N[C@@H](CCCNC(N)=[NH2+])C(=O)N[C@H](C(=O)NCC(=O)N[C@@H](CC(N)=O)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@H](C(=O)N[C@@H](CC(C)C)C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](CCSC)C(=O)N[C@@H](CC(=O)[O-])C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](CC(=O)[O-])C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H](CC(C)C)C(=O)N1CCC[C@H]1C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](C)C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](CS)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@@H](CS)C(=O)NCC(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@H](C(=O)N[C@@H](CS)C(=O)N[C@@H](CC(=O)[O-])C(=O)N[C@H](C(=O)N[C@@H](CCSC)C(=O)N[C@@H](Cc1ccccc1)C(=O)NCC(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](CO)C(=O)N[C@@H](Cc1c[nH]c2ccccc12)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H](C)C(=O)N[C@@H](CCCNC(N)=[NH2+])C(=O)N[C@@H](Cc1cnc[nH]1)C(=O)N[C@H](C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@H](C(=O)N[C@@H](C)C(=O)N[C@H](C(=O)N[C@@H](CS)C(=O)N[C@@H](Cc1c[nH]c2ccccc12)C(=O)N[C@@H](CO)C(=O)N[C@H](C(=O)N[C@@H](Cc1ccc(O)cc1)C(=O)N[C@@H](CO)C(=O)N[C@@H](CC(=O)[O-])C(=O)N[C@H](C(=O)N1CCC[C@H]1C(=O)N[C@@H](CCCNC(N)=[NH2+])C(=O)N[C@H](C(=O)N[C@@H](CCSC)C(=O)N1CCC[C@H]1C(=O)N[C@H](C(=O)NCC(=O)N[C@H]1CSSC[C@@H](C(=O)N[C@@H](Cc2ccc(O)cc2)C(=O)N[C@@H](CC(N)=O)C(=O)N[C@@H](CCC(=O)[O-])C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](Cc2c[nH]c3ccccc23)C(=O)NCC(=O)N[C@@H](Cc2ccccc2)C(=O)N[C@@H](CC(C)C)C(=O)NCC(=O)N2CCC[C@H]2C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](Cc2ccccc2)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](CCC(N)=O)C(=O)N[C@@H](C)C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@H](C(=O)NCC(=O)N[C@@H](Cc2c[nH]c3ccccc23)C(=O)N[C@@H](Cc2ccccc2)C(=O)N[C@H](C(=O)N[C@@H](CCSC)C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](CCCNC(N)=[NH2+])C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@H](C(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@H](C(=O)N[C@@H](CC(C)C)C(=O)N[C@H](C=O)CCCC[NH3+])C(C)C)C(C)C)[C@@H](C)CC)C(C)C)C(C)C)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)CC)C(C)C)[C@@H](C)O)NC(=O)[C@H](C(C)C)NC(=O)[C@H](CC(C)C)NC(=O)CNC(=O)[C@H](CCC(N)=O)NC(=O)[C@@H]2CCCN2C(=O)[C@H](CC(N)=O)NC(=O)[C@H]([C@@H](C)CC)NC(=O)[C@H](Cc2ccccc2)NC(=O)[C@@H]2CCCN2C(=O)[C@H](CCC(=O)[O-])NC(=O)[C@H](C(C)C)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](Cc2ccc(O)cc2)NC(=O)CNC(=O)[C@H](Cc2c[nH]c3ccccc23)NC(=O)CNC(=O)[C@H](C)NC(=O)[C@@H]2CCCN2C(=O)[C@@H]2CCCN2C(=O)[C@H](CC(N)=O)NC(=O)[C@H](CC(C)C)NC(=O)[C@@H]2CCCN2C(=O)CNC(=O)[C@H]([C@@H](C)CC)NC(=O)[C@H](CCSC)NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](CCC(=O)[O-])NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](CC(N)=O)NC(=O)CNC(=O)[C@H](CCCC[NH3+])NC(=O)[C@H](Cc2ccccc2)NC1=O)[C@@H](C)O)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)CC)C(C)C)[C@@H](C)CC)C(C)C)C(C)C)C(C)C)C(C)C)[C@@H](C)CC)C(C)C)C(C)C)[C@@H](C)CC)C(C)C)[C@@H](C)CC)C(C)C)[C@@H](C)O)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)O)C(C)C)[C@@H](C)CC)[C@@H](C)O)[C@@H](C)CC)[C@@H](C)CC)C(C)C)[C@@H](C)CC +CCCCCCCCC[C@H]1C[C@H](O)[C@@H](Cc2ccccc2)[N@H+]1C +OC[C@H]1O[C@@H](n2cnc3c2N=CNC[C@H]3O)[C@@H](Cl)[C@H]1O +C[C@H](CCOc1ccc(C(=O)[O-])cc1)C(=O)[O-] +O=C([O-])c1cccc2ccccc12 +N#CSCc1ccccc1 +Cc1cc(O)cc(C(=O)[O-])c1 +C=C(CCC=C(C)C)[C@@H]1CC=C(C)CC1 +C[C@H](C(=O)C(=O)[O-])c1ccccc1 +O=P([O-])([O-])O[C@H]1O[C@H](CF)[C@@H](O)[C@H]1O +COc1cc(C(=O)[O-])cc(O)c1O +COc1cc(CC[NH3+])ccc1O +CSC[C@H]1O[C@H](OP(=O)([O-])[O-])[C@H](O)[C@@H]1O +NC(=O)CCCC[C@@H]1CCSS1 +O=C([O-])c1ccccc1C(=O)[O-] +[NH3+]Cc1cc(COP(=O)([O-])[O-])co1 +O=C([O-])c1ccc(O)c(O)c1 +NC(=O)OC[C@H](C(=O)[O-])c1ccccc1 +O=C([O-])c1cc(O)c(O)c(Cl)c1 +Cc1cccc(O)c1C(=O)[O-] +C[C@H](O)c1ccccc1 +Cc1ccc(-c2cccs2)s1 +OC[C@@H](O)C#Cc1csc(-c2cccs2)c1 +O=C([O-])c1cc(Cl)ccc1O +O=C([O-])c1ccc(NO)cc1 +Cc1cccc(C(=O)[O-])c1O +C[C@@]12[C@@H]3C[C@@H](C[C@@H]31)[C@@]2(C)C(=O)[O-] +COc1cc([C@@H](O)C(=O)[O-])ccc1O +Cc1ccc(O)c(C(=O)[O-])c1 +O=C([O-])C[C@@]1(F)C=CC(=O)O1 +OC[C@H](O)[C@@H](O)Cc1c[nH]c2ccccc12 +C[NH2+]C[C@@H](O)c1ccccc1 +Cc1nc(C(=O)[O-])sc1CCOP(=O)([O-])[O-] +Cc1cccc(C(=O)[O-])c1 +Cc1ccccc1C(=O)[O-] +N#Cc1c[nH]c2nc(N)[nH]c(=O)c12 +Cc1cc(O)cc(C(=O)[O-])c1O +C[N+](C)(C)[C@@H](Cc1c[nH]c(SO)n1)C(=O)[O-] +COc1ccc(C[C@@H](C)[NH3+])cc1 +Nc1cc(C(=O)[O-])ccc1O +N#CCc1c[nH]c2ccccc12 +Cc1ncc(C(=O)[O-])c(C(=O)[O-])c1O +Cc1cc(O)cc(O)c1C(=O)[O-] +COc1c(C)cc(C[C@H]([NH3+])C(=O)[O-])cc1O +C1=Cc2ccccc2CN1 +O=C1C=C[C@@H]([C@@H](F)C(=O)[O-])O1 +O=C([O-])c1c(O)cccc1O +Nc1ccccc1C(=O)[O-] +C=C1c2ccc(C)cc2O[C@@H]1O +O=C1C=C[C@@H]([C@H](F)C(=O)[O-])O1 +CC(=O)c1ccc(S(=O)(=O)[O-])cc1 +O=C([O-])c1cccc(O)c1 +[NH3+][C@H](COP(=O)([O-])[O-])Cc1c[nH]cn1 +CC(=O)C1=CCNc2nc(N)[nH]c(=O)c2N1 +Cn1c(=O)[nH]c2nc[nH]c2c1=O diff --git a/fix_admet_load.py b/fix_admet_load.py new file mode 100644 index 0000000..b5ae7eb --- /dev/null +++ b/fix_admet_load.py @@ -0,0 +1,60 @@ +import torch +import sys +import os +import argparse +from pathlib import Path + +def patch_torch_load(): + """ + 修补torch.load函数,添加weights_only=False参数 + 这是为了解决PyTorch 2.6版本中weights_only默认值变更导致的问题 + """ + original_torch_load = torch.load + + def patched_load(f, map_location=None, pickle_module=None, **pickle_load_args): + # 显式添加weights_only=False参数 + if 'weights_only' not in pickle_load_args: + pickle_load_args['weights_only'] = False + return original_torch_load(f, map_location, pickle_module, **pickle_load_args) + + torch.load = patched_load + print("已修补torch.load函数,添加weights_only=False参数") + +def main(): + parser = argparse.ArgumentParser(description='运行admet_predict并修复torch.load问题') + parser.add_argument('--data_path', type=str, required=True, help='输入数据路径') + parser.add_argument('--save_path', type=str, required=True, help='保存结果路径') + parser.add_argument('--smiles_column', type=str, default='smiles', help='SMILES列名') + parser.add_argument('--models_dir', type=str, help='模型目录') + parser.add_argument('--include_physchem', action='store_true', help='是否包含物理化学特性') + parser.add_argument('--drugbank_path', type=str, help='DrugBank路径') + parser.add_argument('--atc_code', type=str, help='ATC代码') + + args, unknown = parser.parse_known_args() + + # 应用修补 + patch_torch_load() + + # 构建admet_predict命令 + cmd = [sys.executable, '-m', 'admet_ai.admet_predict'] + cmd.extend(['--data_path', args.data_path]) + cmd.extend(['--save_path', args.save_path]) + cmd.extend(['--smiles_column', args.smiles_column]) + + if args.models_dir: + cmd.extend(['--models_dir', args.models_dir]) + if args.include_physchem: + cmd.append('--include_physchem') + if args.drugbank_path: + cmd.extend(['--drugbank_path', args.drugbank_path]) + if args.atc_code: + cmd.extend(['--atc_code', args.atc_code]) + + # 添加未知参数 + cmd.extend(unknown) + + # 执行命令 + os.execv(sys.executable, cmd) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/scripts/sdf_to_smiles.py b/scripts/sdf_to_smiles.py new file mode 100644 index 0000000..c41b243 --- /dev/null +++ b/scripts/sdf_to_smiles.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +from rdkit import Chem + +# 当前目录路径 +current_dir = os.path.dirname(os.path.abspath(__file__)) + +# 输入SDF文件路径 +sdf_file = os.path.join(current_dir, 'fgbar_vina_SP_1_pv.sdf') + +# 输出SMILES文件路径 +smiles_file = os.path.join(current_dir, 'molecules.txt') + +def sdf_to_smiles(sdf_path, output_path): + """读取SDF文件中的分子并将其转换为SMILES格式保存到文本文件""" + # 读取SDF文件 + suppl = Chem.SDMolSupplier(sdf_path) + + # 计数有效分子数量 + valid_mol_count = 0 + + # 打开输出文件 + with open(output_path, 'w') as f: + # 遍历所有分子 + for i, mol in enumerate(suppl): + if mol is not None: # 确保分子有效 + # 获取SMILES + smiles = Chem.MolToSmiles(mol) + # 写入文件 + f.write(f"{smiles}\n") + valid_mol_count += 1 + + return valid_mol_count + +def main(): + print(f"正在读取SDF文件: {sdf_file}") + mol_count = sdf_to_smiles(sdf_file, smiles_file) + print(f"成功处理了 {mol_count} 个分子") + print(f"SMILES已保存到: {smiles_file}") + +if __name__ == "__main__": + main() \ No newline at end of file