Changes in src/sas/qtgui/Calculators/SldPanel.py [5c0e717:aed0532] in sasview
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Calculators/SldPanel.py
r5c0e717 raed0532 6 6 7 7 from periodictable import formula as Formula 8 from periodictable.xsf import xray_energy, xray_sld 8 from periodictable.xsf import xray_energy, xray_sld_from_atoms 9 9 from periodictable.nsf import neutron_scattering 10 10 … … 21 21 'MOLECULAR_FORMULA', 22 22 'MASS_DENSITY', 23 ' NEUTRON_WAVELENGTH',23 'WAVELENGTH', 24 24 'NEUTRON_SLD_REAL', 25 25 'NEUTRON_SLD_IMAG', 26 'XRAY_WAVELENGTH', 27 'XRAY_SLD_REAL', 28 'XRAY_SLD_IMAG', 26 'CU_KA_SLD_REAL', 27 'CU_KA_SLD_IMAG', 28 'MO_KA_SLD_REAL', 29 'MO_KA_SLD_IMAG', 29 30 'NEUTRON_INC_XS', 30 31 'NEUTRON_ABS_XS', … … 33 34 34 35 class SldResult(object): 35 def __init__(self, molecular_formula, mass_density, 36 neutron_wavelength, neutron_sld_real, neutron_sld_imag, 37 xray_wavelength, xray_sld_real, xray_sld_imag, 36 def __init__(self, molecular_formula, mass_density, wavelength, 37 neutron_sld_real, neutron_sld_imag, 38 cu_ka_sld_real, cu_ka_sld_imag, 39 mo_ka_sld_real, mo_ka_sld_imag, 38 40 neutron_inc_xs, neutron_abs_xs, neutron_length): 39 41 40 42 self.molecular_formula = molecular_formula 41 43 self.mass_density = mass_density 42 self. neutron_wavelength = neutron_wavelength44 self.wavelength = wavelength 43 45 self.neutron_sld_real = neutron_sld_real 44 46 self.neutron_sld_imag = neutron_sld_imag 45 self.xray_wavelength = xray_wavelength 46 self.xray_sld_real = xray_sld_real 47 self.xray_sld_imag = xray_sld_imag 47 self.cu_ka_sld_real = cu_ka_sld_real 48 self.cu_ka_sld_imag = cu_ka_sld_imag 49 self.mo_ka_sld_real = mo_ka_sld_real 50 self.mo_ka_sld_imag = mo_ka_sld_imag 48 51 self.neutron_inc_xs = neutron_inc_xs 49 52 self.neutron_abs_xs = neutron_abs_xs 50 53 self.neutron_length = neutron_length 51 54 52 def sldAlgorithm(molecular_formula, mass_density, neutron_wavelength, xray_wavelength): 53 54 xray_sld_real, xray_sld_imag = xray_sld( 55 compound=molecular_formula, 55 def sldAlgorithm(molecular_formula, mass_density, wavelength): 56 57 sld_formula = Formula(molecular_formula, density=mass_density) 58 59 def calculate_sld(formula): 60 if len(formula.atoms) != 1: 61 raise NotImplementedError() 62 energy = xray_energy(list(formula.atoms.keys())[0].K_alpha) 63 return xray_sld_from_atoms( 64 sld_formula.atoms, 56 65 density=mass_density, 57 wavelength=xray_wavelength) 58 59 (neutron_sld_real, neutron_sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \ 66 energy=energy) 67 68 cu_real, cu_imag = calculate_sld(Formula("Cu")) 69 mo_real, mo_imag = calculate_sld(Formula("Mo")) 70 71 (sld_real, sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \ 60 72 neutron_scattering( 61 73 compound=molecular_formula, 62 74 density=mass_density, 63 wavelength= neutron_wavelength)75 wavelength=wavelength) 64 76 65 77 SCALE = 1e-6 66 78 67 79 # neutron sld 68 scaled_neutron_sld_real = SCALE * neutron_sld_real 69 scaled_neutron_sld_imag = SCALE * abs(neutron_sld_imag) 70 71 # xray sld 72 scaled_xray_sld_real = SCALE * xray_sld_real 73 scaled_xray_sld_imag = SCALE * abs(xray_sld_imag) 74 80 neutron_sld_real = SCALE * sld_real 81 neutron_sld_imag = SCALE * abs(sld_imag) 82 83 # Cu sld 84 cu_ka_sld_real = SCALE * cu_real 85 cu_ka_sld_imag = SCALE * abs(cu_imag) 86 87 # Mo sld 88 mo_ka_sld_real = SCALE * mo_real 89 mo_ka_sld_imag = SCALE * abs(mo_imag) 75 90 76 91 return SldResult( 77 molecular_formula, mass_density, 78 neutron_wavelength, scaled_neutron_sld_real, scaled_neutron_sld_imag, 79 xray_wavelength, scaled_xray_sld_real, scaled_xray_sld_imag, 92 molecular_formula, mass_density, wavelength, 93 neutron_sld_real, neutron_sld_imag, 94 cu_ka_sld_real, cu_ka_sld_imag, 95 mo_ka_sld_real, mo_ka_sld_imag, 80 96 neutron_inc_xs, neutron_abs_xs, neutron_length) 81 97 … … 96 112 MODEL.NEUTRON_SLD_REAL: self.ui.editNeutronSldReal, 97 113 MODEL.NEUTRON_SLD_IMAG: self.ui.editNeutronSldImag, 98 MODEL.XRAY_SLD_REAL: self.ui.editXraySldReal, 99 MODEL.XRAY_SLD_IMAG: self.ui.editXraySldImag, 114 MODEL.CU_KA_SLD_REAL: self.ui.editCuKaSldReal, 115 MODEL.CU_KA_SLD_IMAG: self.ui.editCuKaSldImag, 116 MODEL.MO_KA_SLD_REAL: self.ui.editMoKaSldReal, 117 MODEL.MO_KA_SLD_IMAG: self.ui.editMoKaSldImag, 100 118 MODEL.NEUTRON_INC_XS: self.ui.editNeutronIncXs, 101 119 MODEL.NEUTRON_ABS_XS: self.ui.editNeutronAbsXs, … … 113 131 rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?") 114 132 self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity)) 115 self.ui.editNeutronWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editNeutronWavelength)) 116 self.ui.editXrayWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editXrayWavelength)) 133 self.ui.editWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editWavelength)) 117 134 118 135 # signals 119 self.ui.helpButton.clicked.connect(self.displayHelp) 120 self.ui.closeButton.clicked.connect(self.closePanel) 121 self.ui.recalculateButton.clicked.connect(self.calculateSLD) 122 123 def calculateSLD(self): 124 self.recalculateSLD() 136 self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Reset).clicked.connect(self.modelReset) 137 self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Help).clicked.connect(self.displayHelp) 125 138 126 139 def setupModel(self): 127 140 self.model = QtGui.QStandardItemModel(self) 128 self.model.setItem(MODEL.MOLECULAR_FORMULA , QtGui.QStandardItem()) 129 self.model.setItem(MODEL.MASS_DENSITY , QtGui.QStandardItem()) 130 self.model.setItem(MODEL.NEUTRON_WAVELENGTH, QtGui.QStandardItem()) 131 self.model.setItem(MODEL.XRAY_WAVELENGTH , QtGui.QStandardItem()) 141 self.model.setItem(MODEL.MOLECULAR_FORMULA, QtGui.QStandardItem()) 142 self.model.setItem(MODEL.MASS_DENSITY , QtGui.QStandardItem()) 143 self.model.setItem(MODEL.WAVELENGTH , QtGui.QStandardItem()) 132 144 133 145 for key in list(self._getOutputs().keys()): … … 135 147 136 148 self.model.dataChanged.connect(self.dataChanged) 137 138 self.ui.editMassDensity.textEdited.connect(self.recalculateSLD)139 self.ui.editMolecularFormula.textEdited.connect(self.recalculateSLD)140 self.ui.editNeutronWavelength.textEdited.connect(self.recalculateSLD)141 self.ui.editXrayWavelength.textEdited.connect(self.recalculateSLD)142 149 143 150 self.modelReset() … … 147 154 self.mapper.setModel(self.model) 148 155 self.mapper.setOrientation(QtCore.Qt.Vertical) 149 self.mapper.addMapping(self.ui.editMolecularFormula , MODEL.MOLECULAR_FORMULA) 150 self.mapper.addMapping(self.ui.editMassDensity , MODEL.MASS_DENSITY) 151 self.mapper.addMapping(self.ui.editNeutronWavelength, MODEL.NEUTRON_WAVELENGTH) 152 self.mapper.addMapping(self.ui.editXrayWavelength , MODEL.XRAY_WAVELENGTH) 156 self.mapper.addMapping(self.ui.editMolecularFormula, MODEL.MOLECULAR_FORMULA) 157 self.mapper.addMapping(self.ui.editMassDensity , MODEL.MASS_DENSITY) 158 self.mapper.addMapping(self.ui.editWavelength , MODEL.WAVELENGTH) 153 159 154 160 for key, edit in self._getOutputs().items(): … … 160 166 update = False 161 167 for index in range(top.row(), bottom.row() + 1): 162 if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL. NEUTRON_WAVELENGTH) or (index == MODEL.XRAY_WAVELENGTH):168 if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.WAVELENGTH): 163 169 update = True 164 170 165 # calcu lation171 # calcualtion 166 172 if update: 167 self.recalculateSLD() 168 169 def recalculateSLD(self): 170 formula = self.ui.editMolecularFormula.text() 171 density = self.ui.editMassDensity.text() 172 neutronWavelength = self.ui.editNeutronWavelength.text() 173 xrayWavelength = self.ui.editXrayWavelength.text() 174 175 if len(formula) > 0 and len(density) > 0 and len(neutronWavelength) > 0 and len(xrayWavelength) > 0: 176 try: 177 results = sldAlgorithm(str(formula), float(density), float(neutronWavelength), float(xrayWavelength)) 178 179 def format(value): 180 return ("%-5.3g" % value).strip() 181 182 self.model.item(MODEL.NEUTRON_SLD_REAL).setText(format(results.neutron_sld_real)) 183 self.model.item(MODEL.NEUTRON_SLD_IMAG).setText(format(results.neutron_sld_imag)) 184 185 self.model.item(MODEL.XRAY_SLD_REAL).setText(format(results.xray_sld_real)) 186 self.model.item(MODEL.XRAY_SLD_IMAG).setText(format(results.xray_sld_imag)) 187 188 self.model.item(MODEL.NEUTRON_INC_XS).setText(format(results.neutron_inc_xs)) 189 self.model.item(MODEL.NEUTRON_ABS_XS).setText(format(results.neutron_abs_xs)) 190 self.model.item(MODEL.NEUTRON_LENGTH).setText(format(results.neutron_length)) 191 192 return 193 194 except Exception as e: 195 pass 196 197 for key in list(self._getOutputs().keys()): 198 self.model.item(key).setText("") 173 formula = self.model.item(MODEL.MOLECULAR_FORMULA).text() 174 density = self.model.item(MODEL.MASS_DENSITY).text() 175 wavelength = self.model.item(MODEL.WAVELENGTH).text() 176 if len(formula) > 0 and len(density) > 0 and len(wavelength) > 0: 177 try: 178 results = sldAlgorithm(str(formula), float(density), float(wavelength)) 179 180 def format(value): 181 return ("%-5.3g" % value).strip() 182 183 self.model.item(MODEL.NEUTRON_SLD_REAL).setText(format(results.neutron_sld_real)) 184 self.model.item(MODEL.NEUTRON_SLD_IMAG).setText(format(results.neutron_sld_imag)) 185 186 self.model.item(MODEL.CU_KA_SLD_REAL).setText(format(results.cu_ka_sld_real)) 187 self.model.item(MODEL.CU_KA_SLD_IMAG).setText(format(results.cu_ka_sld_imag)) 188 189 self.model.item(MODEL.MO_KA_SLD_REAL).setText(format(results.mo_ka_sld_real)) 190 self.model.item(MODEL.MO_KA_SLD_IMAG).setText(format(results.mo_ka_sld_imag)) 191 192 self.model.item(MODEL.NEUTRON_INC_XS).setText(format(results.neutron_inc_xs)) 193 self.model.item(MODEL.NEUTRON_ABS_XS).setText(format(results.neutron_abs_xs)) 194 self.model.item(MODEL.NEUTRON_LENGTH).setText(format(results.neutron_length)) 195 196 return 197 198 except Exception as e: 199 pass 200 201 for key in list(self._getOutputs().keys()): 202 self.model.item(key).setText("") 199 203 200 204 def modelReset(self): 201 205 #self.model.beginResetModel() 202 206 try: 203 self.model.item(MODEL.MOLECULAR_FORMULA ).setText("H2O") 204 self.model.item(MODEL.MASS_DENSITY ).setText("1.0") 205 self.model.item(MODEL.NEUTRON_WAVELENGTH).setText("6.0") 206 self.model.item(MODEL.XRAY_WAVELENGTH ).setText("1.0") 207 self.recalculateSLD() 207 self.model.item(MODEL.MOLECULAR_FORMULA).setText("H2O") 208 self.model.item(MODEL.MASS_DENSITY ).setText("1") 209 self.model.item(MODEL.WAVELENGTH ).setText("6") 208 210 finally: 209 211 pass … … 215 217 216 218 217 def closePanel(self):218 """219 close the window containing this panel220 """221 self.close()222
Note: See TracChangeset
for help on using the changeset viewer.