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)
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
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
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
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
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
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
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
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
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
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
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
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
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))
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
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()
#! /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]
def writenexus(nexroot, path): try: nexroot.save(path) except IOError: msg.logMessage('IOError: Check that you have write permissions.',msg.ERROR)
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
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