axis = np.array([ 0.66931818,-0.98578066,0.73593251]) rMat1 = xf.makeBinaryRotMat(axis) rMat2 = xfcapi.makeBinaryRotMat(axis) print "makeBinaryRotMat results match: ",np.linalg.norm(rMat1-rMat2)/np.linalg.norm(rMat1) < epsf bHat = np.array([0.0,0.0,-1.0]) eta = np.array([1.0,0.0,0.0]) rMat1 = xf.makeEtaFrameRotMat(bHat,eta) rMat2 = xfcapi.makeEtaFrameRotMat(bHat,eta) print "makeEtaFrameRotMat results match: ",np.linalg.norm(rMat1-rMat2)/np.linalg.norm(rMat1) < epsf angles = np.array([random.uniform(-np.pi,np.pi),random.uniform(-np.pi,np.pi),random.uniform(-np.pi,np.pi)]) aMin = np.array([random.uniform(-np.pi,np.pi),random.uniform(-np.pi,np.pi)]) aMax = np.array([random.uniform(-np.pi,np.pi),random.uniform(-np.pi,np.pi)]) va1 = xf.validateAngleRanges(angles,aMin,aMax) va2 = xfcapi.validateAngleRanges(angles,aMin,aMax) print angles print aMin,aMax print va1,va2 print "validateAngleRanges results match: ",np.array_equiv(va1,va2) angle = np.array([0.1]) axis = np.array([[ 0.47792,-0.703887,0.525486]]) axis /= np.linalg.norm(axis) vecs = np.array([[ 1.0, 2.0, 3.0]]) rVec1 = xf.rotate_vecs_about_axis(angle,axis.T,vecs.T) rVec2 = xfcapi.rotate_vecs_about_axis(angle,axis,vecs) print "rotate_vecs_about_axis results match: ",np.linalg.norm(rVec1.T-rVec2)/np.linalg.norm(rVec1) < epsf
def paintGridThis(quat): """ """ # pull local vars from globals set in paintGrid global symHKLs_MP, wavelength_MP global omeMin_MP, omeMax_MP, omeTol_MP global etaMin_MP, etaMax_MP, etaTol_MP global omeIndices_MP, etaIndices_MP global omeEdges_MP, etaEdges_MP global hklList_MP, hklIDs_MP global etaOmeMaps_MP global bMat_MP global threshold_MP symHKLs = symHKLs_MP wavelength = wavelength_MP hklIDs = hklIDs_MP hklList = hklList_MP omeMin = omeMin_MP omeMax = omeMax_MP omeTol = omeTol_MP omeIndices = omeIndices_MP omeEdges = omeEdges_MP etaMin = etaMin_MP etaMax = etaMax_MP etaTol = etaTol_MP etaIndices = etaIndices_MP etaEdges = etaEdges_MP etaOmeMaps = etaOmeMaps_MP bMat = bMat_MP threshold = threshold_MP # need this for proper index generation omegas = [omeEdges[0] + (i+0.5)*(omeEdges[1] - omeEdges[0]) for i in range(len(omeEdges) - 1)] etas = [etaEdges[0] + (i+0.5)*(etaEdges[1] - etaEdges[0]) for i in range(len(etaEdges) - 1)] delOmeSign = num.sign(omegas[1] - omegas[0]) del_ome = abs(omegas[1] - omegas[0]) del_eta = abs(etas[1] - etas[0]) dpix_ome = round(omeTol / del_ome) dpix_eta = round(etaTol / del_eta) debug = False if debug: print "using ome, eta dilitations of (%d, %d) pixels" % (dpix_ome, dpix_eta) nHKLs = len(hklIDs) rMat = rotMatOfQuat(quat) nPredRefl = 0 nMeasRefl = 0 reflInfoList = [] dummySpotInfo = num.nan * num.ones(3) hklCounterP = 0 # running count of excpected (predicted) HKLs hklCounterM = 0 # running count of "hit" HKLs for iHKL in range(nHKLs): # select and C-ify symmetric HKLs these_hkls = num.array(symHKLs[hklIDs[iHKL]].T, dtype=float, order='C') # oscillation angle arrays oangs = xfcapi.oscillAnglesOfHKLs(these_hkls, 0., rMat, bMat, wavelength) angList = num.vstack(oangs) if not num.all(num.isnan(angList)): angList[:, 1] = xf.mapAngle(angList[:, 1]) angList[:, 2] = xf.mapAngle(angList[:, 2]) if omeMin is None: omeMin = [-num.pi, ] omeMax = [ num.pi, ] if etaMin is None: etaMin = [-num.pi, ] etaMax = [ num.pi, ] angMask = num.logical_and( xf.validateAngleRanges(angList[:, 1], etaMin, etaMax), xf.validateAngleRanges(angList[:, 2], omeMin, omeMax)) allAngs_m = angList[angMask, :] # not output # # duplicate HKLs # not output # allHKLs_m = num.vstack([these_hkls, these_hkls])[angMask, :] culledTTh = allAngs_m[:, 0] culledEta = allAngs_m[:, 1] culledOme = allAngs_m[:, 2] # not output # culledHKLs = allHKLs_m.T nThisPredRefl = len(culledTTh) hklCounterP += nThisPredRefl for iTTh in range(nThisPredRefl): culledEtaIdx = num.where(etaEdges - culledEta[iTTh] > 0)[0] if len(culledEtaIdx) > 0: culledEtaIdx = culledEtaIdx[0] - 1 if culledEtaIdx < 0: culledEtaIdx = None else: culledEtaIdx = None culledOmeIdx = num.where(omeEdges - culledOme[iTTh] > 0)[0] if len(culledOmeIdx) > 0: if delOmeSign > 0: culledOmeIdx = culledOmeIdx[0] - 1 else: culledOmeIdx = culledOmeIdx[-1] if culledOmeIdx < 0: culledOmeIdx = None else: culledOmeIdx = None if culledEtaIdx is not None and culledOmeIdx is not None: if dpix_ome > 0 or dpix_eta > 0: i_dil, j_dil = num.meshgrid(num.arange(-dpix_ome, dpix_ome + 1), num.arange(-dpix_eta, dpix_eta + 1)) i_sup = omeIndices[culledOmeIdx] + num.array([i_dil.flatten()], dtype=int) j_sup = etaIndices[culledEtaIdx] + num.array([j_dil.flatten()], dtype=int) # catch shit that falls off detector... # ...maybe make this fancy enough to wrap at 2pi? i_max, j_max = etaOmeMaps[iHKL].shape idx_mask = num.logical_and(num.logical_and(i_sup >= 0, i_sup < i_max), num.logical_and(j_sup >= 0, j_sup < j_max)) pixelVal = etaOmeMaps[iHKL][i_sup[idx_mask], j_sup[idx_mask]] else: pixelVal = etaOmeMaps[iHKL][omeIndices[culledOmeIdx], etaIndices[culledEtaIdx] ] isHit = num.any(pixelVal >= threshold[iHKL]) if isHit: hklCounterM += 1 pass pass # disabled # if debug: # disabled # print "hkl %d -->\t%d\t%d\t%d\t" % (iHKL, culledHKLs[0, iTTh], culledHKLs[1, iTTh], culledHKLs[2, iTTh]) + \ # disabled # "isHit=%d\tpixel value: %g\n" % (isHit, pixelVal) + \ # disabled # "eta index: %d,%d\tetaP: %g\n" % (culledEtaIdx, etaIndices[culledEtaIdx], r2d*culledEta[iTTh]) + \ # disabled # "ome index: %d,%d\tomeP: %g\n" % (culledOmeIdx, omeIndices[culledOmeIdx], r2d*culledOme[iTTh]) # disabled # pass pass # close conditional on valid reflections pass # close loop on signed reflections pass # close loop on HKL if hklCounterP == 0: retval = 0. else: retval = float(hklCounterM) / float(hklCounterP) return retval
def paintGridThis(quat): """ """ # pull local vars from globals set in paintGrid global symHKLs_MP, wavelength_MP global omeMin_MP, omeMax_MP, omeTol_MP, omePeriod_MP global etaMin_MP, etaMax_MP, etaTol_MP global omeIndices_MP, etaIndices_MP global omeEdges_MP, etaEdges_MP global hklList_MP, hklIDs_MP global etaOmeMaps_MP global bMat_MP global threshold_MP symHKLs = symHKLs_MP wavelength = wavelength_MP hklIDs = hklIDs_MP hklList = hklList_MP omeMin = omeMin_MP omeMax = omeMax_MP omeTol = omeTol_MP omePeriod = omePeriod_MP omeIndices = omeIndices_MP omeEdges = omeEdges_MP etaMin = etaMin_MP etaMax = etaMax_MP etaTol = etaTol_MP etaIndices = etaIndices_MP etaEdges = etaEdges_MP etaOmeMaps = etaOmeMaps_MP bMat = bMat_MP threshold = threshold_MP # need this for proper index generation omegas = [ omeEdges[0] + (i + 0.5) * (omeEdges[1] - omeEdges[0]) for i in range(len(omeEdges) - 1) ] etas = [ etaEdges[0] + (i + 0.5) * (etaEdges[1] - etaEdges[0]) for i in range(len(etaEdges) - 1) ] delOmeSign = num.sign(omegas[1] - omegas[0]) del_ome = abs(omegas[1] - omegas[0]) del_eta = abs(etas[1] - etas[0]) dpix_ome = round(omeTol / del_ome) dpix_eta = round(etaTol / del_eta) debug = False if debug: print "using ome, eta dilitations of (%d, %d) pixels" % (dpix_ome, dpix_eta) nHKLs = len(hklIDs) rMat = rotMatOfQuat(quat) nPredRefl = 0 nMeasRefl = 0 reflInfoList = [] dummySpotInfo = num.nan * num.ones(3) hklCounterP = 0 # running count of excpected (predicted) HKLs hklCounterM = 0 # running count of "hit" HKLs for iHKL in range(nHKLs): # select and C-ify symmetric HKLs these_hkls = num.array(symHKLs[hklIDs[iHKL]].T, dtype=float, order='C') # oscillation angle arrays oangs = xfcapi.oscillAnglesOfHKLs(these_hkls, 0., rMat, bMat, wavelength) angList = num.vstack(oangs) if not num.all(num.isnan(angList)): idx = -num.isnan(angList[:, 0]) angList = angList[idx, :] angList[:, 1] = xf.mapAngle(angList[:, 1]) angList[:, 2] = xf.mapAngle(angList[:, 2], omePeriod) if omeMin is None: omeMin = [ -num.pi, ] omeMax = [ num.pi, ] if etaMin is None: etaMin = [ -num.pi, ] etaMax = [ num.pi, ] angMask = num.logical_and( xf.validateAngleRanges(angList[:, 1], etaMin, etaMax), xf.validateAngleRanges(angList[:, 2], omeMin, omeMax)) allAngs_m = angList[angMask, :] # not output # # duplicate HKLs # not output # allHKLs_m = num.vstack([these_hkls, these_hkls])[angMask, :] culledTTh = allAngs_m[:, 0] culledEta = allAngs_m[:, 1] culledOme = allAngs_m[:, 2] # not output # culledHKLs = allHKLs_m.T nThisPredRefl = len(culledTTh) hklCounterP += nThisPredRefl for iTTh in range(nThisPredRefl): culledEtaIdx = num.where(etaEdges - culledEta[iTTh] > 0)[0] if len(culledEtaIdx) > 0: culledEtaIdx = culledEtaIdx[0] - 1 if culledEtaIdx < 0: culledEtaIdx = None else: culledEtaIdx = None culledOmeIdx = num.where(omeEdges - culledOme[iTTh] > 0)[0] if len(culledOmeIdx) > 0: if delOmeSign > 0: culledOmeIdx = culledOmeIdx[0] - 1 else: culledOmeIdx = culledOmeIdx[-1] if culledOmeIdx < 0: culledOmeIdx = None else: culledOmeIdx = None if culledEtaIdx is not None and culledOmeIdx is not None: if dpix_ome > 0 or dpix_eta > 0: i_dil, j_dil = num.meshgrid( num.arange(-dpix_ome, dpix_ome + 1), num.arange(-dpix_eta, dpix_eta + 1)) i_sup = omeIndices[culledOmeIdx] + num.array( [i_dil.flatten()], dtype=int) j_sup = etaIndices[culledEtaIdx] + num.array( [j_dil.flatten()], dtype=int) # catch shit that falls off detector... # ...maybe make this fancy enough to wrap at 2pi? i_max, j_max = etaOmeMaps[iHKL].shape idx_mask = num.logical_and( num.logical_and(i_sup >= 0, i_sup < i_max), num.logical_and(j_sup >= 0, j_sup < j_max)) pixelVal = etaOmeMaps[iHKL][i_sup[idx_mask], j_sup[idx_mask]] else: pixelVal = etaOmeMaps[iHKL][omeIndices[culledOmeIdx], etaIndices[culledEtaIdx]] isHit = num.any(pixelVal >= threshold[iHKL]) if isHit: hklCounterM += 1 pass pass # disabled # if debug: # disabled # print "hkl %d -->\t%d\t%d\t%d\t" % (iHKL, culledHKLs[0, iTTh], culledHKLs[1, iTTh], culledHKLs[2, iTTh]) + \ # disabled # "isHit=%d\tpixel value: %g\n" % (isHit, pixelVal) + \ # disabled # "eta index: %d,%d\tetaP: %g\n" % (culledEtaIdx, etaIndices[culledEtaIdx], r2d*culledEta[iTTh]) + \ # disabled # "ome index: %d,%d\tomeP: %g\n" % (culledOmeIdx, omeIndices[culledOmeIdx], r2d*culledOme[iTTh]) # disabled # pass pass # close conditional on valid reflections pass # close loop on signed reflections pass # close loop on HKL if hklCounterP == 0: retval = 0. else: retval = float(hklCounterM) / float(hklCounterP) return retval
bHat = np.array([0.0, 0.0, -1.0]) eta = np.array([1.0, 0.0, 0.0]) rMat1 = xf.makeEtaFrameRotMat(bHat, eta) rMat2 = xfcapi.makeEtaFrameRotMat(bHat, eta) print "makeEtaFrameRotMat results match: ", np.linalg.norm( rMat1 - rMat2) / np.linalg.norm(rMat1) < epsf angles = np.array([ random.uniform(-np.pi, np.pi), random.uniform(-np.pi, np.pi), random.uniform(-np.pi, np.pi) ]) aMin = np.array([random.uniform(-np.pi, np.pi), random.uniform(-np.pi, np.pi)]) aMax = np.array([random.uniform(-np.pi, np.pi), random.uniform(-np.pi, np.pi)]) va1 = xf.validateAngleRanges(angles, aMin, aMax) va2 = xfcapi.validateAngleRanges(angles, aMin, aMax) print angles print aMin, aMax print va1, va2 print "validateAngleRanges results match: ", np.array_equiv(va1, va2) angle = np.array([0.1]) axis = np.array([[0.47792, -0.703887, 0.525486]]) axis /= np.linalg.norm(axis) vecs = np.array([[1.0, 2.0, 3.0]]) rVec1 = xf.rotate_vecs_about_axis(angle, axis.T, vecs.T) rVec2 = xfcapi.rotate_vecs_about_axis(angle, axis, vecs) print "rotate_vecs_about_axis results match: ", np.linalg.norm( rVec1.T - rVec2) / np.linalg.norm(rVec1) < epsf
def paintGridThis(quat): """ """ # Unpack common parameters into locals symHKLs = paramMP['symHKLs'] symHKLs_ix = paramMP['symHKLs_ix'] wavelength = paramMP['wavelength'] hklList = paramMP['hklList'] omeMin = paramMP['omeMin'] omeMax = paramMP['omeMax'] omeTol = paramMP['omeTol'] omePeriod = paramMP['omePeriod'] omeIndices = paramMP['omeIndices'] omeEdges = paramMP['omeEdges'] etaMin = paramMP['etaMin'] etaMax = paramMP['etaMax'] etaTol = paramMP['etaTol'] etaIndices = paramMP['etaIndices'] etaEdges = paramMP['etaEdges'] etaOmeMaps = paramMP['etaOmeMaps'] bMat = paramMP['bMat'] threshold = paramMP['threshold'] # need this for proper index generation delOmeSign = num.sign(omeEdges[1] - omeEdges[0]) del_ome = abs(omeEdges[1] - omeEdges[0]) del_eta = abs(etaEdges[1] - etaEdges[0]) dpix_ome = round(omeTol / del_ome) dpix_eta = round(etaTol / del_eta) debug = False if debug: print "using ome, eta dilitations of (%d, %d) pixels" \ % (dpix_ome, dpix_eta) nHKLs = len(symHKLs_ix) - 1 rMat = rotMatOfQuat(quat) nPredRefl = 0 nMeasRefl = 0 reflInfoList = [] dummySpotInfo = num.nan * num.ones(3) # Compute the oscillation angles of all the symHKLs at once oangs_pair = xfcapi.oscillAnglesOfHKLs( symHKLs, 0., rMat, bMat, wavelength) # Interleave the two produced oang solutions to simplify later processing oangs = num.empty((len(symHKLs)*2, 3), dtype=oangs_pair[0].dtype) oangs[0::2] = oangs_pair[0] oangs[1::2] = oangs_pair[1] # Map all of the angles at once oangs[:, 1] = xf.mapAngle(oangs[:, 1]) oangs[:, 2] = xf.mapAngle(oangs[:, 2], omePeriod) # Create a mask of the good ones oangMask = num.logical_and( ~num.isnan(oangs[:, 0]), num.logical_and( xf.validateAngleRanges(oangs[:, 1], etaMin, etaMax), xf.validateAngleRanges(oangs[:, 2], omeMin, omeMax))) hklCounterP = 0 # running count of excpected (predicted) HKLs hklCounterM = 0 # running count of "hit" HKLs for iHKL in range(nHKLs): start, stop = symHKLs_ix[iHKL:iHKL+2] start, stop = (2*start, 2*stop) angList = oangs[start:stop] angMask = oangMask[start:stop] allAngs_m = angList[angMask, :] if len(allAngs_m) > 0: # not output # # duplicate HKLs # not output # allHKLs_m = num.vstack( # [these_hkls, these_hkls] # )[angMask, :] culledTTh = allAngs_m[:, 0] culledEta = allAngs_m[:, 1] culledOme = allAngs_m[:, 2] # not output # culledHKLs = allHKLs_m.T nThisPredRefl = len(culledTTh) hklCounterP += nThisPredRefl for iTTh in range(nThisPredRefl): culledEtaIdx = num.where(etaEdges - culledEta[iTTh] > 0)[0] if len(culledEtaIdx) > 0: culledEtaIdx = culledEtaIdx[0] - 1 if culledEtaIdx < 0: culledEtaIdx = None else: culledEtaIdx = None culledOmeIdx = num.where(omeEdges - culledOme[iTTh] > 0)[0] if len(culledOmeIdx) > 0: if delOmeSign > 0: culledOmeIdx = culledOmeIdx[0] - 1 else: culledOmeIdx = culledOmeIdx[-1] if culledOmeIdx < 0: culledOmeIdx = None else: culledOmeIdx = None if culledEtaIdx is not None and culledOmeIdx is not None: if dpix_ome > 0 or dpix_eta > 0: i_dil, j_dil = _meshgrid2d( num.arange(-dpix_ome, dpix_ome + 1), num.arange(-dpix_eta, dpix_eta + 1) ) i_sup = omeIndices[culledOmeIdx] + num.array( [i_dil.flatten()], dtype=int ) j_sup = etaIndices[culledEtaIdx] + num.array( [j_dil.flatten()], dtype=int ) # catch shit that falls off detector... # ...maybe make this fancy enough to wrap at 2pi? i_max, j_max = etaOmeMaps[iHKL].shape idx_mask = num.logical_and( num.logical_and(i_sup >= 0, i_sup < i_max), num.logical_and(j_sup >= 0, j_sup < j_max) ) pixelVal = etaOmeMaps[iHKL][ i_sup[idx_mask], j_sup[idx_mask] ] else: pixelVal = etaOmeMaps[iHKL][ omeIndices[culledOmeIdx], etaIndices[culledEtaIdx] ] isHit = num.any(pixelVal >= threshold[iHKL]) if isHit: hklCounterM += 1 # if debug: # print "hkl %d -->\t%d\t%d\t%d\t" % ( # iHKL, culledHKLs[0, iTTh], culledHKLs[1, iTTh], # culledHKLs[2, iTTh] # ) \ # + "isHit=%d\tpixel value: %g\n" % (isHit, pixelVal) \ # + "eta index: %d,%d\tetaP: %g\n" % ( # culledEtaIdx, etaIndices[culledEtaIdx], # r2d*culledEta[iTTh] # ) \ # + "ome index: %d,%d\tomeP: %g\n" % ( # culledOmeIdx, omeIndices[culledOmeIdx], # r2d*culledOme[iTTh] # ) # # close conditional on valid reflections # close loop on signed reflections # close loop on HKL if hklCounterP == 0: retval = 0. else: retval = float(hklCounterM) / float(hklCounterP) return retval