File size: 2,200 Bytes
4947683 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import argparse
import numpy as np
import pandas as pd
from rdkit import Chem
from utils.logger import print_log
from data.converter.blocks_to_data import blocks_to_data
from data.converter.rdkit_to_blocks import rdkit_to_blocks
from data.converter.sdf_to_list_blocks import sdf_to_list_blocks
from data.mmap_dataset import create_mmap
def parse():
parser = argparse.ArgumentParser(description='Process molecule data from PCQM4Mv2 dataset.')
parser.add_argument('--sdf_file', type=str, required=True,
help='Input sdf file')
parser.add_argument('--out_dir', type=str, required=True,
help='Output directory')
parser.add_argument('--using_hydrogen', action='store_true',
help='Whether to preserve hydrogen atoms')
parser.add_argument('--hydrogen_as_block', action='store_true',
help='Whether to consider hydrogen atoms as blocks')
return parser.parse_args()
def process_iterator(sdf_file, using_hydrogen, hydrogen_as_block):
# Read SDF file
supplier = Chem.SDMolSupplier(sdf_file, removeHs=False)
for mol in supplier:
if mol is None:
continue
try:
smiles = Chem.MolToSmiles(mol)
except:
continue
blocks = rdkit_to_blocks(mol, using_hydrogen, hydrogen_as_block)
if blocks is None:
continue
data = blocks_to_data(blocks)
for key in data:
if isinstance(data[key], np.ndarray):
data[key] = data[key].tolist()
# id, data, [len] (only save the lengths as the properties)
yield smiles, data, [len(data['B'])]
def main(args):
print_log('Processing sdf dataset ...')
if not args.using_hydrogen:
ret_name = 'woH'
elif args.hydrogen_as_block:
ret_name = 'blockH'
else:
ret_name = 'atomH'
create_mmap(
process_iterator(args.sdf_file, args.using_hydrogen, args.hydrogen_as_block),
os.path.join(args.out_dir, ret_name))
print_log('Finished!')
if __name__ == '__main__':
main(parse()) |