Changeset 3522037 in sasview
- Timestamp:
- Sep 5, 2018 7:52:57 AM (6 years ago)
- Branches:
- ESS_GUI, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
- Children:
- b1f6063
- Parents:
- 6701a0b (diff), f6c19cf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/sas
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Calculators/SldPanel.py
raed0532 r5c0e717 6 6 7 7 from periodictable import formula as Formula 8 from periodictable.xsf import xray_energy, xray_sld _from_atoms8 from periodictable.xsf import xray_energy, xray_sld 9 9 from periodictable.nsf import neutron_scattering 10 10 … … 21 21 'MOLECULAR_FORMULA', 22 22 'MASS_DENSITY', 23 ' WAVELENGTH',23 'NEUTRON_WAVELENGTH', 24 24 'NEUTRON_SLD_REAL', 25 25 'NEUTRON_SLD_IMAG', 26 'CU_KA_SLD_REAL', 27 'CU_KA_SLD_IMAG', 28 'MO_KA_SLD_REAL', 29 'MO_KA_SLD_IMAG', 26 'XRAY_WAVELENGTH', 27 'XRAY_SLD_REAL', 28 'XRAY_SLD_IMAG', 30 29 'NEUTRON_INC_XS', 31 30 'NEUTRON_ABS_XS', … … 34 33 35 34 class SldResult(object): 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, 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, 40 38 neutron_inc_xs, neutron_abs_xs, neutron_length): 41 39 42 40 self.molecular_formula = molecular_formula 43 41 self.mass_density = mass_density 44 self. wavelength =wavelength42 self.neutron_wavelength = neutron_wavelength 45 43 self.neutron_sld_real = neutron_sld_real 46 44 self.neutron_sld_imag = neutron_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 45 self.xray_wavelength = xray_wavelength 46 self.xray_sld_real = xray_sld_real 47 self.xray_sld_imag = xray_sld_imag 51 48 self.neutron_inc_xs = neutron_inc_xs 52 49 self.neutron_abs_xs = neutron_abs_xs 53 50 self.neutron_length = neutron_length 54 51 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, 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, 65 56 density=mass_density, 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 = \ 57 wavelength=xray_wavelength) 58 59 (neutron_sld_real, neutron_sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \ 72 60 neutron_scattering( 73 61 compound=molecular_formula, 74 62 density=mass_density, 75 wavelength= wavelength)63 wavelength=neutron_wavelength) 76 64 77 65 SCALE = 1e-6 78 66 79 67 # neutron sld 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) 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 90 75 91 76 return SldResult( 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, 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, 96 80 neutron_inc_xs, neutron_abs_xs, neutron_length) 97 81 … … 112 96 MODEL.NEUTRON_SLD_REAL: self.ui.editNeutronSldReal, 113 97 MODEL.NEUTRON_SLD_IMAG: self.ui.editNeutronSldImag, 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, 98 MODEL.XRAY_SLD_REAL: self.ui.editXraySldReal, 99 MODEL.XRAY_SLD_IMAG: self.ui.editXraySldImag, 118 100 MODEL.NEUTRON_INC_XS: self.ui.editNeutronIncXs, 119 101 MODEL.NEUTRON_ABS_XS: self.ui.editNeutronAbsXs, … … 131 113 rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?") 132 114 self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity)) 133 self.ui.editWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editWavelength)) 115 self.ui.editNeutronWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editNeutronWavelength)) 116 self.ui.editXrayWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editXrayWavelength)) 134 117 135 118 # signals 136 self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Reset).clicked.connect(self.modelReset) 137 self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Help).clicked.connect(self.displayHelp) 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() 138 125 139 126 def setupModel(self): 140 127 self.model = QtGui.QStandardItemModel(self) 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()) 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()) 144 132 145 133 for key in list(self._getOutputs().keys()): … … 147 135 148 136 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) 149 142 150 143 self.modelReset() … … 154 147 self.mapper.setModel(self.model) 155 148 self.mapper.setOrientation(QtCore.Qt.Vertical) 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) 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) 159 153 160 154 for key, edit in self._getOutputs().items(): … … 166 160 update = False 167 161 for index in range(top.row(), bottom.row() + 1): 168 if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL. WAVELENGTH):162 if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.NEUTRON_WAVELENGTH) or (index == MODEL.XRAY_WAVELENGTH): 169 163 update = True 170 164 171 # calcu altion165 # calculation 172 166 if update: 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("") 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("") 203 199 204 200 def modelReset(self): 205 201 #self.model.beginResetModel() 206 202 try: 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") 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() 210 208 finally: 211 209 pass … … 217 215 218 216 217 def closePanel(self): 218 """ 219 close the window containing this panel 220 """ 221 self.close() 222 -
src/sas/qtgui/Calculators/UI/SldPanel.ui
rcd2cc745 r5c0e717 7 7 <x>0</x> 8 8 <y>0</y> 9 <width>4 47</width>10 <height>4 03</height>9 <width>490</width> 10 <height>490</height> 11 11 </rect> 12 12 </property> … … 25 25 </property> 26 26 <layout class="QGridLayout" name="gridLayout_2"> 27 <item row="3" column="0"> 28 <spacer name="verticalSpacer"> 29 <property name="orientation"> 30 <enum>Qt::Vertical</enum> 31 </property> 32 <property name="sizeHint" stdset="0"> 33 <size> 34 <width>20</width> 35 <height>40</height> 36 </size> 37 </property> 38 </spacer> 39 </item> 40 <item row="4" column="0"> 41 <widget class="QWidget" name="widget" native="true"> 42 <property name="minimumSize"> 43 <size> 44 <width>466</width> 45 <height>32</height> 46 </size> 47 </property> 48 <widget class="QPushButton" name="recalculateButton"> 49 <property name="geometry"> 50 <rect> 51 <x>0</x> 52 <y>0</y> 53 <width>114</width> 54 <height>32</height> 55 </rect> 56 </property> 57 <property name="text"> 58 <string>Recalculate</string> 59 </property> 60 </widget> 61 <widget class="QPushButton" name="helpButton"> 62 <property name="geometry"> 63 <rect> 64 <x>176</x> 65 <y>0</y> 66 <width>114</width> 67 <height>32</height> 68 </rect> 69 </property> 70 <property name="text"> 71 <string>Help</string> 72 </property> 73 </widget> 74 <widget class="QPushButton" name="closeButton"> 75 <property name="geometry"> 76 <rect> 77 <x>352</x> 78 <y>0</y> 79 <width>114</width> 80 <height>32</height> 81 </rect> 82 </property> 83 <property name="text"> 84 <string>Close</string> 85 </property> 86 </widget> 87 </widget> 88 </item> 27 89 <item row="0" column="0"> 28 90 <widget class="QGroupBox" name="groupBoxInput"> … … 58 120 <widget class="QLineEdit" name="editMassDensity"/> 59 121 </item> 122 <item row="2" column="2"> 123 <widget class="QLabel" name="label_12"> 124 <property name="text"> 125 <string>à 126 </string> 127 </property> 128 </widget> 129 </item> 130 <item row="0" column="0"> 131 <widget class="QLabel" name="label_9"> 132 <property name="text"> 133 <string>Molecular Formula</string> 134 </property> 135 </widget> 136 </item> 137 <item row="2" column="0"> 138 <widget class="QLabel" name="label_11"> 139 <property name="text"> 140 <string>Neutron Wavelength</string> 141 </property> 142 </widget> 143 </item> 60 144 <item row="2" column="1"> 61 <widget class="QLineEdit" name="edit Wavelength">145 <widget class="QLineEdit" name="editNeutronWavelength"> 62 146 <property name="styleSheet"> 63 147 <string notr="true"/> … … 68 152 </widget> 69 153 </item> 70 <item row="2" column="2"> 71 <widget class="QLabel" name="label_12"> 154 <item row="3" column="1"> 155 <widget class="QLineEdit" name="editXrayWavelength"/> 156 </item> 157 <item row="3" column="0"> 158 <widget class="QLabel" name="label_13"> 159 <property name="text"> 160 <string>X-Ray Wavelength</string> 161 </property> 162 </widget> 163 </item> 164 <item row="3" column="2"> 165 <widget class="QLabel" name="label"> 72 166 <property name="text"> 73 167 <string>à 74 168 </string> 75 </property>76 </widget>77 </item>78 <item row="0" column="0">79 <widget class="QLabel" name="label_9">80 <property name="text">81 <string>Molecular Formula</string>82 </property>83 </widget>84 </item>85 <item row="2" column="0">86 <widget class="QLabel" name="label_11">87 <property name="text">88 <string>Wavelength</string>89 169 </property> 90 170 </widget> … … 99 179 </property> 100 180 <layout class="QGridLayout" name="gridLayoutOutput"> 181 <item row="0" column="1"> 182 <widget class="QLineEdit" name="editNeutronSldReal"> 183 <property name="enabled"> 184 <bool>false</bool> 185 </property> 186 <property name="readOnly"> 187 <bool>true</bool> 188 </property> 189 </widget> 190 </item> 101 191 <item row="0" column="0"> 102 192 <widget class="QLabel" name="label_17"> … … 106 196 </widget> 107 197 </item> 108 <item row="0" column="1"> 109 <widget class="QLineEdit" name="editNeutronSldReal"> 110 <property name="readOnly"> 111 <bool>true</bool> 198 <item row="5" column="0"> 199 <widget class="QLabel" name="label_3"> 200 <property name="text"> 201 <string>Neutron 1/e length</string> 202 </property> 203 </widget> 204 </item> 205 <item row="3" column="1"> 206 <widget class="QLineEdit" name="editNeutronIncXs"> 207 <property name="enabled"> 208 <bool>false</bool> 209 </property> 210 <property name="readOnly"> 211 <bool>true</bool> 212 </property> 213 </widget> 214 </item> 215 <item row="3" column="0"> 216 <widget class="QLabel" name="label_21"> 217 <property name="text"> 218 <string>Neutron Inc. Xs</string> 112 219 </property> 113 220 </widget> … … 120 227 </widget> 121 228 </item> 229 <item row="1" column="2"> 230 <widget class="QLabel" name="label_20"> 231 <property name="text"> 232 <string>-i</string> 233 </property> 234 </widget> 235 </item> 122 236 <item row="0" column="3"> 123 237 <widget class="QLineEdit" name="editNeutronSldImag"> 124 <property name="readOnly"> 125 <bool>true</bool> 238 <property name="enabled"> 239 <bool>false</bool> 240 </property> 241 <property name="readOnly"> 242 <bool>true</bool> 243 </property> 244 </widget> 245 </item> 246 <item row="5" column="2" colspan="2"> 247 <widget class="QLabel" name="label_4"> 248 <property name="text"> 249 <string>cm</string> 250 </property> 251 </widget> 252 </item> 253 <item row="5" column="1"> 254 <widget class="QLineEdit" name="editNeutronLength"> 255 <property name="enabled"> 256 <bool>false</bool> 257 </property> 258 <property name="readOnly"> 259 <bool>true</bool> 260 </property> 261 </widget> 262 </item> 263 <item row="4" column="2" colspan="2"> 264 <widget class="QLabel" name="label_24"> 265 <property name="text"> 266 <string>1/cm</string> 267 </property> 268 </widget> 269 </item> 270 <item row="4" column="1"> 271 <widget class="QLineEdit" name="editNeutronAbsXs"> 272 <property name="enabled"> 273 <bool>false</bool> 274 </property> 275 <property name="readOnly"> 276 <bool>true</bool> 277 </property> 278 </widget> 279 </item> 280 <item row="4" column="0"> 281 <widget class="QLabel" name="label_23"> 282 <property name="text"> 283 <string>Neutron Abs. Xs</string> 284 </property> 285 </widget> 286 </item> 287 <item row="3" column="2" colspan="2"> 288 <widget class="QLabel" name="label_22"> 289 <property name="text"> 290 <string>1/cm</string> 291 </property> 292 </widget> 293 </item> 294 <item row="1" column="4"> 295 <widget class="QLabel" name="label_6"> 296 <property name="text"> 297 <string>1/à 298 ²</string> 299 </property> 300 </widget> 301 </item> 302 <item row="1" column="0"> 303 <widget class="QLabel" name="label_19"> 304 <property name="text"> 305 <string>X-Ray SLD</string> 126 306 </property> 127 307 </widget> … … 135 315 </widget> 136 316 </item> 137 <item row="1" column="0"> 138 <widget class="QLabel" name="label_19"> 139 <property name="text"> 140 <string>Cu Ka SLD</string> 141 </property> 142 </widget> 143 </item> 144 <item row="1" column="1"> 145 <widget class="QLineEdit" name="editCuKaSldReal"> 146 <property name="styleSheet"> 147 <string notr="true"/> 148 </property> 149 <property name="readOnly"> 150 <bool>true</bool> 151 </property> 152 </widget> 153 </item> 154 <item row="1" column="2"> 155 <widget class="QLabel" name="label_20"> 156 <property name="text"> 157 <string>-i</string> 158 </property> 159 </widget> 160 </item> 161 <item row="1" column="3"> 162 <widget class="QLineEdit" name="editCuKaSldImag"> 163 <property name="readOnly"> 164 <bool>true</bool> 165 </property> 166 </widget> 167 </item> 168 <item row="1" column="4"> 169 <widget class="QLabel" name="label_6"> 170 <property name="text"> 171 <string>1/à 172 ²</string> 173 </property> 174 </widget> 175 </item> 176 <item row="2" column="0"> 177 <widget class="QLabel" name="label"> 178 <property name="text"> 179 <string>Mo Ka SLD</string> 180 </property> 181 </widget> 182 </item> 183 <item row="2" column="1"> 184 <widget class="QLineEdit" name="editMoKaSldReal"> 185 <property name="readOnly"> 186 <bool>true</bool> 187 </property> 188 </widget> 189 </item> 190 <item row="2" column="2"> 191 <widget class="QLabel" name="label_2"> 192 <property name="text"> 193 <string>-i</string> 194 </property> 195 </widget> 196 </item> 197 <item row="2" column="3"> 198 <widget class="QLineEdit" name="editMoKaSldImag"> 199 <property name="readOnly"> 200 <bool>true</bool> 201 </property> 202 </widget> 203 </item> 204 <item row="2" column="4"> 205 <widget class="QLabel" name="label_7"> 206 <property name="text"> 207 <string>1/à 208 ²</string> 209 </property> 210 </widget> 211 </item> 212 <item row="3" column="0" colspan="5"> 317 <item row="2" column="0" colspan="5"> 213 318 <widget class="QFrame" name="frame"> 214 319 <property name="minimumSize"> … … 232 337 </widget> 233 338 </item> 234 <item row="4" column="0"> 235 <widget class="QLabel" name="label_21"> 236 <property name="text"> 237 <string>Neutron Inc. Xs</string> 238 </property> 239 </widget> 240 </item> 241 <item row="4" column="1"> 242 <widget class="QLineEdit" name="editNeutronIncXs"> 243 <property name="readOnly"> 244 <bool>true</bool> 245 </property> 246 </widget> 247 </item> 248 <item row="4" column="2" colspan="2"> 249 <widget class="QLabel" name="label_22"> 250 <property name="text"> 251 <string>1/cm</string> 252 </property> 253 </widget> 254 </item> 255 <item row="5" column="0"> 256 <widget class="QLabel" name="label_23"> 257 <property name="text"> 258 <string>Neutron Abs. Xs</string> 259 </property> 260 </widget> 261 </item> 262 <item row="5" column="1"> 263 <widget class="QLineEdit" name="editNeutronAbsXs"> 264 <property name="readOnly"> 265 <bool>true</bool> 266 </property> 267 </widget> 268 </item> 269 <item row="5" column="2" colspan="2"> 270 <widget class="QLabel" name="label_24"> 271 <property name="text"> 272 <string>1/cm</string> 273 </property> 274 </widget> 275 </item> 276 <item row="6" column="0"> 277 <widget class="QLabel" name="label_3"> 278 <property name="text"> 279 <string>Neutron 1/e length</string> 280 </property> 281 </widget> 282 </item> 283 <item row="6" column="1"> 284 <widget class="QLineEdit" name="editNeutronLength"> 285 <property name="readOnly"> 286 <bool>true</bool> 287 </property> 288 </widget> 289 </item> 290 <item row="6" column="2" colspan="2"> 291 <widget class="QLabel" name="label_4"> 292 <property name="text"> 293 <string>cm</string> 339 <item row="1" column="1"> 340 <widget class="QLineEdit" name="editXraySldReal"> 341 <property name="enabled"> 342 <bool>false</bool> 343 </property> 344 <property name="readOnly"> 345 <bool>true</bool> 346 </property> 347 </widget> 348 </item> 349 <item row="1" column="3"> 350 <widget class="QLineEdit" name="editXraySldImag"> 351 <property name="enabled"> 352 <bool>false</bool> 353 </property> 354 <property name="readOnly"> 355 <bool>true</bool> 294 356 </property> 295 357 </widget> 296 358 </item> 297 359 </layout> 298 </widget>299 </item>300 <item row="2" column="0">301 <spacer name="verticalSpacer">302 <property name="orientation">303 <enum>Qt::Vertical</enum>304 </property>305 <property name="sizeHint" stdset="0">306 <size>307 <width>20</width>308 <height>40</height>309 </size>310 </property>311 </spacer>312 </item>313 <item row="3" column="0">314 <widget class="QDialogButtonBox" name="buttonBox">315 <property name="orientation">316 <enum>Qt::Horizontal</enum>317 </property>318 <property name="standardButtons">319 <set>QDialogButtonBox::Close|QDialogButtonBox::Help|QDialogButtonBox::Reset</set>320 </property>321 <property name="centerButtons">322 <bool>true</bool>323 </property>324 360 </widget> 325 361 </item> … … 329 365 <tabstop>editMolecularFormula</tabstop> 330 366 <tabstop>editMassDensity</tabstop> 331 <tabstop>edit Wavelength</tabstop>367 <tabstop>editNeutronWavelength</tabstop> 332 368 <tabstop>editNeutronSldReal</tabstop> 333 369 <tabstop>editNeutronSldImag</tabstop> 334 <tabstop>editCuKaSldReal</tabstop>335 <tabstop>editCuKaSldImag</tabstop>336 <tabstop>editMoKaSldReal</tabstop>337 <tabstop>editMoKaSldImag</tabstop>338 370 <tabstop>editNeutronIncXs</tabstop> 339 371 <tabstop>editNeutronAbsXs</tabstop> 340 372 <tabstop>editNeutronLength</tabstop> 341 <tabstop>buttonBox</tabstop>342 373 </tabstops> 343 374 <resources/> 344 <connections> 345 <connection> 346 <sender>buttonBox</sender> 347 <signal>accepted()</signal> 348 <receiver>SldPanel</receiver> 349 <slot>accept()</slot> 350 <hints> 351 <hint type="sourcelabel"> 352 <x>248</x> 353 <y>254</y> 354 </hint> 355 <hint type="destinationlabel"> 356 <x>157</x> 357 <y>274</y> 358 </hint> 359 </hints> 360 </connection> 361 <connection> 362 <sender>buttonBox</sender> 363 <signal>rejected()</signal> 364 <receiver>SldPanel</receiver> 365 <slot>reject()</slot> 366 <hints> 367 <hint type="sourcelabel"> 368 <x>316</x> 369 <y>260</y> 370 </hint> 371 <hint type="destinationlabel"> 372 <x>286</x> 373 <y>274</y> 374 </hint> 375 </hints> 376 </connection> 377 </connections> 375 <connections/> 378 376 </ui> -
src/sas/qtgui/MainWindow/DataExplorer.py
ra24eacf r6b50296 394 394 # Notify the GuiManager about the send request 395 395 self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked()) 396 397 def freezeCheckedData(self): 398 """ 399 Convert checked results (fitted model, residuals) into separate dataset. 400 """ 401 outer_index = -1 402 theories_copied = 0 403 orig_model_size = self.model.rowCount() 404 while outer_index < orig_model_size: 405 outer_index += 1 406 outer_item = self.model.item(outer_index) 407 if not outer_item: 408 continue 409 if not outer_item.isCheckable(): 410 continue 411 # Look for checked inner items 412 inner_index = -1 413 while inner_index < outer_item.rowCount(): 414 inner_item = outer_item.child(inner_index) 415 inner_index += 1 416 if not inner_item: 417 continue 418 if not inner_item.isCheckable(): 419 continue 420 if inner_item.checkState() != QtCore.Qt.Checked: 421 continue 422 self.model.beginResetModel() 423 theories_copied += 1 424 new_item = self.cloneTheory(inner_item) 425 self.model.appendRow(new_item) 426 self.model.endResetModel() 427 428 freeze_msg = "" 429 if theories_copied == 0: 430 return 431 elif theories_copied == 1: 432 freeze_msg = "1 theory copied to a separate data set" 433 elif theories_copied > 1: 434 freeze_msg = "%i theories copied to separate data sets" % theories_copied 435 else: 436 freeze_msg = "Unexpected number of theories copied: %i" % theories_copied 437 raise AttributeError(freeze_msg) 438 self.communicator.statusBarUpdateSignal.emit(freeze_msg) 396 439 397 440 def freezeTheory(self, event): -
src/sas/qtgui/MainWindow/GuiManager.py
raa1db44 r6b50296 438 438 self._workspace.actionImage_Viewer.triggered.connect(self.actionImage_Viewer) 439 439 self._workspace.actionOrientation_Viewer.triggered.connect(self.actionOrientation_Viewer) 440 self._workspace.actionFreeze_Theory.triggered.connect(self.actionFreeze_Theory) 440 441 # Fitting 441 442 self._workspace.actionNew_Fit_Page.triggered.connect(self.actionNew_Fit_Page) … … 683 684 self._workspace.addDockWidget(Qt.RightDockWidgetArea, self.ipDockWidget) 684 685 686 def actionFreeze_Theory(self): 687 """ 688 Convert a child index with data into a separate top level dataset 689 """ 690 self.filesWidget.freezeCheckedData() 691 685 692 def actionOrientation_Viewer(self): 686 693 """ -
src/sas/qtgui/MainWindow/UI/MainWindowUI.ui
raa1db44 r6b50296 64 64 <addaction name="actionReport"/> 65 65 <addaction name="actionReset"/> 66 <addaction name="separator"/> 67 <addaction name="actionFreeze_Theory"/> 66 68 </widget> 67 69 <widget class="QMenu" name="menuView"> … … 535 537 </property> 536 538 </action> 539 <action name="actionFreeze_Theory"> 540 <property name="text"> 541 <string>Freeze Theory</string> 542 </property> 543 </action> 537 544 </widget> 538 545 <resources/> -
src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py
rff3b293 rf6c19cf 430 430 431 431 theory_name = str(current_data.name.split()[0]) 432 res iduals.name = "Residuals for " + str(theory_name) + "[" + \433 str(reference_data.filename)+ "]"432 res_name = reference_data.filename if reference_data.filename else reference_data.name 433 residuals.name = "Residuals for " + str(theory_name) + "[" + res_name + "]" 434 434 residuals.title = residuals.name 435 435 residuals.ytransform = 'y' -
src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
r6dbff18 r5aad7a5 267 267 self.has_magnet_error_column = False 268 268 269 # If the widget generated theory item, save it 270 self.theory_item = None 271 269 272 # signal communicator 270 273 self.communicate = self.parent.communicate … … 389 392 # Tag along functionality 390 393 self.label.setText("Data loaded from: ") 391 self.lblFilename.setText(self.logic.data.filename) 394 if self.logic.data.filename: 395 self.lblFilename.setText(self.logic.data.filename) 396 else: 397 self.lblFilename.setText(self.logic.data.name) 392 398 self.updateQRange() 393 399 # Switch off Data2D control … … 952 958 model = self.cbModel.currentText() 953 959 954 # empty combobox forced to be read 960 # Assure the control is active 961 if not self.cbModel.isEnabled(): 962 return 963 # Empty combobox forced to be read 955 964 if not model: 956 965 return … … 1106 1115 self.disableModelCombo() 1107 1116 self.enableStructureCombo() 1117 # set the index to 0 1118 self.cbStructureFactor.setCurrentIndex(0) 1119 self.model_parameters = None 1108 1120 self._model_model.clear() 1109 1121 return … … 1130 1142 model_row = item.row() 1131 1143 name_index = self._poly_model.index(model_row, 0) 1132 parameter_name = str(name_index.data()) .lower()# "distribution of sld" etc.1133 if " distribution of" in parameter_name:1144 parameter_name = str(name_index.data()) # "distribution of sld" etc. 1145 if "istribution of" in parameter_name: 1134 1146 # just the last word 1135 1147 parameter_name = parameter_name.rsplit()[-1] … … 1991 2003 """ 1992 2004 name = model_name 2005 kernel_module = None 1993 2006 if self.cbCategory.currentText() == CATEGORY_CUSTOM: 1994 2007 # custom kernel load requires full path … … 1996 2009 try: 1997 2010 kernel_module = generate.load_kernel_module(name) 1998 except ModuleNotFoundError: 1999 # maybe it's a recategorised custom model? 2000 name = os.path.join(ModelUtilities.find_plugins_dir(), model_name+".py") 2001 # If this rises, it's a valid problem. 2002 kernel_module = generate.load_kernel_module(name) 2011 except ModuleNotFoundError as ex: 2012 pass 2013 2014 if kernel_module is None: 2015 # mismatch between "name" attribute and actual filename. 2016 curr_model = self.models[model_name] 2017 name, _ = os.path.splitext(os.path.basename(curr_model.filename)) 2018 try: 2019 kernel_module = generate.load_kernel_module(name) 2020 except ModuleNotFoundError as ex: 2021 logging.error("Can't find the model "+ str(ex)) 2022 return 2003 2023 2004 2024 if hasattr(kernel_module, 'parameters'): … … 2193 2213 name = self.nameFromData(fitted_data) 2194 2214 # Notify the GUI manager so it can create the theory model in DataExplorer 2195 new_item = GuiUtils.createModelItemWithPlot(fitted_data, name=name)2196 self.communicate.updateTheoryFromPerspectiveSignal.emit( new_item)2215 self.theory_item = GuiUtils.createModelItemWithPlot(fitted_data, name=name) 2216 self.communicate.updateTheoryFromPerspectiveSignal.emit(self.theory_item) 2197 2217 2198 2218 def nameFromData(self, fitted_data): … … 2284 2304 residuals = self.calculateResiduals(fitted_data) 2285 2305 self.model_data = fitted_data 2286 2287 new_plots = [fitted_data, residuals] 2306 new_plots = [fitted_data] 2307 if residuals is not None: 2308 new_plots.append(residuals) 2288 2309 2289 2310 # Create plots for intermediate product data … … 2303 2324 GuiUtils.deleteRedundantPlots(self.all_data[self.data_index], new_plots) 2304 2325 2326 # Update/generate plots 2305 2327 for plot in new_plots: 2306 if hasattr(plot, "id") and "esidual" in plot.id: 2307 # TODO: fix updates to residuals plot 2308 pass 2309 elif plot is not None: 2310 self.communicate.plotUpdateSignal.emit([plot]) 2328 self.communicate.plotUpdateSignal.emit([plot]) 2311 2329 2312 2330 def complete2D(self, return_data): … … 2410 2428 self._poly_model.clear() 2411 2429 2430 parameters = self.model_parameters.form_volume_parameters 2431 if self.is2D: 2432 parameters += self.model_parameters.orientation_parameters 2433 2412 2434 [self.setPolyModelParameters(i, param) for i, param in \ 2413 enumerate(self.model_parameters.form_volume_parameters) if param.polydisperse] 2435 enumerate(parameters) if param.polydisperse] 2436 2414 2437 FittingUtilities.addPolyHeadersToModel(self._poly_model) 2415 2438 … … 2831 2854 if self.all_data: 2832 2855 index = self.all_data[self.data_index] 2856 else: 2857 index = self.theory_item 2833 2858 report_logic = ReportPageLogic(self, 2834 2859 kernel_module=self.kernel_module, -
src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py
re20870bc rc0a3b22e 127 127 Callback for running the mask editor 128 128 """ 129 self.parent.communicate.maskEditorSignal.emit(self.logic.data)130 pass129 if isinstance(self.logic.data, Data2D): 130 self.parent.communicate.maskEditorSignal.emit(self.logic.data) 131 131 132 132 def onRangeReset(self): … … 157 157 Enable/disable various UI elements based on data loaded 158 158 """ 159 is2Ddata = isinstance(self.logic.data, Data2D) 159 160 self.boxWeighting.setEnabled(True) 160 self.cmdMaskEdit.setEnabled( True)161 self.cmdMaskEdit.setEnabled(is2Ddata) 161 162 # Switch off txtNpts related controls 162 163 self.txtNpts.setEnabled(False) -
src/sas/qtgui/Utilities/AddMultEditor.py
raed0532 r287d356 15 15 import re 16 16 import logging 17 import traceback 18 17 19 import sas.qtgui.Utilities.GuiUtils as GuiUtils 18 20 from sasmodels.sasview_model import load_standard_models … … 202 204 self.cbOperator.currentText()) 203 205 204 success = GuiUtils.checkModel(self.plugin_filename) 206 try: 207 success = GuiUtils.checkModel(self.plugin_filename) 208 except Exception as ex: 209 # broad exception from sasmodels 210 msg = "Error building model: "+ str(ex) 211 logging.error(msg) 212 #print three last lines of the stack trace 213 # this will point out the exact line failing 214 last_lines = traceback.format_exc().split('\n')[-4:] 215 traceback_to_show = '\n'.join(last_lines) 216 logging.error(traceback_to_show) 217 218 # Set the status bar message 219 self.parent.communicate.statusBarUpdateSignal.emit("Model check failed") 220 return 205 221 206 222 if not success: -
src/sas/qtgui/Utilities/ReportDialog.py
rce30949 rcb90b65 73 73 # Use a sensible filename default 74 74 default_name = os.path.join(location, 'fit_report.pdf') 75 75 76 kwargs = { 76 77 'parent' : self, 77 78 'caption' : 'Save Report', 78 'directory': default_name, 79 # don't use 'directory' in order to remember the previous user choice 80 #'directory': default_name, 79 81 'filter' : 'PDF file (*.pdf);;HTML file (*.html);;Text file (*.txt)', 80 82 'options' : QtWidgets.QFileDialog.DontUseNativeDialog} … … 99 101 100 102 # Create files with charts 101 pictures = self.getPictures(basename) 103 pictures = [] 104 if self.data_images is not None: 105 pictures = self.getPictures(basename) 102 106 103 107 # self.data_html contains all images at the end of the report, in base64 form; -
src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py
r144fe21 rcb90b65 158 158 159 159 self.assertTrue(logging.error.called) 160 logging.error.assert_called_with("Error creating pdf: Failed")160 #logging.error.assert_called_with("Error creating pdf") 161 161 -
src/sas/sascalc/pr/invertor.py
rb8080e1 r6701a0b 71 71 A[j][i] = (Fourier transformed base function for point j) 72 72 73 We the mchoose a number of r-points, n_r, to evaluate the second73 We then choose a number of r-points, n_r, to evaluate the second 74 74 derivative of P(r) at. This is used as our regularization term. 75 75 For a vector r of length n_r, the following n_r rows are set to :: … … 144 144 x, y, err, d_max, q_min, q_max and alpha 145 145 """ 146 if 146 if name == 'x': 147 147 if 0.0 in value: 148 148 msg = "Invertor: one of your q-values is zero. " … … 227 227 return None 228 228 229 def add_errors(self, yvalues): 230 """ 231 Adds errors to data set is they are not avaialble 232 :return: 233 """ 234 stats_errors = np.zeros(len(yvalues)) 235 for i in range(len(yvalues)): 236 # Scale the error so that we can fit over several decades of Q 237 scale = 0.05 * np.sqrt(yvalues[i]) 238 min_err = 0.01 * yvalues[i] 239 stats_errors[i] = scale * np.sqrt(np.fabs(yvalues[i])) + min_err 240 logger.warning("Simulated errors have been added to the data set\n") 241 return stats_errors 242 229 243 def clone(self): 230 244 """ … … 244 258 invertor.x = self.x 245 259 invertor.y = self.y 246 invertor.err = self.err 260 if np.size(self.err) == 0 or np.all(self.err) == 0: 261 invertor.err = self.add_errors(self.y) 262 else: 263 invertor.err = self.err 247 264 invertor.est_bck = self.est_bck 248 265 invertor.background = self.background … … 268 285 A[i][j] = (Fourier transformed base function for point j) 269 286 270 We the mchoose a number of r-points, n_r, to evaluate the second287 We then choose a number of r-points, n_r, to evaluate the second 271 288 derivative of P(r) at. This is used as our regularization term. 272 289 For a vector r of length n_r, the following n_r rows are set to ::
Note: See TracChangeset
for help on using the changeset viewer.