Beispiel #1
0
def remeshchiintegrate(data,
                       mask,
                       AIdict,
                       cut=None,
                       color=[255, 255, 255],
                       requestkey=None,
                       qvrt=None,
                       qpar=None):
    AI = pyFAI.AzimuthalIntegrator()
    AI.setPyFAI(**AIdict)

    alphai = config.activeExperiment.getvalue('Incidence Angle (GIXS)')
    msg.logMessage(
        'Incoming angle applied to remeshed q integration: ' + str(alphai),
        msg.DEBUG)

    qsquared = qpar**2 + qvrt**2

    remeshcenter = np.unravel_index(qsquared.argmin(), qsquared.shape)

    f2d = AI.getFit2D()
    f2d['centerX'] = remeshcenter[0]
    f2d['centerY'] = remeshcenter[1]
    AI.setFit2D(**f2d)
    AIdict = AI.getPyFAI()

    return chiintegratepyFAI(data,
                             mask,
                             AIdict,
                             cut,
                             color,
                             requestkey,
                             qvrt=None,
                             qpar=None)
Beispiel #2
0
def zintegrate(data,
               mask,
               AIdict,
               cut=None,
               color=[255, 255, 255],
               requestkey=None,
               qvrt=None,
               qpar=None):
    if mask is not None:
        mask = mask.copy()

    msg.logMessage(('image:', data.shape), msg.DEBUG)
    msg.logMessage(('mask:', mask.shape), msg.DEBUG)

    if not mask.shape == data.shape:
        msg.logMessage("No mask match. Mask will be ignored.", msg.WARNING)
        mask = np.ones_like(data)
        msg.logMessage(('emptymask:', mask.shape), msg.DEBUG)

    if cut is not None:
        msg.logMessage(('cut:', cut.shape), msg.DEBUG)
        mask &= cut.astype(bool)
    # data *= cut

    maskeddata = np.ma.masked_array(data, mask=1 - mask)

    xprofile = np.ma.average(maskeddata, axis=0)

    AI = pyFAI.AzimuthalIntegrator()
    AI.setPyFAI(**AIdict)
    qz = AI.qArray(data.shape[::-1])[:, AI.getFit2D()['centerX']] / 10
    qz[:qz.argmin()] *= -1

    return qz, xprofile, color, requestkey
Beispiel #3
0
def fourierAutocorrelation(dimg, calibrantkey):
    yield 0
    if dimg.transformdata is None:
        return
    yield 20

    config.activeExperiment.center = center_approx.center_approx(
        dimg.transformdata, dimg.mask)

    yield 40

    radialprofile = integration.pixel_2Dintegrate(dimg, mask=dimg.mask)

    yield 60

    peaks = np.array(
        peakfinding.findpeaks(np.arange(len(radialprofile)), radialprofile)).T

    yield 80

    peaks = peaks[peaks[:, 1].argsort()[::-1]]

    for peak in peaks:
        if peak[0] > 15 and not np.isinf(
                peak[1]
        ):  ####This thresholds the minimum sdd which is acceptable
            bestpeak = peak[0]
            # print peak
            break

    yield 85
    N = 1
    # guess which order is the first
    stds = [
        np.std((peaks[:, 0] / (np.arange(len(peaks)) + i))[:4])
        for i in range(1, 5)
    ]
    if min(stds) < 5:  # threshold accepting peak as higher N
        N = np.argmin(stds) + 1  # index of the first detected peak

    msg.logMessage(('Using peak #', N, ' for calibration...'))
    yield 90

    calibrant1stpeak = calibrant.ALL_CALIBRANTS[calibrantkey].dSpacing[N - 1]

    # Calculate sample to detector distance for lowest q peak
    tth = 2 * np.arcsin(0.5 * config.activeExperiment.getvalue('Wavelength') /
                        calibrant1stpeak / 1.e-10)
    tantth = np.tan(tth)
    sdd = bestpeak * config.activeExperiment.getvalue('Pixel Size X') / tantth

    config.activeExperiment.setvalue('Detector Distance', sdd)

    #        self.refinecenter()

    dimg.invalidatecache()

    yield 100
