def buildMisOriList(self, calcAxis=False): quatCompsSym = Quat.calcSymEqvs(self.quatList, self.crystalSym) if self.refOri is None: self.refOri = Quat.calcAverageOri(quatCompsSym) misOriArray, minQuatComps = Quat.calcMisOri(quatCompsSym, self.refOri) self.averageMisOri = misOriArray.mean() self.misOriList = list(misOriArray) if calcAxis: # Now for axis calulation refOriInv = self.refOri.conjugate misOriAxis = np.empty((3, minQuatComps.shape[1])) Dq = np.empty((4, minQuatComps.shape[1])) # refOriInv * minQuat for all points (* is quaternion product) # change to minQuat * refOriInv Dq[0, :] = (refOriInv[0] * minQuatComps[0, :] - refOriInv[1] * minQuatComps[1, :] - refOriInv[2] * minQuatComps[2, :] - refOriInv[3] * minQuatComps[3, :]) Dq[1, :] = (refOriInv[1] * minQuatComps[0, :] + refOriInv[0] * minQuatComps[1, :] + refOriInv[3] * minQuatComps[2, :] - refOriInv[2] * minQuatComps[3, :]) Dq[2, :] = (refOriInv[2] * minQuatComps[0, :] + refOriInv[0] * minQuatComps[2, :] + refOriInv[1] * minQuatComps[3, :] - refOriInv[3] * minQuatComps[1, :]) Dq[3, :] = (refOriInv[3] * minQuatComps[0, :] + refOriInv[0] * minQuatComps[3, :] + refOriInv[2] * minQuatComps[1, :] - refOriInv[1] * minQuatComps[2, :]) Dq[:, Dq[0] < 0] = -Dq[:, Dq[0] < 0] # numpy broadcasting taking care of different array sizes misOriAxis[:, :] = (2 * Dq[1:4, :] * np.arccos(Dq[0, :])) / np.sqrt(1 - np.power(Dq[0, :], 2)) # hack it back into a list. Need to change self.*List to be arrays, it was a bad decision to # make them lists in the beginning self.misOriAxisList = [] for row in misOriAxis.transpose(): self.misOriAxisList.append(row)
def calcAverageOri(self): quatCompsSym = Quat.calcSymEqvs(self.quatList, self.crystalSym) self.refOri = Quat.calcAverageOri(quatCompsSym)