def CalculateTorsionAngles(mol, tors_list, tors_list_rings, confId=-1): """ Calculate the torsion angles for a list of non-ring and a list of ring torsions. Arguments: - mol: the molecule of interest - tors_list: list of non-ring torsions - tors_list_rings: list of ring torsions - confId: index of the conformation (default: first conformer) Return: list of torsion angles """ torsions = [] conf = mol.GetConformer(confId) for t, maxdev in tors_list: if len(t) == 1: t = t[0] p1, p2, p3, p4 = _getTorsionAtomPositions(t, conf) tors = (Geometry.ComputeSignedDihedralAngle(p1, p2, p3, p4) / math.pi) * 180.0 if tors < 0: tors += 360.0 # angle between 0 and 360 else: # loop over torsions and take minimum tors = 360.0 for t2 in t: p1, p2, p3, p4 = _getTorsionAtomPositions(t2, conf) tmp = (Geometry.ComputeSignedDihedralAngle(p1, p2, p3, p4) / math.pi) * 180.0 if tmp < 0: tmp += 360.0 # angle between 0 and 360 if tmp < tors: tors = tmp torsions.append((tors, maxdev)) # rings for t, maxdev in tors_list_rings: num = len(t) # loop over torsions and sum them up tors = 0 for t2 in t: p1, p2, p3, p4 = _getTorsionAtomPositions(t2, conf) tmp = abs( (Geometry.ComputeSignedDihedralAngle(p1, p2, p3, p4) / math.pi) * 180.0) tors += tmp tors /= num torsions.append((tors, maxdev)) return torsions
def CalculateTorsionAngles(mol, tors_list, tors_list_rings, confId=-1): """ Calculate the torsion angles for a list of non-ring and a list of ring torsions. Arguments: - mol: the molecule of interest - tors_list: list of non-ring torsions - tors_list_rings: list of ring torsions - confId: index of the conformation (default: first conformer) Return: list of torsion angles """ torsions = [] conf = mol.GetConformer(confId) for quartets, maxdev in tors_list: tors = [] # loop over torsions and calculate angle for atoms in quartets: p1, p2, p3, p4 = _getTorsionAtomPositions(atoms, conf) tmpTors = (Geometry.ComputeSignedDihedralAngle(p1, p2, p3, p4) / math.pi) * 180.0 if tmpTors < 0: tmpTors += 360.0 # angle between 0 and 360 tors.append(tmpTors) torsions.append((tors, maxdev)) # rings for quartets, maxdev in tors_list_rings: num = len(quartets) # loop over torsions and sum them up tors = 0 for atoms in quartets: p1, p2, p3, p4 = _getTorsionAtomPositions(atoms, conf) tmpTors = abs( (Geometry.ComputeSignedDihedralAngle(p1, p2, p3, p4) / math.pi) * 180.0) tors += tmpTors tors /= num torsions.append(([tors], maxdev)) return torsions