def toInChIKey(mol, backend='rdkit-first', aug_level=0): """ Convert a molecular structure to an InChI Key string. For aug_level=0, generates the canonical InChI. For aug_level=1, appends the molecule multiplicity. For aug_level=2, appends positions of unpaired and paired electrons. Uses RDKit or OpenBabel for conversion. Args: backend choice of backend, 'try-all', 'rdkit', or 'openbabel' aug_level level of augmentation, 0, 1, or 2 """ cython.declare(key=str, ulayer=str, player=str, mlayer=str) if aug_level == 0: return _write(mol, 'inchikey', backend) elif aug_level == 1: key = toInChIKey(mol, backend=backend) mlayer = '-mult{0}'.format(mol.multiplicity) if mol.multiplicity != 0 else '' return key + mlayer elif aug_level == 2: key = toInChIKey(mol, backend=backend) ulayer, player = inchiutil.create_augmented_layers(mol) return inchiutil.compose_aug_inchi_key(key, ulayer, player) else: raise ValueError("Implemented values for aug_level are 0, 1, or 2.")
def toInChIKey(mol, backend='rdkit-first', aug_level=0): """ Convert a molecular structure to an InChI Key string. For aug_level=0, generates the canonical InChI. For aug_level=1, appends the molecule multiplicity. For aug_level=2, appends positions of unpaired and paired electrons. Uses RDKit or OpenBabel for conversion. Args: backend choice of backend, 'try-all', 'rdkit', or 'openbabel' aug_level level of augmentation, 0, 1, or 2 """ cython.declare(key=str, ulayer=str, player=str, mlayer=str) if aug_level == 0: return _write(mol, 'inchikey', backend) elif aug_level == 1: key = toInChIKey(mol, backend=backend) mlayer = '-mult{0}'.format(mol.multiplicity) if mol.multiplicity != 0 else '' return key + mlayer elif aug_level == 2: key = toInChIKey(mol, backend=backend) ulayer, player = inchiutil.create_augmented_layers(mol) return inchiutil.compose_aug_inchi_key(key, ulayer, player) else: raise ValueError("Implemented values for aug_level are 0, 1, or 2.")
def test_triplet_methylene(self): adjlist = """ multiplicity 3 1 C u2 p0 c0 {2,S} {3,S} 2 H u0 p0 c0 {1,S} 3 H u0 p0 c0 {1,S} """ mol = Molecule().from_adjacency_list(adjlist) ulayer, player = create_augmented_layers(mol) self.assertEquals(U_LAYER_PREFIX + '1,1', ulayer) self.assertTrue(not player)
def test_nitrate(self): """ Test that N atom in the p-layer has correct symbol. """ adjlist = """ 1 O u0 p2 c0 {4,D} 2 O u0 p3 c-1 {4,S} 3 O u0 p3 c-1 {4,S} 4 N u0 p0 c+1 {1,D} {2,S} {3,S} """ mol = Molecule().from_adjacency_list(adjlist) ulayer, player = create_augmented_layers(mol) self.assertTrue(not ulayer) self.assertTrue(player.contains(P_LAYER_PREFIX + '1(0)'))
def test_c4h6(self): """ Test that 3-butene-1,2-diyl biradical is always resulting in the same u-layer, regardless of the original order. """ # radical positions 3 and 4 adjlist1 = """ 1 C u0 p0 c0 {2,D} {5,S} {6,S} 2 C u0 p0 c0 {1,D} {3,S} {7,S} 3 C u1 p0 c0 {2,S} {4,S} {8,S} 4 C u1 p0 c0 {3,S} {9,S} {10,S} 5 H u0 p0 c0 {1,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {2,S} 8 H u0 p0 c0 {3,S} 9 H u0 p0 c0 {4,S} 10 H u0 p0 c0 {4,S} """ # radical positions 1 and 2 adjlist2 = """ 1 C u1 p0 c0 {2,S} {5,S} {6,S} 2 C u1 p0 c0 {1,S} {3,S} {7,S} 3 C u0 p0 c0 {2,S} {4,D} {8,S} 4 C u0 p0 c0 {3,D} {9,S} {10,S} 5 H u0 p0 c0 {1,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {2,S} 8 H u0 p0 c0 {3,S} 9 H u0 p0 c0 {4,S} 10 H u0 p0 c0 {4,S} """ u_layers = [] for adjlist in [adjlist1, adjlist2]: mol = Molecule().from_adjacency_list(adjlist) u_layer = create_augmented_layers(mol)[0] u_layers.append(u_layer) self.assertEquals(u_layers[0], u_layers[1])
def test_methane(self): smi = 'C' mol = Molecule().from_smiles(smi) ulayer, player = create_augmented_layers(mol) self.assertTrue(not ulayer) self.assertTrue(not player)