Exemple #1
0
    def calcDihedralForce(self, dihedral):
        if dihedral.get_conformation() is None:
            return

        cosdelta = 1.0
        if dihedral.get_conformation() == 'cis':
            cosdelta = -1.0

        atom1 = dihedral.get_a_1()
        atom2 = dihedral.get_a_2()
        atom3 = dihedral.get_a_3()
        atom4 = dihedral.get_a_4()

        rij = vectorFromAtoms(dihedral.get_a_1(),dihedral.get_a_2())
        rkj = vectorFromAtoms(dihedral.get_a_3(),dihedral.get_a_2())
        rkl = vectorFromAtoms(dihedral.get_a_3(),dihedral.get_a_4())


        k = 33.5

        #rmj = np.cross(rij,rkj)
        #rnk = np.cross(rkj,rkl)

        dkj2 = np.linalg.norm(rkj)*np.linalg.norm(rkj)

        frim = np.dot(rij,rkj) / dkj2
        frln = np.dot(rkl,rkj) / dkj2

        rim = np.array(rij) - frim * np.array(rkj)
        rln = frln * np.array(rkj) - np.array(rkl)

        dim = math.sqrt(np.linalg.norm(rim)*np.linalg.norm(rim))
        dln = math.sqrt(np.linalg.norm(rln)*np.linalg.norm(rln))

        ip = np.dot(rim,rln)


        cosphi = ip / (dim * dln)
        cosphi2 = cosphi*cosphi
        cosphi3 = cosphi2*cosphi
        cosphi4 = cosphi3*cosphi

        cosmphi = cosphi
        dcosmphi = 1


        ki = -k * cosdelta * dcosmphi / dim
        kl = -k * cosdelta * dcosmphi / dln
        kj1 = frim - 1.0
        kj2 = frln

        fi = ki * (np.array(rln) / dln - np.array(rim) / dim * cosphi)
        fl = kl * (np.array(rim) / dim - np.array(rln) / dln * cosphi)
        fj = kj1 * np.array(fi) - kj2 * np.array(fl)
        fk = -1.0 * (np.array(fi) + np.array(fl) + np.array(fj))

        self.forces[int(atom1.get_nr()) - 1] += fi
        self.forces[int(atom2.get_nr()) - 1] += fj
        self.forces[int(atom3.get_nr()) - 1] += fk
        self.forces[int(atom4.get_nr()) - 1] += fl
Exemple #2
0
    def calcMediaTeta(self):
        media = 0.0
        for angle in self.top.get_angle_list():
            atom1 = angle.get_a_1()
            atom2 = angle.get_a_2()
            atom3 = angle.get_a_3()
            vecAB = vectorFromAtoms(atom2, atom1)
            vecAB = unit_vector(vecAB)
            vecBC = vectorFromAtoms(atom2, atom3)
            vecBC = unit_vector(vecBC)
            teta = self.angle_between(vecAB, vecBC)

            media += teta
Exemple #3
0
    def calcMediaAngle(self):
        media = 0.0
        for angle in self.top.get_angle_list():
            atom1 = angle.get_a_1()
            atom2 = angle.get_a_2()
            atom3 = angle.get_a_3()
            vecAB = vectorFromAtoms(atom2, atom1)
            vecAB = unit_vector(vecAB)
            vecBC = vectorFromAtoms(atom2, atom3)
            vecBC = unit_vector(vecBC)
            teta = self.cosine_similarity(vecAB, vecBC)

            media += teta
