Beispiel #1
0
    def next(self):
        # obtain first index for first call
        if self.idx2_1 is None:
            self.idx2_1 = self.iter1.next()

        # toggle inversion if inversion is possible
        if self.can_invert and self.invert == False and self.idx2_2 is not None:
            self.invert = True
        else:
            # determine next pair of indices
            self.invert = False
            # try to increment 2nd iterator
            try:
                self.idx2_2 = self.iter2.next()
            except StopIteration:
                # end of list, start over again
                self.iter2 = iter(self.candidates2)
                # and increment iter1
                self.idx2_1 = self.iter1.next()
                self.idx2_2 = None
                return self.next()

        if self.idx2_1 == self.idx2_2:
            return self.next()

        x1 = self.x1
        x2 = self.x2
        idx1_1 = self.idx1_1
        idx1_2 = self.idx1_2
        idx2_1 = self.idx2_1
        idx2_2 = self.idx2_2

        assert idx1_1 is not None
        assert idx1_2 is not None
        assert idx2_1 is not None
        assert idx2_2 is not None

        # we can immediately trash the match if angle does not match
        try:
            cos_theta2 = np.dot(x2[idx2_1], x2[idx2_2]) / \
                (np.linalg.norm(x2[idx2_1])*np.linalg.norm(x2[idx2_2]))
        except ValueError:
            raise
        if np.abs(cos_theta2 - self.cos_theta1) > 0.5:
            return self.next()

        mul = 1.0
        if self.invert:
            mul = -1.0

        # get rotation for current atom match candidates
        dist, rot = rmsfit.findrotation(x1[[idx1_1, idx1_2]],
                                        mul * x2[[idx2_1, idx2_2]],
                                        align_com=False)

        return rot, self.invert
Beispiel #2
0
    def next(self):
        # obtain first index for first call
        if self.idx2_1 is None:
            self.idx2_1 = self.iter1.next()

        # toggle inversion if inversion is possible
        if self.can_invert and self.invert == False and self.idx2_2 is not None:
            self.invert = True
        else:
            # determine next pair of indices
            self.invert = False
            # try to increment 2nd iterator
            try:
                self.idx2_2 = self.iter2.next()
            except StopIteration:
                # end of list, start over again
                self.iter2 = iter(self.candidates2)
                # and increment iter1
                self.idx2_1 = self.iter1.next()
                self.idx2_2 = None
                return self.next()

        if self.idx2_1 == self.idx2_2:
            return self.next()

        x1 = self.x1
        x2 = self.x2
        idx1_1 = self.idx1_1
        idx1_2 = self.idx1_2
        idx2_1 = self.idx2_1
        idx2_2 = self.idx2_2

        assert idx1_1 is not None
        assert idx1_2 is not None
        assert idx2_1 is not None
        assert idx2_2 is not None

        # we can immediately trash the match if angle does not match
        try:
            cos_theta2 = np.dot(x2[idx2_1], x2[idx2_2]) / \
                (np.linalg.norm(x2[idx2_1])*np.linalg.norm(x2[idx2_2]))
        except ValueError:
            raise
        if(np.abs(cos_theta2 - self.cos_theta1) > 0.5):
            return self.next()

        mul = 1.0
        if(self.invert):
            mul=-1.0

        # get rotation for current atom match candidates
        dist, rot = rmsfit.findrotation( \
                      x1[[idx1_1, idx1_2]], mul*x2[[idx2_1, idx2_2]], align_com=False)

        return rot, self.invert
 def find_rotation(self, X1, X2):
     dist, mx = findrotation(X1, X2)
     return dist, mx
 def find_rotation(self, X1, X2):
     dist, mx = findrotation(X1, X2)
     return dist, mx
def getAlignRotation(XA, XB):
    print "WARNING: getAlignRotation is obsolete, use find_rotation"
    return rotations.mx2q(findrotation(XA, XB))
def getAlignRotation(XA, XB):
    print "WARNING: getAlignRotation is obsolete, use find_rotation"
    return rotations.mx2q(findrotation(XA, XB))