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

#/*##########################################################################
#
# The PyMca X-Ray Fluorescence Toolkit
#
# Copyright (c) 2004-2015 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"
import sys
from PyMca5.PyMcaGui import PyMcaQt as qt
from PyMca5.PyMcaPhysics import Elements
from PyMca5.PyMcaGui import PyMca_Icons
IconDict = PyMca_Icons.IconDict
QTVERSION = qt.qVersion()
DEBUG = 0


[docs]class PeakIdentifier(qt.QWidget): sigPeakIdentifierSignal = qt.pyqtSignal(object) def __init__(self,parent=None,energy=None,threshold=None,useviewer=None, name="Peak Identifier"): qt.QWidget.__init__(self, parent) self.setWindowTitle(name) self.setWindowIcon(qt.QIcon(qt.QPixmap(IconDict['gioconda16']))) if energy is None: energy = 5.9 if threshold is None: threshold = 0.030 if useviewer is None: useviewer = 0 self.__useviewer = useviewer layout = qt.QVBoxLayout(self) #heading self.__energyHBox=qt.QWidget(self) hbox = self.__energyHBox hbox.layout = qt.QHBoxLayout(hbox) hbox.layout.setContentsMargins(0, 0, 0, 0) hbox.layout.setSpacing(0) layout.addWidget(hbox) hbox.layout.addWidget(qt.HorizontalSpacer(hbox)) l1=qt.QLabel(hbox) l1.setText('<b><nobr>Energy (keV)</nobr></b>') hbox.layout.addWidget(l1) self.energy=MyQLineEdit(hbox) self.energy.setText("%.3f" % energy) self.energy._validator = qt.QDoubleValidator(self.energy) self.energy.setValidator(self.energy._validator) self.energy.setToolTip('Press enter to validate your energy') hbox.layout.addWidget(self.energy) hbox.layout.addWidget(qt.HorizontalSpacer(hbox)) self.energy.editingFinished.connect(self._energySlot) #parameters self.__hbox2 = qt.QWidget(self) hbox2 = self.__hbox2 layout.addWidget(hbox2) hbox2.layout = qt.QHBoxLayout(hbox2) hbox2.layout.setContentsMargins(0, 0, 0, 0) hbox2.layout.setSpacing(0) font=hbox2.font() font.setBold(1) hbox2.setFont(font) l2=qt.QLabel(hbox2) l2.setText('Energy Threshold (eV)') self.threshold=qt.QSpinBox(hbox2) self.threshold.setMinimum(0) self.threshold.setMaximum(1000) self.threshold.setValue(int(threshold*1000)) self.k = qt.QCheckBox(hbox2) self.k.setText('K') self.k.setChecked(1) self.l1 = qt.QCheckBox(hbox2) self.l1.setText('L1') self.l1.setChecked(1) self.l2 = qt.QCheckBox(hbox2) self.l2.setText('L2') self.l2.setChecked(1) self.l3 = qt.QCheckBox(hbox2) self.l3.setText('L3') self.l3.setChecked(1) self.m = qt.QCheckBox(hbox2) self.m.setText('M') self.m.setChecked(1) self.threshold.valueChanged[int].connect(self.mySlot) self.k.clicked.connect(self.mySlot) self.l1.clicked.connect(self.mySlot) self.l2.clicked.connect(self.mySlot) self.l3.clicked.connect(self.mySlot) self.m.clicked.connect(self.mySlot) hbox2.layout.addWidget(l2) hbox2.layout.addWidget(self.threshold) hbox2.layout.addWidget(self.k) hbox2.layout.addWidget(self.l1) hbox2.layout.addWidget(self.l2) hbox2.layout.addWidget(self.l3) hbox2.layout.addWidget(self.m) if self.__useviewer: self.__browsertext = qt.QTextEdit(self) layout.addWidget(self.__browsertext) self.setEnergy()
[docs] def setEnergy(self, energy = None): if energy is None: energy = 5.9 if type(energy) == type(""): self.energy.setText("%s" % energy) else: self.energy.setText("%.3f" % energy) self._energySlot()
def _energySlot(self): qstring = self.energy.text() try: value = float(str(qstring)) self.energyvalue = value self.mySlot() self.energy.setPaletteBackgroundColor(qt.Qt.white) cursor = self.__browsertext.textCursor() cursor.movePosition(qt.QTextCursor.Start) self.__browsertext.setTextCursor(cursor) self.threshold.setFocus() except: msg=qt.QMessageBox(self.energy) msg.setIcon(qt.QMessageBox.Critical) msg.setText("Invalid Float") msg.setWindowTitle("Invalid entry") msg.exec_() self.energy.setFocus() return
[docs] def myslot(self): print("PeakIdentifier.py myslot deprecated, use mySlot") return mySlot()
[docs] def mySlot(self): try: energy = float(str(self.energy.text())) except ValueError: msg=qt.QMessageBox(self.energy) msg.setIcon(qt.QMessageBox.Critical) msg.setText("Invalid Energy Value") msg.setWindowTitle("Invalid energy") msg.exec_() self.energy.setFocus() return threshold = float(str(self.threshold.text()))/1000. lines=[] if self.k.isChecked(): lines.append('K') if self.l1.isChecked(): lines.append('L1') if self.l2.isChecked(): lines.append('L2') if self.l3.isChecked(): lines.append('L3') if self.m.isChecked(): lines.append('M') ddict=Elements.getcandidates(energy,threshold,lines)[0] ddict['text'] =self.getHtmlText(ddict) ddict['event']='Candidates' ddict['lines']=lines if self.__useviewer: self.__browsertext.clear() #self.__browsertext.insertHtml("<CENTER>"+dict['text']+\ # "</CENTER>") self.__browsertext.insertHtml(ddict['text']) self.sigPeakIdentifierSignal.emit(ddict)
[docs] def getHtmlText(self, ddict): text = "" if QTVERSION < '4.0.0': text += "<br>" labels=['Element','Line','Energy','Rate'] lemmon=("#%x%x%x" % (255,250,205)) lemmon = lemmon.upper() hcolor = ("#%x%x%x" % (230,240,249)) hcolor = hcolor.upper() text+="<CENTER>" text+=("<nobr>") text+=( "<table WIDTH=80%%>") text+=( "<tr>") for l in labels: text+=('<td align="left" bgcolor="%s"><b>' % hcolor) text+=l text+=("</b></td>") text+=("</tr>") for ele in ddict['elements']: oldline="" for line in ddict[ele]: if line[0][0:1] == 'K': group0 = 'K rays' elif line[0][0:2] == 'L1': group0 = 'L1 rays' elif line[0][0:2] == 'L2': group0 = 'L2 rays' elif line[0][0:2] == 'L3': group0 = 'L3 rays' elif line[0][0:1] == 'M': group0 = 'M rays' else: group0 = 'Unknown' if group0 != oldline: text +="<tr>" text += '<td align="left"><b>%s</b></td>' % ele text += '<td align="left"><b>%s</b></td>' % group0 text += '</tr>' oldline = group0 #for peak in result[group]['peaks']: text += '<tr><td></td>' name = line[0] energy = ("%.3f" % line[1]) ratio = ("%.5f" % line[2]) fields = [name,energy,ratio] for field in fields: if field == name: text+=('<td align="left" bgcolor="%s">%s</td>' % (lemmon,field)) else: text+=('<td align="right" bgcolor="%s">%s</td>' % (lemmon,field)) text+="</tr>" text+=("</table>") text+=("</nobr>") text+="</CENTER>" return text
[docs]class MyQLineEdit(qt.QLineEdit): def __init__(self,parent=None,name=None): qt.QLineEdit.__init__(self,parent) self.setAutoFillBackground(True)
[docs] def setPaletteBackgroundColor(self, color): palette = qt.QPalette() role = self.backgroundRole() palette.setColor(role,color) self.setPalette(palette)
[docs] def focusInEvent(self,event): self.setPaletteBackgroundColor(qt.QColor('yellow')) # TODO not like focusOutEvent ? ''' if QTVERSION > '4.0.0': qt.QLineEdit.focusInEvent(self, event) '''
[docs] def focusOutEvent(self,event): self.setPaletteBackgroundColor(qt.QColor('white')) qt.QLineEdit.focusOutEvent(self, event)
[docs]def main(): app = qt.QApplication(sys.argv) winpalette = qt.QPalette(qt.QColor(230,240,249),qt.QColor(238,234,238)) app.setPalette(winpalette) if len(sys.argv) > 1: ene = float(sys.argv[1]) else: ene = 5.9 mw = qt.QWidget() l = qt.QVBoxLayout(mw) l.setSpacing(0) w= PeakIdentifier(mw,energy=ene,useviewer=1) l.addWidget(w) mw.setWindowTitle("Peak Identifier") mw.show() app.exec_()
if __name__ == "__main__": main()