Exemple #4
0
    def calcAngledForce(self, angle, ff_angles):
        k = 1000
        cost0 = -0.5  # 120 degree

        atom1 = angle.get_a_1()
        atom2 = angle.get_a_2()
        atom3 = angle.get_a_3()

        # Overwrite the hardcoded params
        if ff_angles is not None:
            t0 = ff_angles[angle.get_param()][0]
            cost0 = np.cos(t0 * (np.pi / 180))
            # k     = ff_angles[angle.get_param()][1]

        vecAB = self.vectorFromAtoms(atom1, atom2)
        vecAB = unit_vector(vecAB)
        vecCB = vectorFromAtoms(atom3, atom2)
        vecCB = unit_vector(vecCB)
        costeta = self.cosine_2unit_v(vecAB, vecCB)
        df = -k * (costeta - cost0)
        forceA = df * (vecCB - vecAB * costeta)
        forceC = df * (vecAB - vecCB * costeta)
        forceB = -1 * forceA - forceC

        self.forces[int(atom1.get_nr()) - 1] += forceA
        self.forces[int(atom2.get_nr()) - 1] += forceB
        self.forces[int(atom3.get_nr()) - 1] += forceC
        self.totalAngles[0] += self.calcVectorModule(forceA)
        self.totalAngles[1] += self.calcVectorModule(forceB)
        self.totalAngles[2] += self.calcVectorModule(forceC)
Exemple #5
0
    def calcDihedralEnergy(self, dihedral, ff_dihedrals):
        if dihedral.get_conformation() is None:
            return 0

        cosdelta = 1.0
        if dihedral.get_conformation() == 'cis':
            cosdelta = -1.0

        rij = vectorFromAtoms(dihedral.get_a_1(), dihedral.get_a_2())
        rkj = vectorFromAtoms(dihedral.get_a_3(), dihedral.get_a_2())
        rkl = vectorFromAtoms(dihedral.get_a_3(), dihedral.get_a_4())

        # Overwrite the hardcoded params
        if ff_dihedrals is not None:
            delta = ff_dihedrals[dihedral.get_param()][0]
            cosdelta = np.cos(delta * (np.pi / 180))

        k = 33.5

        dkj2 = np.linalg.norm(rkj) * np.linalg.norm(rkj)

        frim = np.dot(rij, rkj) / dkj2
        frln = np.dot(rkl, rkj) / dkj2

        rim = np.array(rij) - frim * np.array(rkj)
        rln = frln * np.array(rkj) - np.array(rkl)

        dim = math.sqrt(np.linalg.norm(rim) * np.linalg.norm(rim))
        dln = math.sqrt(np.linalg.norm(rln) * np.linalg.norm(rln))

        ip = np.dot(rim, rln)

        cosphi = ip / (dim * dln)
        # This is a simplified formula considering only multiplicity 2

        cosmphi = cosphi

        energy = k * (1 + cosdelta * cosmphi)

        return energy
Exemple #6
0
    def calcAngledForce(self, angle):
        k = 1000
        cost0 = -0.5  # 120 degree
        atom1 = angle.get_a_1()
        atom2 = angle.get_a_2()
        atom3 = angle.get_a_3()

        vecAB = self.vectorFromAtoms(atom1, atom2)
        vecAB = unit_vector(vecAB)
        vecCB = vectorFromAtoms(atom3, atom2)
        vecCB = unit_vector(vecCB)
        costeta = self.cosine_2unit_v(vecAB, vecCB)
        df = -k * (costeta - cost0)
        forceA = df * (vecCB - vecAB * costeta)
        forceC = df * (vecAB - vecCB * costeta)
        forceB = -1 * forceA - forceC

        self.forces[int(atom1.get_nr()) - 1] += forceA
        self.forces[int(atom2.get_nr()) - 1] += forceB
        self.forces[int(atom3.get_nr()) - 1] += forceC
Exemple #7
0
    def calcAngleEnergy(self, angle, ff_angles):
        k = 1000
        cost0 = -0.5  # 120 degree
        atom1 = angle.get_a_1()
        atom2 = angle.get_a_2()
        atom3 = angle.get_a_3()

        #Overwrite the hardcoded params
        if ff_angles is not None:
            t0 = ff_angles[angle.get_param()][0]
            cost0 = np.cos(t0 * (np.pi / 180))
            k = ff_angles[angle.get_param()][1]

        vecAB = self.vectorFromAtoms(atom1, atom2)
        vecAB = unit_vector(vecAB)
        vecCB = vectorFromAtoms(atom3, atom2)
        vecCB = unit_vector(vecCB)
        costeta = self.cosine_2unit_v(vecAB, vecCB)
        energy = 0.5 * k * (costeta - cost0)**2
        return energy