Beispiel #4
0
def similarframe(path, N):
    """
    Get the file path N ahead (or behind) the provided path frame.
    """
    try:
        expr = '(?<=_)[\d]+(?=[_.])'
        frame = re.search(expr, os.path.basename(path)).group(0)
        leadingzeroslen = len(frame)
        framenum = int(frame)
        prevframenum = int(framenum) + N
        prevframenum = '{:0>{}}'.format(prevframenum, leadingzeroslen)
        return re.sub(expr, prevframenum, path)
    except ValueError:
        msg.logMessage('No earlier frame found for ' + path + ' with ' + N,
                       msg.ERROR)
        return None
Beispiel #5
0
def remeshqintegrate(data,
                     mask,
                     AIdict,
                     cut=None,
                     color=[255, 255, 255],
                     requestkey=None,
                     qvrt=None,
                     qpar=None):

    AI = pyFAI.AzimuthalIntegrator()
    AI.setPyFAI(**AIdict)

    alphai = config.activeExperiment.getvalue('Incidence Angle (GIXS)')
    msg.logMessage(
        'Incoming angle applied to remeshed q integration: ' + str(alphai),
        msg.DEBUG)

    #qpar, qvrt = remesh.remeshqarray(data, None, AI, np.deg2rad(alphai))
    qsquared = qpar**2 + qvrt**2

    remeshcenter = np.unravel_index(qsquared.argmin(), qsquared.shape)

    print 'center?:', remeshcenter

    f2d = AI.getFit2D()
    f2d['centerX'] = remeshcenter[0]
    f2d['centerY'] = remeshcenter[1]
    AI.setFit2D(**f2d)
    AIdict = AI.getPyFAI()
    msg.logMessage('remesh corrected calibration: ' + str(AIdict))

    q, qprofile, color, requestkey = qintegrate(data,
                                                mask,
                                                AIdict,
                                                cut,
                                                color,
                                                requestkey,
                                                qvrt=None,
                                                qpar=None)

    maxq = (qsquared * mask).max()
    if cut is not None: qsquared[np.logical_not(cut.astype(np.bool))] = np.inf
    minq = qsquared.min()

    q = np.linspace(minq, maxq, len(qprofile)) / 10.

    return q, qprofile, color, requestkey
Beispiel #6
0
def chiintegratepyFAI(data,
                      mask,
                      AIdict,
                      cut=None,
                      color=[255, 255, 255],
                      requestkey=None,
                      qvrt=None,
                      qpar=None,
                      xres=1000,
                      yres=1000):
    AI = pyFAI.AzimuthalIntegrator()
    AI.setPyFAI(**AIdict)
    # Always do mask with 1-valid, 0's excluded

    if mask is not None:
        mask = mask.copy()

    msg.logMessage(('image:', data.shape), msg.DEBUG)
    msg.logMessage(('mask:', mask.shape), msg.DEBUG)

    if not mask.shape == data.shape:
        msg.logMessage("No mask match. Mask will be ignored.", msg.WARNING)
        mask = np.ones_like(data)
        msg.logMessage(('emptymask:', mask.shape), msg.DEBUG)

    if cut is not None:
        msg.logMessage(('cut:', cut.shape), msg.DEBUG)
        mask &= cut.astype(bool)
    # data *= cut

    cake, q, chi = AI.integrate2d(data.T,
                                  xres,
                                  yres,
                                  mask=1 - mask.T,
                                  method='lut_ocl')
    mask, q, chi = AI.integrate2d(1 - mask.T,
                                  xres,
                                  yres,
                                  mask=1 - mask.T,
                                  method='lut_ocl')

    maskedcake = np.ma.masked_array(cake, mask=mask)

    chiprofile = np.ma.average(maskedcake, axis=1)

    return chi, chiprofile, color, requestkey
