def convertUToRotMat(Urows, U0, symTag='Oh', display=False): """ Takes GrainSpotter gff ouput in rows U11 U12 U13 U21 U22 U23 U13 U23 U33 and takes it into the hexrd/APS frame of reference Urows comes from grainspotter's gff output U0 comes from xrd.crystallography.latticeVectors.U0 """ numU, testDim = Urows.shape assert testDim == 9, "Your input must have 9 columns; yours has %d" % (testDim) qin = quatOfRotMat(Urows.reshape(numU, 3, 3)) qout = num.dot( quatProductMatrix( quatOfRotMat(fableSampCOB), mult='left' ), \ num.dot( quatProductMatrix( quatOfRotMat(U0.T), mult='right'), \ qin ).squeeze() ).squeeze() if qout.ndim == 1: qout = toFundamentalRegion(qout.reshape(4, 1), crysSym=symTag, sampSym=None) else: qout = toFundamentalRegion(qout, crysSym=symTag, sampSym=None) if display: print "quaternions in (Fable convention):" print qin.T print "quaternions out (hexrd convention, symmetrically reduced)" print qout.T pass Uout = rotMatOfQuat(qout) return Uout
def convertRotMatToFableU(rMats, U0=num.eye(3), symTag='Oh', display=False): """ Makes GrainSpotter gff ouput U11 U12 U13 U21 U22 U23 U13 U23 U33 and takes it into the hexrd/APS frame of reference Urows comes from grainspotter's gff output U0 comes from xrd.crystallography.latticeVectors.U0 """ numU = num.shape(num.atleast_3d(rMats))[0] qin = quatOfRotMat(num.atleast_3d(rMats)) qout = num.dot( quatProductMatrix( quatOfRotMat(fableSampCOB.T), mult='left' ), \ num.dot( quatProductMatrix( quatOfRotMat(U0), mult='right'), \ qin ).squeeze() ).squeeze() if qout.ndim == 1: qout = toFundamentalRegion(qout.reshape(4, 1), crysSym=symTag, sampSym=None) else: qout = toFundamentalRegion(qout, crysSym=symTag, sampSym=None) if display: print "quaternions in (hexrd convention):" print qin.T print "quaternions out (Fable convention, symmetrically reduced)" print qout.T pass Uout = rotMatOfQuat(qout) return Uout
def convertUToRotMat(Urows, U0, symTag='Oh', display=False): """ Takes GrainSpotter gff ouput in rows U11 U12 U13 U21 U22 U23 U13 U23 U33 and takes it into the hexrd/APS frame of reference Urows comes from grainspotter's gff output U0 comes from xrd.crystallography.latticeVectors.U0 """ numU, testDim = Urows.shape assert testDim == 9, "Your input must have 9 columns; yours has %d" % ( testDim) qin = quatOfRotMat(Urows.reshape(numU, 3, 3)) qout = num.dot( quatProductMatrix( quatOfRotMat(fableSampCOB), mult='left' ), \ num.dot( quatProductMatrix( quatOfRotMat(U0.T), mult='right'), \ qin ).squeeze() ).squeeze() if qout.ndim == 1: qout = toFundamentalRegion(qout.reshape(4, 1), crysSym=symTag, sampSym=None) else: qout = toFundamentalRegion(qout, crysSym=symTag, sampSym=None) if display: print "quaternions in (Fable convention):" print qin.T print "quaternions out (hexrd convention, symmetrically reduced)" print qout.T pass Uout = rotMatOfQuat(qout) return Uout
def testThisQ(thisQ): """ NOTES: (*) doFit is not done here -- in multiprocessing, that would end up happening on a remote process and then different processes would have different data, unless spotsArray were made to be fancier (*) kludge stuff so that this function is outside of fiberSearch """ global multiProcMode_MP global spotsArray_MP global candidate_MP global dspTol_MP global minCompleteness_MP global doRefinement_MP global nStdDev_MP # assign locals multiProcMode = multiProcMode_MP spotsArray = spotsArray_MP candidate = candidate_MP dspTol = dspTol_MP minCompleteness = minCompleteness_MP doRefinement = doRefinement_MP nStdDev = nStdDev_MP nSigmas = 2 # ... make this a settable option? if multiProcMode: global foundFlagShared foundGrainData = None #print "testing %d of %d"% (iR+1, numTrials) thisRMat = rotMatOfQuat(thisQ) ppfx = '' if multiProcMode: proc = multiprocessing.current_process() ppfx = str(proc.name)+' : ' if multiProcMode and foundFlagShared.value: """ map causes this function to be applied to all trial orientations, but skip evaluations after an acceptable grain has been found """ if debugMultiproc > 1: print ppfx+'skipping on '+str(thisQ) return foundGrainData else: if debugMultiproc > 1: print ppfx+'working on '+str(thisQ) pass candidate.findMatches(rMat=thisRMat, strainMag=dspTol, claimingSpots=False, testClaims=True, updateSelf=True) if debugMultiproc > 1: print ppfx+' for '+str(thisQ)+' got completeness : '+str(candidate.completeness) if candidate.completeness >= minCompleteness: ## attempt to filter out 'junk' spots here by performing full ## refinement before claiming fineEtaTol = candidate.etaTol fineOmeTol = candidate.omeTol if doRefinement: if multiProcMode and foundFlagShared.value: 'some other process beat this one to it' return foundGrainData print ppfx+"testing candidate q = [%1.2e, %1.2e, %1.2e, %1.2e]" %tuple(thisQ) # not needed # candidate.fitPrecession(display=False) ## first fit candidate.fit(display=False) ## auto-tolerace based on statistics of current matches validRefls = candidate.grainSpots['iRefl'] > 0 fineEtaTol = nStdDev * num.std(candidate.grainSpots['diffAngles'][validRefls, 1]) fineOmeTol = nStdDev * num.std(candidate.grainSpots['diffAngles'][validRefls, 2]) ## next fits with finer tolerances for iLoop in range(3): candidate.findMatches(etaTol=fineEtaTol, omeTol=fineOmeTol, claimingSpots=False, testClaims=True, updateSelf=True) # not needed # candidate.fitPrecession(display=False) candidate.fit(display=False) if candidate.completeness < minCompleteness: print ppfx+"candidate failed" return foundGrainData if multiProcMode and foundFlagShared.value: 'some other process beat this one to it' return foundGrainData # not needed # candidate.fitPrecession(display=False) # not needed? # candidate.fit(display=False) # not needed? # candidate.findMatches(etaTol=fineEtaTol, # not needed? # omeTol=fineOmeTol, # not needed? # claimingSpots=False, # not needed? # testClaims=True, # not needed? # updateSelf=True) else: ## at least do precession correction candidate.fitPrecession(display=False) candidate.findMatches(rMat=thisRMat, strainMag=dspTol, claimingSpots=False, testClaims=True, updateSelf=True) fineEtaTol = candidate.etaTol fineOmeTol = candidate.omeTol if candidate.completeness < minCompleteness: print ppfx+"candidate failed" return foundGrainData if multiProcMode and foundFlagShared.value: 'some other process beat this one to it' return foundGrainData if multiProcMode: foundFlagShared.value = True # # newGrain uses current candidate.rMat # # do not do claims here -- those handled outside of this call # foundGrain = candidate.newGrain( # spotsArray, claimingSpots=False, # omeTol=fineOmeTol, # etaTol=fineEtaTol) # if multiProcMode: # foundGrain.strip() cInfo = quatOfRotMat(candidate.rMat).flatten().tolist() cInfo.append(candidate.completeness) print ppfx+"Grain found at q = [%1.2e, %1.2e, %1.2e, %1.2e] with completeness %g" \ % tuple(cInfo) foundGrainData = candidate.getGrainData() 'tolerances not actually set in candidate, so set them manually' foundGrainData['omeTol'] = fineOmeTol foundGrainData['etaTol'] = fineEtaTol return foundGrainData
def testThisQ(thisQ): """ NOTES: (*) doFit is not done here -- in multiprocessing, that would end up happening on a remote process and then different processes would have different data, unless spotsArray were made to be fancier (*) kludge stuff so that this function is outside of fiberSearch """ global multiProcMode_MP global spotsArray_MP global candidate_MP global dspTol_MP global minCompleteness_MP global doRefinement_MP global nStdDev_MP # assign locals multiProcMode = multiProcMode_MP spotsArray = spotsArray_MP candidate = candidate_MP dspTol = dspTol_MP minCompleteness = minCompleteness_MP doRefinement = doRefinement_MP nStdDev = nStdDev_MP nSigmas = 2 # ... make this a settable option? if multiProcMode: global foundFlagShared foundGrainData = None #print "testing %d of %d"% (iR+1, numTrials) thisRMat = rotMatOfQuat(thisQ) ppfx = '' if multiProcMode: proc = multiprocessing.current_process() ppfx = str(proc.name) + ' : ' if multiProcMode and foundFlagShared.value: """ map causes this function to be applied to all trial orientations, but skip evaluations after an acceptable grain has been found """ if debugMultiproc > 1: print ppfx + 'skipping on ' + str(thisQ) return foundGrainData else: if debugMultiproc > 1: print ppfx + 'working on ' + str(thisQ) pass candidate.findMatches(rMat=thisRMat, strainMag=dspTol, claimingSpots=False, testClaims=True, updateSelf=True) if debugMultiproc > 1: print ppfx + ' for ' + str(thisQ) + ' got completeness : ' + str( candidate.completeness) if candidate.completeness >= minCompleteness: ## attempt to filter out 'junk' spots here by performing full ## refinement before claiming fineEtaTol = candidate.etaTol fineOmeTol = candidate.omeTol if doRefinement: if multiProcMode and foundFlagShared.value: 'some other process beat this one to it' return foundGrainData print ppfx + "testing candidate q = [%1.2e, %1.2e, %1.2e, %1.2e]" % tuple( thisQ) # not needed # candidate.fitPrecession(display=False) ## first fit candidate.fit(display=False) ## auto-tolerace based on statistics of current matches validRefls = candidate.grainSpots['iRefl'] > 0 fineEtaTol = nStdDev * num.std( candidate.grainSpots['diffAngles'][validRefls, 1]) fineOmeTol = nStdDev * num.std( candidate.grainSpots['diffAngles'][validRefls, 2]) ## next fits with finer tolerances for iLoop in range(3): candidate.findMatches(etaTol=fineEtaTol, omeTol=fineOmeTol, claimingSpots=False, testClaims=True, updateSelf=True) # not needed # candidate.fitPrecession(display=False) candidate.fit(display=False) if candidate.completeness < minCompleteness: print ppfx + "candidate failed" return foundGrainData if multiProcMode and foundFlagShared.value: 'some other process beat this one to it' return foundGrainData # not needed # candidate.fitPrecession(display=False) # not needed? # candidate.fit(display=False) # not needed? # candidate.findMatches(etaTol=fineEtaTol, # not needed? # omeTol=fineOmeTol, # not needed? # claimingSpots=False, # not needed? # testClaims=True, # not needed? # updateSelf=True) else: ## at least do precession correction candidate.fitPrecession(display=False) candidate.findMatches(rMat=thisRMat, strainMag=dspTol, claimingSpots=False, testClaims=True, updateSelf=True) fineEtaTol = candidate.etaTol fineOmeTol = candidate.omeTol if candidate.completeness < minCompleteness: print ppfx + "candidate failed" return foundGrainData if multiProcMode and foundFlagShared.value: 'some other process beat this one to it' return foundGrainData if multiProcMode: foundFlagShared.value = True # # newGrain uses current candidate.rMat # # do not do claims here -- those handled outside of this call # foundGrain = candidate.newGrain( # spotsArray, claimingSpots=False, # omeTol=fineOmeTol, # etaTol=fineEtaTol) # if multiProcMode: # foundGrain.strip() cInfo = quatOfRotMat(candidate.rMat).flatten().tolist() cInfo.append(candidate.completeness) print ppfx+"Grain found at q = [%1.2e, %1.2e, %1.2e, %1.2e] with completeness %g" \ % tuple(cInfo) foundGrainData = candidate.getGrainData() 'tolerances not actually set in candidate, so set them manually' foundGrainData['omeTol'] = fineOmeTol foundGrainData['etaTol'] = fineEtaTol return foundGrainData