Exemple #8
0
    def setPositionNeighbor(self, neighbor, atom, count, insertedNeighbors,
                            previousAtom):
        bond = 0.10 if ((neighbor.get_atomtype() == 'H') or
                        (neighbor.get_atomtype() == 'HC')) else 0.15
        if previousAtom == atom:
            if count == 0:
                # print ("COUNT 0 - level 0")
                neighbor.setposition(atom.get_x() + bond, atom.get_y(),
                                     atom.get_z())
                return
            if count == 1:
                # print ("COUNT 1 - level 0!!!")
                z = 1
                cos = -0.5
                sin = 0.866
                x = atom.get_x() + bond * cos
                y = atom.get_y() + bond * sin

                neighbor.setposition(x, y, z)
                return
            if count == 2:
                # print("COUNT 2 - level 0!!!")
                v1 = unit_vector(vectorFromAtoms(insertedNeighbors[0], atom))
                v2 = unit_vector(vectorFromAtoms(insertedNeighbors[1], atom))
                v3 = unit_vector(np.array(v1) + np.array(v2))
                position = np.array([atom.get_x(),
                                     atom.get_y(),
                                     atom.get_z()]) - bond * np.array(v3)
                neighbor.setposition(position[0], position[1], position[2])
                return
            if count == 3:
                neighbor.setposition(
                    atom.get_x(), atom.get_y(),
                    atom.get_z() - 0.1 + random.uniform(0, 0.05))
                return

        if count == 0:
            dihedral = self.find_dihedral(previousAtom, atom)
            if dihedral != None:
                # print("COUNT 0a - level 1!!!")
                otherAtom = None
                if dihedral.get_a_1() == neighbor:
                    otherAtom = dihedral.get_a_4()
                if dihedral.get_a_4() == neighbor:
                    otherAtom = dihedral.get_a_1()
                v1 = unit_vector(vectorFromAtoms(otherAtom, previousAtom))
                v2 = unit_vector(vectorFromAtoms(previousAtom, atom))
                v4 = unit_vector(np.cross(v1, v2))
                if dihedral.get_conformation() is not None:
                    v5 = unit_vector(np.cross(v2, v4))
                    if dihedral.get_conformation() == 'cis':
                        v6 = bond * -0.5 * v2 - bond * 0.866 * -v5
                    else:
                        v6 = bond * -0.5 * v2 - bond * 0.866 * v5
                    position = np.array([
                        atom.get_x(), atom.get_y(),
                        atom.get_z()
                    ]) + v6
                    neighbor.setposition(position[0], position[1], position[2])
                    return

                v5 = unit_vector(np.cross(
                    v2, v4)) + (0, 0, random.uniform(-0.5, 0.5))
                v6 = bond * -0.5 * v2 - bond * 0.866 * unit_vector(v5)
                position = np.array([atom.get_x(),
                                     atom.get_y(),
                                     atom.get_z()]) + v6
                neighbor.setposition(position[0], position[1], position[2])
                return

            if dihedral is None:
                # print("COUNT 0b - level 1!!!")
                cos = -0.5
                sin = 0.866
                x = atom.get_x() + bond * cos
                y = atom.get_y() + bond * sin
                z = atom.get_z()
                neighbor.setposition(x, y, z)
                return

        if count == 1:
            # print("COUNT 1 - level 1!!!")
            sp3angle = math.radians(109.5)
            v2 = unit_vector(vectorFromAtoms(previousAtom, atom))
            v3 = unit_vector(vectorFromAtoms(insertedNeighbors[0], atom))
            v4 = unit_vector(-(v2 + v3))
            v5 = np.cross(v2, v3)

            position = np.array([atom.get_x(
            ), atom.get_y(), atom.get_z()]) + bond * math.sin(
                0.5 * sp3angle) * v5 + bond * math.cos(0.5 * sp3angle) * v4
            neighbor.setposition(position[0], position[1], position[2])
            return

        if count == 2:
            # print("COUNT 2 - level 1!!!")
            v1 = unit_vector(vectorFromAtoms(previousAtom, atom))
            v2 = unit_vector(vectorFromAtoms(insertedNeighbors[0], atom))
            v3 = unit_vector(vectorFromAtoms(insertedNeighbors[1], atom))
            v4 = v1 + v2 + v3
            position = np.array([atom.get_x(),
                                 atom.get_y(),
                                 atom.get_z()]) - bond * np.array(v4)
            neighbor.setposition(position[0], position[1], position[2])
            return
