Пример #1
0
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
Пример #2
0
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