Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #5
0
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