Exemple #9
0
    def setPositionNeighbor(self, neighbor, atom, count, insertedNeighbors,
                            previousAtom):
        bond = 0.10 if ((neighbor.get_atomtype() == 'H') or
                        (neighbor.get_atomtype() == 'HC')) else 0.15
        if previousAtom == atom:
            if count == 0:
                neighbor.setposition(atom.get_x() + bond, atom.get_y(),
                                     atom.get_z())
                return
            if count == 1:
                z = 1
                cos = -0.5
                sin = 0.866
                x = atom.get_x() + bond * cos
                y = atom.get_y() + bond * sin

                neighbor.setposition(x, y, z)
                return
            if count == 2:
                v1 = unit_vector(vectorFromAtoms(previousAtom, atom))
                v2 = unit_vector(vectorFromAtoms(insertedNeighbors[0], atom))
                v3 = unit_vector(np.array(v1) + np.array(v2))
                position = np.array([atom.get_x(),
                                     atom.get_y(),
                                     atom.get_z()]) - bond * np.array(v3)
                neighbor.setposition(position[0], position[1], position[2])
                return
            if count == 3:
                neighbor.setposition(
                    atom.get_x(), atom.get_y(),
                    atom.get_z() - 0.1 + random.uniform(0, 0.05))
                return

        if count == 0:
            dihedral = self.find_dihedral(previousAtom, atom)
            otherAtom = None
            if dihedral.get_a_1() == neighbor: otherAtom = dihedral.get_a_4()
            if dihedral.get_a_4() == neighbor: otherAtom = dihedral.get_a_1()
            v1 = unit_vector(vectorFromAtoms(otherAtom, previousAtom))
            v2 = unit_vector(vectorFromAtoms(previousAtom, atom))
            v4 = unit_vector(np.cross(v1, v2))
            if dihedral.get_conformation() is not None:
                v5 = unit_vector(np.cross(v2, v4))
                if dihedral.get_conformation() == 'cis':
                    v6 = bond * -0.5 * v2 - bond * 0.866 * -v5
                else:
                    v6 = bond * -0.5 * v2 - bond * 0.866 * v5
                position = np.array([atom.get_x(),
                                     atom.get_y(),
                                     atom.get_z()]) + v6
                neighbor.setposition(position[0], position[1], position[2])
                return

            v5 = unit_vector(np.cross(v2,
                                      v4)) + (0, 0, random.uniform(-0.5, 0.5))
            v6 = bond * -0.5 * v2 - bond * 0.866 * unit_vector(v5)
            position = np.array([atom.get_x(),
                                 atom.get_y(),
                                 atom.get_z()]) + v6
            neighbor.setposition(position[0], position[1], position[2])
            return
        if count == 1:
            v1 = unit_vector(vectorFromAtoms(previousAtom, atom))
            v2 = unit_vector(vectorFromAtoms(insertedNeighbors[0], atom))
            v3 = unit_vector(np.array(v1) + np.array(v2))
            position = np.array([atom.get_x(),
                                 atom.get_y(),
                                 atom.get_z()]) - bond * np.array(v3)
            neighbor.setposition(position[0], position[1], position[2])

            return
        if count == 2:
            v1 = unit_vector(vectorFromAtoms(previousAtom, atom))
            v2 = unit_vector(vectorFromAtoms(insertedNeighbors[0], atom))
            v3 = unit_vector(vectorFromAtoms(insertedNeighbors[1], atom))
            v4 = unit_vector(np.cross(v1, v2))
            position = np.array([atom.get_x(),
                                 atom.get_y(),
                                 atom.get_z()]) - bond * np.array(v4)
            neighbor.setposition(position[0], position[1], position[2])
            return