Beispiel #7
0
def radialintegratepyFAI(data,
                         mask=None,
                         AIdict=None,
                         cut=None,
                         color=[255, 255, 255],
                         requestkey=None,
                         qvrt=None,
                         qpar=None):
    if mask is None: mask = config.activeExperiment.mask
    if AIdict is None:
        AI = config.activeExperiment.getAI()
        # p1 = AI.get_poni1()
        # p2 = AI.get_poni2()
        # msg.logMessage(('poni:', p1, p2),msg.DEBUG)
    else:
        AI = pyFAI.AzimuthalIntegrator()
        AI.setPyFAI(**AIdict)

    if mask is not None:
        mask = mask.copy()

    msg.logMessage(('image:', data.shape), msg.DEBUG)
    msg.logMessage(('mask:', mask.shape), msg.DEBUG)

    if not mask.shape == data.shape:
        msg.logMessage("No mask match. Mask will be ignored.", msg.WARNING)
        mask = np.ones_like(data)
        msg.logMessage(('emptymask:', mask.shape), msg.DEBUG)

    if cut is not None and type(cut) is np.ndarray:
        msg.logMessage(('cut:', cut.shape), msg.DEBUG)
        mask = mask.astype(bool) & cut.astype(bool)

    (q, radialprofile) = AI.integrate1d(
        data.T,
        config.settings['Integration Bins (q)'],
        mask=1 - mask.T,
        method=pyFAI_method)  #pyfai uses 0-valid mask

    q = q / 10.

    return q.tolist(), radialprofile.tolist(), color, requestkey
Beispiel #8
0
def chi_2Dintegrate(imgdata, cen, mu, mask=None, chires=30):
    """
    Integration over r for a chi range. Output is 30*
    """
    if mask is None:
        msg.logMessage("No mask defined, creating temporary empty mask..",
                       msg.INFO)
        mask = np.zeros_like(imgdata)

    # mask data
    data = imgdata * (1 - mask)

    x, y = np.indices(data.shape).astype(np.float)
    r = np.sqrt((x - cen[0])**2 + (y - cen[1])**2)
    r = r.astype(np.int)

    delta = 3

    rinf = mu - delta / 2.
    rsup = mu + delta / 2.

    rmask = ((rinf < r) & (r < rsup) & (x < cen[0])).astype(np.int)
    data *= rmask

    chi = chires * np.arctan((y - cen[1]) / (x - cen[0]))
    chi += chires * np.pi / 2.
    chi = np.round(chi).astype(np.int)
    chi *= (chi > 0)

    tbin = np.bincount(chi.ravel(), data.ravel())
    nr = np.bincount(chi.ravel(), rmask.ravel())
    angleprofile = tbin / nr

    # vimodel = pymodelfit.builtins.GaussianModel()
    # vimodel.mu = np.pi / 2 * 100
    # vimodel.A = np.nanmax(angleprofile)
    # vimodel.fitData(x=np.arange(np.size(angleprofile)), y=angleprofile, weights=angleprofile)
    # vimodel.plot(lower=0, upper=np.pi * 100)
    # print ('len:',len(angleprofile))
    return angleprofile
Beispiel #9
0
def remeshzintegrate(data,
                     mask,
                     AIdict,
                     cut=None,
                     color=[255, 255, 255],
                     requestkey=None,
                     qvrt=None,
                     qpar=None):
    AI = pyFAI.AzimuthalIntegrator()
    AI.setPyFAI(**AIdict)

    if not mask.shape == data.shape:
        msg.logMessage("No mask match. Mask will be ignored.", msg.WARNING)
        mask = np.ones_like(data)
        msg.logMessage(('emptymask:', mask.shape), msg.DEBUG)

    if cut is not None:
        msg.logMessage(('cut:', cut.shape), msg.DEBUG)
        mask &= cut.astype(bool)

    center = np.where(np.abs(qvrt) == np.abs(qvrt).min())
    qx = -qvrt[center[1][0]] / 10.

    maskeddata = np.ma.masked_array(data, mask=1 - mask)
    xprofile = np.ma.average(maskeddata, axis=0)

    return qx, xprofile, color, requestkey
