AIDD / EPT /scripts /process_data /process_PDBBind.py
Wthinker's picture
Publish AIDD open-source resources
4947683 verified
Raw
History Blame Contribute Delete
3.45 kB
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import re
import argparse
import numpy as np
from utils.logger import print_log
from data.converter.blocks_to_data import blocks_to_data
from data.converter.mol2_to_blocks import mol2_to_blocks
from data.converter.pdb_to_list_blocks import pdb_to_list_blocks
from data.mmap_dataset import create_mmap
def parse():
parser = argparse.ArgumentParser(description='Process PDBBind')
parser.add_argument('--data_dir', type=str, required=True,
help='Directory of scPDB data')
parser.add_argument('--out_dir', type=str, required=True,
help='Output directory')
return parser.parse_args()
def parse_index(fpath):
with open(fpath, 'r') as fin:
lines = fin.readlines()
data = {}
for line in lines:
if line.startswith('#'):
continue
line = re.split(r'\s+', line)
pdb_id, resolution, year, kd = line[:4]
data[pdb_id] = kd
return data
def process_iterator_PP(data_dir):
indexes = parse_index(os.path.join(data_dir, 'index', 'INDEX_general_PP.2020'))
for pdb_id in indexes:
list_blocks = pdb_to_list_blocks(os.path.join(data_dir, f'{pdb_id}.ent.pdb'))
data = blocks_to_data(*list_blocks)
for key in data:
if isinstance(data[key], np.ndarray):
data[key] = data[key].tolist()
yield pdb_id, data, [len(data['B']), indexes[pdb_id]]
def process_iterator_PL(data_dir, index_file):
indexes = parse_index(index_file)
for pdb_id in indexes:
if not os.path.exists(os.path.join(data_dir, pdb_id)):
continue
prot_fname = os.path.join(data_dir, pdb_id, f'{pdb_id}_protein.pdb')
sm_fname = os.path.join(data_dir, pdb_id, f'{pdb_id}_ligand.mol2')
list_blocks1 = pdb_to_list_blocks(prot_fname)
blocks2 = mol2_to_blocks(sm_fname)
data = blocks_to_data(*(list_blocks1 + [blocks2]))
for key in data:
if isinstance(data[key], np.ndarray):
data[key] = data[key].tolist()
yield pdb_id, data, [len(data['B']), indexes[pdb_id]]
def main(args):
print_log(f'Processing PP')
PP_index_file = os.path.join(args.data_dir, 'PP', 'index', 'INDEX_general_PP.2020')
PP_index = parse_index(PP_index_file)
create_mmap(
process_iterator_PP(os.path.join(args.data_dir, 'PP')),
os.path.join(args.out_dir, 'PP'), len(PP_index)
)
print_log(f'Processing PL refined set')
PL_refine_index_file = os.path.join(args.data_dir, 'refined-set', 'index', 'INDEX_refined_set.2020')
PL_refine_index = parse_index(PL_refine_index_file)
create_mmap(
process_iterator_PL(
os.path.join(args.data_dir, 'refined-set'),
PL_refine_index_file,
), os.path.join(args.out_dir, 'refined-set'), len(PL_refine_index)
)
print_log(f'Processing PL others')
PL_other_index_file = os.path.join(args.data_dir, 'v2020-other-PL', 'index', 'INDEX_general_PL.2020')
PL_other_index = parse_index(PL_other_index_file)
create_mmap(
process_iterator_PL(
os.path.join(args.data_dir, 'v2020-other-PL'),
PL_other_index_file,
), os.path.join(args.out_dir, 'v2020-other-PL'), len(PL_other_index) - len(PL_refine_index)
)
print_log('Finished!')
if __name__ == '__main__':
main(parse())