Changeset 180bd54 in sasview for src


Ignore:
Timestamp:
Apr 27, 2017 8:39:35 AM (8 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:
0215e0a
Parents:
98b13f72
Message:

Refactored fitting options tab

Location:
src/sas/qtgui/Perspectives/Fitting
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/Perspectives/Fitting/FittingLogic.py

    r4ff5e35 r180bd54  
    2727        self._data = value 
    2828        self.data_is_loaded = True 
     29 
     30    def isLoadedData(self): 
     31        """ accessor """ 
     32        return self.data_is_loaded 
    2933 
    3034    def createDefault1dData(self, interval, tab_id=0): 
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    r1970780 r180bd54  
    231231        res = (fn - gn) / en 
    232232    except ValueError: 
    233         print "Chi2 calculations: Unmatched lengths %s, %s, %s" % (len(fn), len(gn), len(en)) 
     233        #print "Chi2 calculations: Unmatched lengths %s, %s, %s" % (len(fn), len(gn), len(en)) 
    234234        return None 
    235235 
     
    248248 
    249249    # 1d theory from model_thread is only in the range of index 
    250     if current_data.dy == None or current_data.dy == []: 
     250    if current_data.dy is None or current_data.dy == []: 
    251251        dy = numpy.ones(len(current_data.y)) 
    252252    else: 
    253         if weight == None: 
    254             dy = numpy.ones(len(current_data.y)) 
    255         else: 
    256             dy = weight 
     253        dy = weight if weight is not None else numpy.ones(len(current_data.y)) 
    257254        dy[dy == 0] = 1 
    258255    fn = current_data.y[index][0] 
     
    261258    # build residuals 
    262259    residuals = Data1D() 
    263     try: 
     260    if len(fn) == len(gn): 
    264261        y = (fn - gn)/en 
    265262        residuals.y = -y 
    266     except: 
    267         msg = "ResidualPlot Error: different # of data points in theory" 
    268         print msg 
     263    else: 
    269264        y = (fn - gn[index][0]) / en 
    270265        residuals.y = y 
     266 
     267    #try: 
     268    #    y = (fn - gn)/en 
     269    #    residuals.y = -y 
     270    #except ValueError: 
     271    #    msg = "ResidualPlot Error: different number of data points in theory" 
     272    #    print msg 
     273    #    y = (fn - gn[index][0]) / en 
     274    #    residuals.y = y 
    271275    residuals.x = current_data.x[index][0] 
    272276    residuals.dy = numpy.ones(len(residuals.y)) 
     
    296300    fn = current_data.data 
    297301    gn = reference_data.data 
    298     if weight == None: 
    299         en = current_data.err_data 
    300     else: 
    301         en = weight 
     302    en = current_data.err_data if weight is None else weight 
    302303    residuals.data = (fn - gn) / en 
    303304    residuals.qx_data = current_data.qx_data 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    • Property mode changed from 100755 to 100644
    r98b13f72 r180bd54  
    22import json 
    33import os 
    4 import numpy 
     4import numpy as np 
    55from collections import defaultdict 
    66from itertools import izip 
     
    3131from sas.qtgui.Perspectives.Fitting import FittingUtilities 
    3232from SmearingWidget import SmearingWidget 
     33from OptionsWidget import OptionsWidget 
    3334 
    3435TAB_MAGNETISM = 4 
     
    3738CATEGORY_STRUCTURE = "Structure Factor" 
    3839STRUCTURE_DEFAULT = "None" 
    39 QMIN_DEFAULT = 0.0005 
    40 QMAX_DEFAULT = 0.5 
    41 NPTS_DEFAULT = 50 
    4240 
    4341class FittingWidget(QtGui.QWidget, Ui_FittingWidgetUI): 
     
    6967        # Parameters to fit 
    7068        self.parameters_to_fit = None 
    71         # Weight radio box group 
    72         self.weightingGroup = QtGui.QButtonGroup() 
     69        # Fit options 
     70        self.q_range_min = 0.005 
     71        self.q_range_max = 0.1 
     72        self.npts = 25 
     73        self.log_points = False 
     74        self.weighting = 0 
    7375 
    7476        # Which tab is this widget displayed in? 
     
    7880        self.current_shell_displayed = 0 
    7981        self.has_error_column = False 
    80  
    81         # Range parameters 
    82         self.q_range_min = QMIN_DEFAULT 
    83         self.q_range_max = QMAX_DEFAULT 
    84         self.npts = NPTS_DEFAULT 
    8582 
    8683        # Main Data[12]D holder 
     
    9289        self.communicate = self.parent.communicate 
    9390 
     91        # Options widget 
     92        layout = QtGui.QGridLayout() 
     93        self.options_widget = OptionsWidget(self, self.logic) 
     94        layout.addWidget(self.options_widget)  
     95        self.tabOptions.setLayout(layout) 
     96 
    9497        # Smearing widget 
    9598        layout = QtGui.QGridLayout() 
    9699        self.smearing_widget = SmearingWidget(self) 
    97100        layout.addWidget(self.smearing_widget)  
    98         #self.tabFitting.removeTab(2) 
    99         self.tabFitting.insertTab(2, self.smearing_widget, "Resolution") 
     101        self.tabResolution.setLayout(layout) 
    100102 
    101103        # Define bold font for use in various controls 
     
    186188        self.updateQRange() 
    187189        self.cmdFit.setEnabled(True) 
    188         self.boxWeighting.setEnabled(True) 
    189         self.cmdMaskEdit.setEnabled(True) 
    190         # Switch off txtNpts related controls 
    191         self.txtNpts.setEnabled(False) 
    192         self.txtNptsFit.setEnabled(False) 
    193         self.chkLogData.setEnabled(False) 
    194190        # Switch off Data2D control 
    195191        self.chk2DView.setEnabled(False) 
    196192        self.chk2DView.setVisible(False) 
    197193        self.chkMagnetism.setEnabled(True) 
    198  
    199         # Weighting controls 
    200         if self.is2D: 
    201             if self.logic.data.err_data is None or\ 
    202                     numpy.all(err == 1 for err in self.logic.data.err_data) or \ 
    203                     not numpy.any(self.logic.data.err_data): 
    204                 self.rbWeighting2.setEnabled(False) 
    205                 self.rbWeighting1.setChecked(True) 
    206             else: 
    207                 self.rbWeighting2.setEnabled(True) 
    208                 self.rbWeighting2.setChecked(True) 
    209         else: 
    210             if self.logic.data.dy is None or\ 
    211                     numpy.all(self.logic.data.dy == 1) or\ 
    212                     not numpy.any(self.logic.data.dy): 
    213                 self.rbWeighting2.setEnabled(False) 
    214                 self.rbWeighting1.setChecked(True) 
    215             else: 
    216                 self.rbWeighting2.setEnabled(True) 
    217                 self.rbWeighting2.setChecked(True) 
     194        # Similarly on other tabs 
     195        self.options_widget.setEnablementOnDataLoad() 
    218196 
    219197        # Smearing tab 
     
    260238            self.onSelectModel() 
    261239 
    262     def toggleLogData(self, isChecked): 
    263         """ Toggles between log and linear data sets """ 
    264         pass 
    265  
    266240    def initializeControls(self): 
    267241        """ 
     
    270244        self.cmdFit.setEnabled(False) 
    271245        self.cmdPlot.setEnabled(True) 
    272         self.cmdComputePoints.setVisible(False) # probably redundant 
     246        self.options_widget.cmdComputePoints.setVisible(False) # probably redundant 
    273247        self.chkPolydispersity.setEnabled(True) 
    274248        self.chkPolydispersity.setCheckState(False) 
     
    281255        self.tabFitting.setTabEnabled(TAB_MAGNETISM, False) 
    282256        self.lblChi2Value.setText("---") 
    283         # Group boxes 
    284         self.boxWeighting.setEnabled(False) 
    285         self.cmdMaskEdit.setEnabled(False) 
    286         # Button groups 
    287         self.weightingGroup.addButton(self.rbWeighting1) 
    288         self.weightingGroup.addButton(self.rbWeighting2) 
    289         self.weightingGroup.addButton(self.rbWeighting3) 
    290         self.weightingGroup.addButton(self.rbWeighting4) 
    291257        # Smearing tab 
    292258        self.smearing_widget.updateSmearing(self.data) 
     259        # Line edits in the option tab 
     260        self.updateQRange() 
    293261 
    294262    def initializeSignals(self): 
     
    304272        self.chkPolydispersity.toggled.connect(self.togglePoly) 
    305273        self.chkMagnetism.toggled.connect(self.toggleMagnetism) 
    306         self.chkLogData.toggled.connect(self.toggleLogData) 
    307274        # Buttons 
    308275        self.cmdFit.clicked.connect(self.onFit) 
    309276        self.cmdPlot.clicked.connect(self.onPlot) 
    310         self.cmdMaskEdit.clicked.connect(self.onMaskEdit) 
    311         self.cmdReset.clicked.connect(self.onReset) 
    312         # Line edits 
    313         self.txtNpts.editingFinished.connect(self.onNpts) 
    314         self.txtMinRange.editingFinished.connect(self.onMinRange) 
    315         self.txtMaxRange.editingFinished.connect(self.onMaxRange) 
    316         # Button groups 
    317         self.weightingGroup.buttonClicked.connect(self.onWeightingChoice) 
    318277 
    319278        # Respond to change in parameters from the UI 
     
    322281        # TODO after the poly_model prototype accepted 
    323282        #self._magnet_model.itemChanged.connect(self.onMagneticModelChange) 
     283 
     284        # Signals from separate tabs asking for replot 
     285        self.options_widget.plot_signal.connect(self.onOptionsUpdate) 
    324286 
    325287    def onSelectModel(self): 
     
    391353        # Populate the models combobox 
    392354        self.cbModel.addItems(sorted([model for (model, _) in model_list])) 
    393  
    394     def onWeightingChoice(self, button): 
    395         """ 
    396         Update weighting in the fit state 
    397         """ 
    398         button_id = button.group().checkedId() 
    399         button_id = abs(button_id + 2) 
    400         #self.fitPage.weighting = button_id 
    401         print button_id 
    402355 
    403356    def onPolyModelChange(self, item): 
     
    448401        params_to_fit = self.parameters_to_fit 
    449402 
    450         # Potential weights added 
     403        # Potential weights added directly to data 
    451404        self.addWeightingToData(data) 
    452405 
    453406        # Potential smearing added 
     407        # Remember that smearing_min/max can be None -> 
     408        # deal with it until Python gets discriminated unions 
    454409        smearing, accuracy, smearing_min, smearing_max = self.smearing_widget.state() 
    455410 
     
    512467        res = res_list[0] 
    513468        if res.fitness is None or \ 
    514             not numpy.isfinite(res.fitness) or \ 
    515             numpy.any(res.pvec == None) or \ 
    516             not numpy.all(numpy.isfinite(res.pvec)): 
     469            not np.isfinite(res.fitness) or \ 
     470            np.any(res.pvec == None) or \ 
     471            not np.all(np.isfinite(res.pvec)): 
    517472            msg = "Fitting did not converge!!!" 
    518473            self.communicate.statusBarUpdateSignal.emit(msg) 
     
    607562        Plot the current set of data 
    608563        """ 
    609         if self.data is None : 
     564        if not self.data_is_loaded: 
    610565            self.createDefaultDataset() 
    611566        self.calculateQGridForModel() 
    612567 
    613     def onNpts(self): 
    614         """ 
    615         Callback for number of points line edit update 
    616         """ 
    617         # assumes type/value correctness achieved with QValidator 
    618         try: 
    619             self.npts = int(self.txtNpts.text()) 
    620         except ValueError: 
    621             # TODO 
    622             # This will return the old value to model/view and return 
    623             # notifying the user about format available. 
    624             pass 
    625         # Force redisplay 
    626         if self.model_is_loaded: 
    627             self.onPlot() 
    628  
    629     def onMinRange(self): 
    630         """ 
    631         Callback for minimum range of points line edit update 
    632         """ 
    633         # assumes type/value correctness achieved with QValidator 
    634         try: 
    635             self.q_range_min = float(self.txtMinRange.text()) 
    636         except ValueError: 
    637             # TODO 
    638             # This will return the old value to model/view and return 
    639             # notifying the user about format available. 
    640             return 
    641         # set Q range labels on the main tab 
    642         #self.lblMinRangeDef.setText(str(self.q_range_min)) 
    643         if self.model_is_loaded: 
    644             self.onPlot() 
    645  
    646     def onMaxRange(self): 
    647         """ 
    648         Callback for maximum range of points line edit update 
    649         """ 
    650         # assumes type/value correctness achieved with QValidator 
    651         try: 
    652             self.q_range_max = float(self.txtMaxRange.text()) 
    653         except: 
    654             pass 
    655         # set Q range labels on the main tab 
    656         self.lblMaxRangeDef.setText(str(self.q_range_max)) 
    657         if self.model_is_loaded: 
    658             self.onPlot() 
    659  
    660     def onMaskEdit(self): 
    661         """ 
    662         Callback for running the mask editor 
    663         """ 
    664         pass 
    665  
    666     def onReset(self): 
    667         """ 
    668         Callback for resetting qmin/qmax 
    669         """ 
    670         pass 
     568    def onOptionsUpdate(self): 
     569        """ 
     570        Update local option values and replot 
     571        """ 
     572        self.q_range_min, self.q_range_max, self.npts, self.log_points, self.weighting = \ 
     573            self.options_widget.state() 
     574        self.onPlot() 
    671575 
    672576    def setDefaultStructureCombo(self): 
     
    686590        # Create default datasets if no data passed 
    687591        if self.is2D: 
    688             qmax = self.q_range_max/numpy.sqrt(2) 
     592            qmax = self.q_range_max/np.sqrt(2) 
    689593            qstep = self.npts 
    690594            self.logic.createDefault2dData(qmax, qstep, self.tab_id) 
     595            return 
     596        elif self.log_points: 
     597            qmin = -10.0 if self.q_range_min < 1.e-10 else np.log10(self.q_range_min) 
     598            qmax =  10.0 if self.q_range_max > 1.e10 else np.log10(self.q_range_max) 
     599            interval = np.logspace(start=qmin, stop=qmax, num=self.npts, endpoint=True, base=10.0) 
    691600        else: 
    692             interval = numpy.linspace(start=self.q_range_min, stop=self.q_range_max, 
    693                         num=self.npts, endpoint=True) 
    694             self.logic.createDefault1dData(interval, self.tab_id) 
     601            interval = np.linspace(start=self.q_range_min, stop=self.q_range_max, 
     602                    num=self.npts, endpoint=True) 
     603        self.logic.createDefault1dData(interval, self.tab_id) 
    695604 
    696605    def readCategoryInfo(self): 
     
    745654        """ 
    746655        Adds weighting contribution to fitting data 
    747         """ 
    748         # Check the state of the Weighting radio buttons 
    749         button_id = self.weightingGroup.checkedId() 
    750         # Cast the id to a valid index 
    751         button_id = abs(button_id + 2) 
    752         if button_id == 0: 
    753             # No weight added 
    754             return 
     656        #""" 
    755657        # Send original data for weighting 
    756         weight = get_weight(data=data, is2d=self.is2D, flag=button_id) 
    757         if self.is2D: 
    758             data.err_data = weight 
    759         else: 
    760             data.dy = weight 
     658        weight = get_weight(data=data, is2d=self.is2D, flag=self.weighting) 
     659        update_module = data.err_data if self.is2D else data.dy 
     660        update_module = weight 
    761661 
    762662    def updateQRange(self): 
     
    770670        self.lblMaxRangeDef.setText(str(self.q_range_max)) 
    771671        # set Q range labels on the options tab 
    772         self.txtMaxRange.setText(str(self.q_range_max)) 
    773         self.txtMinRange.setText(str(self.q_range_min)) 
    774         self.txtNpts.setText(str(self.npts)) 
    775         self.txtNptsFit.setText(str(self.npts)) 
     672        self.options_widget.updateQRange(self.q_range_min, self.q_range_max, self.npts) 
    776673 
    777674    def SASModelToQModel(self, model_name, structure_factor=None): 
     
    959856        Prepare the fitting data object, based on current ModelModel 
    960857        """ 
     858        if self.kernel_module is None: 
     859            return 
    961860        # Awful API to a backend method. 
    962861        method = self.methodCalculateForData()(data=self.data, 
  • src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py

    • Property mode changed from 100755 to 100644
    r98b13f72 r180bd54  
    4242 
    4343        # Have we loaded data yet? If so, what kind 
    44         self.is_data = None 
     44        self.have_data = None 
    4545        # Local model for holding data 
    4646        self.model = None 
     
    9696        elif isinstance(data, Data1D): 
    9797            self.cbSmearing.addItems(SMEARING_1D) 
    98             self.is_data = Data1D 
     98            self.have_data = Data1D 
    9999        else: 
    100100            self.cbSmearing.addItems(SMEARING_2D) 
    101             self.is_data = Data2D 
     101            self.have_data = Data2D 
    102102        self.cbSmearing.setCurrentIndex(0) 
    103103 
     
    120120        Respond to model change by updating 
    121121        """ 
    122         print "MODEL CHANGED for property: %s. The value is now: %s" % \ 
    123             (MODEL[top.row()], str(self.model.item(top.row()).text())) 
     122        #print "MODEL CHANGED for property: %s. The value is now: %s" % \ 
     123        #    (MODEL[top.row()], str(self.model.item(top.row()).text())) 
    124124        pass 
    125125 
     
    140140        Accuracy combobox visibility 
    141141        """ 
    142         if self.is_data == Data2D and self.cbSmearing.currentIndex() == 1: 
     142        if self.have_data == Data2D and self.cbSmearing.currentIndex() == 1: 
    143143            self.cbAccuracy.setVisible(True) 
    144144        else: 
     
    165165        # or model-held values 
    166166        smearing = str(self.model.item(MODEL.index('SMEARING')).text()) 
    167         accuracy = str(self.model.item(MODEL.index('ACCURACY')).text()) 
    168         d_down = float(self.model.item(MODEL.index('PINHOLE_MIN')).text()) 
    169         d_up = float(self.model.item(MODEL.index('PINHOLE_MAX')).text()) 
     167        accuracy = "" 
     168        d_down = None 
     169        d_up = None 
     170        if smearing != "None": 
     171            accuracy = str(self.model.item(MODEL.index('ACCURACY')).text()) 
     172            try: 
     173                d_down = float(self.model.item(MODEL.index('PINHOLE_MIN')).text()) 
     174            except ValueError: 
     175                d_down = None 
     176            try: 
     177                d_up = float(self.model.item(MODEL.index('PINHOLE_MAX')).text()) 
     178            except ValueError: 
     179                d_up = None 
    170180 
    171181        return (smearing, accuracy, d_down, d_up) 
  • src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui

    re1e3e09 r180bd54  
    351351      </layout> 
    352352     </widget> 
    353      <widget class="QWidget" name="QRanges"> 
     353     <widget class="QWidget" name="tabOptions"> 
    354354      <attribute name="title"> 
    355355       <string>Fit Options</string> 
    356356      </attribute> 
    357       <layout class="QGridLayout" name="gridLayout_7"> 
    358        <item row="0" column="0"> 
    359         <widget class="QGroupBox" name="groupBox"> 
    360          <property name="title"> 
    361           <string>Fitting range</string> 
    362          </property> 
    363          <layout class="QGridLayout" name="gridLayout_4"> 
    364           <item row="0" column="0" rowspan="2"> 
    365            <layout class="QGridLayout" name="gridLayout_3"> 
    366             <item row="0" column="0"> 
    367              <widget class="QLabel" name="label_5"> 
    368               <property name="text"> 
    369                <string>Min range</string> 
    370               </property> 
    371              </widget> 
    372             </item> 
    373             <item row="0" column="1"> 
    374              <widget class="QLineEdit" name="txtMinRange"/> 
    375             </item> 
    376             <item row="0" column="2"> 
    377              <widget class="QLabel" name="label_7"> 
    378               <property name="text"> 
    379                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    380 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    381               </property> 
    382              </widget> 
    383             </item> 
    384             <item row="1" column="0"> 
    385              <widget class="QLabel" name="label_6"> 
    386               <property name="text"> 
    387                <string>Max range</string> 
    388               </property> 
    389              </widget> 
    390             </item> 
    391             <item row="1" column="1"> 
    392              <widget class="QLineEdit" name="txtMaxRange"/> 
    393             </item> 
    394             <item row="1" column="2"> 
    395              <widget class="QLabel" name="label_8"> 
    396               <property name="text"> 
    397                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    398 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    399               </property> 
    400              </widget> 
    401             </item> 
    402            </layout> 
    403           </item> 
    404           <item row="0" column="1" rowspan="2"> 
    405            <spacer name="horizontalSpacer_5"> 
    406             <property name="orientation"> 
    407              <enum>Qt::Horizontal</enum> 
    408             </property> 
    409             <property name="sizeHint" stdset="0"> 
    410              <size> 
    411               <width>217</width> 
    412               <height>20</height> 
    413              </size> 
    414             </property> 
    415            </spacer> 
    416           </item> 
    417           <item row="0" column="2"> 
    418            <widget class="QPushButton" name="cmdReset"> 
    419             <property name="text"> 
    420              <string>Reset</string> 
    421             </property> 
    422            </widget> 
    423           </item> 
    424           <item row="1" column="2"> 
    425            <widget class="QPushButton" name="cmdMaskEdit"> 
    426             <property name="text"> 
    427              <string>Mask Editor</string> 
    428             </property> 
    429            </widget> 
    430           </item> 
    431          </layout> 
    432         </widget> 
    433        </item> 
    434        <item row="1" column="0"> 
    435         <widget class="QGroupBox" name="groupBox_2"> 
    436          <property name="title"> 
    437           <string>Data points</string> 
    438          </property> 
    439          <layout class="QGridLayout" name="gridLayout_6"> 
    440           <item row="0" column="0"> 
    441            <layout class="QGridLayout" name="gridLayout_5"> 
    442             <item row="0" column="0"> 
    443              <widget class="QLabel" name="label_10"> 
    444               <property name="text"> 
    445                <string>Npts</string> 
    446               </property> 
    447              </widget> 
    448             </item> 
    449             <item row="0" column="1"> 
    450              <widget class="QLineEdit" name="txtNpts"/> 
    451             </item> 
    452             <item row="0" column="2"> 
    453              <widget class="QCheckBox" name="chkLogData"> 
    454               <property name="text"> 
    455                <string>Log spaced points</string> 
    456               </property> 
    457              </widget> 
    458             </item> 
    459             <item row="1" column="0"> 
    460              <widget class="QLabel" name="label_11"> 
    461               <property name="text"> 
    462                <string>Npts(Fit)</string> 
    463               </property> 
    464              </widget> 
    465             </item> 
    466             <item row="1" column="1"> 
    467              <widget class="QLineEdit" name="txtNptsFit"/> 
    468             </item> 
    469             <item row="2" column="0"> 
    470              <widget class="QLabel" name="label_12"> 
    471               <property name="text"> 
    472                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;χ&lt;span style=&quot; vertical-align:super;&quot;&gt;2&lt;/span&gt;/Npts&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    473               </property> 
    474              </widget> 
    475             </item> 
    476             <item row="2" column="1"> 
    477              <widget class="QLineEdit" name="txtChi2"/> 
    478             </item> 
    479             <item row="2" column="3"> 
    480              <widget class="QPushButton" name="cmdComputePoints"> 
    481               <property name="text"> 
    482                <string>Compute</string> 
    483               </property> 
    484              </widget> 
    485             </item> 
    486             <item row="1" column="2"> 
    487              <spacer name="horizontalSpacer_7"> 
    488               <property name="orientation"> 
    489                <enum>Qt::Horizontal</enum> 
    490               </property> 
    491               <property name="sizeHint" stdset="0"> 
    492                <size> 
    493                 <width>40</width> 
    494                 <height>20</height> 
    495                </size> 
    496               </property> 
    497              </spacer> 
    498             </item> 
    499            </layout> 
    500           </item> 
    501          </layout> 
    502         </widget> 
    503        </item> 
    504        <item row="2" column="0"> 
    505         <widget class="QGroupBox" name="boxWeighting"> 
    506          <property name="title"> 
    507           <string>Weighting</string> 
    508          </property> 
    509          <layout class="QGridLayout" name="gridLayout_12"> 
    510           <item row="0" column="0"> 
    511            <layout class="QVBoxLayout" name="verticalLayout"> 
    512             <item> 
    513              <widget class="QRadioButton" name="rbWeighting1"> 
    514               <property name="text"> 
    515                <string>None</string> 
    516               </property> 
    517               <property name="checked"> 
    518                <bool>true</bool> 
    519               </property> 
    520              </widget> 
    521             </item> 
    522             <item> 
    523              <widget class="QRadioButton" name="rbWeighting2"> 
    524               <property name="text"> 
    525                <string>Use dI Data</string> 
    526               </property> 
    527              </widget> 
    528             </item> 
    529             <item> 
    530              <widget class="QRadioButton" name="rbWeighting3"> 
    531               <property name="text"> 
    532                <string>Use |sqrt(I Data)|</string> 
    533               </property> 
    534              </widget> 
    535             </item> 
    536             <item> 
    537              <widget class="QRadioButton" name="rbWeighting4"> 
    538               <property name="text"> 
    539                <string>Use |I Data|</string> 
    540               </property> 
    541              </widget> 
    542             </item> 
    543            </layout> 
    544           </item> 
    545          </layout> 
    546         </widget> 
    547        </item> 
    548        <item row="3" column="0"> 
    549         <spacer name="verticalSpacer"> 
    550          <property name="orientation"> 
    551           <enum>Qt::Vertical</enum> 
    552          </property> 
    553          <property name="sizeHint" stdset="0"> 
    554           <size> 
    555            <width>20</width> 
    556            <height>347</height> 
    557           </size> 
    558          </property> 
    559         </spacer> 
    560        </item> 
    561       </layout> 
     357     </widget> 
     358     <widget class="QWidget" name="tabResolution"> 
     359      <attribute name="title"> 
     360       <string>Resolution</string> 
     361      </attribute> 
    562362     </widget> 
    563363     <widget class="QWidget" name="tab_4"> 
Note: See TracChangeset for help on using the changeset viewer.