#/*##########################################################################
# 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 os
import sys
from PyMca5.PyMcaGui import PyMcaQt as qt
from . import Parameters
QTVERSION = qt.qVersion()
from . import McaTable
DEBUG = 0
[docs]class ParametersTab(qt.QTabWidget):
sigMultiParametersSignal = qt.pyqtSignal(object)
def __init__(self,parent = None, name = "FitParameters"):
qt.QTabWidget.__init__(self, parent)
self.setWindowTitle(name)
#geometry
#self.resize(570,300)
#self.setCaption(self.trUtf8(name))
#initialize the numer of tabs to 1
#self.TabWidget=QTabWidget(self,"ParametersTab")
#self.TabWidget.setGeometry(QRect(25,25,450,350))
#the widgets in the notebook
self.views={}
#the names of the widgets (to have them in order)
self.tabs=[]
#the widgets/tables themselves
self.tables={}
self.mcatable=None
self.setContentsMargins(10, 10, 10, 10)
self.setview(name="Region 1")
[docs] def setview(self,name=None,fitparameterslist=None):
if name is None:
name = self.current
if name in self.tables.keys():
table=self.tables[name]
else:
#create the parameters instance
self.tables[name]=Parameters.Parameters(self)
table=self.tables[name]
self.tabs.append(name)
self.views[name]=table
#if qVersion() >= '3.0.0':
# self.addTab(table,self.trUtf8(name))
#else:
# self.addTab(table,self.tr(name))
self.addTab(table,str(name))
if fitparameterslist is not None:
table.fillfromfit(fitparameterslist)
#print "SHowing page ",name
if QTVERSION < '4.0.0':
self.showPage(self.views[name])
else:
self.setCurrentWidget(self.views[name])
self.current=name
[docs] def renameview(self,oldname=None,newname=None):
error = 1
if newname is not None:
if newname not in self.views.keys():
if oldname in self.views.keys():
parameterlist=self.tables[oldname].fillfitfromtable()
self.setview(name=newname,fitparameterslist=parameterlist)
self.removeview(oldname)
error = 0
return error
[docs] def fillfromfit(self,fitparameterslist,current=None):
if current is None:
current=self.current
#for view in self.tables.keys():
# self.removeview(view)
self.setview(fitparameterslist=fitparameterslist,name=current)
[docs] def fillfitfromtable(self,*vars,**kw):
if len(vars) > 0:
name=vars[0]
elif 'view' in kw:
name=kw['view']
elif 'name' in kw:
name=kw['name']
else:
name=self.current
if hasattr(self.tables[name],'fillfitfromtable'):
return self.tables[name].fillfitfromtable()
else:
return None
[docs] def removeview(self,*vars,**kw):
error = 1
if len(vars) > 0:
view=vars[0]
elif 'view' in kw:
view=kw['view']
elif 'name' in kw:
view=kw['name']
else:
return error
if view == self.current:
return error
if view in self.views.keys():
self.tabs.remove(view)
if QTVERSION < '4.0.0':
self.removePage(self.tables[view])
self.removePage(self.views[view])
else:
index = self.indexOf(self.tables[view])
self.removeTab(index)
index = self.indexOf(self.views[view])
self.removeTab(index)
del self.tables[view]
del self.views[view]
error =0
return error
[docs] def removeallviews(self,keep='Fit'):
for view in list(self.tables.keys()):
if view != keep:
self.removeview(view)
[docs] def fillfrommca(self,mcaresult):
#for view in self.tables.keys():
# self.removeview(view)
self.removeallviews()
region = 0
for result in mcaresult:
#if result['chisq'] is not None:
region=region+1
self.fillfromfit(result['paramlist'],current='Region '+\
"%d" % region)
name='MCA'
if name in self.tables:
table=self.tables[name]
else:
self.tables[name]=McaTable.McaTable(self)
table=self.tables[name]
self.tabs.append(name)
self.views[name]=table
#self.addTab(table,self.trUtf8(name))
self.addTab(table,str(name))
table.sigMcaTableSignal.connect(self.__forward)
table.fillfrommca(mcaresult)
self.setview(name=name)
return
def __forward(self,ddict):
self.sigMultiParametersSignal.emit(ddict)
[docs] def gettext(self,**kw):
if "name" in kw:
name = kw["name"]
else:
name = self.current
table = self.tables[name]
lemon = ("#%x%x%x" % (255,250,205)).upper()
if QTVERSION < '4.0.0':
hb = table.horizontalHeader().paletteBackgroundColor()
hcolor = ("#%x%x%x" % (hb.red(), hb.green(), hb.blue())).upper()
else:
if DEBUG:
print("Actual color to ge got")
hcolor = ("#%x%x%x" % (230,240,249)).upper()
text=""
text+=("<nobr>")
text+=( "<table>")
text+=( "<tr>")
if QTVERSION < '4.0.0':
ncols = table.numCols()
else:
ncols = table.columnCount()
for l in range(ncols):
text+=('<td align="left" bgcolor="%s"><b>' % hcolor)
if QTVERSION < '4.0.0':
text+=(str(table.horizontalHeader().label(l)))
else:
text+=(str(table.horizontalHeaderItem(l).text()))
text+=("</b></td>")
text+=("</tr>")
if QTVERSION < '4.0.0': nrows = table.numRows()
else: nrows = table.rowCount()
for r in range(nrows):
text+=("<tr>")
if QTVERSION < '4.0.0':
newtext = str(table.text(r,0))
else:
item = table.item(r, 0)
newtext = ""
if item is not None:
newtext = str(item.text())
if len(newtext):
color = "white"
b="<b>"
else:
b=""
color = lemon
try:
#MyQTable item has color defined
cc = table.item(r,0).color
cc = ("#%x%x%x" % (cc.red(),cc.green(),cc.blue())).upper()
color = cc
except:
pass
for c in range(ncols):
if QTVERSION < '4.0.0':
newtext = str(table.text(r,c))
else:
item = table.item(r, c)
newtext = ""
if item is not None:
newtext = str(item.text())
if len(newtext):
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+=(newtext)
if len(b):
text+=("</td>")
else:
text+=("</b></td>")
if QTVERSION < '4.0.0':
newtext = str(table.text(r,0))
else:
item = table.item(r, 0)
newtext = ""
if item is not None:
newtext = str(item.text())
if len(newtext):
text+=("</b>")
text+=("</tr>")
#text+=( str(qt.QString("<br>"))
text+=("\n")
text+=("</table>")
text+=("</nobr>")
return text
[docs] def getHTMLText(self, **kw):
return self.gettext(**kw)
if QTVERSION > '4.0.0':
[docs] def getText(self, **kw):
if "name" in kw:
name = kw["name"]
else:
name = self.current
table = self.tables[name]
text=""
if QTVERSION < '4.0.0':
ncols = table.numCols()
else:
ncols = table.columnCount()
for l in range(ncols):
if QTVERSION < '4.0.0':
text+=(str(table.horizontalHeader().label(l)))
else:
text+=(str(table.horizontalHeaderItem(l).text()))+"\t"
text+=("\n")
if QTVERSION < '4.0.0':
nrows = table.numRows()
else:
nrows = table.rowCount()
for r in range(nrows):
if QTVERSION < '4.0.0':
newtext = str(table.text(r,0))
else:
item = table.item(r, 0)
newtext = ""
if item is not None:
newtext = str(item.text())+"\t"
for c in range(ncols):
if QTVERSION < '4.0.0':
newtext = str(table.text(r,c))
else:
newtext = ""
if c != 4:
item = table.item(r, c)
if item is not None:
newtext = str(item.text())
else:
item = table.cellWidget(r, c)
if item is not None:
newtext = str(item.currentText())
text+=(newtext)+"\t"
text+=("\n")
text+=("\n")
return text
[docs]def test():
a = qt.QApplication(sys.argv)
a.lastWindowClosed.connect(a.quit)
w = ParametersTab()
w.show()
from PyMca5.PyMca import specfilewrapper as specfile
from PyMca5.PyMca import Specfit
from PyMca5 import PyMcaDataDir
import numpy
sf=specfile.Specfile(os.path.join(PyMcaDataDir.PYMCA_DATA_DIR,
"XRFSpectrum.mca"))
scan=sf.select('2.1')
mcadata=scan.mca(1)
y=numpy.array(mcadata)
#x=numpy.arange(len(y))
x=numpy.arange(len(y))*0.0502883-0.492773
fit=Specfit.Specfit()
fit.setdata(x=x,y=y)
fit.importfun(os.path.join(os.path.dirname(Specfit.__file__),
"SpecfitFunctions.py"))
fit.settheory('Hypermet')
fit.configure(Yscaling=1.,
WeightFlag=1,
PosFwhmFlag=1,
HeightAreaFlag=1,
FwhmPoints=16,
PositionFlag=1,
HypermetTails=1)
fit.setbackground('Linear')
if 1:
mcaresult=fit.mcafit(x=x,xmin=x[300],xmax=x[1000])
w.fillfrommca(mcaresult)
else:
fit.estimate()
fit.startfit()
w.fillfromfit(fit.paramlist,current='Fit')
w.removeview(view='Region 1')
a.exec_()
if __name__ == "__main__":
bench=0
if bench:
import pstats
import profile
profile.run('test()',"test")
p=pstats.Stats("test")
p.strip_dirs().sort_stats(-1).print_stats()
else:
test()