Beispiel #10
0
def cakexintegrate(data,
                   mask,
                   AIdict,
                   cut=None,
                   color=[255, 255, 255],
                   requestkey=None,
                   qvrt=None,
                   qpar=None):
    AI = pyFAI.AzimuthalIntegrator()
    AI.setPyFAI(**AIdict)

    if not mask.shape == data.shape:
        msg.logMessage("No mask match. Mask will be ignored.", msg.WARNING)
        mask = np.ones_like(data)
        msg.logMessage(('emptymask:', mask.shape), msg.DEBUG)

    if cut is not None:
        msg.logMessage(('cut:', cut.shape), msg.DEBUG)
        mask &= cut.astype(bool)

    chi = np.arange(-180, 180, 360 / config.settings['Integration Bins (χ)'])

    maskeddata = np.ma.masked_array(data, mask=1 - mask)
    xprofile = np.ma.average(maskeddata, axis=1)

    return chi.tolist(), xprofile.tolist(), color, requestkey
Beispiel #11
0
def cakezintegrate(data,
                   mask,
                   AIdict,
                   cut=None,
                   color=[255, 255, 255],
                   requestkey=None,
                   qvrt=None,
                   qpar=None):
    AI = pyFAI.AzimuthalIntegrator()
    AI.setPyFAI(**AIdict)

    if not mask.shape == data.shape:
        msg.logMessage("No mask match. Mask will be ignored.", msg.WARNING)
        mask = np.ones_like(data)
        msg.logMessage(('emptymask:', mask.shape), msg.DEBUG)

    if cut is not None:
        msg.logMessage(('cut:', cut.shape), msg.DEBUG)
        mask &= cut.astype(bool)

    q = np.arange(1000) * np.max(qpar) / 10000.

    maskeddata = np.ma.masked_array(data, mask=1 - mask)
    zprofile = np.ma.average(maskeddata, axis=0)

    return q, zprofile, color, requestkey
Beispiel #12
0
def pixel_2Dintegrate(dimg, mask=None):
    centerx = dimg.experiment.getvalue('Center X')
    centery = dimg.experiment.getvalue('Center Y')

    if mask is None:
        msg.logMessage("No mask defined, creating temporary empty mask.",
                       msg.INFO)
        mask = np.zeros_like(dimg.rawdata)

    # mask data
    data = dimg.transformdata * (mask)

    # calculate data radial profile
    x, y = np.indices(data.shape)
    r = np.sqrt((x - centerx)**2 + (y - centery)**2)
    r = r.astype(np.int)

    tbin = np.bincount(r.ravel(), data.ravel())
    nr = np.bincount(r.ravel(), (mask).ravel())
    radialprofile = tbin / nr

    return radialprofile
Beispiel #13
0
 def read(self, f, frame=None):
     with open(f, 'r') as f:
         data = np.fromfile(f, dtype=np.int32)
     for name, detector in detectors.ALL_DETECTORS.iteritems():
         if hasattr(detector, 'MAX_SHAPE'):
             # print name, detector.MAX_SHAPE, imgdata.shape[::-1]
             if np.prod(detector.MAX_SHAPE) == len(data):  #
                 detector = detector()
                 msg.logMessage('Detector found: ' + name, msg.INFO)
                 break
         if hasattr(detector, 'BINNED_PIXEL_SIZE'):
             # print detector.BINNED_PIXEL_SIZE.keys()
             if len(data) in [
                     np.prod(np.array(detector.MAX_SHAPE) / b)
                     for b in detector.BINNED_PIXEL_SIZE.keys()
             ]:
                 detector = detector()
                 msg.logMessage('Detector found with binning: ' + name,
                                msg.INFO)
                 break
     data.shape = detector.MAX_SHAPE
     self.data = data
     return self
