| import argparse |
| import os |
|
|
| from rdkit import Chem |
| import torch |
| from tqdm.auto import tqdm |
| from onescience.utils.targetdiff import misc |
| from onescience.utils.targetdiff.evaluation import scoring_func |
| from onescience.utils.targetdiff.evaluation.docking_qvina import QVinaDockingTask |
| from onescience.datapipes.targetdiff import get_dataset |
| from easydict import EasyDict |
|
|
|
|
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser() |
| parser.add_argument('-d', '--dataset', type=str, default='./data/crossdocked_v1.1_rmsd1.0_pocket10') |
| parser.add_argument('-s', '--split', type=str, default='./data/crossdocked_pocket10_pose_split.pt') |
| parser.add_argument('-o', '--out', type=str, default=None) |
| parser.add_argument('--protein_root', type=str, default='./data/crossdocked_v1.1_rmsd1.0') |
| parser.add_argument('--ligand_root', type=str, default='./data/crossdocked_v1.1_rmsd1.0_pocket10') |
| parser.add_argument('--use_uff', type=eval, default=True) |
| parser.add_argument('--size_factor', type=float, default=1.2) |
| args = parser.parse_args() |
|
|
| logger = misc.get_logger('docking') |
| logger.info(args) |
|
|
| |
| dataset, subsets = get_dataset( |
| config=EasyDict({ |
| 'name': 'pl', |
| 'path': args.dataset, |
| 'split': args.split |
| }) |
| ) |
| train_set, test_set = subsets['train'], subsets['test'] |
| logger.info(f'Successfully load the dataset (size: {len(test_set)})!') |
|
|
| |
| logger.info('Start docking...') |
| results = [] |
| for i, data in enumerate(tqdm(test_set)): |
| mol = next(iter(Chem.SDMolSupplier(os.path.join(args.ligand_root, data.ligand_filename)))) |
| |
| chem_results = scoring_func.get_chem(mol) |
| vina_task = QVinaDockingTask.from_original_data( |
| data, |
| ligand_root=args.ligand_root, |
| protein_root=args.protein_root, |
| use_uff=args.use_uff, |
| size_factor=args.size_factor |
| ) |
| vina_results = vina_task.run_sync() |
| |
| |
| |
|
|
| results.append({ |
| 'mol': mol, |
| 'smiles': data.ligand_smiles, |
| 'ligand_filename': data.ligand_filename, |
| 'chem_results': chem_results, |
| 'vina': vina_results |
| }) |
|
|
| |
| if args.out is None: |
| split_name = os.path.basename(args.split) |
| split_name = split_name[:split_name.rfind('.')] |
| docked_name = f'{split_name}_test_docked_uff_{args.use_uff}_size_{args.size_factor}.pt' |
| out_path = os.path.join(os.path.dirname(args.dataset), docked_name) |
| else: |
| out_path = args.out |
| logger.info('Num docked: %d' % len(results)) |
| logger.info('Saving results to %s' % out_path) |
| torch.save(results, out_path) |
|
|