Source code for PyMca5.PyMcaGui.pymca.PyMcaGLWindow

#/*##########################################################################
# Copyright (C) 2004-2014 V.A. Sole, European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import numpy
DEBUG = 0
try:
    from PyMca5 import Object3D
    from PyMca5.Object3D import Object3DScene
except ImportError:
    if DEBUG:
        print("PyMcaGLWindow imports Object3D direcly. Frozen version?")
    import Object3D
    from Object3D import Object3DScene

[docs]class SceneGLWindow(Object3D.Object3DScene.Object3DScene): def _addSelection(self, selectionlist, replot=True): if DEBUG: print("addSelection(self, selectionlist)",selectionlist) if type(selectionlist) == type([]): sellist = selectionlist else: sellist = [selectionlist] for sel in sellist: source = sel['SourceName'] key = sel['Key'] legend = sel['legend'] #expected form sourcename + scan key dataObject = sel['dataobject'] #one-dimensional selections not considered if dataObject.info["selectiontype"] == "1D": continue #there must be something to plot if not hasattr(dataObject, 'y'): continue #there must be an x for a scan selection to reach here if not hasattr(dataObject, 'x'): continue if dataObject.x is None: numberOfXAxes = 0 else: numberOfXAxes = len(dataObject.x) if numberOfXAxes > 1: if DEBUG: print("Mesh plots") else: xdata = dataObject.x[0] #we have to loop for all y values ycounter = -1 for ydata in dataObject.y: ycounter += 1 ylegend = 'y%d' % ycounter if sel['selection'] is not None: if type(sel['selection']) == type({}): if 'y' in sel['selection']: ilabel = sel['selection']['y'][ycounter] ylegend = dataObject.info['LabelNames'][ilabel] object3Dlegend = legend + " " + ylegend ndata = len(ydata) object3D = self.addDataObject(dataObject, legend=object3Dlegend, update_scene=False) self.sceneControl.updateView() self.glWidget.setZoomFactor(self.glWidget.getZoomFactor()) def _removeSelection(self, selectionlist): if DEBUG: print("_removeSelection(self, selectionlist)",selectionlist) if type(selectionlist) == type([]): sellist = selectionlist else: sellist = [selectionlist] for sel in sellist: source = sel['SourceName'] key = sel['Key'] legend = sel['legend'] #expected form sourcename + scan key if 'LabelNames' in sel['selection']: labelNames = sel['selection']['LabelNames'] else: labelNames = sel['selection']['cntlist'] for ycounter in sel['selection']['y']: ylegend = labelNames[ycounter] object3Dlegend = legend + " " + ylegend self.removeObject(object3Dlegend, update_scene=False) self.sceneControl.updateView() self.glWidget.setZoomFactor(self.glWidget.getZoomFactor()) def _replaceSelection(self, selectionlist): if DEBUG: print("_replaceSelection(self, selectionlist)",selectionlist) if type(selectionlist) == type([]): sellist = selectionlist else: sellist = [selectionlist] self.clear(update_scene=False) self._addSelection(selectionlist)
[docs] def addDataObject(self, dataObject, legend=None, update_scene=True): if legend is None: legend = dataObject.info['legend'] if (dataObject.m is None) or (dataObject.m == []): data = dataObject.y[0] else: #I would have to check for the presence of zeros in monitor data = dataObject.y[0]/dataObject.m[0] if dataObject.x is None: if len(data.shape) == 3: object3D=self.stack(data, legend=legend, update_scene=False) else: object3D=self.mesh(data, legend=legend, update_scene=False) return object3D ndata = 1 for dimension in data.shape: ndata *= dimension ndim = 1 xDimList = [] for dataset in dataObject.x: xdim = 1 for dimension in dataset.shape: xdim *= dimension xDimList.append(xdim) ndim *=xdim if len(dataObject.x) == len(data.shape): #two possibilities, the product is equal to the dimension #or not if ndim == ndata: if len(data.shape) == 3: if DEBUG: print("CASE 1") if (xDimList[0] != data.shape[0]) or\ (xDimList[1] != data.shape[1]) or\ (xDimList[2] != data.shape[2]): text = "Wrong dimensions:" text += " %dx%dx%d != (%d, %d, %d)" % (xDimList[0], xDimList[1], xDimList[2], data.shape[0], data.shape[1], data.shape[2]) raise ValueError(text) object3D = self.stack(data, x=dataObject.x[0], y=dataObject.x[1], z=dataObject.x[2], legend=legend, update_scene=update_scene) elif len(data.shape) == 2: if DEBUG: print("CASE 2") object3D = self.mesh(data, x=dataObject.x[0], y=dataObject.x[1], z=0, #This is 2D #z=data[:], #This is 3D legend=legend, update_scene=update_scene) elif len(data.shape) == 1: if DEBUG: print("CASE 3") object3D = self.mesh(data, x=dataObject.x[0], y=numpy.zeros((1,1), numpy.float32), z=data[:], legend=legend, update_scene=update_scene) return object3D elif (len(data.shape) == 3) and (len(xDimList) == 2): print("WARNING Assuming last dimension") if DEBUG: print("CASE 1.1") if (xDimList[0] != data.shape[0]) or\ (xDimList[1] != data.shape[1]): text = "Wrong dimensions:" text += " %dx%d != (%d, %d, %d)" % (xDimList[0], xDimList[1], data.shape[0], data.shape[1], data.shape[2]) raise ValueError(text) z = numpy.arange(data.shape[2]) object3D = self.stack(data, x=dataObject.x[0], y=dataObject.x[1], z=z, legend=legend, update_scene=update_scene) return object3D #I have to assume all the x are of 1 element or of as many elements as data xyzData = numpy.zeros((ndata, 3), numpy.float32) values = numpy.zeros((ndata, 1), numpy.float32) values[:,0] = data xdataCounter = 0 for xdata in dataObject.x: ndim = 1 for dimension in xdata.shape: ndim *= dimension if ndim == 1: xyzData[:,xdataCounter] = xdata * numpy.ones(ndata) else: xyzData[:,xdataCounter] = xdata xdataCounter += 1 object3D = Object3D.Object3DScene.Object3DMesh.Object3DMesh(legend) #if the number of points is reasonable #I force a surface plot. if ndata < 200000: cfg = object3D.setConfiguration({'common':{'mode':3}}) if DEBUG: print("DEFAULT CASE") object3D.setData(values, xyz=xyzData) self.addObject(object3D, legend, update_scene=update_scene) return object3D