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())