In [1]:
from rmgpy.molecule import Atom, Bond, Molecule
from rmgpy.molecule.resonance import *
from rmgpy.molecule.element import PeriodicSystem

import numpy as np
import itertools
from IPython.display import display
import pdb

In [ ]:
mol = Molecule().fromAdjacencyList("""
1  C u0 p0 c0 {2,B} {3,S} {6,B}
2  C u0 p0 c0 {1,B} {3,B} {11,S}
3  C u0 p0 c0 {1,S} {2,B} {4,B}
4  C u0 p0 c0 {3,B} {5,B} {12,S}
5  C u0 p0 c0 {4,B} {6,B} {10,B}
6  C u0 p0 c0 {1,B} {5,B} {7,B}
7  C u0 p0 c0 {6,B} {8,B} {13,S}
8  C u0 p0 c0 {7,B} {9,B} {14,S}
9  C u0 p0 c0 {8,B} {10,B} {15,S}
10 C u0 p0 c0 {5,B} {9,B} {16,S}
11 H u0 p0 c0 {2,S}
12 H u0 p0 c0 {4,S}
13 H u0 p0 c0 {7,S}
14 H u0 p0 c0 {8,S}
15 H u0 p0 c0 {9,S}
16 H u0 p0 c0 {10,S}
""")
display(mol)
mol.kekulize()
display(mol)

In [ ]:
mol = Molecule().fromAdjacencyList("""
1  *5 C u0 p0 c0 {2,B} {4,B} {5,B}
2  *2 C u0 p0 c0 {1,B} {3,B} {8,B}
3  *3 C u0 p0 c0 {2,B} {6,B} {11,S}
4     C u0 p0 c0 {1,B} {7,B} {14,S}
5  *6 C u0 p0 c0 {1,B} {9,B} {15,S}
6     C u0 p0 c0 {3,B} {7,B} {12,S}
7     C u0 p0 c0 {4,B} {6,B} {13,S}
8     C u0 p0 c0 {2,B} {10,B} {16,S}
9  *4 C u0 p0 c0 {5,B} {10,B} {17,S}
10 *1 C u1 p0 c0 {8,B} {9,B}
11    H u0 p0 c0 {3,S}
12    H u0 p0 c0 {6,S}
13    H u0 p0 c0 {7,S}
14    H u0 p0 c0 {4,S}
15    H u0 p0 c0 {5,S}
16    H u0 p0 c0 {8,S}
17    H u0 p0 c0 {9,S}
""")
display(mol)
labels = mol.getLabeledAtoms()
mol.addBond(Bond(labels['*1'], labels['*2']))
mol.getBond(labels['*2'], labels['*3']).decrementOrder()
labels['*1'].decrementRadical()
labels['*3'].incrementRadical()
mol.kekulize()
display(mol)

In [ ]:
atom = mol.atoms[3]
occupied = 0
uncertain = 0
for bond in atom.bonds.itervalues():
    if abs(round(bond.order) - bond.order) < 1e-9:
        occupied += int(round(bond.order))
    elif bond.isBenzene():
        # The atom has a benzene bond, so at least one electron is occupied, but there is a second uncertain electron
        occupied += 1
        uncertain += 1
    else:
        ValueError('Unexpected bond order {0}.'.format(bond.order))
occupied += atom.radicalElectrons
occupied += 2 * atom.lonePairs
available = PeriodicSystem.valences[atom.element.symbol] - occupied
print available, uncertain

In [ ]:
mol = Molecule().fromAdjacencyList("""
1  *1 C u0 p0 c0 {2,B} {3,B} {6,B}
2  *2 C u0 p0 c0 {1,B} {4,B} {9,B}
3     C u0 p0 c0 {1,B} {5,B} {7,B}
4     C u0 p0 c0 {2,B} {8,B} {10,B}
5     C u0 p0 c0 {3,B} {11,B} {17,S}
6     C u0 p0 c0 {1,B} {12,B} {18,S}
7     C u0 p0 c0 {3,B} {8,B} {19,S}
8     C u0 p0 c0 {4,B} {7,B} {20,S}
9     C u0 p0 c0 {2,B} {13,B} {21,S}
10    C u0 p0 c0 {4,B} {14,B} {23,S}
11    C u0 p0 c0 {5,B} {12,B} {15,S}
12    C u0 p0 c0 {6,B} {11,B} {16,S}
13    C u0 p0 c0 {9,B} {14,B} {22,S}
14    C u0 p0 c0 {10,B} {13,B} {24,S}
15    H u0 p0 c0 {11,S}
16    H u0 p0 c0 {12,S}
17    H u0 p0 c0 {5,S}
18    H u0 p0 c0 {6,S}
19    H u0 p0 c0 {7,S}
20    H u0 p0 c0 {8,S}
21    H u0 p0 c0 {9,S}
22    H u0 p0 c0 {13,S}
23    H u0 p0 c0 {10,S}
24    H u0 p0 c0 {14,S}
25 *3 H u1 p0 c0
""")

labels = mol.getLabeledAtoms()
mol.addBond(Bond(labels['*1'], labels['*3']))
mol.getBond(labels['*1'], labels['*2']).decrementOrder()
labels['*2'].incrementRadical()
labels['*3'].decrementRadical()
#mol.getBond(labels['*1'], labels['*2']).setOrderNum(1)

mol.kekulize()

display(mol)

print mol.toAdjacencyList()