Beispiel #14
0
    def drawoverlay(self):

        activelatticetype = self.activelatticetype()
        SG = self.spacegroupparameter.value()
        refbeta = self.beta.value()
        refdelta = self.delta.value()
        peaks = spacegrp_peaks.find_peaks(
            float(activelatticetype.a.value()),
            float(activelatticetype.b.value()),
            float(activelatticetype.c.value()),
            activelatticetype.alpha.value(),
            activelatticetype.beta.value(),
            activelatticetype.gamma.value(),
            normal=self._getRotationVector(),
            norm_type=['xyz', 'hkl', 'uvw'][self._getRotationType()],
            refdelta=refdelta,
            refbeta=refbeta,
            order=5,
            unitcell=None,
            space_grp=SG)
        for peak in peaks:
            msg.logMessage(unicode(peak), msg.DEBUG)

            #     print key + " -> " + str(peaks[key])
            center = config.activeExperiment.center
            sdd = config.activeExperiment.getvalue('Detector Distance')
            pixelsize = config.activeExperiment.getvalue('Pixel Size X')
            peak.position(center, sdd, pixelsize)
        #     pixels = spacegrp_peaks.angles_to_pixels(np.array(peaks[key]), center, sdd)
        #     peaks[key] = pixels

        # peaks = [peak('Transmission', p, peaks[p][0][0], peaks[p][0][1], 1, 1, 1) for p in peaks if
        #          not np.any(peaks[p] < -100000)] + \
        #         [peak('Reflection', p, peaks[p][1][0], peaks[p][1][1], 1, 1, 1) for p in peaks if
        #          not np.any(peaks[p] < -100000)]

        self.sigDrawSGOverlay.emit(peakoverlay(peaks))
Beispiel #15
0
def variation(operationindex, imga, imgb=None, imgc=None, roi=None):
    if imga is not None and imgb is not None and imgc is not None:
        try:
            with warnings.catch_warnings():
                warnings.simplefilter('ignore')
                # TODO: REFACTOR THIS TO USE THUMBS!!!!!
                p = scipy.ndimage.zoom(imga, 0.1, order=1)
                c = scipy.ndimage.zoom(imgb, 0.1, order=1)
                n = scipy.ndimage.zoom(imgc, 0.1, order=1)
                p = scipy.ndimage.gaussian_filter(p, 3)
                c = scipy.ndimage.gaussian_filter(c, 3)
                n = scipy.ndimage.gaussian_filter(n, 3)
                if roi is not None:
                    roi = scipy.ndimage.zoom(roi, 0.1, order=1)
                    roi = np.flipud(roi)
                else:
                    roi = 1
            with np.errstate(divide='ignore'):
                return variationoperators.operations.values()[operationindex](p, c, n, roi, None, None)
        except TypeError:
            msg.logMessage('Variation could not be determined for a frame.',msg.ERROR)
    else:
        msg.logMessage('Variation could not be determined for a frame.',msg.ERROR)
    return 0
Beispiel #16
0
    def onMove(self, pos):
        pos = self.mapFromScene(pos)
        peaks = self.peaksAtRelative(pos)

        if len(peaks) != 0:
            s = u''
            #print points
            for peak in peaks:
                if s != u'': s += '\n\n'
                s += unicode(peak)

            self.display_text.setText(s)
            self.display_text.setPos(pos)
            self.display_text.show()
            msg.logMessage(s)
        else:
            self.display_text.hide()
            #print str(self)

        if len(peaks) > 6:
            self.display_text.setText('Too many points under cursor.\n'
                                      'Zoom in or check Log info.')
            self.display_text.setPos(pos)
            self.display_text.show()
