source: sasview/src/sas/qtgui/SldPanel.py @ f140169

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalc
Last change on this file since f140169 was 1d85b5e, checked in by Piotr Rozyczko <rozyczko@…>, 8 years ago

Linked two new calculators to the Gui Manager.

  • Property mode set to 100644
File size: 8.5 KB
Line 
1# global
2import logging
3from periodictable import formula as Formula
4from periodictable.xsf import xray_energy, xray_sld_from_atoms
5from periodictable.nsf import neutron_scattering
6
7from PyQt4 import QtGui, QtCore
8
9# Local UI
10from UI.SldPanel import Ui_SldPanel
11
12def enum(*sequential, **named):
13    enums = dict(zip(sequential, range(len(sequential))), **named)
14    return type('Enum', (), enums)
15
16MODEL = enum(
17    'MOLECULAR_FORMULA',
18    'MASS_DENSITY',
19    'WAVELENGTH',
20    'NEUTRON_SLD_REAL',
21    'NEUTRON_SLD_IMAG',
22    'CU_KA_SLD_REAL',
23    'CU_KA_SLD_IMAG',
24    'MO_KA_SLD_REAL',
25    'MO_KA_SLD_IMAG',
26    'NEUTRON_INC_XS',
27    'NEUTRON_ABS_XS',
28    'NEUTRON_LENGTH',
29)
30
31class SldResult(object):
32    def __init__(self, molecular_formula, mass_density, wavelength,
33        neutron_sld_real, neutron_sld_imag,
34        cu_ka_sld_real, cu_ka_sld_imag,
35        mo_ka_sld_real, mo_ka_sld_imag,
36        neutron_inc_xs, neutron_abs_xs, neutron_length):
37
38        self.molecular_formula = molecular_formula
39        self.mass_density = mass_density
40        self.wavelength = wavelength
41        self.neutron_sld_real = neutron_sld_real
42        self.neutron_sld_imag = neutron_sld_imag
43        self.cu_ka_sld_real = cu_ka_sld_real
44        self.cu_ka_sld_imag = cu_ka_sld_imag
45        self.mo_ka_sld_real = mo_ka_sld_real
46        self.mo_ka_sld_imag = mo_ka_sld_imag
47        self.neutron_inc_xs = neutron_inc_xs
48        self.neutron_abs_xs = neutron_abs_xs
49        self.neutron_length = neutron_length
50
51def sldAlgorithm(molecular_formula, mass_density, wavelength):
52
53    sld_formula = Formula(molecular_formula, density=mass_density)
54
55    def calculate_sld(formula):
56        if len(formula.atoms) != 1:
57            raise NotImplementedError()
58        energy = xray_energy(formula.atoms.keys()[0].K_alpha)
59        return xray_sld_from_atoms(
60            sld_formula.atoms,
61            density=mass_density,
62            energy=energy)
63
64    cu_real, cu_imag = calculate_sld(Formula("Cu"))
65    mo_real, mo_imag = calculate_sld(Formula("Mo"))
66
67    (sld_real, sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \
68        neutron_scattering(
69            compound=molecular_formula,
70            density=mass_density,
71            wavelength=wavelength)
72
73    SCALE = 1e-6
74
75    # neutron sld
76    neutron_sld_real = SCALE * sld_real
77    neutron_sld_imag = SCALE * abs(sld_imag)
78
79    # Cu sld
80    cu_ka_sld_real = SCALE * cu_real
81    cu_ka_sld_imag = SCALE * abs(cu_imag)
82
83    # Mo sld
84    mo_ka_sld_real = SCALE * mo_real
85    mo_ka_sld_imag = SCALE * abs(mo_imag)
86
87    return SldResult(
88        molecular_formula, mass_density, wavelength,
89        neutron_sld_real, neutron_sld_imag,
90        cu_ka_sld_real, cu_ka_sld_imag,
91        mo_ka_sld_real, mo_ka_sld_imag,
92        neutron_inc_xs, neutron_abs_xs, neutron_length)
93
94
95class FormulaValidator(QtGui.QValidator):
96    def __init__(self, parent=None):
97        super(FormulaValidator, self).__init__(parent)
98 
99    def validate(self, input, pos):
100        try:
101            Formula(str(input))
102            self._setStyleSheet("")
103            return QtGui.QValidator.Acceptable, pos
104
105        except Exception as e:
106            self._setStyleSheet("background-color:pink;")
107            return QtGui.QValidator.Intermediate, pos
108
109    def _setStyleSheet(self, value):
110        try:
111            if self.parent():
112                self.parent().setStyleSheet(value)
113        except:
114            pass
115
116
117class SldPanel(QtGui.QDialog):
118
119    def __init__(self, parent=None):
120        super(SldPanel, self).__init__()
121
122        self.manager = parent
123
124        self.setupUi()
125        self.setupModel()
126        self.setupMapper()
127
128    def _getOutputs(self):
129        return {
130            MODEL.NEUTRON_SLD_REAL: self.ui.editNeutronSldReal,
131            MODEL.NEUTRON_SLD_IMAG: self.ui.editNeutronSldImag,
132            MODEL.CU_KA_SLD_REAL: self.ui.editCuKaSldReal,
133            MODEL.CU_KA_SLD_IMAG: self.ui.editCuKaSldImag,
134            MODEL.MO_KA_SLD_REAL: self.ui.editMoKaSldReal,
135            MODEL.MO_KA_SLD_IMAG: self.ui.editMoKaSldImag,
136            MODEL.NEUTRON_INC_XS: self.ui.editNeutronIncXs,
137            MODEL.NEUTRON_ABS_XS: self.ui.editNeutronAbsXs,
138            MODEL.NEUTRON_LENGTH: self.ui.editNeutronLength
139        }
140
141    def setupUi(self):
142        self.ui = Ui_SldPanel()
143        self.ui.setupUi(self)
144
145        # set validators
146        self.ui.editMolecularFormula.setValidator(FormulaValidator(self.ui.editMolecularFormula))
147
148        rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?")
149        self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity))
150        self.ui.editWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editWavelength))
151
152        # signals
153        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Reset).clicked.connect(self.modelReset)
154        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Help).clicked.connect(self.displayHelp)
155
156    def setupModel(self):
157        self.model = QtGui.QStandardItemModel(self)
158        self.model.setItem(MODEL.MOLECULAR_FORMULA, QtGui.QStandardItem())
159        self.model.setItem(MODEL.MASS_DENSITY     , QtGui.QStandardItem())
160        self.model.setItem(MODEL.WAVELENGTH       , QtGui.QStandardItem())
161
162        for key in self._getOutputs().keys():
163            self.model.setItem(key, QtGui.QStandardItem())
164
165        QtCore.QObject.connect(
166            self.model,
167            QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),
168            self.dataChanged)
169
170        self.modelReset()
171
172    def setupMapper(self):
173        self.mapper = QtGui.QDataWidgetMapper(self)
174        self.mapper.setModel(self.model)
175        self.mapper.setOrientation(QtCore.Qt.Vertical)
176
177        self.mapper.addMapping(self.ui.editMolecularFormula, MODEL.MOLECULAR_FORMULA)
178        self.mapper.addMapping(self.ui.editMassDensity     , MODEL.MASS_DENSITY)
179        self.mapper.addMapping(self.ui.editWavelength      , MODEL.WAVELENGTH)
180
181        for key, edit in self._getOutputs().iteritems():
182            self.mapper.addMapping(edit, key)
183
184        self.mapper.toFirst()
185
186    def dataChanged(self, top, bottom):
187        update = False
188        for index in xrange(top.row(), bottom.row() + 1):
189            if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.WAVELENGTH):
190                update = True
191
192        # calcualtion
193        if update:
194            formula = self.model.item(MODEL.MOLECULAR_FORMULA).text()
195            density = self.model.item(MODEL.MASS_DENSITY).text()
196            wavelength = self.model.item(MODEL.WAVELENGTH).text()
197            if len(formula) > 0 and len(density) > 0 and len(wavelength) > 0:
198                try:
199                    results = sldAlgorithm(str(formula), float(density), float(wavelength))
200
201                    def format(value):
202                        return ("%-5.3g" % value).strip()
203
204                    self.model.item(MODEL.NEUTRON_SLD_REAL).setText(format(results.neutron_sld_real))
205                    self.model.item(MODEL.NEUTRON_SLD_IMAG).setText(format(results.neutron_sld_imag))
206
207                    self.model.item(MODEL.CU_KA_SLD_REAL).setText(format(results.cu_ka_sld_real))
208                    self.model.item(MODEL.CU_KA_SLD_IMAG).setText(format(results.cu_ka_sld_imag))
209
210                    self.model.item(MODEL.MO_KA_SLD_REAL).setText(format(results.mo_ka_sld_real))
211                    self.model.item(MODEL.MO_KA_SLD_IMAG).setText(format(results.mo_ka_sld_imag))
212
213                    self.model.item(MODEL.NEUTRON_INC_XS).setText(format(results.neutron_inc_xs))
214                    self.model.item(MODEL.NEUTRON_ABS_XS).setText(format(results.neutron_abs_xs))
215                    self.model.item(MODEL.NEUTRON_LENGTH).setText(format(results.neutron_length))
216
217                    return
218           
219                except Exception as e:
220                    pass
221
222            for key in self._getOutputs().keys():
223                self.model.item(key).setText("")
224
225    def modelReset(self):
226        #self.model.beginResetModel()
227        try:
228            self.model.item(MODEL.MOLECULAR_FORMULA).setText("H2O")
229            self.model.item(MODEL.MASS_DENSITY     ).setText("1")
230            self.model.item(MODEL.WAVELENGTH       ).setText("6")
231        finally:
232            pass
233            #self.model.endResetModel()
234
235    def displayHelp(self):
236        try:
237            location = self.manager.HELP_DIRECTORY_LOCATION + \
238                "/user/sasgui/perspectives/calculator/sld_calculator_help.html"
239            self.manager._helpView.load(QtCore.QUrl(location))
240            self.manager._helpView.show()
241        except AttributeError:
242            # No manager defined - testing and standalone runs
243            pass
244
Note: See TracBrowser for help on using the repository browser.