Ignore:
Timestamp:
Nov 24, 2017 9:57:08 AM (7 years ago)
Author:
Piotr Rozyczko <rozyczko@…>
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
Message:

More inversion work on details in validation, UI design and such

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py

    r0580c77 r8f83719f  
    2626 
    2727 
    28 # TODO: Remove data 
    2928# TODO: Modify plot references, don't just send new 
    3029# TODO: Update help with batch capabilities 
    31 # TODO: Easy way to scroll through results - no tabs in window(?) - 'spreadsheet' 
    3230# TODO: Method to export results in some meaningful way 
    33 #class InversionWindow(QtWidgets.QTabWidget, Ui_PrInversion): 
    3431class InversionWindow(QtWidgets.QDialog, Ui_PrInversion): 
    3532    """ 
     
    5552 
    5653        self.logic = InversionLogic() 
     54 
     55        # Reference to Dmax window 
     56        self.dmaxWindow = None 
    5757 
    5858        # The window should not close 
     
    8484        self._models = {} 
    8585 
     86        self.calculateAllButton.setEnabled(False) 
     87        self.calculateThisButton.setEnabled(False) 
     88 
    8689        # plots for current data 
    8790        self.pr_plot = None 
     
    9396        self.model = QtGui.QStandardItemModel(self) 
    9497        self.mapper = QtWidgets.QDataWidgetMapper(self) 
     98 
     99        # Add validators 
     100        self.setupValidators() 
    95101        # Link user interactions with methods 
    96102        self.setupLinks() 
     
    150156 
    151157        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())))) 
    154159        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()))) 
    157161        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()))) 
    160163        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()))) 
    163165        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()))) 
    166167        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()))) 
    169169        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()))) 
    172171 
    173172        self.model.itemChanged.connect(self.model_changed) 
     
    197196 
    198197        # 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) 
    203200        self.mapper.addMapping(self.explorerButton, WIDGETS.W_EXPLORE) 
    204201        self.mapper.addMapping(self.maxDistanceInput, WIDGETS.W_MAX_DIST) 
    205202        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) 
    208204 
    209205        # Output 
     
    215211        self.mapper.addMapping(self.oscillationValue, WIDGETS.W_OSCILLATION) 
    216212        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) 
    219214 
    220215        # Main Buttons 
    221216        self.mapper.addMapping(self.removeButton, WIDGETS.W_REMOVE) 
    222217        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) 
    225219        self.mapper.addMapping(self.helpButton, WIDGETS.W_HELP) 
    226220 
     
    268262    def setupWindow(self): 
    269263        """Initialize base window state on init""" 
    270         #self.setTabPosition(0) 
    271264        self.enableButtons() 
    272265        self.estimateBgd.setChecked(True) 
    273266 
     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 
    274277    ###################################################################### 
    275278    # Methods for updating GUI 
     
    279282        Enable buttons when data is present, else disable them 
    280283        """ 
     284        self.calculateAllButton.setEnabled(self.logic.data_is_loaded) 
     285        self.calculateThisButton.setEnabled(self.logic.data_is_loaded) 
    281286        self.removeButton.setEnabled(self.logic.data_is_loaded) 
    282287        self.explorerButton.setEnabled(self.logic.data_is_loaded) 
     
    311316        self.pr_plot_list.pop(self._data) 
    312317        self.data_plot_list.pop(self._data) 
     318        if self.dmaxWindow is not None: 
     319            self.dmaxWindow = None 
    313320        self.dataList.removeItem(self.dataList.currentIndex()) 
    314321        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) 
    315330 
    316331    ###################################################################### 
     
    345360            title = self.data_plot.name 
    346361            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 
    347366        self.mapper.toFirst() 
    348367 
     
    374393        Open the Explorer window to see correlations between params and results 
    375394        """ 
    376         # TODO: Link Invertor() and DmaxWindow so window updates when recalculated 
    377395        from .DMaxExplorerWidget import DmaxWindow 
    378396        self.dmaxWindow = DmaxWindow(self._calculator, self.getNFunc(), self) 
     
    395413 
    396414        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 
    397418            # Create initial internal mappings 
    398419            self._data_list[data] = self._calculator.clone() 
     
    439460    ###################################################################### 
    440461    # Thread Creators 
    441  
    442     # TODO: Move to individual class(?) 
    443  
    444462    def startThreadAll(self): 
    445463        for data_ref, pr in list(self._data_list.items()): 
     
    531549        alpha, message, elapsed = output_tuple 
    532550        # 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))) 
    534552        self.regConstantSuggestionButton.setText("{:-3.2g}".format(alpha)) 
    535553        self.regConstantSuggestionButton.setEnabled(True) 
     
    582600 
    583601        # 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)))) 
    588604        self.model.setItem(WIDGETS.W_BACKGROUND_INPUT, 
    589605                           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)))) 
    595611        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)))) 
    597613 
    598614        # Save Pr invertor 
Note: See TracChangeset for help on using the changeset viewer.