def distanceToFiber(c, s, q, qsym, **kwargs): """ """ csymFlag = False B = I3 arglen = len(kwargs) if len(c) != 3 or len(s) != 3: raise RuntimeError('c and/or s are not 3-vectors') # argument handling if arglen > 0: argkeys = list(kwargs.keys()) for i in range(arglen): if argkeys[i] == 'centrosymmetry': csymFlag = kwargs[argkeys[i]] elif argkeys[i] == 'bmatrix': B = kwargs[argkeys[i]] else: raise RuntimeError("keyword arg \'%s\' is not recognized" % (argkeys[i])) c = unitVector(dot(B, asarray(c))) s = unitVector(asarray(s).reshape(3, 1)) nq = q.shape[1] # number of quaternions rmats = rotMatOfQuat(q) # (nq, 3, 3) csym = applySym(c, qsym, csymFlag) # (3, m) m = csym.shape[1] # multiplicity if nq == 1: rc = dot(rmats, csym) # apply q's to c's sdotrc = dot(s.T, rc).max() else: rc = multMatArray( rmats, tile(csym, (nq, 1, 1)) ) # apply q's to c's sdotrc = dot( s.T, rc.swapaxes(1, 2).reshape(nq*m, 3).T ).reshape(nq, m).max(1) d = arccosSafe(array(sdotrc)) return d
def applySym(vec, qsym, csFlag=False, cullPM=False, tol=1e-8): """ apply symmetry group to a single 3-vector (columnar) argument csFlag : centrosymmetry flag cullPM : cull +/- flag """ nsym = qsym.shape[1] Rsym = rotMatOfQuat(qsym) allhkl = multMatArray(Rsym, tile(vec, (nsym, 1, 1))).swapaxes(1, 2).reshape(nsym, 3).T if csFlag: allhkl = hstack([allhkl, -1*allhkl]) eqv, uid = findDuplicateVectors(allhkl, tol=tol, equivPM=cullPM) return allhkl[ix_(range(3), uid)]
def distanceToFiber(c, s, q, qsym, **kwargs): """ """ csymFlag = False B = I3 arglen = len(kwargs) if len(c) != 3 or len(s) != 3: raise RuntimeError, 'c and/or s are not 3-vectors' # argument handling if arglen > 0: argkeys = kwargs.keys() for i in range(arglen): if argkeys[i] == 'centrosymmetry': csymFlag = kwargs[argkeys[i]] elif argkeys[i] == 'bmatrix': B = kwargs[argkeys[i]] else: raise RuntimeError('keyword arg \'%s\' is not recognized' \ % (argkeys[i])) c = unitVector( dot(B, asarray(c)) ) s = unitVector( asarray(s).reshape(3, 1) ) nq = q.shape[1] # number of quaternions rmats = rotMatOfQuat(q) # (nq, 3, 3) csym = applySym(c, qsym, csymFlag) # (3, m) m = csym.shape[1] # multiplicity if nq == 1: rc = dot(rmats, csym) # apply q's to c's sdotrc = dot( s.T, rc ).max() else: rc = multMatArray( rmats, tile(csym, (nq, 1, 1)) ) # apply q's to c's sdotrc = dot( s.T, rc.swapaxes(1, 2).reshape(nq*m, 3).T ).reshape(nq, m).max(1) d = arccosSafe( array(sdotrc) ) return d