- Timestamp:
- Oct 17, 2018 7:27:04 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:
- dd545d1
- Parents:
- 21fa45b
- git-author:
- Piotr Rozyczko <piotr.rozyczko@…> (10/17/18 07:11:28)
- git-committer:
- Piotr Rozyczko <piotr.rozyczko@…> (10/17/18 07:27:04)
- Location:
- src/sas/qtgui/Perspectives/Fitting
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
r20f4857 rd2007a8 102 102 103 103 def onParamCopy(self): 104 self.currentTab.on ParameterCopy("")104 self.currentTab.onCopyToClipboard("") 105 105 106 106 def onParamPaste(self): … … 108 108 109 109 def onExcelCopy(self): 110 self.currentTab.on ParameterCopy("Excel")110 self.currentTab.onCopyToClipboard("Excel") 111 111 112 112 def onLatexCopy(self): 113 self.currentTab.on ParameterCopy("Latex")113 self.currentTab.onCopyToClipboard("Latex") 114 114 115 115 def closeEvent(self, event): -
src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
r21fa45b rd2007a8 119 119 self.tab_id = tab_id 120 120 121 import sys 122 sys.excepthook = self.info 123 121 124 # Globals 122 125 self.initializeGlobals() … … 163 166 self.label_17.setStyleSheet(new_font) 164 167 self.label_19.setStyleSheet(new_font) 168 169 def info(self, type, value, tb): 170 logger.error("SasView threw exception: " + str(value)) 171 traceback.print_exception(type, value, tb) 165 172 166 173 @property … … 543 550 544 551 # Respond to change in parameters from the UI 545 self._model_model.itemChanged.connect(self.onMainParamsChange) 546 #self.constraintAddedSignal.connect(self.modifyViewOnConstraint) 547 self._poly_model.itemChanged.connect(self.onPolyModelChange) 548 self._magnet_model.itemChanged.connect(self.onMagnetModelChange) 552 self._model_model.dataChanged.connect(self.onMainParamsChange) 553 self._poly_model.dataChanged.connect(self.onPolyModelChange) 554 self._magnet_model.dataChanged.connect(self.onMagnetModelChange) 549 555 self.lstParams.selectionModel().selectionChanged.connect(self.onSelectionChanged) 550 556 … … 1207 1213 self.cbModel.addItems(sorted([model for (model, _) in model_list])) 1208 1214 1209 def onPolyModelChange(self, item):1215 def onPolyModelChange(self, top, bottom): 1210 1216 """ 1211 1217 Callback method for updating the main model and sasmodel 1212 1218 parameters with the GUI values in the polydispersity view 1213 1219 """ 1220 item = self._poly_model.itemFromIndex(top) 1214 1221 model_column = item.column() 1215 1222 model_row = item.row() … … 1278 1285 self._model_model.blockSignals(False) 1279 1286 1280 def onMagnetModelChange(self, item):1287 def onMagnetModelChange(self, top, bottom): 1281 1288 """ 1282 1289 Callback method for updating the sasmodel magnetic parameters with the GUI values 1283 1290 """ 1291 item = self._magnet_model.itemFromIndex(top) 1284 1292 model_column = item.column() 1285 1293 model_row = item.row() … … 1716 1724 # block signals temporarily, so we don't end up 1717 1725 # updating charts with every single model change on the end of fitting 1718 self._model_model. itemChanged.disconnect()1726 self._model_model.dataChanged.disconnect() 1719 1727 self.iterateOverModel(updateFittedValues) 1720 1728 self.iterateOverModel(updatePolyValues) 1721 self._model_model. itemChanged.connect(self.onMainParamsChange)1729 self._model_model.dataChanged.connect(self.onMainParamsChange) 1722 1730 1723 1731 def iterateOverPolyModel(self, func): … … 1771 1779 # block signals temporarily, so we don't end up 1772 1780 # updating charts with every single model change on the end of fitting 1773 self._poly_model. itemChanged.disconnect()1781 self._poly_model.dataChanged.disconnect() 1774 1782 self.iterateOverPolyModel(updateFittedValues) 1775 self._poly_model. itemChanged.connect(self.onPolyModelChange)1783 self._poly_model.dataChanged.connect(self.onPolyModelChange) 1776 1784 1777 1785 if self.has_poly_error_column: … … 1836 1844 # block signals temporarily, so we don't end up 1837 1845 # updating charts with every single model change on the end of fitting 1838 self._magnet_model. itemChanged.disconnect()1846 self._magnet_model.dataChanged.disconnect() 1839 1847 self.iterateOverMagnetModel(updateFittedValues) 1840 self._magnet_model. itemChanged.connect(self.onMagnetModelChange)1848 self._magnet_model.dataChanged.connect(self.onMagnetModelChange) 1841 1849 1842 1850 if self.has_magnet_error_column: … … 2272 2280 return False 2273 2281 2274 def onMainParamsChange(self, item):2282 def onMainParamsChange(self, top, bottom): 2275 2283 """ 2276 2284 Callback method for updating the sasmodel parameters with the GUI values 2277 2285 """ 2286 item = self._model_model.itemFromIndex(top) 2287 2278 2288 model_column = item.column() 2279 2289 … … 2301 2311 else: 2302 2312 parameter_name = str(self._model_model.data(name_index)) 2303 2304 # Update the parameter value - note: this supports +/-inf as well2305 self.kernel_module.params[parameter_name] = value2306 2313 2307 2314 # Update the parameter value - note: this supports +/-inf as well … … 3151 3158 # Update relevant models 3152 3159 self.setPolyModel() 3153 self.setMagneticModel() 3160 if self.canHaveMagnetism(): 3161 self.setMagneticModel() 3154 3162 3155 3163 def onShowSLDProfile(self): … … 3465 3473 #self._copy_parameters_state(self.fixed_param, self.state.fixed_param) 3466 3474 3467 def onParameterCopy(self, format=None): 3475 def onCopyToClipboard(self, format=None): 3476 """ 3477 Copy current fitting parameters into the clipboard 3478 using requested formatting: 3479 plain, excel, latex 3480 """ 3481 param_list = self.getFitParameters() 3482 if format=="": 3483 formatted_output = FittingUtilities.formatParameters(param_list) 3484 elif format == "Excel": 3485 formatted_output = FittingUtilities.formatParametersExcel(param_list[1:]) 3486 elif format == "Latex": 3487 formatted_output = FittingUtilities.formatParametersLatex(param_list[1:]) 3488 else: 3489 raise AttributeError("Bad parameter output format specifier.") 3490 3491 # Dump formatted_output to the clipboard 3492 cb = QtWidgets.QApplication.clipboard() 3493 cb.setText(formatted_output) 3494 3495 def getFitParameters(self, format=None): 3468 3496 """ 3469 3497 Copy current parameters into the clipboard … … 3472 3500 # first - regular params 3473 3501 param_list = [] 3474 3475 3502 param_list.append(['model_name', str(self.cbModel.currentText())]) 3476 3477 try:3478 param_list.append(['structure_factor', str(self.cbStructureFactor.currentText())])3479 except:3480 pass3481 3503 3482 3504 def gatherParams(row): … … 3486 3508 param_name = str(self._model_model.item(row, 0).text()) 3487 3509 3488 if param_name == str(self.cbModel.currentText()): 3489 pass 3490 elif param_name == str(self.cbStructureFactor.currentText()): 3510 # Assure this is a parameter - must contain a checkbox 3511 if not self._model_model.item(row, 0).isCheckable(): 3512 # maybe it is a combobox item (multiplicity) 3513 try: 3514 index = self._model_model.index(row, 1) 3515 widget = self.lstParams.indexWidget(index) 3516 if widget is None: 3517 return 3518 if isinstance(widget, QtWidgets.QComboBox): 3519 # find the index of the combobox 3520 current_index = widget.currentIndex() 3521 param_list.append([param_name, 'None', str(current_index)]) 3522 except Exception as ex: 3523 pass 3524 return 3525 3526 param_checked = str(self._model_model.item(row, 0).checkState() == QtCore.Qt.Checked) 3527 # Value of the parameter. In some cases this is the text of the combobox choice. 3528 param_value = str(self._model_model.item(row, 1).text()) 3529 param_error = None 3530 param_min = None 3531 param_max = None 3532 column_offset = 0 3533 if self.has_error_column: 3534 column_offset = 1 3535 try: 3536 param_min = str(self._model_model.item(row, 2+column_offset).text()) 3537 param_max = str(self._model_model.item(row, 3+column_offset).text()) 3538 except: 3491 3539 pass 3492 3540 else: … … 3501 3549 column_offset = 1 3502 3550 3503 try: 3504 param_min = str(self._model_model.item(row, 2 + column_offset).text()) 3505 param_max = str(self._model_model.item(row, 3 + column_offset).text()) 3506 except: 3507 pass 3508 3509 param_list.append([param_name, param_checked, param_value, param_error, param_min, param_max]) 3551 param_list.append([param_name, param_checked, param_value, param_min, param_max]) 3510 3552 3511 3553 def gatherPolyParams(row): … … 3519 3561 column_offset = 0 3520 3562 if self.has_poly_error_column: 3521 param_error = str(self._poly_model.item(row, 2).text())3522 3563 column_offset = 1 3523 3564 param_min = str(self._poly_model.item(row, 2+column_offset).text()) … … 3526 3567 param_nsigs = str(self._poly_model.item(row, 5+column_offset).text()) 3527 3568 param_fun = str(self._poly_model.item(row, 6+column_offset).text()).rstrip() 3569 index = self._poly_model.index(row, 6+column_offset) 3570 widget = self.lstPoly.indexWidget(index) 3571 if widget is not None and isinstance(widget, QtWidgets.QComboBox): 3572 param_fun = widget.currentText() 3528 3573 # width 3529 3574 name = param_name+".width" 3530 param_list.append([name, param_checked, param_value, param_ error,3531 param_npts, param_nsigs, param_ min, param_max, param_fun])3575 param_list.append([name, param_checked, param_value, param_min, param_max, 3576 param_npts, param_nsigs, param_fun]) 3532 3577 3533 3578 def gatherMagnetParams(row): … … 3541 3586 column_offset = 0 3542 3587 if self.has_magnet_error_column: 3543 param_error = str(self._magnet_model.item(row, 2).text())3544 3588 column_offset = 1 3545 3589 param_min = str(self._magnet_model.item(row, 2+column_offset).text()) 3546 3590 param_max = str(self._magnet_model.item(row, 3+column_offset).text()) 3547 param_list.append([param_name, param_checked, param_value, param_ error, param_min, param_max])3591 param_list.append([param_name, param_checked, param_value, param_min, param_max]) 3548 3592 3549 3593 self.iterateOverModel(gatherParams) … … 3553 3597 self.iterateOverMagnetModel(gatherMagnetParams) 3554 3598 3555 if format=="": 3556 formatted_output = FittingUtilities.formatParameters(param_list) 3557 elif format == "Excel": 3558 formatted_output = FittingUtilities.formatParametersExcel(param_list[2:]) 3559 elif format == "Latex": 3560 formatted_output = FittingUtilities.formatParametersLatex(param_list[2:]) 3561 else: 3562 raise AttributeError("Bad format specifier.") 3563 3564 # Dump formatted_output to the clipboard 3565 cb = QtWidgets.QApplication.clipboard() 3566 cb.setText(formatted_output) 3599 if self.kernel_module.is_multiplicity_model: 3600 param_list.append(['multiplicity', str(self.kernel_module.multiplicity)]) 3601 3602 # option tab 3603 param_list.append(['q_range_min', str(self.q_range_min)]) 3604 param_list.append(['q_range_max', str(self.q_range_max)]) 3605 param_list.append(['q_weighting', str(self.weighting)]) 3606 3607 # resolution 3608 smearing, accuracy, smearing_min, smearing_max = self.smearing_widget.state() 3609 index = self.smearing_widget.cbSmearing.currentIndex() 3610 param_list.append(['smearing', str(index)]) 3611 param_list.append(['smearing_min', str(smearing_min)]) 3612 param_list.append(['smearing_max', str(smearing_max)]) 3613 3614 # checkboxes, if required 3615 has_polydisp = self.chkPolydispersity.isChecked() 3616 has_magnetism = self.chkMagnetism.isChecked() 3617 has_chain = self.chkChainFit.isChecked() 3618 has_2D = self.chk2DView.isChecked() 3619 param_list.append(['polydisperse_params', str(has_polydisp)]) 3620 param_list.append(['magnetic_params', str(has_magnetism)]) 3621 param_list.append(['chainfit_params', str(has_chain)]) 3622 param_list.append(['2D_params', str(has_2D)]) 3623 3624 return param_list 3567 3625 3568 3626 def onParameterPaste(self): … … 3575 3633 3576 3634 context = {} 3577 # put the text into dictionary3578 3635 lines = cb_text.split(':') 3579 3636 if lines[0] != 'sasview_parameter_values': 3580 3637 return False 3581 3638 3582 model = lines[1].split(',') 3583 3584 if model[0] != 'model_name': 3639 # put the text into dictionary 3640 line_dict = {} 3641 for line in lines[1:]: 3642 content = line.split(',') 3643 if len(content) > 1: 3644 line_dict[content[0]] = content[1:] 3645 3646 model = line_dict['model_name'][0] 3647 3648 if 'model_name' not in line_dict.keys(): 3585 3649 return False 3586 3650 3587 StrucFac = lines[2].split(',') 3588 3589 if StrucFac[0] != 'structure_factor': 3590 return False 3591 3592 context['model_name'] = [model[1]] 3593 context['structure_factor'] = [StrucFac[1]] 3594 3595 for line in lines[3:-1]: 3596 if len(line) != 0: 3597 item = line.split(',') 3598 check = item[1] 3599 name = item[0] 3600 value = item[2] 3601 # Transfer the text to content[dictionary] 3602 context[name] = [check, value] 3603 3604 # limits 3605 try: 3606 limit_lo = item[3] 3607 context[name].append(limit_lo) 3608 limit_hi = item[4] 3609 context[name].append(limit_hi) 3610 except: 3611 pass 3612 3613 # Polydisp 3614 if len(item) > 5: 3615 value = item[5] 3616 context[name].append(value) 3617 try: 3618 value = item[6] 3619 context[name].append(value) 3620 value = item[7] 3621 context[name].append(value) 3622 except IndexError: 3623 pass 3624 3625 if str(self.cbModel.currentText()) != str(context['model_name'][0]) or \ 3626 str(self.cbStructureFactor.currentText()) != str(context['structure_factor'][0]): 3651 if 'multiplicity' in line_dict.keys(): 3652 multip = int(line_dict['multiplicity'][0], 0) 3653 # reset the model with multiplicity, so further updates are saved 3654 if self.kernel_module.is_multiplicity_model: 3655 self.kernel_module.multiplicity=multip 3656 self.updateMultiplicityCombo(multip) 3657 3658 if 'polydisperse_params' in line_dict.keys(): 3659 self.chkPolydispersity.setChecked(line_dict['polydisperse_params'][0]=='True') 3660 if 'magnetic_params' in line_dict.keys(): 3661 self.chkMagnetism.setChecked(line_dict['magnetic_params'][0]=='True') 3662 if 'chainfit_params' in line_dict.keys(): 3663 self.chkChainFit.setChecked(line_dict['chainfit_params'][0]=='True') 3664 if '2D_params' in line_dict.keys(): 3665 self.chk2DView.setChecked(line_dict['2D_params'][0]=='True') 3666 3667 # Create the context dictionary for parameters 3668 context['model_name'] = model 3669 for key, value in line_dict.items(): 3670 if len(value) > 2: 3671 context[key] = value 3672 3673 if str(self.cbModel.currentText()) != str(context['model_name']): 3627 3674 msg = QtWidgets.QMessageBox() 3628 3675 msg.setIcon(QtWidgets.QMessageBox.Information) … … 3636 3683 return 3637 3684 3685 if 'smearing' in line_dict.keys(): 3686 try: 3687 index = int(line_dict['smearing'][0]) 3688 self.smearing_widget.cbSmearing.setCurrentIndex(index) 3689 except ValueError: 3690 pass 3691 if 'smearing_min' in line_dict.keys(): 3692 try: 3693 self.smearing_widget.dq_l = float(line_dict['smearing_min'][0]) 3694 except ValueError: 3695 pass 3696 if 'smearing_max' in line_dict.keys(): 3697 try: 3698 self.smearing_widget.dq_r = float(line_dict['smearing_max'][0]) 3699 except ValueError: 3700 pass 3701 3702 if 'q_range_max' in line_dict.keys(): 3703 try: 3704 self.q_range_min = float(line_dict['q_range_min'][0]) 3705 self.q_range_max = float(line_dict['q_range_max'][0]) 3706 except ValueError: 3707 pass 3708 self.options_widget.updateQRange(self.q_range_min, self.q_range_max, self.npts) 3709 3638 3710 self.updateFullModel(context) 3639 3711 self.updateFullPolyModel(context) 3712 self.updateFullMagnetModel(context) 3713 3714 def updateMultiplicityCombo(self, multip): 3715 """ 3716 Find and update the multiplicity combobox 3717 """ 3718 index = self._model_model.index(self._n_shells_row, 1) 3719 widget = self.lstParams.indexWidget(index) 3720 if widget is not None and isinstance(widget, QtWidgets.QComboBox): 3721 widget.setCurrentIndex(widget.findText(str(multip))) 3722 self.current_shell_displayed = multip 3640 3723 3641 3724 def updateFullModel(self, param_dict): … … 3653 3736 if param_name not in list(param_dict.keys()): 3654 3737 return 3738 # Special case of combo box in the cell (multiplicity) 3739 param_line = param_dict[param_name] 3740 if len(param_line) == 1: 3741 # modify the shells value 3742 try: 3743 combo_index = int(param_line[0]) 3744 except ValueError: 3745 # quietly pass 3746 return 3747 index = self._model_model.index(row, 1) 3748 widget = self.lstParams.indexWidget(index) 3749 if widget is not None and isinstance(widget, QtWidgets.QComboBox): 3750 #widget.setCurrentIndex(combo_index) 3751 return 3655 3752 # checkbox state 3656 3753 param_checked = QtCore.Qt.Checked if param_dict[param_name][0] == "True" else QtCore.Qt.Unchecked 3657 3754 self._model_model.item(row, 0).setCheckState(param_checked) 3658 3755 3659 # modify the param value 3660 param_repr = GuiUtils.formatNumber(param_dict[param_name][1], high=True) 3661 self._model_model.item(row, 1).setText(param_repr) 3756 # parameter value can be either just a value or text on the combobox 3757 param_text = param_dict[param_name][1] 3758 index = self._model_model.index(row, 1) 3759 widget = self.lstParams.indexWidget(index) 3760 if widget is not None and isinstance(widget, QtWidgets.QComboBox): 3761 # Find the right index based on text 3762 combo_index = int(param_text, 0) 3763 widget.setCurrentIndex(combo_index) 3764 else: 3765 # modify the param value 3766 param_repr = GuiUtils.formatNumber(param_text, high=True) 3767 self._model_model.item(row, 1).setText(param_repr) 3662 3768 3663 3769 # Potentially the error column … … 3665 3771 if len(param_dict[param_name])>4 and self.has_error_column: 3666 3772 # error values are not editable - no need to update 3667 #error_repr = GuiUtils.formatNumber(param_dict[param_name][2], high=True)3668 #self._model_model.item(row, 2).setText(error_repr)3669 3773 ioffset = 1 3670 3774 # min/max … … 3679 3783 self.setFocus() 3680 3784 3681 # block signals temporarily, so we don't end up3682 # updating charts with every single model change on the end of fitting3683 self._model_model.blockSignals(True)3684 3785 self.iterateOverModel(updateFittedValues) 3685 self._model_model.blockSignals(False)3686 3687 3786 3688 3787 def updateFullPolyModel(self, param_dict): … … 3731 3830 self.setFocus() 3732 3831 3733 # block signals temporarily, so we don't end up3734 # updating charts with every single model change on the end of fitting3735 self._poly_model.blockSignals(True)3736 3832 self.iterateOverPolyModel(updateFittedValues) 3737 self._poly_model.blockSignals(False) 3738 3739 3740 3833 3834 def updateFullMagnetModel(self, param_dict): 3835 """ 3836 Update the magnetism model with new parameters, create the errors column 3837 """ 3838 assert isinstance(param_dict, dict) 3839 if not dict: 3840 return 3841 3842 def updateFittedValues(row): 3843 # Utility function for main model update 3844 # internal so can use closure for param_dict 3845 if row >= self._magnet_model.rowCount(): 3846 return 3847 param_name = str(self._magnet_model.item(row, 0).text()).rsplit()[-1] 3848 if param_name not in list(param_dict.keys()): 3849 return 3850 # checkbox state 3851 param_checked = QtCore.Qt.Checked if param_dict[param_name][0] == "True" else QtCore.Qt.Unchecked 3852 self._magnet_model.item(row,0).setCheckState(param_checked) 3853 3854 # modify the param value 3855 param_repr = GuiUtils.formatNumber(param_dict[param_name][1], high=True) 3856 self._magnet_model.item(row, 1).setText(param_repr) 3857 3858 # Potentially the error column 3859 ioffset = 0 3860 if len(param_dict[param_name])>4 and self.has_magnet_error_column: 3861 ioffset = 1 3862 # min 3863 param_repr = GuiUtils.formatNumber(param_dict[param_name][2+ioffset], high=True) 3864 self._magnet_model.item(row, 2+ioffset).setText(param_repr) 3865 # max 3866 param_repr = GuiUtils.formatNumber(param_dict[param_name][3+ioffset], high=True) 3867 self._magnet_model.item(row, 3+ioffset).setText(param_repr) 3868 3869 self.iterateOverMagnetModel(updateFittedValues) -
src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
ra4b9b7a rd2007a8 1010 1010 1011 1011 # Change another parameter 1012 self.widget._model_model.item(2, 1).setText("3.0") 1012 self.widget._model_model.item(3, 1).setText("3.0") 1013 1013 1014 # Check that the stack is updated 1014 1015 self.assertEqual(len(self.widget.page_stack), 2)
Note: See TracChangeset
for help on using the changeset viewer.