File: mol.py

package info (click to toggle)
rdkit 201809.1%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 123,688 kB
  • sloc: cpp: 230,509; python: 70,501; java: 6,329; ansic: 5,427; sql: 1,899; yacc: 1,739; lex: 1,243; makefile: 445; xml: 229; fortran: 183; sh: 123; cs: 93
file content (72 lines) | stat: -rwxr-xr-x 1,629 bytes parent folder | download
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
from __future__ import print_function
from Chem import rdmol
from Chem.rdmol import Atom, Bond, Mol


def ParseAtomBlock(lines, mol, nAtoms):
  for i in range(nAtoms):
    line = lines[i]
    pX = float(line[0:10])
    pY = float(line[10:20])
    pZ = float(line[20:30])
    symb = line[31:34].strip()
    newAt = rdmol.Atom(symb)
    newAt.setPos(pX, pY, pZ)

    chg = int(line[36:39])
    if chg in [1, 2, 3, 5, 6, 7]:
      newAt.setFormalCharge(4 - chg)

    # parse valence

    # parse rxn component

    mol.addAtom(newAt)


bondMap = {1: Bond.SINGLE, 2: Bond.DOUBLE, 3: Bond.TRIPLE, 4: Bond.AROMATIC}


def ParseBondBlock(lines, mol, nBonds):
  for i in range(nBonds):
    line = lines[i]
    id1 = int(line[0:3]) - 1
    id2 = int(line[3:6]) - 1
    order = int(line[6:9])
    order = bondMap.get(order, Bond.OTHER)
    b = Bond(order)
    b.setOwningMol(mol)
    b.setBeginAtomIdx(id1)
    b.setEndAtomIdx(id2)
    mol.addBond(b)


def ParseMolBlock(lines, mol):
  header = lines[0:3]
  counts = lines[3]
  nAtoms = int(counts[0:3])
  nBonds = int(counts[3:6])
  nLists = int(counts[6:9])
  chiralFlag = int(counts[12:15])
  nsText = int(counts[15:18])
  nRxnComponents = int(counts[18:21])
  nReactants = int(counts[21:24])
  nProducts = int(counts[24:27])
  nIntermediates = int(counts[27:30])

  ParseAtomBlock(lines[4:], mol, nAtoms)
  ParseBondBlock(lines[4 + nAtoms:], mol, nBonds)


if __name__ == '__main__':
  import sys
  fName = sys.argv[1]
  inF = open(fName, 'r')
  lines = inF.readlines()
  m = rdmol.Mol()
  ParseMolBlock(lines, m)

  print(m.getNumAtoms())
  m.debugMol()

  print(rdmol.MolToCDXML(m))