Source code for PyMca5.PyMcaGui.math.fitting.McaTable

#/*##########################################################################
# 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"
from PyMca5.PyMcaGui import PyMcaQt as qt
if hasattr(qt, "QString"):
    QString = qt.QString
else:
    QString = str

QTVERSION = qt.qVersion()

QTable = qt.QTableWidget

DEBUG=0

[docs]class McaTable(QTable): sigMcaTableSignal = qt.pyqtSignal(object) def __init__(self, *args,**kw): QTable.__init__(self, *args) self.setRowCount(1) self.setColumnCount(1) self.labels=['Parameter','Estimation','Fit Value','Sigma', 'Restrains','Min/Parame','Max/Factor/Delta/'] self.code_options=["FREE","POSITIVE","QUOTED", "FIXED","FACTOR","DELTA","SUM","IGNORE","ADD","SHOW"] i=0 if 'labels' in kw: self.labels=[] for label in kw['labels']: self.labels.append(label) else: self.labels=['Position','Fit Area','MCA Area','Sigma','Fwhm','Chisq', 'Region','XBegin','XEnd'] self.setColumnCount(len(self.labels)) for label in self.labels: item = self.horizontalHeaderItem(i) if item is None: item = qt.QTableWidgetItem(self.labels[i], qt.QTableWidgetItem.Type) self.setHorizontalHeaderItem(i,item) item.setText(self.labels[i]) self.resizeColumnToContents(i) i=i+1 self.regionlist=[] self.regiondict={} if DEBUG: print("MCATABLE click on vertical header items?") self.verticalHeader().sectionClicked[int].connect(self.__myslot) self.cellClicked[int, int].connect(self.__myslot) self.itemSelectionChanged[()].connect(self.__myslot)
[docs] def fillfrommca(self,mcaresult,diag=1): line0=0 region=0 alreadyforced = 0 for result in mcaresult: region=region+1 if result['chisq'] is not None: chisq=QString("%6.2f" % (result['chisq'])) else: chisq=QString("Fit Error") if 1: xbegin=QString("%6g" % (result['xbegin'])) xend=QString("%6g" % (result['xend'])) fitlabel,fitpars, fitsigmas = self.__getfitpar(result) if QTVERSION < '4.0.0': qt.QHeader.setLabel(self.horizontalHeader(),1,"Fit "+fitlabel) else: item = self.horizontalHeaderItem(1) item.setText("Fit "+fitlabel) i = 0 for (pos,area,sigma,fwhm) in result['mca_areas']: line0=line0+1 if QTVERSION < '4.0.0': nlines=self.numRows() if (line0 > nlines): self.setNumRows(line0) else: nlines=self.rowCount() if (line0 > nlines): self.setRowCount(line0) line=line0-1 #pos=QString(str(pos)) #area=QString(str(area)) #sigma=QString(str(sigma)) #fwhm=QString(str(fwhm)) tregion=QString(str(region)) pos=QString("%6g" % (pos)) fitpar = QString("%6g" % (fitpars[i])) if fitlabel == 'Area': sigma = max(sigma,fitsigmas[i]) areastr=QString("%6g" % (area)) sigmastr=QString("%6.3g" % (sigma)) fwhm=QString("%6g" % (fwhm)) tregion=QString("%6g" % (region)) fields=[pos,fitpar,areastr,sigmastr,fwhm,chisq,tregion,xbegin,xend] col=0 recolor = 0 if fitlabel == 'Area': if diag: if abs(fitpars[i]-area) > (3.0 * sigma): color = qt.QColor(255,182,193) recolor = 1 for field in fields: key = self.item(line, col) if key is None: key = qt.QTableWidgetItem(field) self.setItem(line, col, key) else: item.setText(field) if recolor: #function introduced in Qt 4.2.0 if QTVERSION >= '4.2.0': item.setBackground(qt.QBrush(color)) item.setFlags(qt.Qt.ItemIsSelectable|qt.Qt.ItemIsEnabled) col=col+1 if recolor: if not alreadyforced: alreadyforced = 1 self.scrollToItem(self.item(line, 0)) i += 1 i = 0 for label in self.labels: self.resizeColumnToContents(i) i=i+1 ndict = {} ndict['event'] = 'McaTableFilled' self.sigMcaTableSignal.emit(ndict)
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 known 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: text = str(self.item(row, col).text()) try: ddict[label] = float(text) except: ddict[label] = text col +=1 self.sigMcaTableSignal.emit(ddict)