Beispiel #17
0
#! /usr/bin/env python

# from image_load import *
# import loader
import numpy as np
from pyFAI import geometry

from PySide import QtGui
import msg


try:
    from cWarpImage import warp_image
except ImportError:
    msg.logMessage("Remeshing C extension is NOT LOADED!",msg.ERROR)


def calc_q_range(lims, geometry, alphai, cen):
    nanometer = 1.0E+09
    sdd = geometry.get_dist() * nanometer
    wavelen = geometry.get_wavelength() * nanometer
    pixel1 = geometry.get_pixel1() * nanometer
    pixel2 = geometry.get_pixel2() * nanometer

    # calculate q-range for the image
    y = np.array([0, lims[1] - 1], dtype=np.float) * pixel1
    z = np.array([0, lims[0] - 1], dtype=np.float) * pixel2
    y, z = np.meshgrid(y, z)
    y -= cen[0]
    z -= cen[1]
Beispiel #18
0
def writenexus(nexroot, path):
    try:
        nexroot.save(path)
    except IOError:
        msg.logMessage('IOError: Check that you have write permissions.',msg.ERROR)
Beispiel #19
0
def remeshqintegrate(data,
                     mask,
                     AIdict,
                     cut=None,
                     color=[255, 255, 255],
                     requestkey=None,
                     qvrt=None,
                     qpar=None):

    alphai = config.activeExperiment.getvalue('Incidence Angle (GIXS)')
    msg.logMessage(
        'Incoming angle applied to remeshed q integration: ' + str(alphai),
        msg.DEBUG)

    if mask is None: mask = config.activeExperiment.mask
    if AIdict is None:
        AI = config.activeExperiment.getAI()
        # p1 = AI.get_poni1()
        # p2 = AI.get_poni2()
        # msg.logMessage(('poni:', p1, p2),msg.DEBUG)
    else:
        AI = pyFAI.AzimuthalIntegrator()
        AI.setPyFAI(**AIdict)

    if mask is not None:
        mask = mask.copy()

    msg.logMessage(('image:', data.shape), msg.DEBUG)
    msg.logMessage(('mask:', mask.shape), msg.DEBUG)

    if not mask.shape == data.shape:
        msg.logMessage("No mask match. Mask will be ignored.", msg.WARNING)
        mask = np.ones_like(data)
        msg.logMessage(('emptymask:', mask.shape), msg.DEBUG)

    if cut is not None and type(cut) is np.ndarray:
        msg.logMessage(('cut:', cut.shape), msg.DEBUG)
        mask = mask.astype(bool) & cut.astype(bool)

    #qpar, qvrt = remesh.remeshqarray(data, None, AI, np.deg2rad(alphai))
    qsquared = qpar**2 + qvrt**2

    remeshcenter = np.unravel_index(qsquared.argmin(), qsquared.shape)

    print 'center?:', remeshcenter

    f2d = AI.getFit2D()
    f2d['centerX'] = remeshcenter[0]
    f2d['centerY'] = remeshcenter[1]
    AI.setFit2D(**f2d)
    AIdict = AI.getPyFAI()
    msg.logMessage('remesh corrected calibration: ' + str(AIdict))

    AI._cached_array["q_center"] = np.sqrt(
        qsquared
    ).T / 10  # This is cheating! pyFAI may give unexpected results here

    (q, radialprofile) = AI.integrate1d(
        data.T,
        config.settings['Integration Bins (q)'],
        mask=1 - mask.T,
        method=pyFAI_method)  #pyfai uses 0-valid mask

    return q, radialprofile, color, requestkey
Beispiel #20
0
def jpeg(img):
    buffer = StringIO.StringIO()
    pilImage = Image.fromarray(img)
    pilImage.save(buffer, "JPEG", quality=85)
    msg.logMessage(('JPEG buffer size (bytes):', buffer.len),msg.DEBUG)
    return buffer