def testTorsionFingerprintsColinearBonds(self): # test that single bonds adjacent to triple bonds are ignored mol = Chem.MolFromSmiles('CCC#CCC') tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists(mol, ignoreColinearBonds=True) self.assertEqual(len(tors_list), 0) weights = TorsionFingerprints.CalculateTorsionWeights(mol, ignoreColinearBonds=True) self.assertEqual(len(weights), 0) # test that they are not ignored, but alternative atoms searched for tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists( mol, ignoreColinearBonds=False) self.assertEqual(len(tors_list), 1) self.assertEqual(tors_list[0][0][0], (0, 1, 4, 5)) weights = TorsionFingerprints.CalculateTorsionWeights(mol, ignoreColinearBonds=False) self.assertEqual(len(weights), 1) # test that single bonds adjacent to terminal triple bonds are always ignored mol = Chem.MolFromSmiles('C#CCC') tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists(mol, ignoreColinearBonds=True) self.assertEqual(len(tors_list), 0) tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists( mol, ignoreColinearBonds=False) self.assertEqual(len(tors_list), 0)
def testTorsionFingerprints(self): # we use the xray structure from the paper (JCIM, 52, 1499, 2012): 1DWD refFile = os.path.join(RDConfig.RDCodeDir, 'Chem', 'test_data', '1DWD_ligand.pdb') ref = Chem.MolFromSmiles( 'NC(=[NH2+])c1ccc(C[C@@H](NC(=O)CNS(=O)(=O)c2ccc3ccccc3c2)C(=O)N2CCCCC2)cc1') mol = Chem.MolFromPDBFile(refFile) mol = AllChem.AssignBondOrdersFromTemplate(ref, mol) # the torsion lists tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists(mol) self.assertEqual(len(tors_list), 11) self.assertEqual(len(tors_list_rings), 4) self.assertAlmostEqual(tors_list[-1][1], 180.0, 4) tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists(mol, maxDev='spec') self.assertAlmostEqual(tors_list[-1][1], 90.0, 4) self.assertRaises(ValueError, TorsionFingerprints.CalculateTorsionLists, mol, maxDev='test') tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists(mol, symmRadius=0) self.assertEqual(len(tors_list[0][0]), 2) # the weights weights = TorsionFingerprints.CalculateTorsionWeights(mol) self.assertAlmostEqual(weights[4], 1.0) self.assertEqual(len(weights), len(tors_list + tors_list_rings)) weights = TorsionFingerprints.CalculateTorsionWeights(mol, 15, 14) self.assertAlmostEqual(weights[3], 1.0) self.assertRaises(ValueError, TorsionFingerprints.CalculateTorsionWeights, mol, 15, 3) # the torsion angles tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists(mol) torsions = TorsionFingerprints.CalculateTorsionAngles(mol, tors_list, tors_list_rings) self.assertEqual(len(weights), len(torsions)) self.assertAlmostEqual(torsions[2][0][0], 232.5346, 4) # the torsion fingerprint deviation tfd = TorsionFingerprints.CalculateTFD(torsions, torsions) self.assertAlmostEqual(tfd, 0.0) refFile = os.path.join(RDConfig.RDCodeDir, 'Chem', 'test_data', '1PPC_ligand.pdb') mol2 = Chem.MolFromPDBFile(refFile) mol2 = AllChem.AssignBondOrdersFromTemplate(ref, mol2) torsions2 = TorsionFingerprints.CalculateTorsionAngles(mol2, tors_list, tors_list_rings) weights = TorsionFingerprints.CalculateTorsionWeights(mol) tfd = TorsionFingerprints.CalculateTFD(torsions, torsions2, weights=weights) self.assertAlmostEqual(tfd, 0.0691, 4) tfd = TorsionFingerprints.CalculateTFD(torsions, torsions2) self.assertAlmostEqual(tfd, 0.1115, 4) # the wrapper functions tfd = TorsionFingerprints.GetTFDBetweenMolecules(mol, mol2) self.assertAlmostEqual(tfd, 0.0691, 4) mol.AddConformer(mol2.GetConformer(), assignId=True) mol.AddConformer(mol2.GetConformer(), assignId=True) tfd = TorsionFingerprints.GetTFDBetweenConformers(mol, confIds1=[0], confIds2=[1, 2]) self.assertEqual(len(tfd), 2) self.assertAlmostEqual(tfd[0], 0.0691, 4) tfdmat = TorsionFingerprints.GetTFDMatrix(mol) self.assertEqual(len(tfdmat), 3)
def __init__(self, mol_config: MolConfig, max_steps=200): super(ConformerEnv, self).__init__() logging.info('initializing conformer environment') self.config = copy.deepcopy(mol_config) self.max_steps = max_steps self.total_reward = 0 self.current_step = 0 self.step_info = {} self.episode_info = {} self.mol = self.config.mol # set mol to have exactly one conformer if self.mol.GetNumConformers() != 1: logging.warn( "Input molecule to environment should have exactly one conformer, none or more than one detected." ) self.mol.RemoveAllConformers() if Chem.EmbedMolecule(self.mol, randomSeed=self.config.seed, useRandomCoords=True) == -1: raise Exception( 'Unable to embed molecule with conformer using rdkit') self.conf = self.mol.GetConformer() nonring, ring = TorsionFingerprints.CalculateTorsionLists(self.mol) self.nonring = [list(atoms[0]) for atoms, ang in nonring] self.reset()
def testGithub4720(self): # exceptions with highly-coordinated atoms mol = Chem.MolFromSmiles('S(F)(F)(F)(F)(Cl)c1ccccc1') tors_list, tors_list_rings = TorsionFingerprints.CalculateTorsionLists( mol) self.assertEqual(len(tors_list), 1)
def calculate(self, mol): yield tuple( Torsion(*mol.get_atoms(atoms[0])) for atoms, _ in (TorsionFingerprints.CalculateTorsionLists(mol.to_rdkit_mol())[0]))