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 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 getAlignRotation(XA, XB): print "WARNING: getAlignRotation is obsolete, use find_rotation" return rotations.mx2q(findrotation(XA, XB))