Source code for PyMca5.PyMcaGui.physics.xrf.McaAdvancedTable

#/*##########################################################################
#
# The PyMca X-Ray Fluorescence Toolkit
#
# Copyright (c) 2004-2014 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. Armando Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
from PyMca5.PyMcaGui import PyMcaQt as qt
if hasattr(qt, "QString"):
    QString = qt.QString
else:
    QString = str
QTVERSION = qt.qVersion()
DEBUG=0

QTable = qt.QTableWidget

[docs]class McaTable(QTable): sigMcaTableSignal = qt.pyqtSignal(object) sigClosed = qt.pyqtSignal(object) def __init__(self, *args,**kw): QTable.__init__(self, *args) if 'labels' in kw: self.labels=[] for label in kw['labels']: self.labels.append(label) else: #self.labels=['Element','Group','Energy','Ratio','Fit Area','MCA Area','Sigma','Fwhm','Chisq'] self.labels=['Element','Group','Fit Area','Sigma','Energy','Ratio','FWHM','Chi square'] self.setColumnCount(len(self.labels)) for i in range(len(self.labels)): item = self.horizontalHeaderItem(i) if item is None: item = qt.QTableWidgetItem(self.labels[i], qt.QTableWidgetItem.Type) item.setText(self.labels[i]) self.setHorizontalHeaderItem(i,item) self.regionlist=[] self.regiondict={} if QTVERSION < '5.0.0': self.verticalHeader().setClickable(True) else: self.verticalHeader().setSectionsClickable(True) self.verticalHeader().sectionClicked.connect(self.__myslot) self.itemSelectionChanged.connect(self.__myslot) #self.connect(self,qt.SIGNAL("selectionChanged()"),self.__myslot) #self.setSelectionMode(qttable.QTable.SingleRow)
[docs] def fillfrommca(self,result,diag=1): line=0 #calculate the number of rows nrows = 0 for group in result['groups']: nrows += 1 for peak in result[group]['peaks']: nrows += 1 for peak0 in result[group]['escapepeaks']: peak = peak0+"esc" if result[group][peak]['ratio'] > 0.0: nrows += 1 self.setRowCount(nrows) for group in result['groups']: ele,group0 = group.split() fitarea = QString("%.4e" % (result[group]['fitarea'])) sigmaarea = QString("%.2e" % (result[group]['sigmaarea'])) fields = [ele,group0,fitarea,sigmaarea] col = 0 color = qt.QColor('white') nlines = self.rowCount() if (line+1) > nlines: self.setRowCount(line+1) for i in range(len(self.labels)): if i < len(fields): item = self.item(line, col) text = fields[i] if item is None: item = qt.QTableWidgetItem(text, qt.QTableWidgetItem.Type) self.setItem(line, col, item) else: item.setText(text) item.setBackgroundColor(color) item.setFlags(qt.Qt.ItemIsSelectable| qt.Qt.ItemIsEnabled) else: item = self.item(line, col) if item is not None: item.setText("") #self.setItem(line, col, item) col=col+1 line += 1 #Lemon Chiffon = (255,250,205) color = qt.QColor(255,250,205) for peak in result[group]['peaks']: name = peak energy = QString("%.3f" % (result[group][peak]['energy'])) ratio = QString("%.5f" % (result[group][peak]['ratio'])) area = QString("%.4e" % (result[group][peak]['fitarea'])) sigma = QString("%.2e" % (result[group][peak]['sigmaarea'])) fwhm = QString("%.3f" % (result[group][peak]['fwhm'])) chisq = QString("%.2f" % (result[group][peak]['chisq'])) if (line+1) > nlines: self.setRowCount(line+1) fields = [name,area,sigma,energy,ratio,fwhm,chisq] col = 1 for field in fields: item = self.item(line, col) text = field if item is None: item = qt.QTableWidgetItem(text, qt.QTableWidgetItem.Type) self.setItem(line, col, item) else: item.setText(text) item.setBackgroundColor(color) item.setFlags(qt.Qt.ItemIsSelectable| qt.Qt.ItemIsEnabled) col=col+1 line+=1 for peak0 in result[group]['escapepeaks']: peak = peak0+"esc" if result[group][peak]['ratio'] > 0.0: energy = QString("%.3f" % (result[group][peak]['energy'])) ratio = QString("%.5f" % (result[group][peak]['ratio'])) area = QString("%.4e" % (result[group][peak]['fitarea'])) sigma = QString("%.2e" % (result[group][peak]['sigmaarea'])) fwhm = QString("%.3f" % (result[group][peak]['fwhm'])) chisq = QString("%.2f" % (result[group][peak]['chisq'])) if (line+1) > nlines: self.setRowCount(line+1) fields = [peak,area,sigma,energy,ratio,fwhm,chisq] col = 1 for field in fields: item = self.item(line, col) if item is None: item = qt.QTableWidgetItem(field, qt.QTableWidgetItem.Type) self.setItem(line, col, item) else: item.setText(field) item.setBackgroundColor(color) item.setFlags(qt.Qt.ItemIsSelectable| qt.Qt.ItemIsEnabled) col=col+1 line+=1 for i in range(self.columnCount()): if i>-1: self.resizeColumnToContents(i)
def __getfitpar(self,result): if result['fitconfig']['fittheory'].find("Area") != -1: fitlabel='Area' elif result['fitconfig']['fittheory'].find("Hypermet") != -1: fitlabel='Area' else: fitlabel='Height' values = [] sigmavalues = [] for param in result['paramlist']: if param['name'].find('ST_Area') != -1: # value and sigmavalue defined via fitlabel values[-1] = value * (1.0 + param['fitresult']) #just an approximation sigmavalues[-1] = sigmavalue * (1.0 + param['fitresult']) elif param['name'].find('LT_Area')!= -1: pass elif param['name'].find(fitlabel) != -1: value = param['fitresult'] sigmavalue = param['sigma'] values.append(value) sigmavalues.append(sigmavalue) return fitlabel, values, sigmavalues def __myslot(self,*var): ddict={} if len(var) == 0: #selection changed event #get the current selection ddict['event'] = 'McaTableClicked' row = self.currentRow() else: #Header click ddict['event'] = 'McaTableRowHeaderClicked' row = var[0] ccol = self.currentColumn() ddict['row' ] = row ddict['col'] = ccol ddict['labelslist'] = self.labels if row >= 0: col = 0 for label in self.labels: item = self.item(row, col) if item is not None: text = item.text() try: ddict[label] = float(str(text)) except: ddict[label] = str(text) col +=1 self.sigMcaTableSignal.emit(ddict)
[docs] def gettext(self): lemon= ("#%x%x%x" % (255,250,205)).upper() if QTVERSION < '4.0.0': hb = self.horizontalHeader().paletteBackgroundColor() hcolor = ("#%x%x%x" % (hb.red(),hb.green(),hb.blue())).upper() else: if DEBUG: print("color background to implement") hcolor = ("#%x%x%x" % (230,240,249)).upper() text = "" text += ("<nobr>") text += ("<table>") text += ("<tr>") ncols = self.columnCount() for l in range(ncols): text+=('<td align="left" bgcolor="%s"><b>' % hcolor) text+=(str(self.horizontalHeaderItem(l).text())) text+=("</b></td>") text+=("</tr>") #text+=( str(QString("</br>")) nrows = self.rowCount() for r in range(nrows): text+=("<tr>") moretext = "" item = self.item(r, 0) if item is not None: moretext = str(item.text()) if len(moretext): color = "white" b="<b>" else: b="" color = lemon for c in range(ncols): moretext = "" item = self.item(r, c) if item is not None: moretext = str(item.text()) if len(moretext): finalcolor = color else: finalcolor = "white" if c<2: text+=('<td align="left" bgcolor="%s">%s' % (finalcolor,b)) else: text+=('<td align="right" bgcolor="%s">%s' % (finalcolor,b)) text+= moretext if len(b): text+=("</td>") else: text+=("</b></td>") moretext = "" item = self.item(r, 0) if item is not None: moretext = str(item.text()) if len(moretext): text+=("</b>") text+=("</tr>") #text+=( str(QString("<br>")) text+=("\n") text+=("</table>") text+=("</nobr>") return text
[docs] def closeEvent(self, event): QTable.closeEvent(self, event) ddict={} ddict['event']= 'closed' self.sigClosed.emit(ddict)