Source code for PyMca5.PyMcaGui.physics.xrf.QXTube
#/*##########################################################################
#
# 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.PyMcaPhysics import Elements
from PyMca5.PyMcaPhysics import XRayTubeEbel
import numpy
from PyMca5.PyMcaGui import PlotWidget
from PyMca5.PyMcaGui import PyMcaQt as qt
DEBUG = 0
if qt.qVersion() > '4.0.0':
[docs] class QGridLayout(qt.QGridLayout):
[docs] def addMultiCellWidget(self, w, r0, r1, c0, c1, *var):
self.addWidget(w, r0, c0, 1 + r1 - r0, 1 + c1 - c0)
[docs]class QXTube(qt.QWidget):
sigQXTubeSignal = qt.pyqtSignal(object)
def __init__(self, parent=None, initdict = None):
qt.QWidget.__init__(self, parent)
self.l = qt.QVBoxLayout(self)
self.l.setContentsMargins(0, 0, 0, 0)
self.l.setSpacing(0)
self.tubeWidget = TubeWidget(self, initdict = initdict)
self.setParameters = self.tubeWidget.setParameters
self.getParameters = self.tubeWidget.getParameters
label = qt.QLabel(self)
hbox = qt.QWidget(self)
hboxl = qt.QHBoxLayout(hbox)
hboxl.setContentsMargins(0, 0, 0, 0)
hboxl.setSpacing(0)
self.plotButton = qt.QPushButton(hbox)
self.plotButton.setText("Plot Continuum")
self.exportButton = qt.QPushButton(hbox)
self.exportButton.setText("Export to Fit")
#grid.addWidget(self.plotButton, 7, 1)
#grid.addWidget(self.exportButton, 7, 3)
hboxl.addWidget(self.plotButton)
hboxl.addWidget(self.exportButton)
self.l.addWidget(self.tubeWidget)
f = label.font()
f.setItalic(1)
label.setFont(f)
label.setAlignment(qt.Qt.AlignRight)
label.setText("H. Ebel, X-Ray Spectrometry 28 (1999) 255-266 ")
self.l.addWidget(label)
self.l.addWidget(hbox)
self.graph = PlotWidget.PlotWidget(self,
backend=None)
self.l.addWidget(self.graph)
self.graph.setGraphXLabel("Energy (keV)")
self.graph.setGraphYLabel("photons/sr/mA/keV/s")
self.plotButton.clicked.connect(self.plot)
self.exportButton.clicked.connect(self._export)
[docs] def plot(self):
d = self.tubeWidget.getParameters()
transmission = d["transmission"]
anode = d["anode"]
anodedensity = d["anodedensity"]
anodethickness = d["anodethickness"]
voltage = d["voltage"]
wele = d["window"]
wdensity = d["windowdensity"]
wthickness = d["windowthickness"]
fele = d["filter1"]
fdensity = d["filter1density"]
fthickness = d["filter1thickness"]
filterlist =[[fele, fdensity, fthickness]]
alphae = d["alphae"]
alphax = d["alphax"]
delta = d["deltaplotting"]
e = numpy.arange(1, voltage, delta)
if __name__ == "__main__":
continuumR = XRayTubeEbel.continuumEbel([anode, anodedensity, anodethickness],
voltage, e,
[wele, wdensity, wthickness],
alphae=alphae, alphax=alphax,
transmission=0,
targetthickness=anodethickness,
filterlist=filterlist)
continuumT = XRayTubeEbel.continuumEbel([anode, anodedensity, anodethickness],
voltage, e,
[wele, wdensity, wthickness],
alphae=alphae, alphax=alphax,
transmission=1,
targetthickness=anodethickness,
filterlist=filterlist)
self.graph.addCurve(e, continuumR, "continuumR", replot=False)
self.graph.addCurve(e, continuumT, "continuumT", replot=False)
else:
continuum = XRayTubeEbel.continuumEbel([anode, anodedensity, anodethickness],
voltage, e,
[wele, wdensity, wthickness],
alphae=alphae, alphax=alphax,
transmission=transmission,
targetthickness=anodethickness,
filterlist=filterlist)
self.graph.addCurve(e, continuum, "continuum", replot=False)
self.graph.resetZoom()
self.graph.replot()
def _export(self):
d = self.tubeWidget.getParameters()
transmission = d["transmission"]
anode = d["anode"]
anodedensity = d["anodedensity"]
anodethickness = d["anodethickness"]
voltage = d["voltage"]
wele = d["window"]
wdensity = d["windowdensity"]
wthickness = d["windowthickness"]
fele = d["filter1"]
fdensity = d["filter1density"]
fthickness = d["filter1thickness"]
filterlist =[[fele, fdensity, fthickness]]
alphae = d["alphae"]
alphax = d["alphax"]
delta = d["deltaplotting"]
e = numpy.arange(1, voltage, delta)
d["event"] = "TubeUpdated"
d["energyplot"] = e
d["continuum"] = XRayTubeEbel.continuumEbel([anode, anodedensity, anodethickness],
voltage, e,
[wele, wdensity, wthickness],
alphae=alphae, alphax=alphax,
transmission=transmission,
targetthickness=anodethickness,
filterlist=filterlist)
fllines = XRayTubeEbel.characteristicEbel([anode, anodedensity, anodethickness],
voltage,
[wele, wdensity, wthickness],
alphae=alphae, alphax=alphax,
transmission=transmission,
targetthickness=anodethickness,
filterlist=filterlist)
d["characteristic"] = fllines
if DEBUG:
fsum = 0.0
for l in fllines:
print("%s %.4f %.3e" % (l[2],l[0],l[1]))
fsum += l[1]
print(fsum)
energy, energyweight, energyscatter = XRayTubeEbel.generateLists([anode, anodedensity,
anodethickness],
voltage,
window = [wele, wdensity, wthickness],
alphae = alphae, alphax = alphax,
transmission = transmission,
targetthickness=anodethickness,
filterlist=filterlist)
d["energylist"] = energy
d["weightlist"] = energyweight
d["scatterlist"] = energyscatter
d["flaglist"] = numpy.ones(len(energy))
self.sigQXTubeSignal.emit(d)
[docs]class TubeWidget(qt.QWidget):
def __init__(self, parent=None, initdict = None):
qt.QWidget.__init__(self, parent)
self._build()
self.anodeCombo.sigMyQComboBoxSignal.connect(self._anodeSlot)
self.windowCombo.sigMyQComboBoxSignal.connect(self._windowSlot)
self.filter1Combo.sigMyQComboBoxSignal.connect(self._filter1Slot)
self.transmissionCheckBox.clicked.connect(self._transmissionSlot)
if initdict is not None:
self.setParameters(initdict)
else:
d = {}
d["transmission"] = 0
d["voltage"] = 30.0
d["anode"] = "Ag"
d["anodethickness"] = 0.0002
d["anodedensity"] = Elements.Element["Ag"]["density"]
d["window"] = "Be"
d["windowthickness"] = 0.0125
d["windowdensity"] = Elements.Element["Be"]["density"]
d["filter1"] = "He"
d["filter1thickness"]= 0.0
d["filter1density"] = Elements.Element["He"]["density"]
d["alphax"] = 90.0
d["alphae"] = 90.0
d["deltaplotting"] = 0.10
self.setParameters(d)
def _build(self):
layout = qt.QVBoxLayout(self)
layout.setContentsMargins(11, 11, 11, 11)
gridwidget = qt.QWidget(self)
grid = QGridLayout(gridwidget)
grid.setContentsMargins(0, 0, 0, 0)
grid.setSpacing(6)
self.transmissionCheckBox = qt.QCheckBox(gridwidget)
self.transmissionCheckBox.setText("Transmission Tube")
voltage = qt.QLabel(gridwidget)
voltage.setText("Voltage")
self.voltage = qt.QLineEdit(gridwidget)
grid.addMultiCellWidget(self.transmissionCheckBox, 0 ,0, 0, 1)
grid.addWidget(voltage, 0 ,2)
grid.addWidget(self.voltage, 0 ,3)
#materials
mlabel = qt.QLabel(gridwidget)
mlabel.setText("Material")
dlabel = qt.QLabel(gridwidget)
dlabel.setText("Density (g/cm3)")
tlabel = qt.QLabel(gridwidget)
tlabel.setText("Thickness (cm)")
#anode
anodelabel = qt.QLabel(gridwidget)
anodelabel.setText("Anode")
self.anodeCombo = MyQComboBox(gridwidget, options = Elements.ElementList)
self.anodeDensity = qt.QLineEdit(gridwidget)
self.anodeThickness = qt.QLineEdit(gridwidget)
#window
windowlabel = qt.QLabel(gridwidget)
windowlabel.setText("Window")
self.windowCombo = MyQComboBox(gridwidget, options = Elements.ElementList)
self.windowDensity = qt.QLineEdit(gridwidget)
self.windowThickness = qt.QLineEdit(gridwidget)
grid.addWidget(mlabel, 1 ,1)
grid.addWidget(dlabel, 1 ,2)
grid.addWidget(tlabel, 1 ,3)
grid.addWidget(anodelabel, 2, 0)
grid.addWidget(self.anodeCombo, 2, 1)
grid.addWidget(self.anodeDensity, 2, 2)
grid.addWidget(self.anodeThickness, 2, 3)
grid.addWidget(windowlabel, 3, 0)
grid.addWidget(self.windowCombo, 3, 1)
grid.addWidget(self.windowDensity, 3, 2)
grid.addWidget(self.windowThickness, 3, 3)
#filter1
filter1label = qt.QLabel(gridwidget)
filter1label.setText("Filter")
self.filter1Combo = MyQComboBox(gridwidget, options = Elements.ElementList)
self.filter1Density = qt.QLineEdit(gridwidget)
self.filter1Thickness = qt.QLineEdit(gridwidget)
grid.addWidget(filter1label, 4, 0)
grid.addWidget(self.filter1Combo, 4, 1)
grid.addWidget(self.filter1Density, 4, 2)
grid.addWidget(self.filter1Thickness, 4, 3)
#angles
alphaelabel = qt.QLabel(gridwidget)
alphaelabel.setText("Alpha electron")
self.alphaE = qt.QLineEdit(gridwidget)
alphaxlabel = qt.QLabel(gridwidget)
alphaxlabel.setText("Alpha x-ray")
self.alphaX = qt.QLineEdit(gridwidget)
grid.addWidget(alphaelabel, 5, 2)
grid.addWidget(self.alphaE, 5, 3)
grid.addWidget(alphaxlabel, 6, 2)
grid.addWidget(self.alphaX, 6, 3)
#delta energy
deltalabel = qt.QLabel(gridwidget)
deltalabel.setText("Delta energy (keV) just for plotting")
self.delta = qt.QLineEdit(gridwidget)
grid.addMultiCellWidget(deltalabel, 7, 7, 0, 3)
grid.addWidget(self.delta, 7, 3)
layout.addWidget(gridwidget)
[docs] def setParameters(self, d):
"""
d["transmission"] = 1
d["anode"] = "Ag"
d["anodethickness"] = 0.0002
d["anodedensity"] = None
d["window"] = "Be"
d["windowthickness"] = 0.0125
d["windowdensity"] = None
d["anglex"] = 90.0
d["anglee"] = 90.0
d["deltaplotting"] = 0.2
"""
if "transmission" in d:
if d["transmission"]:
self.transmissionCheckBox.setChecked(1)
else:
self.transmissionCheckBox.setChecked(0)
self._transmissionSlot()
if "voltage" in d:
self.voltage.setText("%.1f" % d["voltage"])
if "anode" in d:
self.anodeCombo.setCurrentIndex(Elements.ElementList.index(d["anode"]))
self.anodeDensity.setText("%f" % Elements.Element[d["anode"]]["density"])
if "anodethickness" in d:
self.anodeThickness.setText("%f" % d["anodethickness"])
if "anodedensity" in d:
self.anodeDensity.setText("%f" % d["anodedensity"])
if "window" in d:
self.windowCombo.setCurrentIndex(Elements.ElementList.index(d["window"]))
self.windowDensity.setText("%f" % Elements.Element[d["window"]]["density"])
if "windowthickness" in d:
self.windowThickness.setText("%f" % d["windowthickness"])
if "windowdensity" in d:
self.windowDensity.setText("%f" % d["windowdensity"])
if "filter1" in d:
self.filter1Combo.setCurrentIndex(Elements.ElementList.index(d["filter1"]))
self.filter1Density.setText("%f" % Elements.Element[d["filter1"]]["density"])
if "filter1thickness" in d:
self.filter1Thickness.setText("%f" % d["filter1thickness"])
if "filter1density" in d:
self.filter1Density.setText("%f" % d["filter1density"])
if "alphax" in d:
self.alphaX.setText("%.1f" % d["alphax"])
if "alphae" in d:
self.alphaE.setText("%.1f" % d["alphae"])
if "deltaplotting" in d:
self.delta.setText("%.3f" % d["deltaplotting"])
[docs] def getParameters(self):
d = {}
if self.transmissionCheckBox.isChecked():
d["transmission"] = 1
else:
d["transmission"] = 0
d["voltage"] = float(str(self.voltage.text()))
d["anode"] = self.anodeCombo.getCurrent()[1]
d["anodethickness"] = float(str(self.anodeThickness.text()))
d["anodedensity"] = float(str(self.anodeDensity.text()))
d["window"] = self.windowCombo.getCurrent()[1]
d["windowthickness"] = float(str(self.windowThickness.text()))
d["windowdensity"] = float(str(self.windowDensity.text()))
d["filter1"] = self.filter1Combo.getCurrent()[1]
d["filter1thickness"] = float(str(self.filter1Thickness.text()))
d["filter1density"] = float(str(self.filter1Density.text()))
d["alphax"] = float(str(self.alphaX.text()))
d["alphae"] = float(str(self.alphaE.text()))
d["deltaplotting"] = float(str(self.delta.text()))
return d
def _anodeSlot(self, ddict):
if DEBUG:
print("_anodeSlot", ddict)
self.anodeDensity.setText("%f" % Elements.Element[ddict["element"]]["density"])
def _windowSlot(self, ddict):
if DEBUG:
print("_windowSlot", ddict)
self.windowDensity.setText("%f" % Elements.Element[ddict["element"]]["density"])
def _filter1Slot(self, ddict):
if DEBUG:
print("_filter1Slot", ddict)
self.filter1Density.setText("%f" % Elements.Element[ddict["element"]]["density"])
def _transmissionSlot(self):
if DEBUG:
print("_transmissionSlot")
if self.transmissionCheckBox.isChecked():
self.anodeThickness.setEnabled(1)
else:
self.anodeThickness.setEnabled(0)
[docs]class MyQComboBox(qt.QComboBox):
sigMyQComboBoxSignal = qt.pyqtSignal(object)
def __init__(self,parent = None,name = None,fl = 0,
options=['1','2','3'],row=None,col=None):
if row is None: row = 0
if col is None: col = 0
self.row = row
self.col = col
qt.QComboBox.__init__(self,parent)
self.setOptions(options)
self.setDuplicatesEnabled(False)
self.setEditable(False)
self.activated[str].connect(self._mySignal)
[docs] def setOptions(self,options=['1','2','3']):
self.clear()
if qt.qVersion() < '4.0.0':
self.insertStrList(options)
else:
for item in options:
self.addItem(item)
def _mySignal(self, qstring0):
if DEBUG:
print("_mySignal ", qstring0)
text = str(qstring0)
d = {}
d['event'] = 'activated'
d['element'] = text
#d['z'] = Elemens.ElementList.index(d) + 1
self.sigMyQComboBoxSignal.emit(d)
if __name__ == "__main__":
app = qt.QApplication([])
w = QXTube()
w.show()
app.exec_()