Changeset 8f83719f in sasview
- Timestamp:
- Nov 24, 2017 9:57:08 AM (7 years ago)
- Branches:
- ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
- Children:
- f4480f0
- Parents:
- cb4d219
- Location:
- src/sas
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py
r0261bc1 r8f83719f 16 16 from PyQt5 import QtWidgets 17 17 18 from twisted.internet import threads19 20 18 # sas-global 21 19 from sas.qtgui.Plotting.PlotterData import Data1D … … 30 28 from sas.qtgui.Utilities.GuiUtils import enum 31 29 32 W = enum( 'NPTS', 33 'DMIN', 34 'DMAX', 35 'VARIABLE', 30 W = enum( 'NPTS', #0 31 'DMIN', #1 32 'DMAX', #2 33 'VARIABLE', #3 36 34 ) 37 35 … … 59 57 self.mapper = None 60 58 59 # Add validators on line edits 60 self.setupValidators() 61 61 62 # # Connect buttons to slots. 62 63 # # Needs to be done early so default values propagate properly. … … 69 70 self.setupMapper() 70 71 72 def setupValidators(self): 73 """Add validators on relevant line edits""" 74 self.Npts.setValidator(QtGui.QIntValidator()) 75 self.minDist.setValidator(GuiUtils.DoubleValidator()) 76 self.maxDist.setValidator(GuiUtils.DoubleValidator()) 77 71 78 def setupSlots(self): 72 79 self.closeButton.clicked.connect(self.close) 73 74 80 self.model.itemChanged.connect(self.modelChanged) 81 self.dependentVariable.currentIndexChanged.connect(lambda:self.modelChanged(None)) 75 82 76 83 def setupModel(self): 77 84 self.model.setItem(W.NPTS, QtGui.QStandardItem(str(self.nfunc))) 78 self.model.setItem(W.DMIN, QtGui.QStandardItem( str(0.9*self.pr_state.d_max)))79 self.model.setItem(W.DMAX, QtGui.QStandardItem( str(1.1*self.pr_state.d_max)))85 self.model.setItem(W.DMIN, QtGui.QStandardItem("{:.1f}".format(0.9*self.pr_state.d_max))) 86 self.model.setItem(W.DMAX, QtGui.QStandardItem("{:.1f}".format(1.1*self.pr_state.d_max))) 80 87 self.model.setItem(W.VARIABLE, QtGui.QStandardItem( "ϲ/dof")) 81 88 … … 91 98 92 99 self.mapper.toFirst() 100 101 def variableChanged(self, index): 102 """ 103 Respond to combobox update 104 """ 105 # Just fire the model change signal, mate 106 pass 93 107 94 108 def modelChanged(self, item): … … 121 135 bck.append(self.pr_state.background) 122 136 chi2.append(self.pr_state.chi2) 123 except :137 except Exception as ex: 124 138 # This inversion failed, skip this D_max value 125 139 msg = "ExploreDialog: inversion failed " 126 msg += "for D_max=%s\n%s" % (str(x), sys.exc_info()[1])140 msg += "for D_max=%s\n%s" % (str(x), ex) 127 141 print(msg) 128 142 logger.error(msg) … … 134 148 except RuntimeError as ex: 135 149 msg = "ExploreDialog: inversion failed " 136 msg += "for D_max=%s\n%s" % (str(x), sys.exc_info()[1])150 msg += "for D_max=%s\n%s" % (str(x), ex) 137 151 print(msg) 138 152 logger.error(msg) 139 153 140 plotter = str(self.model.item(W.VARIABLE).text()) 154 plotter = self.model.item(W.VARIABLE).text() 155 y_label = y_unit = "" 156 x_label = "D_{max}" 157 x_unit = "A" 141 158 if plotter == "ϲ/dof": 142 159 ys = chi2 160 y_label = "\chi^2/dof" 161 y_unit = "a.u." 143 162 elif plotter == "I(Q=0)": 144 163 ys = iq0 164 y_label = "I(q=0)" 165 y_unit = "\AA^{-1}" 145 166 elif plotter == "Rg": 146 167 ys = rg 168 y_label = "R_g" 169 y_unit = "\AA" 147 170 elif plotter == "Oscillation parameter": 148 171 ys = osc 172 y_label = "Osc" 173 y_unit = "a.u." 149 174 elif plotter == "Background": 150 175 ys = bck 176 y_label = "Bckg" 177 y_unit = "\AA^{-1}" 151 178 elif plotter == "Positive Fraction": 152 179 ys = pos 180 y_label = "P^+" 181 y_unit = "a.u." 153 182 else: 154 183 ys = pos_err 184 y_label = "P^{+}_{1\sigma}" 185 y_unit = "a.u." 155 186 156 187 data = Data1D(xs, ys) … … 158 189 self.plot.removePlot(None) 159 190 self.hasPlot = True 191 data.title = plotter 192 data._xaxis= x_label 193 data._xunit = x_unit 194 data._yaxis = y_label 195 data._yunit = y_unit 160 196 self.plot.plot(data=data, marker="-") -
src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py
r0580c77 r8f83719f 26 26 27 27 28 # TODO: Remove data29 28 # TODO: Modify plot references, don't just send new 30 29 # TODO: Update help with batch capabilities 31 # TODO: Easy way to scroll through results - no tabs in window(?) - 'spreadsheet'32 30 # TODO: Method to export results in some meaningful way 33 #class InversionWindow(QtWidgets.QTabWidget, Ui_PrInversion):34 31 class InversionWindow(QtWidgets.QDialog, Ui_PrInversion): 35 32 """ … … 55 52 56 53 self.logic = InversionLogic() 54 55 # Reference to Dmax window 56 self.dmaxWindow = None 57 57 58 58 # The window should not close … … 84 84 self._models = {} 85 85 86 self.calculateAllButton.setEnabled(False) 87 self.calculateThisButton.setEnabled(False) 88 86 89 # plots for current data 87 90 self.pr_plot = None … … 93 96 self.model = QtGui.QStandardItemModel(self) 94 97 self.mapper = QtWidgets.QDataWidgetMapper(self) 98 99 # Add validators 100 self.setupValidators() 95 101 # Link user interactions with methods 96 102 self.setupLinks() … … 150 156 151 157 self.backgroundInput.editingFinished.connect( 152 lambda: self._calculator.set_est_bck(int(is_float( 153 self.backgroundInput.text())))) 158 lambda: self._calculator.set_est_bck(int(is_float(self.backgroundInput.text())))) 154 159 self.minQInput.editingFinished.connect( 155 lambda: self._calculator.set_qmin(is_float( 156 self.minQInput.text()))) 160 lambda: self._calculator.set_qmin(is_float(self.minQInput.text()))) 157 161 self.regularizationConstantInput.editingFinished.connect( 158 lambda: self._calculator.set_alpha(is_float( 159 self.regularizationConstantInput.text()))) 162 lambda: self._calculator.set_alpha(is_float(self.regularizationConstantInput.text()))) 160 163 self.maxDistanceInput.editingFinished.connect( 161 lambda: self._calculator.set_dmax(is_float( 162 self.maxDistanceInput.text()))) 164 lambda: self._calculator.set_dmax(is_float(self.maxDistanceInput.text()))) 163 165 self.maxQInput.editingFinished.connect( 164 lambda: self._calculator.set_qmax(is_float( 165 self.maxQInput.text()))) 166 lambda: self._calculator.set_qmax(is_float(self.maxQInput.text()))) 166 167 self.slitHeightInput.editingFinished.connect( 167 lambda: self._calculator.set_slit_height(is_float( 168 self.slitHeightInput.text()))) 168 lambda: self._calculator.set_slit_height(is_float(self.slitHeightInput.text()))) 169 169 self.slitWidthInput.editingFinished.connect( 170 lambda: self._calculator.set_slit_width(is_float( 171 self.slitHeightInput.text()))) 170 lambda: self._calculator.set_slit_width(is_float(self.slitHeightInput.text()))) 172 171 173 172 self.model.itemChanged.connect(self.model_changed) … … 197 196 198 197 # Parameter Items 199 self.mapper.addMapping(self.regularizationConstantInput, 200 WIDGETS.W_REGULARIZATION) 201 self.mapper.addMapping(self.regConstantSuggestionButton, 202 WIDGETS.W_REGULARIZATION_SUGGEST) 198 self.mapper.addMapping(self.regularizationConstantInput, WIDGETS.W_REGULARIZATION) 199 self.mapper.addMapping(self.regConstantSuggestionButton, WIDGETS.W_REGULARIZATION_SUGGEST) 203 200 self.mapper.addMapping(self.explorerButton, WIDGETS.W_EXPLORE) 204 201 self.mapper.addMapping(self.maxDistanceInput, WIDGETS.W_MAX_DIST) 205 202 self.mapper.addMapping(self.noOfTermsInput, WIDGETS.W_NO_TERMS) 206 self.mapper.addMapping(self.noOfTermsSuggestionButton, 207 WIDGETS.W_NO_TERMS_SUGGEST) 203 self.mapper.addMapping(self.noOfTermsSuggestionButton, WIDGETS.W_NO_TERMS_SUGGEST) 208 204 209 205 # Output … … 215 211 self.mapper.addMapping(self.oscillationValue, WIDGETS.W_OSCILLATION) 216 212 self.mapper.addMapping(self.posFractionValue, WIDGETS.W_POS_FRACTION) 217 self.mapper.addMapping(self.sigmaPosFractionValue, 218 WIDGETS.W_SIGMA_POS_FRACTION) 213 self.mapper.addMapping(self.sigmaPosFractionValue, WIDGETS.W_SIGMA_POS_FRACTION) 219 214 220 215 # Main Buttons 221 216 self.mapper.addMapping(self.removeButton, WIDGETS.W_REMOVE) 222 217 self.mapper.addMapping(self.calculateAllButton, WIDGETS.W_CALCULATE_ALL) 223 self.mapper.addMapping(self.calculateThisButton, 224 WIDGETS.W_CALCULATE_VISIBLE) 218 self.mapper.addMapping(self.calculateThisButton, WIDGETS.W_CALCULATE_VISIBLE) 225 219 self.mapper.addMapping(self.helpButton, WIDGETS.W_HELP) 226 220 … … 268 262 def setupWindow(self): 269 263 """Initialize base window state on init""" 270 #self.setTabPosition(0)271 264 self.enableButtons() 272 265 self.estimateBgd.setChecked(True) 273 266 267 def setupValidators(self): 268 """Apply validators to editable line edits""" 269 self.noOfTermsInput.setValidator(QtGui.QIntValidator()) 270 self.regularizationConstantInput.setValidator(GuiUtils.DoubleValidator()) 271 self.maxDistanceInput.setValidator(GuiUtils.DoubleValidator()) 272 self.minQInput.setValidator(GuiUtils.DoubleValidator()) 273 self.maxQInput.setValidator(GuiUtils.DoubleValidator()) 274 self.slitHeightInput.setValidator(GuiUtils.DoubleValidator()) 275 self.slitWidthInput.setValidator(GuiUtils.DoubleValidator()) 276 274 277 ###################################################################### 275 278 # Methods for updating GUI … … 279 282 Enable buttons when data is present, else disable them 280 283 """ 284 self.calculateAllButton.setEnabled(self.logic.data_is_loaded) 285 self.calculateThisButton.setEnabled(self.logic.data_is_loaded) 281 286 self.removeButton.setEnabled(self.logic.data_is_loaded) 282 287 self.explorerButton.setEnabled(self.logic.data_is_loaded) … … 311 316 self.pr_plot_list.pop(self._data) 312 317 self.data_plot_list.pop(self._data) 318 if self.dmaxWindow is not None: 319 self.dmaxWindow = None 313 320 self.dataList.removeItem(self.dataList.currentIndex()) 314 321 self.dataList.setCurrentIndex(0) 322 # Last file removed 323 if not self._data_list: 324 self._data = None 325 self.pr_plot = None 326 self._data_set = None 327 self.calculateThisButton.setEnabled(False) 328 self.calculateAllButton.setEnabled(False) 329 self.explorerButton.setEnabled(False) 315 330 316 331 ###################################################################### … … 345 360 title = self.data_plot.name 346 361 GuiUtils.updateModelItemWithPlot(self._data, self.data_plot, title) 362 if self.dmaxWindow is not None: 363 self.dmaxWindow.pr_state = self._calculator 364 self.dmaxWindow.nfunc = self.getNFunc() 365 347 366 self.mapper.toFirst() 348 367 … … 374 393 Open the Explorer window to see correlations between params and results 375 394 """ 376 # TODO: Link Invertor() and DmaxWindow so window updates when recalculated377 395 from .DMaxExplorerWidget import DmaxWindow 378 396 self.dmaxWindow = DmaxWindow(self._calculator, self.getNFunc(), self) … … 395 413 396 414 for data in data_item: 415 if data in self._data_list.keys(): 416 # Don't add data if it's already in 417 return 397 418 # Create initial internal mappings 398 419 self._data_list[data] = self._calculator.clone() … … 439 460 ###################################################################### 440 461 # Thread Creators 441 442 # TODO: Move to individual class(?)443 444 462 def startThreadAll(self): 445 463 for data_ref, pr in list(self._data_list.items()): … … 531 549 alpha, message, elapsed = output_tuple 532 550 # Save useful info 533 self.model.setItem(WIDGETS.W_COMP_TIME, QtGui.QStandardItem( str(elapsed)))551 self.model.setItem(WIDGETS.W_COMP_TIME, QtGui.QStandardItem("{:.4g}".format(elapsed))) 534 552 self.regConstantSuggestionButton.setText("{:-3.2g}".format(alpha)) 535 553 self.regConstantSuggestionButton.setEnabled(True) … … 582 600 583 601 # Show result on control panel 584 585 # TODO: Connect self._calculator to GUI - two-to-one connection possible? 586 self.model.setItem(WIDGETS.W_RG, QtGui.QStandardItem(str(pr.rg(out)))) 587 self.model.setItem(WIDGETS.W_I_ZERO, QtGui.QStandardItem(str(pr.iq0(out)))) 602 self.model.setItem(WIDGETS.W_RG, QtGui.QStandardItem("{:.3g}".format(pr.rg(out)))) 603 self.model.setItem(WIDGETS.W_I_ZERO, QtGui.QStandardItem("{:.3g}".format(pr.iq0(out)))) 588 604 self.model.setItem(WIDGETS.W_BACKGROUND_INPUT, 589 605 QtGui.QStandardItem("{:.3f}".format(pr.est_bck))) 590 self.model.setItem(WIDGETS.W_BACKGROUND_OUTPUT, QtGui.QStandardItem( str(pr.background)))591 self.model.setItem(WIDGETS.W_CHI_SQUARED, QtGui.QStandardItem( str(pr.chi2[0])))592 self.model.setItem(WIDGETS.W_COMP_TIME, QtGui.QStandardItem( str(elapsed)))593 self.model.setItem(WIDGETS.W_OSCILLATION, QtGui.QStandardItem( str(pr.oscillations(out))))594 self.model.setItem(WIDGETS.W_POS_FRACTION, QtGui.QStandardItem( str(pr.get_positive(out))))606 self.model.setItem(WIDGETS.W_BACKGROUND_OUTPUT, QtGui.QStandardItem("{:.3g}".format(pr.background))) 607 self.model.setItem(WIDGETS.W_CHI_SQUARED, QtGui.QStandardItem("{:.3g}".format(pr.chi2[0]))) 608 self.model.setItem(WIDGETS.W_COMP_TIME, QtGui.QStandardItem("{:.2g}".format(elapsed))) 609 self.model.setItem(WIDGETS.W_OSCILLATION, QtGui.QStandardItem("{:.3g}".format(pr.oscillations(out)))) 610 self.model.setItem(WIDGETS.W_POS_FRACTION, QtGui.QStandardItem("{:.3g}".format(pr.get_positive(out)))) 595 611 self.model.setItem(WIDGETS.W_SIGMA_POS_FRACTION, 596 QtGui.QStandardItem( str(pr.get_pos_err(out, cov))))612 QtGui.QStandardItem("{:.3g}".format(pr.get_pos_err(out, cov)))) 597 613 598 614 # Save Pr invertor -
src/sas/qtgui/Perspectives/Inversion/UI/DMaxExplorer.ui
rfa81e94 r8f83719f 7 7 <x>0</x> 8 8 <y>0</y> 9 <width> 609</width>10 <height> 524</height>9 <width>394</width> 10 <height>426</height> 11 11 </rect> 12 12 </property> … … 14 14 <string>Dialog</string> 15 15 </property> 16 <layout class="QGridLayout" name="gridLayout_ 2">16 <layout class="QGridLayout" name="gridLayout_3"> 17 17 <item row="0" column="0"> 18 18 <layout class="QVBoxLayout" name="verticalLayout"> … … 25 25 <size> 26 26 <width>20</width> 27 <height> 40</height>27 <height>305</height> 28 28 </size> 29 29 </property> … … 32 32 <item> 33 33 <layout class="QGridLayout" name="gridLayout"> 34 <item row="1" column="2">35 <widget class="QLabel" name="label_4">36 <property name="text">37 <string>Max Distance [â«]</string>38 </property>39 </widget>40 </item>41 <item row="1" column="3">42 <widget class="QLineEdit" name="maxDist"/>43 </item>44 <item row="0" column="2">45 <widget class="QLabel" name="label_2">46 <property name="text">47 <string>Npts</string>48 </property>49 </widget>50 </item>51 <item row="0" column="3">52 <widget class="QLineEdit" name="Npts"/>53 </item>54 34 <item row="0" column="0"> 55 <widget class="QLabel" name="label"> 56 <property name="text"> 57 <string>Dependent Variable:</string> 58 </property> 59 </widget> 60 </item> 61 <item row="1" column="1"> 62 <widget class="QLineEdit" name="minDist"/> 63 </item> 64 <item row="0" column="1"> 65 <widget class="QComboBox" name="dependentVariable"> 35 <layout class="QHBoxLayout" name="horizontalLayout_3"> 66 36 <item> 67 <property name="text"> 68 <string>1-Ï positive fraction</string> 69 </property> 37 <widget class="QLabel" name="label"> 38 <property name="text"> 39 <string>Dependent Variable:</string> 40 </property> 41 </widget> 70 42 </item> 71 43 <item> 72 <property name="text"> 73 <string>ϲ/dof</string> 74 </property> 44 <widget class="QComboBox" name="dependentVariable"> 45 <item> 46 <property name="text"> 47 <string>1-Ï positive fraction</string> 48 </property> 49 </item> 50 <item> 51 <property name="text"> 52 <string>ϲ/dof</string> 53 </property> 54 </item> 55 <item> 56 <property name="text"> 57 <string>I(Q=0)</string> 58 </property> 59 </item> 60 <item> 61 <property name="text"> 62 <string>Rg</string> 63 </property> 64 </item> 65 <item> 66 <property name="text"> 67 <string>Oscillation parameter</string> 68 </property> 69 </item> 70 <item> 71 <property name="text"> 72 <string>Background</string> 73 </property> 74 </item> 75 <item> 76 <property name="text"> 77 <string>Positive Fraction</string> 78 </property> 79 </item> 80 </widget> 75 81 </item> 76 82 <item> 77 <property name="text"> 78 <string>I(Q=0)</string> 79 </property> 83 <spacer name="horizontalSpacer_2"> 84 <property name="orientation"> 85 <enum>Qt::Horizontal</enum> 86 </property> 87 <property name="sizeHint" stdset="0"> 88 <size> 89 <width>40</width> 90 <height>20</height> 91 </size> 92 </property> 93 </spacer> 94 </item> 95 </layout> 96 </item> 97 <item row="1" column="0"> 98 <layout class="QHBoxLayout" name="horizontalLayout_2"> 99 <item> 100 <widget class="QLabel" name="label_2"> 101 <property name="text"> 102 <string>Npts</string> 103 </property> 104 </widget> 80 105 </item> 81 106 <item> 82 <property name="text"> 83 <string>Rg</string> 84 </property> 107 <widget class="QLineEdit" name="Npts"/> 85 108 </item> 86 109 <item> 87 <property name="text"> 88 <string>Oscillation parameter</string> 89 </property> 110 <widget class="QLabel" name="label_3"> 111 <property name="text"> 112 <string>Min Distance [â«]</string> 113 </property> 114 </widget> 90 115 </item> 91 116 <item> 92 <property name="text"> 93 <string>Background</string> 94 </property> 117 <widget class="QLineEdit" name="minDist"/> 95 118 </item> 96 119 <item> 97 <property name="text"> 98 <string>Positive Fraction</string> 99 </property> 120 <widget class="QLabel" name="label_4"> 121 <property name="text"> 122 <string>Max Distance [â«]</string> 123 </property> 124 </widget> 100 125 </item> 101 </widget> 126 <item> 127 <widget class="QLineEdit" name="maxDist"/> 128 </item> 129 </layout> 102 130 </item> 103 <item row="1" column="0"> 104 <widget class="QLabel" name="label_3"> 105 <property name="text"> 106 <string>Min Distance [â«]</string> 107 </property> 108 </widget> 109 </item> 110 <item row="2" column="0" colspan="4"> 111 <widget class="QPushButton" name="closeButton"> 112 <property name="text"> 113 <string>Close</string> 114 </property> 115 </widget> 131 <item row="2" column="0"> 132 <layout class="QHBoxLayout" name="horizontalLayout"> 133 <item> 134 <spacer name="horizontalSpacer"> 135 <property name="orientation"> 136 <enum>Qt::Horizontal</enum> 137 </property> 138 <property name="sizeHint" stdset="0"> 139 <size> 140 <width>40</width> 141 <height>20</height> 142 </size> 143 </property> 144 </spacer> 145 </item> 146 <item> 147 <widget class="QPushButton" name="closeButton"> 148 <property name="text"> 149 <string>Close</string> 150 </property> 151 </widget> 152 </item> 153 </layout> 116 154 </item> 117 155 </layout> -
src/sas/qtgui/Perspectives/Inversion/UI/TabbedInversionUI.ui
r0580c77 r8f83719f 7 7 <x>0</x> 8 8 <y>0</y> 9 <width> 473</width>10 <height> 540</height>9 <width>390</width> 10 <height>409</height> 11 11 </rect> 12 12 </property> 13 13 <property name="sizePolicy"> 14 <sizepolicy hsizetype=" Fixed" vsizetype="Fixed">14 <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 15 15 <horstretch>0</horstretch> 16 16 <verstretch>0</verstretch> … … 32 32 <string>P(r) Inversion</string> 33 33 </property> 34 <layout class="QGridLayout" name="gridLayout_ 10">34 <layout class="QGridLayout" name="gridLayout_7"> 35 35 <item row="0" column="0"> 36 36 <widget class="QTabWidget" name="PrTabWidget"> 37 37 <property name="sizePolicy"> 38 <sizepolicy hsizetype=" Fixed" vsizetype="Fixed">38 <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 39 39 <horstretch>0</horstretch> 40 40 <verstretch>0</verstretch> … … 52 52 <widget class="QWidget" name="tabMain"> 53 53 <attribute name="title"> 54 <string>P (r) Parameters</string>54 <string>Parameters</string> 55 55 </attribute> 56 <layout class="QGridLayout" name="gridLayout_ 7">57 <item row="0" column="0" colspan="2">56 <layout class="QGridLayout" name="gridLayout_6"> 57 <item row="0" column="0"> 58 58 <widget class="QGroupBox" name="dataSourceGroupBox"> 59 <property name="sizePolicy"> 60 <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 61 <horstretch>0</horstretch> 62 <verstretch>0</verstretch> 63 </sizepolicy> 64 </property> 59 65 <property name="title"> 60 66 <string>I(q) data source</string> … … 101 107 </widget> 102 108 </item> 103 <item row="1" column="0" colspan="2"> 104 <layout class="QGridLayout" name="gridLayout_6"> 105 <item row="0" column="0"> 106 <widget class="QGroupBox" name="paramGroupBox"> 107 <property name="sizePolicy"> 108 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> 109 <horstretch>0</horstretch> 110 <verstretch>0</verstretch> 111 </sizepolicy> 112 </property> 113 <property name="toolTip"> 114 <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> 109 <item row="1" column="0"> 110 <widget class="QGroupBox" name="paramGroupBox"> 111 <property name="sizePolicy"> 112 <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 113 <horstretch>0</horstretch> 114 <verstretch>0</verstretch> 115 </sizepolicy> 116 </property> 117 <property name="toolTip"> 118 <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> 115 119 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 116 120 p, li { white-space: pre-wrap; } 117 121 </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> 118 122 <pre style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;><span style=" font-family:'Courier New'; font-size:9pt; color:#000000;">P(r) is found by fitting a set of base functions to I(Q). The minimization involves a regularization term to ensure a smooth P(r). The regularization constant gives the size of that term. The suggested value is the value above which the output P(r) will have only one peak.</span></pre></body></html></string> 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 123 </property> 124 <property name="title"> 125 <string>Parameters</string> 126 </property> 127 <layout class="QGridLayout" name="gridLayout"> 128 <item row="0" column="0"> 129 <widget class="QLabel" name="label_12"> 130 <property name="sizePolicy"> 131 <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> 132 <horstretch>0</horstretch> 133 <verstretch>0</verstretch> 134 </sizepolicy> 135 </property> 136 <property name="text"> 137 <string>Number of terms</string> 138 </property> 139 </widget> 140 </item> 141 <item row="0" column="1"> 142 <widget class="QLineEdit" name="noOfTermsInput"> 143 <property name="sizePolicy"> 144 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 145 <horstretch>0</horstretch> 146 <verstretch>0</verstretch> 147 </sizepolicy> 148 </property> 149 <property name="minimumSize"> 150 <size> 151 <width>40</width> 152 <height>0</height> 153 </size> 154 </property> 155 </widget> 156 </item> 157 <item row="0" column="2"> 158 <widget class="QPushButton" name="noOfTermsSuggestionButton"> 159 <property name="enabled"> 160 <bool>false</bool> 161 </property> 162 <property name="text"> 163 <string/> 164 </property> 165 </widget> 166 </item> 167 <item row="1" column="0"> 168 <widget class="QLabel" name="label_13"> 169 <property name="sizePolicy"> 170 <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> 171 <horstretch>0</horstretch> 172 <verstretch>0</verstretch> 173 </sizepolicy> 174 </property> 175 <property name="minimumSize"> 176 <size> 177 <width>80</width> 178 <height>0</height> 179 </size> 180 </property> 181 <property name="text"> 182 <string>Reg. constant</string> 183 </property> 184 </widget> 185 </item> 186 <item row="1" column="1"> 187 <widget class="QLineEdit" name="regularizationConstantInput"> 188 <property name="sizePolicy"> 189 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 190 <horstretch>0</horstretch> 191 <verstretch>0</verstretch> 192 </sizepolicy> 193 </property> 194 <property name="minimumSize"> 195 <size> 196 <width>40</width> 197 <height>0</height> 198 </size> 199 </property> 200 </widget> 201 </item> 202 <item row="1" column="2"> 203 <widget class="QPushButton" name="regConstantSuggestionButton"> 204 <property name="enabled"> 205 <bool>false</bool> 206 </property> 207 <property name="text"> 208 <string/> 209 </property> 210 </widget> 211 </item> 212 <item row="2" column="0"> 213 <widget class="QLabel" name="label_14"> 214 <property name="sizePolicy"> 215 <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> 216 <horstretch>0</horstretch> 217 <verstretch>0</verstretch> 218 </sizepolicy> 219 </property> 220 <property name="text"> 221 <string>Max distance [Ã 218 222 ]</string> 219 </property> 220 </widget> 221 </item> 222 <item row="2" column="1"> 223 <widget class="QLineEdit" name="maxDistanceInput"> 224 <property name="sizePolicy"> 225 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 226 <horstretch>0</horstretch> 227 <verstretch>0</verstretch> 228 </sizepolicy> 229 </property> 230 <property name="minimumSize"> 231 <size> 232 <width>40</width> 233 <height>0</height> 234 </size> 235 </property> 236 </widget> 237 </item> 238 <item row="2" column="2"> 239 <widget class="QPushButton" name="explorerButton"> 240 <property name="sizePolicy"> 241 <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> 242 <horstretch>0</horstretch> 243 <verstretch>0</verstretch> 244 </sizepolicy> 245 </property> 246 <property name="minimumSize"> 247 <size> 248 <width>50</width> 249 <height>0</height> 250 </size> 251 </property> 252 <property name="toolTip"> 253 <string><html><head/><body><p>Open the D<span style=" vertical-align:sub;">max</span> explorer window.</p></body></html></string> 254 </property> 255 <property name="layoutDirection"> 256 <enum>Qt::LeftToRight</enum> 257 </property> 258 <property name="text"> 259 <string>Explore</string> 260 </property> 261 </widget> 262 </item> 263 </layout> 264 <zorder>noOfTermsInput</zorder> 265 <zorder>noOfTermsSuggestionButton</zorder> 266 <zorder>regularizationConstantInput</zorder> 267 <zorder>regConstantSuggestionButton</zorder> 268 <zorder>maxDistanceInput</zorder> 269 <zorder>explorerButton</zorder> 270 <zorder>label_13</zorder> 271 <zorder>label_12</zorder> 272 <zorder>label_14</zorder> 273 </widget> 274 </item> 275 </layout> 223 </property> 224 </widget> 225 </item> 226 <item row="2" column="1"> 227 <widget class="QLineEdit" name="maxDistanceInput"> 228 <property name="sizePolicy"> 229 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 230 <horstretch>0</horstretch> 231 <verstretch>0</verstretch> 232 </sizepolicy> 233 </property> 234 <property name="minimumSize"> 235 <size> 236 <width>40</width> 237 <height>0</height> 238 </size> 239 </property> 240 </widget> 241 </item> 242 <item row="2" column="2"> 243 <widget class="QPushButton" name="explorerButton"> 244 <property name="sizePolicy"> 245 <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> 246 <horstretch>0</horstretch> 247 <verstretch>0</verstretch> 248 </sizepolicy> 249 </property> 250 <property name="minimumSize"> 251 <size> 252 <width>50</width> 253 <height>0</height> 254 </size> 255 </property> 256 <property name="toolTip"> 257 <string><html><head/><body><p>Open the D<span style=" vertical-align:sub;">max</span> explorer window.</p></body></html></string> 258 </property> 259 <property name="layoutDirection"> 260 <enum>Qt::LeftToRight</enum> 261 </property> 262 <property name="text"> 263 <string>Explore</string> 264 </property> 265 </widget> 266 </item> 267 </layout> 268 <zorder>noOfTermsInput</zorder> 269 <zorder>noOfTermsSuggestionButton</zorder> 270 <zorder>regularizationConstantInput</zorder> 271 <zorder>regConstantSuggestionButton</zorder> 272 <zorder>maxDistanceInput</zorder> 273 <zorder>explorerButton</zorder> 274 <zorder>label_13</zorder> 275 <zorder>label_12</zorder> 276 <zorder>label_14</zorder> 277 </widget> 276 278 </item> 277 279 <item row="2" column="0"> … … 281 283 </property> 282 284 <layout class="QGridLayout" name="gridLayout_4"> 283 <item row="1" column="1"> 285 <item row="0" column="0"> 286 <widget class="QLabel" name="label_15"> 287 <property name="text"> 288 <string><html><head/><body><p>R<span style=" vertical-align:sub;">g</span></p></body></html></string> 289 </property> 290 </widget> 291 </item> 292 <item row="0" column="1"> 284 293 <widget class="QLineEdit" name="rgValue"> 285 294 <property name="enabled"> … … 287 296 </property> 288 297 <property name="sizePolicy"> 289 <sizepolicy hsizetype=" MinimumExpanding" vsizetype="Fixed">298 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 290 299 <horstretch>0</horstretch> 291 300 <verstretch>0</verstretch> … … 297 306 </widget> 298 307 </item> 299 <item row="5" column="1">300 <widget class="QLineEdit" name="chiDofValue">301 <property name="enabled">302 <bool>true</bool>303 </property>304 <property name="sizePolicy">305 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">306 <horstretch>0</horstretch>307 <verstretch>0</verstretch>308 </sizepolicy>309 </property>310 <property name="readOnly">311 <bool>true</bool>312 </property>313 </widget>314 </item>315 <item row="3" column="1">316 <widget class="QLineEdit" name="backgroundValue">317 <property name="enabled">318 <bool>true</bool>319 </property>320 <property name="sizePolicy">321 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">322 <horstretch>0</horstretch>323 <verstretch>0</verstretch>324 </sizepolicy>325 </property>326 <property name="readOnly">327 <bool>true</bool>328 </property>329 </widget>330 </item>331 <item row="0" column="0">332 <widget class="QLabel" name="label_22">333 <property name="text">334 <string>Parameter</string>335 </property>336 </widget>337 </item>338 <item row="0" column="1">339 <widget class="QLabel" name="label_23">340 <property name="text">341 <string>Calculated Value</string>342 </property>343 <property name="alignment">344 <set>Qt::AlignCenter</set>345 </property>346 </widget>347 </item>348 <item row="4" column="2">349 <widget class="QLabel" name="label_27">350 <property name="text">351 <string>secs</string>352 </property>353 </widget>354 </item>355 308 <item row="0" column="2"> 356 <widget class="QLabel" name="label_28">357 <property name="text">358 <string>Units</string>359 </property>360 </widget>361 </item>362 <item row="1" column="0">363 <widget class="QLabel" name="label_15">364 <property name="text">365 <string>Rg</string>366 </property>367 </widget>368 </item>369 <item row="2" column="2">370 <widget class="QLabel" name="label_25">371 <property name="text">372 <string>Ã373 -1</string>374 </property>375 </widget>376 </item>377 <item row="7" column="0">378 <widget class="QLabel" name="label_21">379 <property name="text">380 <string>Positive Fraction</string>381 </property>382 </widget>383 </item>384 <item row="5" column="0">385 <widget class="QLabel" name="label_19">386 <property name="text">387 <string>Chi^2/dof</string>388 </property>389 </widget>390 </item>391 <item row="6" column="0">392 <widget class="QLabel" name="label_20">393 <property name="text">394 <string>Oscillations</string>395 </property>396 </widget>397 </item>398 <item row="6" column="1">399 <widget class="QLineEdit" name="oscillationValue">400 <property name="enabled">401 <bool>true</bool>402 </property>403 <property name="sizePolicy">404 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">405 <horstretch>0</horstretch>406 <verstretch>0</verstretch>407 </sizepolicy>408 </property>409 <property name="readOnly">410 <bool>true</bool>411 </property>412 </widget>413 </item>414 <item row="1" column="2">415 309 <widget class="QLabel" name="label_24"> 416 310 <property name="text"> … … 420 314 </widget> 421 315 </item> 422 <item row="4" column="0"> 316 <item row="0" column="3"> 317 <widget class="QLabel" name="label_22"> 318 <property name="text"> 319 <string> </string> 320 </property> 321 </widget> 322 </item> 323 <item row="0" column="4"> 324 <widget class="QLabel" name="label_19"> 325 <property name="text"> 326 <string><html><head/><body><p>Ï<span style=" vertical-align:super;">2</span>/dof</p></body></html></string> 327 </property> 328 </widget> 329 </item> 330 <item row="0" column="5"> 331 <widget class="QLineEdit" name="chiDofValue"> 332 <property name="enabled"> 333 <bool>true</bool> 334 </property> 335 <property name="sizePolicy"> 336 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 337 <horstretch>0</horstretch> 338 <verstretch>0</verstretch> 339 </sizepolicy> 340 </property> 341 <property name="readOnly"> 342 <bool>true</bool> 343 </property> 344 </widget> 345 </item> 346 <item row="1" column="0"> 347 <widget class="QLabel" name="label_16"> 348 <property name="text"> 349 <string>I(Q=0)</string> 350 </property> 351 </widget> 352 </item> 353 <item row="1" column="1"> 354 <widget class="QLineEdit" name="iQ0Value"> 355 <property name="enabled"> 356 <bool>true</bool> 357 </property> 358 <property name="sizePolicy"> 359 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 360 <horstretch>0</horstretch> 361 <verstretch>0</verstretch> 362 </sizepolicy> 363 </property> 364 <property name="readOnly"> 365 <bool>true</bool> 366 </property> 367 </widget> 368 </item> 369 <item row="1" column="2"> 370 <widget class="QLabel" name="label_25"> 371 <property name="text"> 372 <string><html><head/><body><p>Ã 373 <span style=" vertical-align:super;">-1</span></p></body></html></string> 374 </property> 375 </widget> 376 </item> 377 <item row="1" column="4"> 378 <widget class="QLabel" name="label_20"> 379 <property name="text"> 380 <string>Oscillations</string> 381 </property> 382 </widget> 383 </item> 384 <item row="1" column="5"> 385 <widget class="QLineEdit" name="oscillationValue"> 386 <property name="enabled"> 387 <bool>true</bool> 388 </property> 389 <property name="sizePolicy"> 390 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 391 <horstretch>0</horstretch> 392 <verstretch>0</verstretch> 393 </sizepolicy> 394 </property> 395 <property name="readOnly"> 396 <bool>true</bool> 397 </property> 398 </widget> 399 </item> 400 <item row="2" column="0"> 401 <widget class="QLabel" name="label_17"> 402 <property name="text"> 403 <string>Background</string> 404 </property> 405 </widget> 406 </item> 407 <item row="2" column="1"> 408 <widget class="QLineEdit" name="backgroundValue"> 409 <property name="enabled"> 410 <bool>true</bool> 411 </property> 412 <property name="sizePolicy"> 413 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 414 <horstretch>0</horstretch> 415 <verstretch>0</verstretch> 416 </sizepolicy> 417 </property> 418 <property name="readOnly"> 419 <bool>true</bool> 420 </property> 421 </widget> 422 </item> 423 <item row="2" column="2"> 424 <widget class="QLabel" name="label_26"> 425 <property name="text"> 426 <string><html><head/><body><p>Ã 427 <span style=" vertical-align:super;">-1</span></p></body></html></string> 428 </property> 429 </widget> 430 </item> 431 <item row="2" column="4"> 432 <widget class="QLabel" name="label_21"> 433 <property name="text"> 434 <string><html><head/><body><p>P<span style=" vertical-align:super;">+</span> Fraction</p></body></html></string> 435 </property> 436 </widget> 437 </item> 438 <item row="2" column="5"> 439 <widget class="QLineEdit" name="posFractionValue"> 440 <property name="enabled"> 441 <bool>true</bool> 442 </property> 443 <property name="sizePolicy"> 444 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 445 <horstretch>0</horstretch> 446 <verstretch>0</verstretch> 447 </sizepolicy> 448 </property> 449 <property name="readOnly"> 450 <bool>true</bool> 451 </property> 452 </widget> 453 </item> 454 <item row="3" column="0"> 423 455 <widget class="QLabel" name="label_18"> 424 456 <property name="text"> 425 <string>Computation Time</string> 426 </property> 427 </widget> 428 </item> 429 <item row="8" column="0"> 457 <string>Calc. Time</string> 458 </property> 459 </widget> 460 </item> 461 <item row="3" column="1"> 462 <widget class="QLineEdit" name="computationTimeValue"> 463 <property name="enabled"> 464 <bool>true</bool> 465 </property> 466 <property name="sizePolicy"> 467 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 468 <horstretch>0</horstretch> 469 <verstretch>0</verstretch> 470 </sizepolicy> 471 </property> 472 <property name="readOnly"> 473 <bool>true</bool> 474 </property> 475 </widget> 476 </item> 477 <item row="3" column="2"> 478 <widget class="QLabel" name="label_27"> 479 <property name="text"> 480 <string>secs</string> 481 </property> 482 </widget> 483 </item> 484 <item row="3" column="4"> 430 485 <widget class="QLabel" name="label_29"> 431 486 <property name="text"> 432 <string> 1-sigma positive fraction</string>433 </property> 434 </widget> 435 </item> 436 <item row=" 8" column="1">487 <string><html><head/><body><p>P<span style=" vertical-align:super;">+</span><span style=" vertical-align:sub;">1-Ï</span> fraction</p></body></html></string> 488 </property> 489 </widget> 490 </item> 491 <item row="3" column="5"> 437 492 <widget class="QLineEdit" name="sigmaPosFractionValue"> 438 493 <property name="enabled"> … … 440 495 </property> 441 496 <property name="sizePolicy"> 442 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 443 <horstretch>0</horstretch> 444 <verstretch>0</verstretch> 445 </sizepolicy> 446 </property> 447 <property name="readOnly"> 448 <bool>true</bool> 449 </property> 450 </widget> 451 </item> 452 <item row="7" column="1"> 453 <widget class="QLineEdit" name="posFractionValue"> 454 <property name="enabled"> 455 <bool>true</bool> 456 </property> 457 <property name="sizePolicy"> 458 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 459 <horstretch>0</horstretch> 460 <verstretch>0</verstretch> 461 </sizepolicy> 462 </property> 463 <property name="readOnly"> 464 <bool>true</bool> 465 </property> 466 </widget> 467 </item> 468 <item row="3" column="2"> 469 <widget class="QLabel" name="label_26"> 470 <property name="text"> 471 <string>Ã 472 -1</string> 473 </property> 474 </widget> 475 </item> 476 <item row="2" column="0"> 477 <widget class="QLabel" name="label_16"> 478 <property name="text"> 479 <string>I(Q=0)</string> 480 </property> 481 </widget> 482 </item> 483 <item row="4" column="1"> 484 <widget class="QLineEdit" name="computationTimeValue"> 485 <property name="enabled"> 486 <bool>true</bool> 487 </property> 488 <property name="sizePolicy"> 489 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 490 <horstretch>0</horstretch> 491 <verstretch>0</verstretch> 492 </sizepolicy> 493 </property> 494 <property name="readOnly"> 495 <bool>true</bool> 496 </property> 497 </widget> 498 </item> 499 <item row="3" column="0"> 500 <widget class="QLabel" name="label_17"> 501 <property name="text"> 502 <string>Background</string> 503 </property> 504 </widget> 505 </item> 506 <item row="2" column="1"> 507 <widget class="QLineEdit" name="iQ0Value"> 508 <property name="enabled"> 509 <bool>true</bool> 510 </property> 511 <property name="sizePolicy"> 512 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> 497 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> 513 498 <horstretch>0</horstretch> 514 499 <verstretch>0</verstretch> … … 738 723 </item> 739 724 <item row="1" column="0"> 740 <spacer name="verticalSpacer_2">741 <property name="orientation">742 <enum>Qt::Vertical</enum>743 </property>744 <property name="sizeHint" stdset="0">745 <size>746 <width>20</width>747 <height>0</height>748 </size>749 </property>750 </spacer>751 </item>752 <item row="2" column="0">753 725 <layout class="QHBoxLayout" name="horizontalLayout_8"> 754 726 <property name="sizeConstraint"> -
src/sas/qtgui/Plotting/Plotter.py
rcb4d219 r8f83719f 92 92 marker = dict(PlotUtilities.SHAPES)[marker] 93 93 except KeyError: 94 list(PlotUtilities.SHAPES.values())[marker]94 marker = list(PlotUtilities.SHAPES.values())[marker] 95 95 96 96 assert marker is not None -
src/sas/qtgui/Plotting/PlotterBase.py
rdd150ef r8f83719f 145 145 def xLabel(self, xlabel=""): 146 146 """ x-label setter """ 147 self.x_label = r'$%s$'% xlabel 147 self.x_label = r'$%s$'% xlabel if xlabel else "" 148 148 149 149 @property … … 155 155 def yLabel(self, ylabel=""): 156 156 """ y-label setter """ 157 self.y_label = r'$%s$'% ylabel 157 self.y_label = r'$%s$'% ylabel if ylabel else "" 158 158 159 159 @property -
src/sas/sascalc/calculator/resolution_calculator.py
rfbfc488 r8f83719f 1094 1094 output.qx_data = qx_value 1095 1095 output.qy_data = qy_value 1096 except :1097 logger.error( sys.exc_value)1096 except Exception as ex: 1097 logger.error(ex) 1098 1098 1099 1099 return output -
src/sas/sascalc/pr/invertor.py
rf1ec901 r8f83719f 500 500 cov = np.linalg.pinv(inv_cov) 501 501 err = math.fabs(chi2 / float(npts - nfunc)) * cov 502 except :502 except Exception as ex: 503 503 # We were not able to estimate the errors 504 504 # Return an empty error matrix 505 logger.error( sys.exc_value)505 logger.error(ex) 506 506 507 507 # Keep a copy of the last output … … 544 544 try: 545 545 return estimator.num_terms(isquit_func) 546 except :546 except Exception as ex: 547 547 # If we fail, estimate alpha and return the default 548 548 # number of terms 549 549 best_alpha, _, _ = self.estimate_alpha(self.nfunc) 550 logger.warning("Invertor.estimate_numterms: %s" % sys.exc_value)550 logger.warning("Invertor.estimate_numterms: %s" % ex) 551 551 return self.nfunc, best_alpha, "Could not estimate number of terms" 552 552 … … 634 634 return best_alpha, message, elapsed 635 635 636 except :637 message = "Invertor.estimate_alpha: %s" % sys.exc_value636 except Exception as ex: 637 message = "Invertor.estimate_alpha: %s" % ex 638 638 return 0, message, elapsed 639 639 … … 754 754 self.cov[i][i] = float(toks2[1]) 755 755 756 except :757 msg = "Invertor.from_file: corrupted file\n%s" % sys.exc_value756 except Exception as ex: 757 msg = "Invertor.from_file: corrupted file\n%s" % ex 758 758 raise RuntimeError(msg) 759 759 else: -
src/sas/sascalc/pr/num_term.py
ra1b8fee r8f83719f 183 183 data_y = np.append(data_y, test_y) 184 184 data_err = np.append(data_err, err) 185 except :186 logger.error( sys.exc_value)185 except Exception as ex: 186 logger.error(ex) 187 187 188 188 return data_x, data_y, data_err
Note: See TracChangeset
for help on using the changeset viewer.