def test_rdkit_round_trip(self): """Test conversion to and from RDKitMol""" for mol in self.test_mols: rdkit_mol = to_rdkit_mol(mol) new_mol = from_rdkit_mol(Molecule(), rdkit_mol) self.assertTrue(mol.is_isomorphic(new_mol) or self.test_Hbond_free_mol.is_isomorphic(new_mol)) self.assertEqual(mol.get_element_count(), new_mol.get_element_count())
def _rdkit_translator(input_object, identifier_type, mol=None): """ Converts between formats using RDKit. If input is a :class:`Molecule`, the identifier_type is used to determine the output type. If the input is a `str`, then the identifier_type is used to identify the input, and the desired output is assumed to be a :class:`Molecule` object. Args: input_object: either molecule or string identifier identifier_type: format of string identifier 'inchi' -> InChI 'inchikey' -> InChI Key 'sma' -> SMARTS 'smi' -> SMILES mol: molecule object for output (optional) """ if identifier_type == 'inchi' and not Chem.inchi.INCHI_AVAILABLE: raise DependencyError("RDKit installed without InChI. Please reinstall to read and write InChI strings.") if isinstance(input_object, str): # We are converting from a string identifier to a molecule if identifier_type == 'inchi': rdkitmol = Chem.inchi.MolFromInchi(input_object, removeHs=False) elif identifier_type == 'sma': rdkitmol = Chem.MolFromSmarts(input_object) elif identifier_type == 'smi': rdkitmol = Chem.MolFromSmiles(input_object) else: raise ValueError('Identifier type {0} is not supported for reading using RDKit.'.format(identifier_type)) if rdkitmol is None: raise ValueError("Could not interpret the identifier {0!r}".format(input_object)) if mol is None: mol = mm.Molecule() output = from_rdkit_mol(mol, rdkitmol) elif isinstance(input_object, mm.Molecule): # We are converting from a molecule to a string identifier if identifier_type == 'smi': rdkitmol = to_rdkit_mol(input_object, sanitize=False) else: rdkitmol = to_rdkit_mol(input_object, sanitize=True) if identifier_type == 'inchi': output = Chem.inchi.MolToInchi(rdkitmol, options='-SNon') elif identifier_type == 'inchikey': inchi = to_inchi(input_object) output = Chem.inchi.InchiToInchiKey(inchi) elif identifier_type == 'sma': output = Chem.MolToSmarts(rdkitmol) elif identifier_type == 'smi': if input_object.is_aromatic(): output = Chem.MolToSmiles(rdkitmol) else: output = Chem.MolToSmiles(rdkitmol, kekuleSmiles=True) else: raise ValueError('Identifier type {0} is not supported for writing using RDKit.'.format(identifier_type)) else: raise ValueError('Unexpected input format. Should be a Molecule or a string.') return output
def test_lone_pair_retention(self): """Test that we don't lose any lone pairs on round trip RDKit conversion.""" mol = Molecule().from_adjacency_list(""" 1 C u0 p0 c0 {2,D} {3,S} {4,S} 2 O u0 p2 c0 {1,D} 3 H u0 p0 c0 {1,S} 4 H u0 p0 c0 {1,S} """) rdmol = to_rdkit_mol(mol) mol2 = from_rdkit_mol(Molecule(), rdmol) self.assertTrue(mol.is_isomorphic(mol2))