def make_old_detector_parfile( results, det_origin=(204.8, 204.8), filename=None ): tiltAngles = np.array(results['tiltAngles']) rMat_d = makeDetectorRotMat(tiltAngles) tVec_d = results['tVec_d'] - results['tVec_s'] beamXYD = old_detector_params_from_new( np.hstack([tiltAngles.flatten(), tVec_d.flatten()]), det_origin ) det_plist = np.zeros(12) det_plist[:3] = beamXYD.flatten() det_plist[3:6] = tiltAngles det_plist[6:] = results['dParams'] if filename is not None: if isinstance(filename, file): fid = filename elif isinstance(filename, str) or isinstance(filename, unicode): fid = open(filename, 'w') print >> fid, "# DETECTOR PARAMETERS (from new geometry model fit)" print >> fid, "# \n# <class 'hexrd.xrd.detector.DetectorGeomGE'>\n#" for i in range(len(det_plist)): print >> fid, "%1.8e\t%d" % (det_plist[i], 0) fid.close() return det_plist
def objFuncSX(pFit, pFull, pFlag, dFunc, dFlag, xyo_det, hkls_idx, bMat, vInv, wavelength, bVec, eVec, omePeriod, simOnly=False, returnScalarValue=returnScalarValue): """ """ npts = len(xyo_det) refineFlag = np.hstack([pFlag, dFlag]) # pFull[refineFlag] = pFit/scl[refineFlag] pFull[refineFlag] = pFit dParams = pFull[-len(dFlag):] xy_unwarped = dFunc(xyo_det[:, :2], dParams) # detector quantities rMat_d = xf.makeDetectorRotMat(pFull[:3]) tVec_d = pFull[3:6].reshape(3, 1) # sample quantities chi = pFull[6] tVec_s = pFull[7:10].reshape(3, 1) # crystal quantities rMat_c = xf.makeRotMatOfExpMap(pFull[10:13]) tVec_c = pFull[13:16].reshape(3, 1) gVec_c = np.dot(bMat, hkls_idx) vMat_s = mutil.vecMVToSymm(vInv) # stretch tensor comp matrix from MV notation in SAMPLE frame gVec_s = np.dot(vMat_s, np.dot(rMat_c, gVec_c)) # reciprocal lattice vectors in SAMPLE frame gHat_s = mutil.unitVector(gVec_s) # unit reciprocal lattice vectors in SAMPLE frame gHat_c = np.dot(rMat_c.T, gHat_s) # unit reciprocal lattice vectors in CRYSTAL frame match_omes, calc_omes = matchOmegas(xyo_det, hkls_idx, chi, rMat_c, bMat, wavelength, vInv=vInv, beamVec=bVec, etaVec=eVec, omePeriod=omePeriod) calc_xy = np.zeros((npts, 2)) for i in range(npts): rMat_s = xfcapi.makeOscillRotMat([chi, calc_omes[i]]) calc_xy[i, :] = xfcapi.gvecToDetectorXY(gHat_c[:, i], rMat_d, rMat_s, rMat_c, tVec_d, tVec_s, tVec_c, beamVec=bVec).flatten() pass if np.any(np.isnan(calc_xy)): print "infeasible pFull: may want to scale back finite difference step size" # return values if simOnly: retval = np.hstack([calc_xy, calc_omes.reshape(npts, 1)]) else: diff_vecs_xy = calc_xy - xy_unwarped[:, :2] diff_ome = xf.angularDifference( calc_omes, xyo_det[:, 2] ) retval = np.hstack([diff_vecs_xy, diff_ome.reshape(npts, 1) ]).flatten() if returnScalarValue: retval = sum( retval ) return retval
def tVec_d_from_old_detector_params(old_par, det_origin): """ calculate tVec_d from old [xc, yc, D] parameter spec as loaded the params have 2 columns: [val, bool] """ rMat_d = makeDetectorRotMat(old_par[3:6, 0]) # P2_d = np.c_[old_par[0, 0] - det_origin[0], old_par[1, 0] - det_origin[1], 0.0].T P2_l = np.c_[0.0, 0.0, -old_par[2, 0]].T return P2_l - np.dot(rMat_d, P2_d)
def old_detector_params_from_new(new_par, det_origin): """ calculate beam position in old parameter spec *) may need to consider distortion... """ rMat_d = makeDetectorRotMat(new_par[:3]) tVec_d = new_par[3:6].reshape(3, 1) A = np.eye(3); A[:, :2] = rMat_d[:, :2] return solve(A, -tVec_d) + np.vstack([det_origin[0], det_origin[1], 0])
def tVec_d_from_old_detector_params(old_par, det_origin): """ calculate tVec_d from old [xc, yc, D] parameter spec as loaded the params have 2 columns: [val, bool] """ rMat_d = makeDetectorRotMat(old_par[3:6, 0]) # P2_d = np.c_[old_par[0, 0] - det_origin[0], old_par[1, 0] - det_origin[1], 0.].T P2_l = np.c_[0., 0., -old_par[2, 0]].T return P2_l - np.dot(rMat_d, P2_d)
def write_old_parfile(filename, results): if isinstance(filename, file): fid = filename elif isinstance(filename, str) or isinstance(filename, unicode): fid = open(filename, 'w') pass rMat_d = xf.makeDetectorRotMat(results['tiltAngles']) tVec_d = results['tVec_d'] - results['tVec_s'] beamXYD = beamXYD_from_tVec_d(rMat_d, tVec_d, bVec_ref, detOrigin) det_plist = np.zeros(12) det_plist[:3] = beamXYD.flatten() det_plist[3:6] = results['tiltAngles'] det_plist[6:] = results['dParams'] print >> fid, "# DETECTOR PARAMETERS (from new geometry model fit)" print >> fid, "# \n# <class 'hexrd.xrd.detector.DetectorGeomGE'>\n#" for i in range(len(det_plist)): print >> fid, "%1.8e\t%d" % (det_plist[i], 0) fid.close() return
def tVec_d_from_old_parfile(old_par, detOrigin): beamXYD = old_par[:3, 0] rMat_d = xf.makeDetectorRotMat(old_par[3:6, 0]) args = (rMat_d, beamXYD, detOrigin, bVec_ref) tvd_xy = opt.leastsq(objFun_tVec_d, -beamXYD[:2], args=args)[0] return np.hstack([tvd_xy, -beamXYD[2]]).reshape(3, 1)
import sys, os, time import numpy as np from hexrd.xrd import transforms as xf from hexrd.xrd import transforms_CAPI as xfcapi # input parameters bVec_ref = xf.bVec_ref tilt_angles = (0.0011546340766314521, -0.0040527538387122993, -0.0026221336905160211) rMat_d = xf.makeDetectorRotMat(tilt_angles) tVec_d = np.array([[-1.44904], [-3.235616], [-1050.74026]]) chi = -0.0011591608938627839 tVec_s = np.array([[-0.15354144], [0.], [-0.23294777]]) rMat_c = xf.makeRotMatOfExpMap( np.array([[0.66931818], [-0.98578066], [0.73593251]])) tVec_c = np.array([[0.07547626], [0.08827523], [-0.02131205]]) rMat_s = xf.makeOscillRotMat([chi, 0.]) # ###################################################################### # Calculate pixel coordinates # pvec = 204.8 * np.linspace(-1, 1, 2048) dcrds = np.meshgrid(pvec, pvec) XY = np.ascontiguousarray( np.vstack([dcrds[0].flatten(), dcrds[1].flatten()]).T)
import sys, os, time import numpy as np from hexrd.xrd import transforms as xf from hexrd.xrd import transforms_CAPI as xfcapi # input parameters bVec_ref = xf.bVec_ref rMat_d = xf.makeDetectorRotMat( (0.0011546340766314521, -0.0040527538387122993, -0.0026221336905160211)) tVec_d = np.array([[-1.44904], [-3.235616], [-1050.74026]]) chi = -0.0011591608938627839 tVec_s = np.array([[-0.15354144], [0.], [-0.23294777]]) rMat_c = xf.makeRotMatOfExpMap( np.array([[0.66931818], [-0.98578066], [0.73593251]])) tVec_c = np.array([[0.07547626], [0.08827523], [-0.02131205]]) rMat_s = xf.makeOscillRotMat([chi, 0.]) # ###################################################################### # Calculate pixel coordinates # pvec = 204.8 * np.linspace(-1, 1, 2048) dcrds = np.meshgrid(pvec, pvec) XY = np.ascontiguousarray( np.vstack([dcrds[0].flatten(), dcrds[1].flatten()]).T) # Check the timings
def tVec_d_from_old_parfile(old_par, detOrigin): beamXYD = old_par[:3, 0] rMat_d = xf.makeDetectorRotMat(old_par[3:6, 0]) args=(rMat_d, beamXYD, detOrigin, bVec_ref) tvd_xy = opt.leastsq(objFun_tVec_d, -beamXYD[:2], args=args)[0] return np.hstack([tvd_xy, -beamXYD[2]]).reshape(3, 1)
import sys, os, time, random import numpy as np from hexrd.xrd import transforms as xf from hexrd.xrd import transforms_CAPI as xfcapi epsf = 2.2e-16 vec = np.array([[random.uniform(-np.pi,np.pi),random.uniform(-np.pi,np.pi),random.uniform(-np.pi,np.pi)]]) vHat1 = xf.unitVector(vec.T) vHat2 = xfcapi.unitRowVector(vec) print "unitVector results match: ",np.linalg.norm(vHat1.T-vHat2)/np.linalg.norm(vHat1) < epsf tAng = np.array([0.0011546340766314521,-0.0040527538387122993,-0.0026221336905160211]) rMat1 = xf.makeDetectorRotMat(tAng) rMat2 = xfcapi.makeDetectorRotMat(tAng) print "makeDetectorRotMat results match: ",np.linalg.norm(rMat1-rMat2)/np.linalg.norm(rMat1) < epsf oAng = np.array([-0.0011591608938627839,0.0011546340766314521]) rMat1 = xf.makeOscillRotMat(oAng) rMat2 = xfcapi.makeOscillRotMat(oAng) print "makeOscillRotMat results match: ",np.linalg.norm(rMat1-rMat2)/np.linalg.norm(rMat1) < epsf eMap = np.array([ 0.66931818,-0.98578066,0.73593251]) rMat1 = xf.makeRotMatOfExpMap(eMap) rMat2 = xfcapi.makeRotMatOfExpMap(eMap) print "makeRotMatOfExpMap results match: ",np.linalg.norm(rMat1-rMat2)/np.linalg.norm(rMat1) < epsf axis = np.array([ 0.66931818,-0.98578066,0.73593251]) rMat1 = xf.makeBinaryRotMat(axis) rMat2 = xfcapi.makeBinaryRotMat(axis)
def check_indexing_plots(cfg_filename, plot_trials=False, plot_from_grains=False): cfg = config.open(cfg_filename)[0] # use first block, like indexing working_dir = cfg.working_dir analysis_dir = os.path.join(working_dir, cfg.analysis_name) #instrument parameters icfg = get_instrument_parameters(cfg) chi = icfg['oscillation_stage']['chi'] # load maps that were used oem = cPickle.load(open(cfg.find_orientations.orientation_maps.file, 'r')) nmaps = len(oem.dataStore) omeEdges = np.degrees(oem.omeEdges) nome = len(omeEdges) - 1 etaEdges = np.degrees(oem.etaEdges) neta = len(etaEdges) - 1 delta_ome = abs(omeEdges[1] - omeEdges[0]) full_ome_range = xf.angularDifference(omeEdges[0], omeEdges[-1]) == 0 full_eta_range = xf.angularDifference(etaEdges[0], etaEdges[-1]) == 0 # grab plane data and figure out IDs of map HKLS pd = oem.planeData gvids = [ pd.hklDataList[i]['hklID'] for i in np.where(pd.exclusions == False)[0].tolist() ] # load orientations quats = np.atleast_2d( np.loadtxt(os.path.join(working_dir, 'accepted_orientations.dat'))) if plot_trials: scored_trials = np.load( os.path.join(working_dir, 'scored_orientations.dat')) quats = scored_orientations[:4, scored_orientations[ -1, :] >= cfg.find_orientations.clustering.completeness] pass expMaps = np.tile(2. * np.arccos(quats[:, 0]), (3, 1)) * unitVector(quats[:, 1:].T) ########################################## # SPECIAL CASE FOR FIT GRAINS # ########################################## if plot_from_grains: distortion = (GE_41RT, icfg['detector']['distortion']['parameters']) # grain_table = np.atleast_2d( np.loadtxt(os.path.join(analysis_dir, 'grains.out'))) ngrains = len(grain_table) # expMaps = grain_table[:, 3:6] tVec_c = grain_table[:, 6:9] vInv = grain_table[:, 6:12] # rMat_d = xf.makeDetectorRotMat( icfg['detector']['transform']['tilt_angles']) tVec_d = np.vstack(icfg['detector']['transform']['t_vec_d']) # chi = icfg['oscillation_stage']['chi'] tVec_s = np.vstack(icfg['oscillation_stage']['t_vec_s']) # oes = np.zeros(oem.dataStore.shape) for i_grn in range(ngrains): spots_table = np.loadtxt( os.path.join(analysis_dir, 'spots_%05d.out' % i_grn)) idx_m = spots_table[:, 0] >= 0 for i_map in range(nmaps): idx_g = spots_table[:, 1] == gvids[i_map] idx = np.logical_and(idx_m, idx_g) nrefl = sum(idx) omes_fit = xf.mapAngle(spots_table[idx, 9], np.radians( cfg.find_orientations.omega.period), units='radians') xy_det = spots_table[idx, -3:] xy_det[:, 2] = np.zeros(nrefl) rMat_s_array = xfcapi.makeOscillRotMatArray(chi, omes_fit) # form in-plane vectors for detector points list in DETECTOR FRAME P2_d = xy_det.T # in LAB FRAME P2_l = np.dot(rMat_d, P2_d) + tVec_d # point on detector P0_l = np.hstack([ tVec_s + np.dot(rMat_s_array[j], tVec_c[i_grn, :].reshape(3, 1)) for j in range(nrefl) ]) # origin of CRYSTAL FRAME # diffraction unit vector components in LAB FRAME dHat_l = unitVector(P2_l - P0_l) P2_l = np.dot(rMat_d, xy_det.T) + tVec_d # angles for reference frame dHat_ref_l = unitVector(P2_l) # append etas and omes etas_fit = np.arctan2(dHat_ref_l[1, :], dHat_ref_l[0, :]).flatten() # find indices, then truncate or wrap i_ome = cellIndices(oem.omeEdges, omes_fit) if full_ome_range: i_ome[i_ome < 0] = np.mod(i_ome, nome) + 1 i_ome[i_ome >= nome] = np.mod(i_ome, nome) else: incl = np.logical_or(i_ome >= 0, i_ome < nome) i_ome = i_ome[incl] j_eta = cellIndices(oem.etaEdges, etas_fit) if full_eta_range: j_eta[j_eta < 0] = np.mod(j_eta, neta) + 1 j_eta[j_eta >= neta] = np.mod(j_eta, neta) else: incl = np.logical_or(j_eta >= 0, j_eta < neta) j_eta = j_eta[incl] #if np.max(i_ome) >= nome or np.min(i_ome) < 0 or np.max(j_eta) >= neta or np.min(j_eta) < 0: # import pdb; pdb.set_trace() # add to map oes[i_map][i_ome, j_eta] = 1 pass pass # simulate quaternion points if not plot_from_grains: oes = simulateOmeEtaMaps(omeEdges, etaEdges, pd, expMaps, chi=chi, etaTol=0.01, omeTol=0.01, etaRanges=None, omeRanges=None, bVec=xf.bVec_ref, eVec=xf.eta_ref, vInv=xf.vInv_ref) # tick labling omes = np.degrees(oem.omeEdges) etas = np.degrees(oem.etaEdges) num_ticks = 7 xmin = np.amin(etas) xmax = np.amax(etas) dx = (xmax - xmin) / (num_ticks - 1.) dx1 = (len(etas) - 1) / (num_ticks - 1.) xtlab = ["%.0f" % (xmin + i * dx) for i in range(num_ticks)] xtloc = np.array([i * dx1 for i in range(num_ticks)]) - 0.5 ymin = np.amin(omes) ymax = np.amax(omes) dy = (ymax - ymin) / (num_ticks - 1.) dy1 = (len(omes) - 1) / (num_ticks - 1.) ytlab = ["%.0f" % (ymin + i * dy) for i in range(num_ticks)] ytloc = np.array([i * dy1 for i in range(num_ticks)]) - 0.5 # Plot the three kernel density estimates n_maps = len(oem.iHKLList) fig_list = [plt.figure(num=i + 1) for i in range(n_maps)] ax_list = [fig_list[i].gca() for i in range(n_maps)] for i_map in range(n_maps): y, x = np.where(oes[i_map] > 0) ax_list[i_map].hold(True) ax_list[i_map].imshow(oem.dataStore[i_map] > 0.1, cmap=cm.bone) ax_list[i_map].set_title(r'Map for $\{%d %d %d\}$' % tuple(pd.hkls[:, i_map])) ax_list[i_map].set_xlabel( r'Azimuth channel, $\eta$; $\Delta\eta=%.3f$' % delta_ome) ax_list[i_map].set_ylabel( r'Rotation channel, $\omega$; $\Delta\omega=%.3f$' % delta_ome) ax_list[i_map].plot(x, y, 'c+') ax_list[i_map].xaxis.set_ticks(xtloc) ax_list[i_map].xaxis.set_ticklabels(xtlab) ax_list[i_map].yaxis.set_ticks(ytloc) ax_list[i_map].yaxis.set_ticklabels(ytlab) ax_list[i_map].axis('tight') plt.show() return fig_list, oes
def check_indexing_plots(cfg_filename, plot_trials=False, plot_from_grains=False): cfg = config.open(cfg_filename)[0] # use first block, like indexing working_dir = cfg.working_dir analysis_dir = os.path.join(working_dir, cfg.analysis_name) #instrument parameters icfg = get_instrument_parameters(cfg) chi = icfg['oscillation_stage']['chi'] # load maps that were used oem = cPickle.load( open(cfg.find_orientations.orientation_maps.file, 'r') ) nmaps = len(oem.dataStore) omeEdges = np.degrees(oem.omeEdges); nome = len(omeEdges) - 1 etaEdges = np.degrees(oem.etaEdges); neta = len(etaEdges) - 1 delta_ome = abs(omeEdges[1]-omeEdges[0]) full_ome_range = xf.angularDifference(omeEdges[0], omeEdges[-1]) == 0 full_eta_range = xf.angularDifference(etaEdges[0], etaEdges[-1]) == 0 # grab plane data and figure out IDs of map HKLS pd = oem.planeData gvids = [pd.hklDataList[i]['hklID'] for i in np.where(pd.exclusions == False)[0].tolist()] # load orientations quats = np.atleast_2d(np.loadtxt(os.path.join(working_dir, 'accepted_orientations.dat'))) if plot_trials: scored_trials = np.load(os.path.join(working_dir, 'scored_orientations.dat')) quats = scored_orientations[:4, scored_orientations[-1, :] >= cfg.find_orientations.clustering.completeness] pass expMaps = np.tile(2. * np.arccos(quats[:, 0]), (3, 1))*unitVector(quats[:, 1:].T) ########################################## # SPECIAL CASE FOR FIT GRAINS # ########################################## if plot_from_grains: distortion = (GE_41RT, icfg['detector']['distortion']['parameters']) # grain_table = np.atleast_2d(np.loadtxt(os.path.join(analysis_dir, 'grains.out'))) ngrains = len(grain_table) # expMaps = grain_table[:, 3:6] tVec_c = grain_table[:, 6:9] vInv = grain_table[:, 6:12] # rMat_d = xf.makeDetectorRotMat(icfg['detector']['transform']['tilt_angles']) tVec_d = np.vstack(icfg['detector']['transform']['t_vec_d']) # chi = icfg['oscillation_stage']['chi'] tVec_s = np.vstack(icfg['oscillation_stage']['t_vec_s']) # oes = np.zeros(oem.dataStore.shape) for i_grn in range(ngrains): spots_table = np.loadtxt(os.path.join(analysis_dir, 'spots_%05d.out' %i_grn)) idx_m = spots_table[:, 0] >= 0 for i_map in range(nmaps): idx_g = spots_table[:, 1] == gvids[i_map] idx = np.logical_and(idx_m, idx_g) nrefl = sum(idx) omes_fit = xf.mapAngle(spots_table[idx, 9], np.radians(cfg.find_orientations.omega.period), units='radians') xy_det = spots_table[idx, -3:] xy_det[:, 2] = np.zeros(nrefl) rMat_s_array = xfcapi.makeOscillRotMatArray(chi, omes_fit) # form in-plane vectors for detector points list in DETECTOR FRAME P2_d = xy_det.T # in LAB FRAME P2_l = np.dot(rMat_d, P2_d) + tVec_d # point on detector P0_l = np.hstack( [tVec_s + np.dot(rMat_s_array[j], tVec_c[i_grn, :].reshape(3, 1)) for j in range(nrefl)] ) # origin of CRYSTAL FRAME # diffraction unit vector components in LAB FRAME dHat_l = unitVector(P2_l - P0_l) P2_l = np.dot(rMat_d, xy_det.T) + tVec_d # angles for reference frame dHat_ref_l = unitVector(P2_l) # append etas and omes etas_fit = np.arctan2(dHat_ref_l[1, :], dHat_ref_l[0, :]).flatten() # find indices, then truncate or wrap i_ome = cellIndices(oem.omeEdges, omes_fit) if full_ome_range: i_ome[i_ome < 0] = np.mod(i_ome, nome) + 1 i_ome[i_ome >= nome] = np.mod(i_ome, nome) else: incl = np.logical_or(i_ome >= 0, i_ome < nome) i_ome = i_ome[incl] j_eta = cellIndices(oem.etaEdges, etas_fit) if full_eta_range: j_eta[j_eta < 0] = np.mod(j_eta, neta) + 1 j_eta[j_eta >= neta] = np.mod(j_eta, neta) else: incl = np.logical_or(j_eta >= 0, j_eta < neta) j_eta = j_eta[incl] #if np.max(i_ome) >= nome or np.min(i_ome) < 0 or np.max(j_eta) >= neta or np.min(j_eta) < 0: # import pdb; pdb.set_trace() # add to map oes[i_map][i_ome, j_eta] = 1 pass pass # simulate quaternion points if not plot_from_grains: oes = simulateOmeEtaMaps(omeEdges, etaEdges, pd, expMaps, chi=chi, etaTol=0.01, omeTol=0.01, etaRanges=None, omeRanges=None, bVec=xf.bVec_ref, eVec=xf.eta_ref, vInv=xf.vInv_ref) # tick labling omes = np.degrees(oem.omeEdges) etas = np.degrees(oem.etaEdges) num_ticks = 7 xmin = np.amin(etas); xmax = np.amax(etas) dx = (xmax - xmin) / (num_ticks - 1.); dx1 = (len(etas) - 1) / (num_ticks - 1.) xtlab = ["%.0f" % (xmin + i*dx) for i in range(num_ticks)] xtloc = np.array([i*dx1 for i in range(num_ticks)]) - 0.5 ymin = np.amin(omes); ymax = np.amax(omes) dy = (ymax - ymin) / (num_ticks - 1.); dy1 = (len(omes) - 1) / (num_ticks - 1.) ytlab = ["%.0f" % (ymin + i*dy) for i in range(num_ticks)] ytloc = np.array([i*dy1 for i in range(num_ticks)]) - 0.5 # Plot the three kernel density estimates n_maps = len(oem.iHKLList) fig_list =[plt.figure(num=i+1) for i in range(n_maps)] ax_list = [fig_list[i].gca() for i in range(n_maps)] for i_map in range(n_maps): y, x = np.where(oes[i_map] > 0) ax_list[i_map].hold(True) ax_list[i_map].imshow(oem.dataStore[i_map] > 0.1, cmap=cm.bone) ax_list[i_map].set_title(r'Map for $\{%d %d %d\}$' %tuple(pd.hkls[:, i_map])) ax_list[i_map].set_xlabel(r'Azimuth channel, $\eta$; $\Delta\eta=%.3f$' %delta_ome) ax_list[i_map].set_ylabel(r'Rotation channel, $\omega$; $\Delta\omega=%.3f$' %delta_ome) ax_list[i_map].plot(x, y, 'c+') ax_list[i_map].xaxis.set_ticks(xtloc) ax_list[i_map].xaxis.set_ticklabels(xtlab) ax_list[i_map].yaxis.set_ticks(ytloc) ax_list[i_map].yaxis.set_ticklabels(ytlab) ax_list[i_map].axis('tight') plt.show() return fig_list, oes
def objFuncSX(pFit, pFull, pFlag, dFunc, dFlag, xyo_det, hkls_idx, bMat, vInv, bVec, eVec, omePeriod, simOnly=False, return_value_flag=return_value_flag): """ """ npts = len(xyo_det) refineFlag = np.array(np.hstack([pFlag, dFlag]), dtype=bool) print refineFlag # pFull[refineFlag] = pFit/scl[refineFlag] pFull[refineFlag] = pFit if dFunc is not None: dParams = pFull[-len(dFlag):] xys = dFunc(xyo_det[:, :2], dParams) else: xys = xyo_det[:, :2] # detector quantities wavelength = pFull[0] rMat_d = xf.makeDetectorRotMat(pFull[1:4]) tVec_d = pFull[4:7].reshape(3, 1) # sample quantities chi = pFull[7] tVec_s = pFull[8:11].reshape(3, 1) # crystal quantities rMat_c = xf.makeRotMatOfExpMap(pFull[11:14]) tVec_c = pFull[14:17].reshape(3, 1) # stretch tensor comp matrix from MV notation in SAMPLE frame vMat_s = mutil.vecMVToSymm(vInv) # g-vectors: # 1. calculate full g-vector components in CRYSTAL frame from B # 2. rotate into SAMPLE frame and apply stretch # 3. rotate back into CRYSTAL frame and normalize to unit magnitude # IDEA: make a function for this sequence of operations with option for # choosing ouput frame (i.e. CRYSTAL vs SAMPLE vs LAB) gVec_c = np.dot(bMat, hkls_idx) gVec_s = np.dot(vMat_s, np.dot(rMat_c, gVec_c)) gHat_c = mutil.unitVector(np.dot(rMat_c.T, gVec_s)) match_omes, calc_omes = matchOmegas(xyo_det, hkls_idx, chi, rMat_c, bMat, wavelength, vInv=vInv, beamVec=bVec, etaVec=eVec, omePeriod=omePeriod) calc_xy = np.zeros((npts, 2)) for i in range(npts): rMat_s = xfcapi.makeOscillRotMat([chi, calc_omes[i]]) calc_xy[i, :] = xfcapi.gvecToDetectorXY(gHat_c[:, i], rMat_d, rMat_s, rMat_c, tVec_d, tVec_s, tVec_c, beamVec=bVec).flatten() pass if np.any(np.isnan(calc_xy)): raise RuntimeError("infeasible pFull: may want to scale" + "back finite difference step size") # return values if simOnly: # return simulated values retval = np.hstack([calc_xy, calc_omes.reshape(npts, 1)]) else: # return residual vector # IDEA: try angles instead of xys? diff_vecs_xy = calc_xy - xys[:, :2] diff_ome = xf.angularDifference(calc_omes, xyo_det[:, 2]) retval = np.hstack([diff_vecs_xy, diff_ome.reshape(npts, 1)]).flatten() if return_value_flag == 1: # return scalar sum of squared residuals retval = sum(abs(retval)) elif return_value_flag == 2: # return DOF-normalized chisq # TODO: check this calculation denom = npts - len(pFit) - 1. if denom != 0: nu_fac = 1. / denom else: nu_fac = 1. nu_fac = 1 / (npts - len(pFit) - 1.) retval = nu_fac * sum(retval**2) return retval
def objFuncSX(pFit, pFull, pFlag, dFunc, dFlag, xyo_det, hkls_idx, bMat, vInv, bVec, eVec, omePeriod, simOnly=False, return_value_flag=return_value_flag): """ """ npts = len(xyo_det) refineFlag = np.array(np.hstack([pFlag, dFlag]), dtype=bool) print refineFlag # pFull[refineFlag] = pFit/scl[refineFlag] pFull[refineFlag] = pFit if dFunc is not None: dParams = pFull[-len(dFlag):] xys = dFunc(xyo_det[:, :2], dParams) else: xys = xyo_det[:, :2] # detector quantities wavelength = pFull[0] rMat_d = xf.makeDetectorRotMat(pFull[1:4]) tVec_d = pFull[4:7].reshape(3, 1) # sample quantities chi = pFull[7] tVec_s = pFull[8:11].reshape(3, 1) # crystal quantities rMat_c = xf.makeRotMatOfExpMap(pFull[11:14]) tVec_c = pFull[14:17].reshape(3, 1) # stretch tensor comp matrix from MV notation in SAMPLE frame vMat_s = mutil.vecMVToSymm(vInv) # g-vectors: # 1. calculate full g-vector components in CRYSTAL frame from B # 2. rotate into SAMPLE frame and apply stretch # 3. rotate back into CRYSTAL frame and normalize to unit magnitude # IDEA: make a function for this sequence of operations with option for # choosing ouput frame (i.e. CRYSTAL vs SAMPLE vs LAB) gVec_c = np.dot(bMat, hkls_idx) gVec_s = np.dot(vMat_s, np.dot(rMat_c, gVec_c)) gHat_c = mutil.unitVector(np.dot(rMat_c.T, gVec_s)) match_omes, calc_omes = matchOmegas( xyo_det, hkls_idx, chi, rMat_c, bMat, wavelength, vInv=vInv, beamVec=bVec, etaVec=eVec, omePeriod=omePeriod) calc_xy = np.zeros((npts, 2)) for i in range(npts): rMat_s = xfcapi.makeOscillRotMat([chi, calc_omes[i]]) calc_xy[i, :] = xfcapi.gvecToDetectorXY(gHat_c[:, i], rMat_d, rMat_s, rMat_c, tVec_d, tVec_s, tVec_c, beamVec=bVec).flatten() pass if np.any(np.isnan(calc_xy)): raise RuntimeError( "infeasible pFull: may want to scale" + "back finite difference step size") # return values if simOnly: # return simulated values retval = np.hstack([calc_xy, calc_omes.reshape(npts, 1)]) else: # return residual vector # IDEA: try angles instead of xys? diff_vecs_xy = calc_xy - xys[:, :2] diff_ome = xf.angularDifference(calc_omes, xyo_det[:, 2]) retval = np.hstack([diff_vecs_xy, diff_ome.reshape(npts, 1) ]).flatten() if return_value_flag == 1: # return scalar sum of squared residuals retval = sum(abs(retval)) elif return_value_flag == 2: # return DOF-normalized chisq # TODO: check this calculation denom = npts - len(pFit) - 1. if denom != 0: nu_fac = 1. / denom else: nu_fac = 1. nu_fac = 1 / (npts - len(pFit) - 1.) retval = nu_fac * sum(retval**2) return retval
import sys, os, time import numpy as np from hexrd.xrd import transforms as xf from hexrd.xrd import transforms_CAPI as xfcapi # input parameters bVec_ref = xf.bVec_ref tilt_angles = ( 0.0011546340766314521, -0.0040527538387122993, -0.0026221336905160211 ) rMat_d = xf.makeDetectorRotMat( tilt_angles ) tVec_d = np.array( [ [ -1.44904 ], [ -3.235616], [-1050.74026 ] ] ) chi = -0.0011591608938627839 tVec_s = np.array([ [-0.15354144], [ 0. ], [-0.23294777] ] ) rMat_c = xf.makeRotMatOfExpMap(np.array( [ [ 0.66931818], [-0.98578066], [ 0.73593251] ] ) ) tVec_c = np.array( [ [ 0.07547626], [ 0.08827523], [-0.02131205] ] ) rMat_s = xf.makeOscillRotMat([chi, 0.])
from timeit import default_timer as timer import sys, os, time import numpy as np from hexrd.xrd import transforms as xf from hexrd.xrd import transforms_CAPI as xfcapi from hexrd.xrd import pycfuncs_transforms as pycfuncs import numba.cuda # input parameters bVec_ref = xf.bVec_ref rMat_d = xf.makeDetectorRotMat( ( 0.0011546340766314521, -0.0040527538387122993, -0.0026221336905160211 ) ) tVec_d = np.array( [ [ -1.44904 ], [ -3.235616], [-1050.74026 ] ] ) chi = -0.0011591608938627839 tVec_s = np.array([ [-0.15354144], [ 0. ], [-0.23294777] ] ) rMat_c = xf.makeRotMatOfExpMap(np.array( [ [ 0.66931818], [-0.98578066], [ 0.73593251] ] ) ) tVec_c = np.array( [ [ 0.07547626], [ 0.08827523], [-0.02131205] ] )
epsf = 2.2e-16 vec = np.array([[ random.uniform(-np.pi, np.pi), random.uniform(-np.pi, np.pi), random.uniform(-np.pi, np.pi) ]]) vHat1 = xf.unitVector(vec.T) vHat2 = xfcapi.unitRowVector(vec) print "unitVector results match: ", np.linalg.norm( vHat1.T - vHat2) / np.linalg.norm(vHat1) < epsf tAng = np.array( [0.0011546340766314521, -0.0040527538387122993, -0.0026221336905160211]) rMat1 = xf.makeDetectorRotMat(tAng) rMat2 = xfcapi.makeDetectorRotMat(tAng) print "makeDetectorRotMat results match: ", np.linalg.norm( rMat1 - rMat2) / np.linalg.norm(rMat1) < epsf oAng = np.array([-0.0011591608938627839, 0.0011546340766314521]) rMat1 = xf.makeOscillRotMat(oAng) rMat2 = xfcapi.makeOscillRotMat(oAng) print "makeOscillRotMat results match: ", np.linalg.norm( rMat1 - rMat2) / np.linalg.norm(rMat1) < epsf eMap = np.array([0.66931818, -0.98578066, 0.73593251]) rMat1 = xf.makeRotMatOfExpMap(eMap) rMat2 = xfcapi.makeRotMatOfExpMap(eMap) print "makeRotMatOfExpMap results match: ", np.linalg.norm( rMat1 - rMat2) / np.linalg.norm(rMat1) < epsf