Changeset c416a17 in sasview for src/sas/sasgui/perspectives/fitting
- Timestamp:
- May 26, 2017 7:41:44 AM (8 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:
- c1e380e
- Parents:
- 6964d44 (diff), 7132e49 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/sas/sasgui/perspectives/fitting
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/fitting/basepage.py
r9687d58 rc416a17 2 2 Base Page for fitting 3 3 """ 4 from __future__ import print_function 5 4 6 import sys 5 7 import os 6 8 import wx 7 import numpy 9 import numpy as np 8 10 import time 9 11 import copy … … 34 36 from sas.sasgui.guiframe.documentation_window import DocumentationWindow 35 37 38 logger = logging.getLogger(__name__) 36 39 37 40 (PageInfoEvent, EVT_PAGE_INFO) = wx.lib.newevent.NewEvent() … … 53 56 ON_MAC = True 54 57 58 CUSTOM_MODEL = 'Plugin Models' 59 55 60 class BasicPage(ScrolledPanel, PanelBase): 56 61 """ 57 This class provide general structure of fitpanel page62 This class provide general structure of the fitpanel page 58 63 """ 59 64 # Internal name for the AUI manager … … 98 103 self.graph_id = None 99 104 # Q range for data set 100 self.qmin_data_set = n umpy.inf105 self.qmin_data_set = np.inf 101 106 self.qmax_data_set = None 102 107 self.npts_data_set = 0 … … 118 123 self.dxw = None 119 124 # pinhole smear 120 self.dx_min = None 121 self.dx_max = None 125 self.dx_percent = None 122 126 # smear attrbs 123 127 self.enable_smearer = None … … 277 281 278 282 """ 279 x = n umpy.linspace(start=self.qmin_x, stop=self.qmax_x,283 x = np.linspace(start=self.qmin_x, stop=self.qmax_x, 280 284 num=self.npts_x, endpoint=True) 281 285 self.data = Data1D(x=x) … … 294 298 """ 295 299 if self.qmin_x >= 1.e-10: 296 qmin = n umpy.log10(self.qmin_x)300 qmin = np.log10(self.qmin_x) 297 301 else: 298 302 qmin = -10. 299 303 300 304 if self.qmax_x <= 1.e10: 301 qmax = n umpy.log10(self.qmax_x)305 qmax = np.log10(self.qmax_x) 302 306 else: 303 307 qmax = 10. 304 308 305 x = n umpy.logspace(start=qmin, stop=qmax,309 x = np.logspace(start=qmin, stop=qmax, 306 310 num=self.npts_x, endpoint=True, base=10.0) 307 311 self.data = Data1D(x=x) … … 340 344 qstep = self.npts_x 341 345 342 x = n umpy.linspace(start=xmin, stop=xmax, num=qstep, endpoint=True)343 y = n umpy.linspace(start=ymin, stop=ymax, num=qstep, endpoint=True)346 x = np.linspace(start=xmin, stop=xmax, num=qstep, endpoint=True) 347 y = np.linspace(start=ymin, stop=ymax, num=qstep, endpoint=True) 344 348 # use data info instead 345 new_x = n umpy.tile(x, (len(y), 1))346 new_y = n umpy.tile(y, (len(x), 1))349 new_x = np.tile(x, (len(y), 1)) 350 new_y = np.tile(y, (len(x), 1)) 347 351 new_y = new_y.swapaxes(0, 1) 348 352 # all data reuire now in 1d array 349 353 qx_data = new_x.flatten() 350 354 qy_data = new_y.flatten() 351 q_data = n umpy.sqrt(qx_data * qx_data + qy_data * qy_data)355 q_data = np.sqrt(qx_data * qx_data + qy_data * qy_data) 352 356 # set all True (standing for unmasked) as default 353 mask = n umpy.ones(len(qx_data), dtype=bool)357 mask = np.ones(len(qx_data), dtype=bool) 354 358 # store x and y bin centers in q space 355 359 x_bins = x … … 357 361 358 362 self.data.source = Source() 359 self.data.data = n umpy.ones(len(mask))360 self.data.err_data = n umpy.ones(len(mask))363 self.data.data = np.ones(len(mask)) 364 self.data.err_data = np.ones(len(mask)) 361 365 self.data.qx_data = qx_data 362 366 self.data.qy_data = qy_data … … 655 659 # It seems MAC needs wxCallAfter 656 660 if event.GetId() == GUIFRAME_ID.COPYEX_ID: 657 print "copy excel"661 print("copy excel") 658 662 wx.CallAfter(self.get_copy_excel) 659 663 elif event.GetId() == GUIFRAME_ID.COPYLAT_ID: 660 print "copy latex"664 print("copy latex") 661 665 wx.CallAfter(self.get_copy_latex) 662 666 else: … … 677 681 def _copy_info(self, flag): 678 682 """ 679 Send event d pemding on flag680 681 : Param flag: flag that distinguish event683 Send event depending on flag 684 685 : Param flag: flag that distinguishes the event 682 686 """ 683 687 # messages depending on the flag … … 781 785 except Exception: 782 786 # Skip non-data lines 783 logg ing.error(traceback.format_exc())784 return n umpy.array(angles), numpy.array(weights)787 logger.error(traceback.format_exc()) 788 return np.array(angles), np.array(weights) 785 789 except: 786 790 raise … … 847 851 self.state.pinhole_smearer = \ 848 852 copy.deepcopy(self.pinhole_smearer.GetValue()) 849 self.state.dx_max = copy.deepcopy(self.dx_max) 850 self.state.dx_min = copy.deepcopy(self.dx_min) 853 self.state.dx_percent = copy.deepcopy(self.dx_percent) 851 854 self.state.dxl = copy.deepcopy(self.dxl) 852 855 self.state.dxw = copy.deepcopy(self.dxw) … … 1105 1108 """ 1106 1109 for key, value in self.master_category_dict.iteritems(): 1110 formfactor = state.formfactorcombobox.split(":") 1111 if isinstance(formfactor, list): 1112 formfactor = formfactor[0] 1107 1113 for list_item in value: 1108 if state.formfactorcomboboxin list_item:1114 if formfactor in list_item: 1109 1115 return self.categorybox.Items.index(key) 1110 1116 return 0 … … 1116 1122 :precondition: the page is already drawn or created 1117 1123 1118 :postcondition: the state of the underlying data change as well as the1124 :postcondition: the state of the underlying data changes as well as the 1119 1125 state of the graphic interface 1120 1126 """ … … 1152 1158 self._show_combox_helper() 1153 1159 # select the current model 1154 try: 1155 # to support older version 1156 category_pos = int(state.categorycombobox) 1157 except: 1158 state.formfactorcombobox = state.formfactorcombobox.lower() 1159 state.formfactorcombobox = \ 1160 state.formfactorcombobox.replace('model', '') 1161 state.formfactorcombobox = unicode(state.formfactorcombobox) 1162 state.categorycombobox = unicode(state.categorycombobox) 1163 if state.categorycombobox in self.categorybox.Items: 1164 category_pos = self.categorybox.Items.index( 1165 state.categorycombobox) 1166 else: 1167 # Look in master list for model name (model.lower) 1168 category_pos = self.get_cat_combo_box_pos(state) 1160 state._convert_to_sasmodels() 1161 state.categorycombobox = unicode(state.categorycombobox) 1162 if state.categorycombobox in self.categorybox.Items: 1163 category_pos = self.categorybox.Items.index( 1164 state.categorycombobox) 1165 else: 1166 # Look in master list for model name (model.lower) 1167 category_pos = self.get_cat_combo_box_pos(state) 1169 1168 1170 1169 self.categorybox.Select(category_pos) 1171 1170 self._show_combox(None) 1172 try: 1173 # to support older version 1174 formfactor_pos = int(state.formfactorcombobox) 1175 except: 1176 formfactor_pos = 0 1177 for ind_form in range(self.formfactorbox.GetCount()): 1178 if self.formfactorbox.GetString(ind_form) == \ 1179 (state.formfactorcombobox): 1180 formfactor_pos = int(ind_form) 1171 from models import PLUGIN_NAME_BASE 1172 if self.categorybox.GetValue() == CUSTOM_MODEL \ 1173 and PLUGIN_NAME_BASE not in state.formfactorcombobox: 1174 state.formfactorcombobox = \ 1175 PLUGIN_NAME_BASE + state.formfactorcombobox 1176 formfactor_pos = 0 1177 for ind_form in range(self.formfactorbox.GetCount()): 1178 if self.formfactorbox.GetString(ind_form) == \ 1179 (state.formfactorcombobox): 1180 formfactor_pos = int(ind_form) 1181 break 1182 1183 self.formfactorbox.Select(formfactor_pos) 1184 1185 structfactor_pos = 0 1186 if state.structurecombobox is not None: 1187 state.structurecombobox = unicode(state.structurecombobox) 1188 for ind_struct in range(self.structurebox.GetCount()): 1189 if self.structurebox.GetString(ind_struct) == \ 1190 (state.structurecombobox): 1191 structfactor_pos = int(ind_struct) 1181 1192 break 1182 1183 self.formfactorbox.Select(formfactor_pos)1184 1185 structfactor_pos = 01186 try:1187 # to support older version1188 structfactor_pos = int(state.structurecombobox)1189 except:1190 if state.structurecombobox is not None:1191 state.structurecombobox = unicode(state.structurecombobox)1192 for ind_struct in range(self.structurebox.GetCount()):1193 if self.structurebox.GetString(ind_struct) == \1194 (state.structurecombobox):1195 structfactor_pos = int(ind_struct)1196 break1197 1193 1198 1194 self.structurebox.SetSelection(structfactor_pos) … … 1252 1248 # we have two more options for smearing 1253 1249 if self.pinhole_smearer.GetValue(): 1254 self.dx_min = state.dx_min 1255 self.dx_max = state.dx_max 1256 if self.dx_min is not None: 1257 self.smear_pinhole_min.SetValue(str(self.dx_min)) 1258 if self.dx_max is not None: 1259 self.smear_pinhole_max.SetValue(str(self.dx_max)) 1250 self.dx_percent = state.dx_percent 1251 if self.dx_percent is not None: 1252 if state.dx_old: 1253 self.dx_percent = 100 * (self.dx_percent / self.data.x[0]) 1254 self.smear_pinhole_percent.SetValue("%.2f" % self.dx_percent) 1260 1255 self.onPinholeSmear(event=None) 1261 1256 elif self.slit_smearer.GetValue(): … … 1312 1307 [state.values, state.weights] 1313 1308 except Exception: 1314 logg ing.error(traceback.format_exc())1309 logger.error(traceback.format_exc()) 1315 1310 selection = self._find_polyfunc_selection(disp_model) 1316 1311 for list in self.fittable_param: … … 1329 1324 list[6].Disable() 1330 1325 except Exception: 1331 logg ing.error(traceback.format_exc())1326 logger.error(traceback.format_exc()) 1332 1327 # For array, disable all fixed params 1333 1328 if selection == 1: … … 1338 1333 item[2].Disable() 1339 1334 except Exception: 1340 logg ing.error(traceback.format_exc())1335 logger.error(traceback.format_exc()) 1341 1336 1342 1337 def _selectDlg(self): 1343 1338 """ 1344 open a dialog file to select ed the customized dispersity1339 open a dialog file to select the customized polydispersity function 1345 1340 """ 1346 1341 if self.parent is not None: … … 1384 1379 # self.state.struct_rbutton = self.struct_rbutton.GetValue() 1385 1380 # self.state.plugin_rbutton = self.plugin_rbutton.GetValue() 1386 self.state.structurecombobox = self.structurebox.Get Label()1387 self.state.formfactorcombobox = self.formfactorbox.Get Label()1388 self.state.categorycombobox = self.categorybox.Get Label()1381 self.state.structurecombobox = self.structurebox.GetValue() 1382 self.state.formfactorcombobox = self.formfactorbox.GetValue() 1383 self.state.categorycombobox = self.categorybox.GetValue() 1389 1384 1390 1385 # post state to fit panel … … 1457 1452 self.state_change = True 1458 1453 self._draw_model() 1459 # Time delay has been introduced to prevent _handle error1460 # on Windows1461 # This part of code is executed when model is selected and1462 # it's parameters are changed (with respect to previously1463 # selected model). There are two Iq evaluations occuring one1464 # after another and therefore there may be compilation error1465 # if model is calculated for the first time.1466 # This seems to be Windows only issue - haven't tested on Linux1467 # though.The proper solution (other than time delay) requires1468 # more fundemental code refatoring1469 # Wojtek P. Nov 7, 20161470 if not ON_MAC:1471 time.sleep(0.1)1472 1454 self.Refresh() 1473 1455 1474 # logg ing.info("is_modified flag set to %g",is_modified)1456 # logger.info("is_modified flag set to %g",is_modified) 1475 1457 return is_modified 1476 1458 … … 1576 1558 self.save_current_state() 1577 1559 except Exception: 1578 logg ing.error(traceback.format_exc())1560 logger.error(traceback.format_exc()) 1579 1561 1580 1562 return flag, is_modified … … 1586 1568 if len(statelist) == 0 or len(listtorestore) == 0: 1587 1569 return 1588 if len(statelist) != len(listtorestore):1589 return1590 1570 1591 1571 for j in range(len(listtorestore)): 1592 item_page = listtorestore[j] 1593 item_page_info = statelist[j] 1594 # change the state of the check box for simple parameters 1595 if item_page[0] is not None: 1596 item_page[0].SetValue(item_page_info[0]) 1597 if item_page[2] is not None: 1598 item_page[2].SetValue(item_page_info[2]) 1599 if item_page[2].__class__.__name__ == "ComboBox": 1600 if item_page_info[2] in self.model.fun_list: 1601 fun_val = self.model.fun_list[item_page_info[2]] 1602 self.model.setParam(item_page_info[1], fun_val) 1603 if item_page[3] is not None: 1604 # show or hide text +/- 1605 if item_page_info[2]: 1606 item_page[3].Show(True) 1607 else: 1608 item_page[3].Hide() 1609 if item_page[4] is not None: 1610 # show of hide the text crtl for fitting error 1611 if item_page_info[4][0]: 1612 item_page[4].Show(True) 1613 item_page[4].SetValue(item_page_info[4][1]) 1614 else: 1615 item_page[3].Hide() 1616 if item_page[5] is not None: 1617 # show of hide the text crtl for fitting error 1618 item_page[5].Show(item_page_info[5][0]) 1619 item_page[5].SetValue(item_page_info[5][1]) 1620 1621 if item_page[6] is not None: 1622 # show of hide the text crtl for fitting error 1623 item_page[6].Show(item_page_info[6][0]) 1624 item_page[6].SetValue(item_page_info[6][1]) 1572 for param in statelist: 1573 if param[1] == listtorestore[j][1]: 1574 item_page = listtorestore[j] 1575 item_page_info = param 1576 if (item_page_info[1] == "theta" or item_page_info[1] == 1577 "phi") and not self._is_2D(): 1578 break 1579 # change the state of the check box for simple parameters 1580 if item_page[0] is not None: 1581 item_page[0].SetValue(item_page_info[0]) 1582 if item_page[2] is not None: 1583 item_page[2].SetValue(item_page_info[2]) 1584 if item_page[2].__class__.__name__ == "ComboBox": 1585 if item_page_info[2] in self.model.fun_list: 1586 fun_val = self.model.fun_list[item_page_info[2]] 1587 self.model.setParam(item_page_info[1], fun_val) 1588 if item_page[3] is not None: 1589 # show or hide text +/- 1590 if item_page_info[2]: 1591 item_page[3].Show(True) 1592 else: 1593 item_page[3].Hide() 1594 if item_page[4] is not None: 1595 # show of hide the text crtl for fitting error 1596 if item_page_info[4][0]: 1597 item_page[4].Show(True) 1598 item_page[4].SetValue(str(item_page_info[4][1])) 1599 else: 1600 item_page[3].Hide() 1601 if item_page[5] is not None: 1602 # show of hide the text crtl for fitting error 1603 item_page[5].Show(True) 1604 item_page[5].SetValue(str(item_page_info[5][1])) 1605 if item_page[6] is not None: 1606 # show of hide the text crtl for fitting error 1607 item_page[6].Show(True) 1608 item_page[6].SetValue(str(item_page_info[6][1])) 1609 break 1625 1610 1626 1611 def _reset_strparam_state(self, listtorestore, statelist): … … 1763 1748 def _set_multfactor_combobox(self, multiplicity=10): 1764 1749 """ 1765 Set comboBox for mu itfactor of CoreMultiShellModel1750 Set comboBox for multitfactor of CoreMultiShellModel 1766 1751 :param multiplicit: no. of multi-functionality 1767 1752 """ … … 1801 1786 Fill panel's combo box according to the type of model selected 1802 1787 """ 1803 custom_model = 'Customized Models' 1788 1804 1789 mod_cat = self.categorybox.GetStringSelection() 1805 1790 self.structurebox.SetSelection(0) … … 1810 1795 m_list = [] 1811 1796 try: 1812 if mod_cat == custom_model:1797 if mod_cat == CUSTOM_MODEL: 1813 1798 for model in self.model_list_box[mod_cat]: 1814 1799 m_list.append(self.model_dict[model.name]) … … 2125 2110 for data in self.data_list: 2126 2111 # q value from qx and qy 2127 radius = n umpy.sqrt(data.qx_data * data.qx_data +2112 radius = np.sqrt(data.qx_data * data.qx_data + 2128 2113 data.qy_data * data.qy_data) 2129 2114 # get unmasked index … … 2131 2116 (radius <= float(self.qmax.GetValue())) 2132 2117 index_data = (index_data) & (data.mask) 2133 index_data = (index_data) & (n umpy.isfinite(data.data))2118 index_data = (index_data) & (np.isfinite(data.data)) 2134 2119 2135 2120 if len(index_data[index_data]) < 10: … … 2166 2151 index_data = (float(self.qmin.GetValue()) <= radius) & \ 2167 2152 (radius <= float(self.qmax.GetValue())) 2168 index_data = (index_data) & (n umpy.isfinite(data.y))2153 index_data = (index_data) & (np.isfinite(data.y)) 2169 2154 2170 2155 if len(index_data[index_data]) < 5: … … 2238 2223 2239 2224 # Check that min is less than max 2240 low = -n umpy.inf if min_str == "" else float(min_str)2241 high = n umpy.inf if max_str == "" else float(max_str)2225 low = -np.inf if min_str == "" else float(min_str) 2226 high = np.inf if max_str == "" else float(max_str) 2242 2227 if high < low: 2243 2228 min_ctrl.SetBackgroundColour("pink") … … 2389 2374 self.model.set_dispersion(p, disp_model) 2390 2375 except Exception: 2391 logg ing.error(traceback.format_exc())2376 logger.error(traceback.format_exc()) 2392 2377 2393 2378 # save state into … … 2504 2489 self.Refresh() 2505 2490 except Exception: 2506 logg ing.error(traceback.format_exc())2491 logger.error(traceback.format_exc()) 2507 2492 # Error msg 2508 2493 msg = "Error occurred:" … … 2605 2590 del self.state.model._persistency_dict[name.split('.')[0]] 2606 2591 except Exception: 2607 logg ing.error(traceback.format_exc())2592 logger.error(traceback.format_exc()) 2608 2593 2609 2594 def _lay_out(self): … … 2614 2599 Layout is called after fitting. 2615 2600 """ 2616 self._sleep4sec()2617 2601 self.Layout() 2618 2602 return 2619 2620 def _sleep4sec(self):2621 """2622 sleep for 1 sec only applied on Mac2623 Note: This 1sec helps for Mac not to crash on self.2624 Layout after self._draw_model2625 """2626 if ON_MAC:2627 time.sleep(1)2628 2603 2629 2604 def _find_polyfunc_selection(self, disp_func=None): … … 2659 2634 self.qmin_x = data_min 2660 2635 self.qmax_x = math.sqrt(x * x + y * y) 2661 # self.data.mask = n umpy.ones(len(self.data.data),dtype=bool)2636 # self.data.mask = np.ones(len(self.data.data),dtype=bool) 2662 2637 # check smearing 2663 2638 if not self.disable_smearer.GetValue(): … … 2747 2722 except Exception: 2748 2723 # Not for control panels 2749 logg ing.error(traceback.format_exc())2724 logger.error(traceback.format_exc()) 2750 2725 # Make sure the resduals plot goes to the last 2751 2726 if res_item is not None: … … 3080 3055 disfunc = str(item[7].GetValue()) 3081 3056 except Exception: 3082 logg ing.error(traceback.format_exc())3057 logger.error(traceback.format_exc()) 3083 3058 3084 3059 # 2D … … 3123 3098 disfunc += ' ' + str(weight) 3124 3099 except Exception: 3125 logg ing.error(traceback.format_exc())3100 logger.error(traceback.format_exc()) 3126 3101 content += name + ',' + str(check) + ',' + value + disfunc + ',' + \ 3127 3102 bound_lo + ',' + bound_hi + ':' … … 3371 3346 3372 3347 if value[1] == 'array': 3373 pd_vals = n umpy.array(value[2])3374 pd_weights = n umpy.array(value[3])3348 pd_vals = np.array(value[2]) 3349 pd_weights = np.array(value[3]) 3375 3350 if len(pd_vals) == 0 or len(pd_vals) != len(pd_weights): 3376 3351 msg = ("bad array distribution parameters for %s" … … 3394 3369 3395 3370 except Exception: 3396 logg ing.error(traceback.format_exc())3397 print 3398 sys.exc_info()[1] 3371 logger.error(traceback.format_exc()) 3372 print("Error in BasePage._paste_poly_help: %s" % \ 3373 sys.exc_info()[1]) 3399 3374 3400 3375 def _set_disp_cb(self, isarray, item): … … 3425 3400 Moveit; This method doesn't belong here 3426 3401 """ 3427 print "BasicPage.update_pinhole_smear was called: skipping"3402 print("BasicPage.update_pinhole_smear was called: skipping") 3428 3403 return 3429 3404 … … 3457 3432 fills out the category list box 3458 3433 """ 3459 uncat_str = ' CustomizedModels'3434 uncat_str = 'Plugin Models' 3460 3435 self._read_category_info() 3461 3436 … … 3486 3461 self.model_box.Clear() 3487 3462 3488 if category == ' CustomizedModels':3463 if category == 'Plugin Models': 3489 3464 for model in self.model_list_box[category]: 3490 3465 str_m = str(model).split(".")[0] … … 3601 3576 # check model type to show sizer 3602 3577 if self.model is not None: 3603 print "_set_model_sizer_selection: disabled."3578 print("_set_model_sizer_selection: disabled.") 3604 3579 # self._set_model_sizer_selection(self.model) 3605 3580 -
src/sas/sasgui/perspectives/fitting/batchfitpage.py
rdbce805 r7432acb 200 200 # self.state.formfactorcombobox = self.formfactorbox.GetCurrentSelection() 201 201 # 202 # if self.model !=None:202 # if self.model is not None: 203 203 # self._set_copy_flag(True) 204 204 # self._set_paste_flag(True) 205 # if self.data !=None:205 # if self.data is not None: 206 206 # self._set_bookmark_flag(False) 207 207 # self._keep.Enable(False) … … 225 225 # 226 226 # 227 # if event !=None:227 # if event is not None: 228 228 # ## post state to fit panel 229 229 # new_event = PageInfoEvent(page = self) … … 254 254 # is_modified = False 255 255 # 256 # if self.model != None:256 # if self.model is not None: 257 257 # ##Check the values 258 258 # self._check_value_enter( self.fittable_param) … … 291 291 # else: 292 292 # #self.btFit.Enable(True) 293 # if self._is_2D() and self.data !=None:293 # if self._is_2D() and self.data is not None: 294 294 # self.btEditMask.Enable(True) 295 295 # … … 335 335 # self._set_save_flag(False) 336 336 # else: 337 # if self.model !=None:337 # if self.model is not None: 338 338 # self._set_bookmark_flag(False) 339 339 # self._keep.Enable(False) -
src/sas/sasgui/perspectives/fitting/fit_thread.py
rf182f93 rc416a17 1 2 1 import sys 3 2 import time … … 89 88 elapsed=time.time() - self.starttime) 90 89 91 return result[0], time.time()-self.starttime92 93 90 except KeyboardInterrupt, msg: 94 91 # Thread was interrupted, just proceed and re-raise. … … 102 99 if self.handler is not None: 103 100 self.handler.stop(msg=msg) 104 except Exception as ex: 105 #print "EXCEPTION: ", ex 101 except: 106 102 import traceback 107 103 if self.handler is not None: 108 104 self.handler.error(msg=traceback.format_exc()) 109 110 111 -
src/sas/sasgui/perspectives/fitting/fitpage.py
r24fd27a red2276f 6 6 import wx 7 7 import wx.lib.newevent 8 import numpy 8 import numpy as np 9 9 import copy 10 10 import math … … 29 29 _BOX_WIDTH = 76 30 30 _DATA_BOX_WIDTH = 300 31 SMEAR_SIZE_L = 0.0032 31 SMEAR_SIZE_H = 0.00 33 32 CUSTOM_MODEL = 'Plugin Models' 34 33 35 34 class FitPage(BasicPage): … … 164 163 On_select_data 165 164 """ 166 if event is None and self.dataSource.GetCount() > 0: 167 data = self.dataSource.GetClientData(0) 168 self.set_data(data) 169 elif self.dataSource.GetCount() > 0: 170 pos = self.dataSource.GetSelection() 165 if self.dataSource.GetCount() > 0: 166 pos = self.dataSource.GetSelection() if event is not None else 0 171 167 data = self.dataSource.GetClientData(pos) 172 168 self.set_data(data) … … 213 209 "Please enter only the value of interest to customize smearing..." 214 210 smear_message_new_psmear = \ 215 "Please enter both; the dQ will be generated by interpolation..."211 "Please enter a fixed percentage to be applied to all Q values..." 216 212 smear_message_2d_x_title = "<dQp>[1/A]:" 217 213 smear_message_2d_y_title = "<dQs>[1/A]:" 218 smear_message_pinhole_min_title = "dQ_low[1/A]:" 219 smear_message_pinhole_max_title = "dQ_high[1/A]:" 214 smear_message_pinhole_percent_title = "dQ[%]:" 220 215 smear_message_slit_height_title = "Slit height[1/A]:" 221 216 smear_message_slit_width_title = "Slit width[1/A]:" … … 256 251 self.Bind(wx.EVT_RADIOBUTTON, self.onWeighting, 257 252 id=self.dI_idata.GetId()) 258 self.dI_ didata.SetValue(True)253 self.dI_noweight.SetValue(True) 259 254 # add 4 types of weighting to the sizer 260 255 sizer_weighting.Add(self.dI_noweight, 0, wx.LEFT, 10) … … 266 261 sizer_weighting.Add(self.dI_idata) 267 262 sizer_weighting.Add((10, 10)) 268 self.dI_noweight.Enable( False)263 self.dI_noweight.Enable(True) 269 264 self.dI_didata.Enable(False) 270 265 self.dI_sqrdata.Enable(False) … … 310 305 311 306 # textcntrl for custom resolution 312 self.smear_pinhole_max = ModelTextCtrl(self, wx.ID_ANY, 313 size=(_BOX_WIDTH - 25, 20), 314 style=wx.TE_PROCESS_ENTER, 315 text_enter_callback=self.onPinholeSmear) 316 self.smear_pinhole_min = ModelTextCtrl(self, wx.ID_ANY, 317 size=(_BOX_WIDTH - 25, 20), 318 style=wx.TE_PROCESS_ENTER, 319 text_enter_callback=self.onPinholeSmear) 307 self.smear_pinhole_percent = ModelTextCtrl(self, wx.ID_ANY, 308 size=(_BOX_WIDTH - 25, 20), 309 style=wx.TE_PROCESS_ENTER, 310 text_enter_callback= 311 self.onPinholeSmear) 320 312 self.smear_slit_height = ModelTextCtrl(self, wx.ID_ANY, 321 313 size=(_BOX_WIDTH - 25, 20), … … 336 328 337 329 # set default values for smear 338 self.smear_pinhole_max.SetValue(str(self.dx_max)) 339 self.smear_pinhole_min.SetValue(str(self.dx_min)) 330 self.smear_pinhole_percent.SetValue(str(self.dx_percent)) 340 331 self.smear_slit_height.SetValue(str(self.dxl)) 341 332 self.smear_slit_width.SetValue(str(self.dxw)) … … 362 353 self.Bind(wx.EVT_RADIOBUTTON, self.onSlitSmear, 363 354 id=self.slit_smearer.GetId()) 364 self. enable_smearer.SetValue(True)355 self.disable_smearer.SetValue(True) 365 356 366 357 sizer_smearer.Add(self.disable_smearer, 0, wx.LEFT, 10) … … 429 420 self.smear_description_2d_y.SetToolTipString( 430 421 " dQs(perpendicular) in q_phi direction.") 431 self.smear_description_pin_min = wx.StaticText(self, wx.ID_ANY, 432 smear_message_pinhole_min_title, style=wx.ALIGN_LEFT) 433 self.smear_description_pin_max = wx.StaticText(self, wx.ID_ANY, 434 smear_message_pinhole_max_title, style=wx.ALIGN_LEFT) 422 self.smear_description_pin_percent = wx.StaticText(self, wx.ID_ANY, 423 smear_message_pinhole_percent_title, 424 style=wx.ALIGN_LEFT) 435 425 self.smear_description_slit_height = wx.StaticText(self, wx.ID_ANY, 436 426 smear_message_slit_height_title, style=wx.ALIGN_LEFT) … … 456 446 self.sizer_new_smear.Add((15, -1)) 457 447 self.sizer_new_smear.Add(self.smear_description_2d_x, 0, wx.CENTER, 10) 458 self.sizer_new_smear.Add(self.smear_description_pin_min,459 0, wx.CENTER, 10)460 448 self.sizer_new_smear.Add(self.smear_description_slit_height, 461 449 0, wx.CENTER, 10) 462 450 463 self.sizer_new_smear.Add(self.smear_pinhole_min, 0, wx.CENTER, 10)464 451 self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 465 452 self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) … … 467 454 self.sizer_new_smear.Add(self.smear_description_2d_y, 468 455 0, wx.CENTER, 10) 469 self.sizer_new_smear.Add(self.smear_description_pin_ max,456 self.sizer_new_smear.Add(self.smear_description_pin_percent, 470 457 0, wx.CENTER, 10) 471 458 self.sizer_new_smear.Add(self.smear_description_slit_width, 472 459 0, wx.CENTER, 10) 473 460 474 self.sizer_new_smear.Add(self.smear_pinhole_ max, 0, wx.CENTER, 10)461 self.sizer_new_smear.Add(self.smear_pinhole_percent, 0, wx.CENTER, 10) 475 462 self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 476 463 self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) … … 1128 1115 if item.GetValue(): 1129 1116 if button_list.index(item) == 0: 1130 flag = 0 # dy = n umpy.ones_like(dy_data)1117 flag = 0 # dy = np.ones_like(dy_data) 1131 1118 elif button_list.index(item) == 1: 1132 1119 flag = 1 # dy = dy_data 1133 1120 elif button_list.index(item) == 2: 1134 flag = 2 # dy = n umpy.sqrt(numpy.abs(data))1121 flag = 2 # dy = np.sqrt(np.abs(data)) 1135 1122 elif button_list.index(item) == 3: 1136 flag = 3 # dy = n umpy.abs(data)1123 flag = 3 # dy = np.abs(data) 1137 1124 break 1138 1125 return flag … … 1190 1177 self.state.slit_smearer = self.slit_smearer.GetValue() 1191 1178 1192 self.state.structurecombobox = self.structurebox.GetLabel() 1193 self.state.formfactorcombobox = self.formfactorbox.GetLabel() 1179 self.state.structurecombobox = self.structurebox.GetValue() 1180 self.state.formfactorcombobox = self.formfactorbox.GetValue() 1181 self.state.categorycombobox = self.categorybox.GetValue() 1194 1182 self.enable_fit_button() 1195 1183 if self.model is not None: … … 1248 1236 wx.PostEvent(self.parent, new_event) 1249 1237 # update list of plugins if new plugin is available 1250 custom_model = 'Customized Models'1238 custom_model = CUSTOM_MODEL 1251 1239 mod_cat = self.categorybox.GetStringSelection() 1252 1240 if mod_cat == custom_model: … … 1270 1258 if copy_flag: 1271 1259 self.get_paste_params(copy_flag) 1272 1260 wx.CallAfter(self._onDraw, None) 1273 1261 1274 1262 else: … … 1434 1422 key = event.GetKeyCode() 1435 1423 length = len(self.data.x) 1436 indx = (n umpy.abs(self.data.x - x_data)).argmin()1424 indx = (np.abs(self.data.x - x_data)).argmin() 1437 1425 # return array.flat[idx] 1438 1426 if key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP: … … 1489 1477 self.enable2D: 1490 1478 # set mask 1491 radius = n umpy.sqrt(self.data.qx_data * self.data.qx_data +1479 radius = np.sqrt(self.data.qx_data * self.data.qx_data + 1492 1480 self.data.qy_data * self.data.qy_data) 1493 1481 index_data = ((self.qmin_x <= radius) & (radius <= self.qmax_x)) 1494 1482 index_data = (index_data) & (self.data.mask) 1495 index_data = (index_data) & (n umpy.isfinite(self.data.data))1483 index_data = (index_data) & (np.isfinite(self.data.data)) 1496 1484 if len(index_data[index_data]) < 10: 1497 1485 msg = "Cannot Plot :No or too little npts in" … … 1583 1571 if self.dxw is None: 1584 1572 self.dxw = "" 1585 if self.dx_min is None: 1586 self.dx_min = SMEAR_SIZE_L 1587 if self.dx_max is None: 1588 self.dx_max = SMEAR_SIZE_H 1573 if self.dx_percent is None: 1574 self.dx_percent = SMEAR_SIZE_H 1589 1575 1590 1576 def _get_smear_info(self): … … 1612 1598 and data.dqx_data.any() != 0: 1613 1599 self.smear_type = "Pinhole2d" 1614 self.dq_l = format_number(n umpy.average(data.dqx_data))1615 self.dq_r = format_number(n umpy.average(data.dqy_data))1600 self.dq_l = format_number(np.average(data.dqx_data)) 1601 self.dq_r = format_number(np.average(data.dqy_data)) 1616 1602 return 1617 1603 else: 1618 1604 return 1619 1605 # check if it is pinhole smear and get min max if it is. 1620 if data.dx is not None and n umpy.any(data.dx):1606 if data.dx is not None and np.any(data.dx): 1621 1607 self.smear_type = "Pinhole" 1622 1608 self.dq_l = data.dx[0] … … 1626 1612 elif data.dxl is not None or data.dxw is not None: 1627 1613 self.smear_type = "Slit" 1628 if data.dxl is not None and n ot numpy.all(data.dxl, 0):1614 if data.dxl is not None and np.all(data.dxl, 0): 1629 1615 self.dq_l = data.dxl[0] 1630 if data.dxw is not None and n ot numpy.all(data.dxw, 0):1616 if data.dxw is not None and np.all(data.dxw, 0): 1631 1617 self.dq_r = data.dxw[0] 1632 1618 # return self.smear_type,self.dq_l,self.dq_r … … 1648 1634 self.smear_description_2d_y.Show(True) 1649 1635 if self.pinhole_smearer.GetValue(): 1650 self.smear_pinhole_min.Show(True) 1651 self.smear_pinhole_max.Show(True) 1636 self.smear_pinhole_percent.Show(True) 1652 1637 # smear from data 1653 1638 elif self.enable_smearer.GetValue(): … … 1660 1645 self.smear_description_slit_width.Show(True) 1661 1646 elif self.smear_type == 'Pinhole': 1662 self.smear_description_pin_min.Show(True) 1663 self.smear_description_pin_max.Show(True) 1647 self.smear_description_pin_percent.Show(True) 1664 1648 self.smear_description_smear_type.Show(True) 1665 1649 self.smear_description_type.Show(True) … … 1670 1654 if self.smear_type == 'Pinhole': 1671 1655 self.smear_message_new_p.Show(True) 1672 self.smear_description_pin_min.Show(True) 1673 self.smear_description_pin_max.Show(True) 1674 1675 self.smear_pinhole_min.Show(True) 1676 self.smear_pinhole_max.Show(True) 1656 self.smear_description_pin_percent.Show(True) 1657 1658 self.smear_pinhole_percent.Show(True) 1677 1659 # custom slit smear 1678 1660 elif self.slit_smearer.GetValue(): … … 1699 1681 self.smear_data_left.Hide() 1700 1682 self.smear_data_right.Hide() 1701 self.smear_description_pin_min.Hide() 1702 self.smear_pinhole_min.Hide() 1703 self.smear_description_pin_max.Hide() 1704 self.smear_pinhole_max.Hide() 1683 self.smear_description_pin_percent.Hide() 1684 self.smear_pinhole_percent.Hide() 1705 1685 self.smear_description_slit_height.Hide() 1706 1686 self.smear_slit_height.Hide() … … 1828 1808 if not flag: 1829 1809 self.onSmear(None) 1830 1831 def _mac_sleep(self, sec=0.2):1832 """1833 Give sleep to MAC1834 """1835 if self.is_mac:1836 time.sleep(sec)1837 1810 1838 1811 def get_view_mode(self): … … 1933 1906 1934 1907 # more disables for 2D 1908 di_flag = False 1909 dq_flag = False 1935 1910 if self.data.__class__.__name__ == "Data2D" or \ 1936 1911 self.enable2D: … … 1938 1913 self.pinhole_smearer.Enable(True) 1939 1914 self.default_mask = copy.deepcopy(self.data.mask) 1940 if self.data.err_data is None or\ 1941 numpy.all(err == 1 for err in self.data.err_data) or \ 1942 not numpy.any(self.data.err_data): 1943 self.dI_didata.Enable(False) 1944 self.dI_noweight.SetValue(True) 1945 self.weightbt_string = self.dI_noweight.GetLabelText() 1946 else: 1947 self.dI_didata.Enable(True) 1948 self.dI_didata.SetValue(True) 1949 self.weightbt_string = self.dI_didata.GetLabelText() 1915 if self.data.err_data is not None \ 1916 and np.any(self.data.err_data): 1917 di_flag = True 1918 if self.data.dqx_data is not None \ 1919 and np.any(self.data.dqx_data): 1920 dq_flag = True 1950 1921 else: 1951 1922 self.slit_smearer.Enable(True) 1952 1923 self.pinhole_smearer.Enable(True) 1953 1954 if self.data.dy is None or\ 1955 numpy.all(self.data.dy == 1) or\ 1956 not numpy.any(self.data.dy): 1957 self.dI_didata.Enable(False) 1958 self.dI_noweight.SetValue(True) 1959 self.weightbt_string = self.dI_noweight.GetLabelText() 1960 else: 1961 self.dI_didata.Enable(True) 1962 self.dI_didata.SetValue(True) 1963 self.weightbt_string = self.dI_didata.GetLabelText() 1924 if self.data.dy is not None and np.any(self.data.dy): 1925 di_flag = True 1926 if self.data.dx is not None and np.any(self.data.dx): 1927 dq_flag = True 1928 elif self.data.dxl is not None and np.any(self.data.dxl): 1929 dq_flag = True 1930 1931 if dq_flag: 1932 self.enable_smearer.Enable(True) 1933 self.enable_smearer.SetValue(True) 1934 self.disable_smearer.SetValue(False) 1935 else: 1936 self.enable_smearer.Disable() 1937 self.disable_smearer.Enable(True) 1938 self.disable_smearer.SetValue(True) 1939 1940 if di_flag: 1941 self.dI_didata.Enable(True) 1942 self.dI_didata.SetValue(True) 1943 self.weightbt_string = self.dI_didata.GetLabelText() 1944 else: 1945 self.dI_didata.Enable(False) 1946 self.dI_noweight.SetValue(True) 1947 self.weightbt_string = self.dI_noweight.GetLabelText() 1948 1964 1949 # Enable weighting radio buttons 1965 1950 self.dI_noweight.Enable(True) … … 2003 1988 self.EditMask_title.Disable() 2004 1989 1990 self.on_smear_helper() 2005 1991 self.on_set_focus(None) 2006 1992 self.Refresh() … … 2074 2060 if self.data.__class__.__name__ == "Data2D" or \ 2075 2061 self.enable2D: 2076 radius = n umpy.sqrt(self.data.qx_data * self.data.qx_data +2062 radius = np.sqrt(self.data.qx_data * self.data.qx_data + 2077 2063 self.data.qy_data * self.data.qy_data) 2078 2064 index_data = (self.qmin_x <= radius) & (radius <= self.qmax_x) 2079 2065 index_data = (index_data) & (self.data.mask) 2080 index_data = (index_data) & (n umpy.isfinite(self.data.data))2066 index_data = (index_data) & (np.isfinite(self.data.data)) 2081 2067 npts2fit = len(self.data.data[index_data]) 2082 2068 else: … … 2111 2097 # make sure stop button to fit button all the time 2112 2098 self._on_fit_complete() 2113 if out is None or not n umpy.isfinite(chisqr):2099 if out is None or not np.isfinite(chisqr): 2114 2100 raise ValueError, "Fit error occured..." 2115 2101 … … 2122 2108 2123 2109 # Check if chi2 is finite 2124 if chisqr is not None and n umpy.isfinite(chisqr):2110 if chisqr is not None and np.isfinite(chisqr): 2125 2111 # format chi2 2126 2112 chi2 = format_number(chisqr, True) … … 2174 2160 2175 2161 if cov[ind] is not None: 2176 if n umpy.isfinite(float(cov[ind])):2162 if np.isfinite(float(cov[ind])): 2177 2163 val_err = format_number(cov[ind], True) 2178 2164 item[4].SetForegroundColour(wx.BLACK) … … 2195 2181 self.save_current_state() 2196 2182 2197 if not self.is_mac:2198 self.Layout()2199 self.Refresh()2200 self._mac_sleep(0.1)2201 2183 # plot model ( when drawing, do not update chisqr value again) 2202 2184 self._draw_model(update_chisqr=False, source='fit') … … 2238 2220 # event case of radio button 2239 2221 if tcrtl.GetValue(): 2240 self.dx_min = 0.0 2241 self.dx_max = 0.0 2222 self.dx_percent = 0.0 2242 2223 is_new_pinhole = True 2243 2224 else: … … 2276 2257 """ 2277 2258 # get the values 2278 pin_min = self.smear_pinhole_min.GetValue() 2279 pin_max = self.smear_pinhole_max.GetValue() 2280 2281 # Check changes in slit width 2259 pin_percent = self.smear_pinhole_percent.GetValue() 2260 2261 # Check changes in slit heigth 2282 2262 try: 2283 dx_ min = float(pin_min)2263 dx_percent = float(pin_percent) 2284 2264 except: 2285 2265 return True 2286 if self.dx_min != dx_min: 2287 return True 2288 2289 # Check changes in slit heigth 2290 try: 2291 dx_max = float(pin_max) 2292 except: 2293 return True 2294 if self.dx_max != dx_max: 2266 if self.dx_percent != dx_percent: 2295 2267 return True 2296 2268 return False … … 2308 2280 self.smear_type = 'Pinhole2d' 2309 2281 len_data = len(data.data) 2310 data.dqx_data = n umpy.zeros(len_data)2311 data.dqy_data = n umpy.zeros(len_data)2282 data.dqx_data = np.zeros(len_data) 2283 data.dqy_data = np.zeros(len_data) 2312 2284 else: 2313 2285 self.smear_type = 'Pinhole' 2314 2286 len_data = len(data.x) 2315 data.dx = n umpy.zeros(len_data)2287 data.dx = np.zeros(len_data) 2316 2288 data.dxl = None 2317 2289 data.dxw = None 2318 2290 msg = None 2319 2291 2320 get_pin_min = self.smear_pinhole_min 2321 get_pin_max = self.smear_pinhole_max 2322 2323 if not check_float(get_pin_min): 2324 get_pin_min.SetBackgroundColour("pink") 2325 msg = "Model Error:wrong value entered!!!" 2326 elif not check_float(get_pin_max): 2327 get_pin_max.SetBackgroundColour("pink") 2292 get_pin_percent = self.smear_pinhole_percent 2293 2294 if not check_float(get_pin_percent): 2295 get_pin_percent.SetBackgroundColour("pink") 2328 2296 msg = "Model Error:wrong value entered!!!" 2329 2297 else: 2330 2298 if len_data < 2: 2331 2299 len_data = 2 2332 self.dx_min = float(get_pin_min.GetValue()) 2333 self.dx_max = float(get_pin_max.GetValue()) 2334 if self.dx_min < 0: 2335 get_pin_min.SetBackgroundColour("pink") 2300 self.dx_percent = float(get_pin_percent.GetValue()) 2301 if self.dx_percent < 0: 2302 get_pin_percent.SetBackgroundColour("pink") 2336 2303 msg = "Model Error:This value can not be negative!!!" 2337 elif self.dx_max < 0: 2338 get_pin_max.SetBackgroundColour("pink") 2339 msg = "Model Error:This value can not be negative!!!" 2340 elif self.dx_min is not None and self.dx_max is not None: 2304 elif self.dx_percent is not None: 2305 percent = self.dx_percent/100 2341 2306 if self._is_2D(): 2342 data.dqx_data[data.dqx_data == 0] = self.dx_min 2343 data.dqy_data[data.dqy_data == 0] = self.dx_max 2344 elif self.dx_min == self.dx_max: 2345 data.dx[data.dx == 0] = self.dx_min 2307 data.dqx_data[data.dqx_data == 0] = percent * data.qx_data 2308 data.dqy_data[data.dqy_data == 0] = percent * data.qy_data 2346 2309 else: 2347 step = (self.dx_max - self.dx_min) / (len_data - 1) 2348 data.dx = numpy.arange(self.dx_min, 2349 self.dx_max + step / 1.1, 2350 step) 2351 elif self.dx_min is not None: 2352 if self._is_2D(): 2353 data.dqx_data[data.dqx_data == 0] = self.dx_min 2354 else: 2355 data.dx[data.dx == 0] = self.dx_min 2356 elif self.dx_max is not None: 2357 if self._is_2D(): 2358 data.dqy_data[data.dqy_data == 0] = self.dx_max 2359 else: 2360 data.dx[data.dx == 0] = self.dx_max 2310 data.dx = percent * data.x 2361 2311 self.current_smearer = smear_selection(data, self.model) 2362 2312 # 2D need to set accuracy … … 2368 2318 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2369 2319 else: 2370 get_pin_min.SetBackgroundColour("white") 2371 get_pin_max.SetBackgroundColour("white") 2320 get_pin_percent.SetBackgroundColour("white") 2372 2321 # set smearing value whether or not the data contain the smearing info 2373 2322 … … 2509 2458 try: 2510 2459 self.dxl = float(self.smear_slit_height.GetValue()) 2511 data.dxl = self.dxl * n umpy.ones(data_len)2460 data.dxl = self.dxl * np.ones(data_len) 2512 2461 self.smear_slit_height.SetBackgroundColour(wx.WHITE) 2513 2462 except: 2514 2463 self.dxl = None 2515 data.dxl = n umpy.zeros(data_len)2464 data.dxl = np.zeros(data_len) 2516 2465 if self.smear_slit_height.GetValue().lstrip().rstrip() != "": 2517 2466 self.smear_slit_height.SetBackgroundColour("pink") … … 2522 2471 self.dxw = float(self.smear_slit_width.GetValue()) 2523 2472 self.smear_slit_width.SetBackgroundColour(wx.WHITE) 2524 data.dxw = self.dxw * n umpy.ones(data_len)2473 data.dxw = self.dxw * np.ones(data_len) 2525 2474 except: 2526 2475 self.dxw = None 2527 data.dxw = n umpy.zeros(data_len)2476 data.dxw = np.zeros(data_len) 2528 2477 if self.smear_slit_width.GetValue().lstrip().rstrip() != "": 2529 2478 self.smear_slit_width.SetBackgroundColour("pink") … … 2652 2601 if event is None: 2653 2602 output = "-" 2654 elif not n umpy.isfinite(event.output):2603 elif not np.isfinite(event.output): 2655 2604 output = "-" 2656 2605 else: -
src/sas/sasgui/perspectives/fitting/fitting.py
r9687d58 rc416a17 11 11 #copyright 2009, University of Tennessee 12 12 ################################################################################ 13 from __future__ import print_function 14 13 15 import re 14 16 import sys … … 16 18 import wx 17 19 import logging 18 import numpy 20 import numpy as np 19 21 import time 20 22 from copy import deepcopy … … 48 50 49 51 from . import models 52 53 logger = logging.getLogger(__name__) 50 54 51 55 MAX_NBR_DATA = 4 … … 119 123 self.page_finder = {} 120 124 # Log startup 121 logg ing.info("Fitting plug-in started")125 logger.info("Fitting plug-in started") 122 126 self.batch_capable = self.get_batch_capable() 123 127 … … 225 229 226 230 self.id_edit = wx.NewId() 227 editmodel_help = "Edit customized model sample file"228 231 self.menu1.AppendMenu(self.id_edit, "Plugin Model Operations", 229 self.edit_model_menu , editmodel_help)232 self.edit_model_menu) 230 233 #create menubar items 231 234 return [(self.menu1, self.sub_menu)] … … 260 263 self.update_custom_combo() 261 264 if os.path.isfile(p_path): 262 msg = "Sorry! Could not beable to delete the default "263 msg += " custommodel... \n"265 msg = "Sorry! unable to delete the default " 266 msg += "plugin model... \n" 264 267 msg += "Please manually remove the files (.py, .pyc) " 265 268 msg += "in the 'plugin_models' folder \n" … … 274 277 if item.GetLabel() == label: 275 278 self.edit_menu.DeleteItem(item) 276 msg = "The custommodel, %s, has been deleted." % label279 msg = "The plugin model, %s, has been deleted." % label 277 280 evt = StatusEvent(status=msg, type='stop', info='info') 278 281 wx.PostEvent(self.parent, evt) … … 301 304 Make new model 302 305 """ 303 if self.new_model_frame !=None:306 if self.new_model_frame is not None: 304 307 self.new_model_frame.Show(False) 305 308 self.new_model_frame.Show(True) … … 331 334 temp = self.fit_panel.reset_pmodel_list() 332 335 if temp: 333 # Set the new custommodel list for all fit pages336 # Set the new plugin model list for all fit pages 334 337 for uid, page in self.fit_panel.opened_pages.iteritems(): 335 338 if hasattr(page, "formfactorbox"): … … 347 350 page.formfactorbox.SetLabel(current_val) 348 351 except: 349 logg ing.error("update_custom_combo: %s", sys.exc_value)352 logger.error("update_custom_combo: %s", sys.exc_value) 350 353 351 354 def set_edit_menu(self, owner): … … 385 388 help for setting list of the edit model menu labels 386 389 """ 387 if menu ==None:390 if menu is None: 388 391 menu = self.edit_custom_model 389 392 list_fnames = os.listdir(models.find_plugins_dir()) … … 440 443 wx.PostEvent(self.parent, StatusEvent(status=msg)) 441 444 442 if page !=None:445 if page is not None: 443 446 return set_focus_page(page) 444 447 if caption == "Const & Simul Fit": … … 587 590 msg = "Fitting: cannot deal with the theory received" 588 591 evt = StatusEvent(status=msg, info="error") 589 logg ing.error("set_theory " + msg + "\n" + str(sys.exc_value))592 logger.error("set_theory " + msg + "\n" + str(sys.exc_value)) 590 593 wx.PostEvent(self.parent, evt) 591 594 … … 633 636 state = self.temp_state[self.state_index] 634 637 #panel state should have model selection to set_state 635 if state.formfactorcombobox !=None:638 if state.formfactorcombobox is not None: 636 639 #set state 637 640 data = self.parent.create_gui_data(state.data) … … 876 879 enable1D=enable1D, enable2D=enable2D, 877 880 qmin=qmin, qmax=qmax, weight=weight) 878 879 def _mac_sleep(self, sec=0.2):880 """881 Give sleep to MAC882 """883 if ON_MAC:884 time.sleep(sec)885 881 886 882 def draw_model(self, model, page_id, data=None, smearer=None, … … 1022 1018 return False 1023 1019 ## If a thread is already started, stop it 1024 #if self.calc_fit !=None and self.calc_fit.isrunning():1020 #if self.calc_fitis not None and self.calc_fit.isrunning(): 1025 1021 # self.calc_fit.stop() 1026 1022 msg = "Fitting is in progress..." … … 1031 1027 manager=self, 1032 1028 improvement_delta=0.1) 1033 self._mac_sleep(0.2)1034 1029 1035 1030 # batch fit … … 1113 1108 page = self.fit_panel.add_empty_page() 1114 1109 # add data associated to the page created 1115 if page !=None:1110 if page is not None: 1116 1111 evt = StatusEvent(status="Page Created", info="info") 1117 1112 wx.PostEvent(self.parent, evt) … … 1132 1127 page = self.fit_panel.set_data(data) 1133 1128 # page could be None when loading state files 1134 if page ==None:1129 if page is None: 1135 1130 return page 1136 1131 #append Data1D to the panel containing its theory … … 1200 1195 """ 1201 1196 # case that uid is not specified 1202 if uid ==None:1197 if uid is None: 1203 1198 for page_id in self.page_finder.keys(): 1204 1199 self.page_finder[page_id].schedule_tofit(value) … … 1223 1218 for item in param: 1224 1219 ## check if constraint 1225 if item[0] != None and item[1] !=None:1220 if item[0] is not None and item[1] is not None: 1226 1221 listOfConstraint.append((item[0], item[1])) 1227 1222 new_model = model … … 1238 1233 """ 1239 1234 panel = self.plot_panel 1240 if panel ==None:1235 if panel is None: 1241 1236 raise ValueError, "Fitting:_onSelect: NonType panel" 1242 1237 Plugin.on_perspective(self, event=event) … … 1260 1255 """ 1261 1256 """ 1262 print "update_fit result", result1257 print("update_fit result", result) 1263 1258 1264 1259 def _batch_fit_complete(self, result, pars, page_id, … … 1271 1266 :param elapsed: time spent at the fitting level 1272 1267 """ 1273 self._mac_sleep(0.2)1274 1268 uid = page_id[0] 1275 1269 if uid in self.fit_thread_list.keys(): … … 1333 1327 new_theory = copy_data.data 1334 1328 new_theory[res.index] = res.theory 1335 new_theory[res.index == False] = n umpy.nan1329 new_theory[res.index == False] = np.nan 1336 1330 correct_result = True 1337 1331 #get all fittable parameters of the current model … … 1342 1336 param_list.remove(param) 1343 1337 if not correct_result or res.fitness is None or \ 1344 not n umpy.isfinite(res.fitness) or \1345 numpy.any(res.pvec ==None) or not \1346 numpy.all(numpy.isfinite(res.pvec)):1338 not np.isfinite(res.fitness) or \ 1339 np.any(res.pvec is None) or not \ 1340 np.all(np.isfinite(res.pvec)): 1347 1341 data_name = str(None) 1348 1342 if data is not None: … … 1353 1347 msg += "Data %s and Model %s did not fit.\n" % (data_name, 1354 1348 model_name) 1355 ERROR = n umpy.NAN1349 ERROR = np.NAN 1356 1350 cell = BatchCell() 1357 1351 cell.label = res.fitness … … 1367 1361 batch_inputs["error on %s" % str(param)].append(ERROR) 1368 1362 else: 1369 # TODO: Why sometimes res.pvec comes with n umpy.float64?1363 # TODO: Why sometimes res.pvec comes with np.float64? 1370 1364 # probably from scipy lmfit 1371 if res.pvec.__class__ == n umpy.float64:1365 if res.pvec.__class__ == np.float64: 1372 1366 res.pvec = [res.pvec] 1373 1367 … … 1465 1459 cell.value = index 1466 1460 1467 if theory_data !=None:1461 if theory_data is not None: 1468 1462 #Suucessful fit 1469 1463 theory_data.id = wx.NewId() … … 1521 1515 page_id = [] 1522 1516 ## fit more than 1 model at the same time 1523 self._mac_sleep(0.2)1524 1517 try: 1525 1518 index = 0 … … 1534 1527 fit_msg = res.mesg 1535 1528 if res.fitness is None or \ 1536 not n umpy.isfinite(res.fitness) or \1537 numpy.any(res.pvec ==None) or \1538 not n umpy.all(numpy.isfinite(res.pvec)):1529 not np.isfinite(res.fitness) or \ 1530 np.any(res.pvec is None) or \ 1531 not np.all(np.isfinite(res.pvec)): 1539 1532 fit_msg += "\nFitting did not converge!!!" 1540 1533 wx.CallAfter(self._update_fit_button, page_id) 1541 1534 else: 1542 1535 #set the panel when fit result are float not list 1543 if res.pvec.__class__ == n umpy.float64:1536 if res.pvec.__class__ == np.float64: 1544 1537 pvec = [res.pvec] 1545 1538 else: 1546 1539 pvec = res.pvec 1547 if res.stderr.__class__ == n umpy.float64:1540 if res.stderr.__class__ == np.float64: 1548 1541 stderr = [res.stderr] 1549 1542 else: … … 1553 1546 #(CallAfter is important to MAC) 1554 1547 try: 1555 #if res !=None:1548 #if res is not None: 1556 1549 wx.CallAfter(cpage.onsetValues, res.fitness, 1557 1550 res.param_list, … … 1596 1589 """ 1597 1590 event.Skip() 1598 if self.menu1 ==None:1591 if self.menu1 is None: 1599 1592 return 1600 1593 menu_item = self.menu1.FindItemById(self.id_reset_flag) … … 1655 1648 caption = evt.caption 1656 1649 enable_smearer = evt.enable_smearer 1657 if model ==None:1650 if model is None: 1658 1651 return 1659 1652 if uid not in self.page_finder.keys(): … … 1693 1686 if dy is None: 1694 1687 new_plot.is_data = False 1695 new_plot.dy = n umpy.zeros(len(y))1688 new_plot.dy = np.zeros(len(y)) 1696 1689 # If this is a theory curve, pick the proper symbol to make it a curve 1697 1690 new_plot.symbol = GUIFRAME_ID.CURVE_SYMBOL_NUM … … 1707 1700 new_plot.title = data.name 1708 1701 new_plot.group_id = data.group_id 1709 if new_plot.group_id ==None:1702 if new_plot.group_id is None: 1710 1703 new_plot.group_id = data.group_id 1711 1704 new_plot.id = data_id … … 1742 1735 """ 1743 1736 try: 1744 n umpy.nan_to_num(y)1737 np.nan_to_num(y) 1745 1738 new_plot = self.create_theory_1D(x, y, page_id, model, data, state, 1746 1739 data_description=model.name, … … 1756 1749 data_id="Data " + data.name + " unsmeared", 1757 1750 dy=unsmeared_error) 1758 1759 if sq_model is not None and pq_model is not None: 1760 self.create_theory_1D(x, sq_model, page_id, model, data, state, 1761 data_description=model.name + " S(q)", 1762 data_id=str(page_id) + " " + data.name + " S(q)") 1763 self.create_theory_1D(x, pq_model, page_id, model, data, state, 1764 data_description=model.name + " P(q)", 1765 data_id=str(page_id) + " " + data.name + " P(q)") 1766 1751 # Comment this out until we can get P*S models with correctly populated parameters 1752 #if sq_model is not None and pq_model is not None: 1753 # self.create_theory_1D(x, sq_model, page_id, model, data, state, 1754 # data_description=model.name + " S(q)", 1755 # data_id=str(page_id) + " " + data.name + " S(q)") 1756 # self.create_theory_1D(x, pq_model, page_id, model, data, state, 1757 # data_description=model.name + " P(q)", 1758 # data_id=str(page_id) + " " + data.name + " P(q)") 1767 1759 1768 1760 current_pg = self.fit_panel.get_page_by_id(page_id) … … 1808 1800 Handle exception from calculator by posting it as an error. 1809 1801 """ 1810 logg ing.error("".join(traceback.format_exception(etype, value, tb)))1802 logger.error("".join(traceback.format_exception(etype, value, tb))) 1811 1803 msg = traceback.format_exception(etype, value, tb, limit=1) 1812 1804 evt = StatusEvent(status="".join(msg), type="stop", info="error") … … 1827 1819 that can be plot. 1828 1820 """ 1829 n umpy.nan_to_num(image)1821 np.nan_to_num(image) 1830 1822 new_plot = Data2D(image=image, err_image=data.err_data) 1831 1823 new_plot.name = model.name + '2d' … … 1965 1957 ## then kill itself but cannot. Paul Kienzle came up with 1966 1958 ## this fix to prevent threads from stepping on each other 1967 ## which was causing a simple custom model to crash Sasview. 1959 ## which was causing a simple custom plugin model to crash 1960 ##Sasview. 1968 1961 ## We still don't know why the fit sometimes lauched a second 1969 1962 ## thread -- something which should also be investigated. … … 2011 2004 chisqr = None 2012 2005 #to compute chisq make sure data has valid data 2013 # return None if data ==None2014 if not check_data_validity(data_copy) or data_copy ==None:2006 # return None if data is None 2007 if not check_data_validity(data_copy) or data_copy is None: 2015 2008 return chisqr 2016 2009 2017 2010 # Get data: data I, theory I, and data dI in order 2018 2011 if data_copy.__class__.__name__ == "Data2D": 2019 if index ==None:2020 index = n umpy.ones(len(data_copy.data), dtype=bool)2021 if weight !=None:2012 if index is None: 2013 index = np.ones(len(data_copy.data), dtype=bool) 2014 if weight is not None: 2022 2015 data_copy.err_data = weight 2023 2016 # get rid of zero error points 2024 2017 index = index & (data_copy.err_data != 0) 2025 index = index & (n umpy.isfinite(data_copy.data))2018 index = index & (np.isfinite(data_copy.data)) 2026 2019 fn = data_copy.data[index] 2027 2020 theory_data = self.page_finder[page_id].get_theory_data(fid=data_copy.id) 2028 if theory_data ==None:2021 if theory_data is None: 2029 2022 return chisqr 2030 2023 gn = theory_data.data[index] … … 2032 2025 else: 2033 2026 # 1 d theory from model_thread is only in the range of index 2034 if index ==None:2035 index = n umpy.ones(len(data_copy.y), dtype=bool)2036 if weight !=None:2027 if index is None: 2028 index = np.ones(len(data_copy.y), dtype=bool) 2029 if weight is not None: 2037 2030 data_copy.dy = weight 2038 if data_copy.dy ==None or data_copy.dy == []:2039 dy = n umpy.ones(len(data_copy.y))2031 if data_copy.dy is None or data_copy.dy == []: 2032 dy = np.ones(len(data_copy.y)) 2040 2033 else: 2041 2034 ## Set consistently w/AbstractFitengine: … … 2046 2039 2047 2040 theory_data = self.page_finder[page_id].get_theory_data(fid=data_copy.id) 2048 if theory_data ==None:2041 if theory_data is None: 2049 2042 return chisqr 2050 2043 gn = theory_data.y … … 2055 2048 res = (fn - gn) / en 2056 2049 except ValueError: 2057 print "Unmatch lengths %s, %s, %s" % (len(fn), len(gn), len(en))2050 print("Unmatch lengths %s, %s, %s" % (len(fn), len(gn), len(en))) 2058 2051 return 2059 2052 2060 residuals = res[n umpy.isfinite(res)]2053 residuals = res[np.isfinite(res)] 2061 2054 # get chisqr only w/finite 2062 chisqr = n umpy.average(residuals * residuals)2055 chisqr = np.average(residuals * residuals) 2063 2056 2064 2057 self._plot_residuals(page_id=page_id, data=data_copy, … … 2089 2082 theory_data = self.page_finder[page_id].get_theory_data(fid=data_copy.id) 2090 2083 gn = theory_data.data 2091 if weight ==None:2084 if weight is None: 2092 2085 en = data_copy.err_data 2093 2086 else: … … 2097 2090 residuals.qy_data = data_copy.qy_data 2098 2091 residuals.q_data = data_copy.q_data 2099 residuals.err_data = n umpy.ones(len(residuals.data))2092 residuals.err_data = np.ones(len(residuals.data)) 2100 2093 residuals.xmin = min(residuals.qx_data) 2101 2094 residuals.xmax = max(residuals.qx_data) … … 2110 2103 else: 2111 2104 # 1 d theory from model_thread is only in the range of index 2112 if data_copy.dy ==None or data_copy.dy == []:2113 dy = n umpy.ones(len(data_copy.y))2105 if data_copy.dy is None or data_copy.dy == []: 2106 dy = np.ones(len(data_copy.y)) 2114 2107 else: 2115 if weight ==None:2116 dy = n umpy.ones(len(data_copy.y))2108 if weight is None: 2109 dy = np.ones(len(data_copy.y)) 2117 2110 ## Set consitently w/AbstractFitengine: 2118 2111 ## But this should be corrected later. … … 2133 2126 residuals.y = (fn - gn[index]) / en 2134 2127 residuals.x = data_copy.x[index] 2135 residuals.dy = n umpy.ones(len(residuals.y))2128 residuals.dy = np.ones(len(residuals.y)) 2136 2129 residuals.dx = None 2137 2130 residuals.dxl = None … … 2151 2144 ##group_id specify on which panel to plot this data 2152 2145 group_id = self.page_finder[page_id].get_graph_id() 2153 if group_id ==None:2146 if group_id is None: 2154 2147 group_id = data.group_id 2155 2148 new_plot.group_id = "res" + str(group_id) -
src/sas/sasgui/perspectives/fitting/media/plugin.rst
r9687d58 r72100ee 538 538 sin, cos, tan, asin, acos, atan: 539 539 Trigonometry functions and inverses, operating on radians. 540 sinh, cos , tanh, asinh, acosh, atanh:540 sinh, cosh, tanh, asinh, acosh, atanh: 541 541 Hyperbolic trigonometry functions. 542 542 atan2(y,x): -
src/sas/sasgui/perspectives/fitting/model_thread.py
r9687d58 rc416a17 4 4 5 5 import time 6 import numpy 6 import numpy as np 7 7 import math 8 8 from sas.sascalc.data_util.calcthread import CalcThread … … 53 53 self.starttime = time.time() 54 54 # Determine appropriate q range 55 if self.qmin ==None:55 if self.qmin is None: 56 56 self.qmin = 0 57 if self.qmax ==None:58 if self.data !=None:57 if self.qmax is None: 58 if self.data is not None: 59 59 newx = math.pow(max(math.fabs(self.data.xmax), 60 60 math.fabs(self.data.xmin)), 2) … … 68 68 69 69 # Define matrix where data will be plotted 70 radius = n umpy.sqrt((self.data.qx_data * self.data.qx_data) + \70 radius = np.sqrt((self.data.qx_data * self.data.qx_data) + \ 71 71 (self.data.qy_data * self.data.qy_data)) 72 72 … … 75 75 index_model = (self.qmin <= radius) & (radius <= self.qmax) 76 76 index_model = index_model & self.data.mask 77 index_model = index_model & n umpy.isfinite(self.data.data)77 index_model = index_model & np.isfinite(self.data.data) 78 78 79 79 if self.smearer is not None: … … 91 91 self.data.qy_data[index_model] 92 92 ]) 93 output = n umpy.zeros(len(self.data.qx_data))93 output = np.zeros(len(self.data.qx_data)) 94 94 # output default is None 95 95 # This method is to distinguish between masked … … 177 177 """ 178 178 self.starttime = time.time() 179 output = n umpy.zeros((len(self.data.x)))179 output = np.zeros((len(self.data.x))) 180 180 index = (self.qmin <= self.data.x) & (self.data.x <= self.qmax) 181 181 … … 189 189 self.qmax) 190 190 mask = self.data.x[first_bin:last_bin+1] 191 unsmeared_output = n umpy.zeros((len(self.data.x)))191 unsmeared_output = np.zeros((len(self.data.x))) 192 192 unsmeared_output[first_bin:last_bin+1] = self.model.evalDistribution(mask) 193 self.smearer.model = self.model 193 194 output = self.smearer(unsmeared_output, first_bin, last_bin) 194 195 … … 196 197 # Check that the arrays are compatible. If we only have a model but no data, 197 198 # the length of data.y will be zero. 198 if isinstance(self.data.y, n umpy.ndarray) and output.shape == self.data.y.shape:199 unsmeared_data = n umpy.zeros((len(self.data.x)))200 unsmeared_error = n umpy.zeros((len(self.data.x)))199 if isinstance(self.data.y, np.ndarray) and output.shape == self.data.y.shape: 200 unsmeared_data = np.zeros((len(self.data.x))) 201 unsmeared_error = np.zeros((len(self.data.x))) 201 202 unsmeared_data[first_bin:last_bin+1] = self.data.y[first_bin:last_bin+1]\ 202 203 * unsmeared_output[first_bin:last_bin+1]\ … … 222 223 223 224 if p_model is not None and s_model is not None: 224 sq_values = n umpy.zeros((len(self.data.x)))225 pq_values = n umpy.zeros((len(self.data.x)))225 sq_values = np.zeros((len(self.data.x))) 226 pq_values = np.zeros((len(self.data.x))) 226 227 sq_values[index] = s_model.evalDistribution(self.data.x[index]) 227 228 pq_values[index] = p_model.evalDistribution(self.data.x[index]) -
src/sas/sasgui/perspectives/fitting/models.py
r313c5c9 r81b1f4d 2 2 Utilities to manage models 3 3 """ 4 from __future__ import print_function 5 4 6 import traceback 5 7 import os … … 19 21 from sasmodels.sasview_model import load_custom_model, load_standard_models 20 22 23 logger = logging.getLogger(__name__) 24 21 25 22 26 PLUGIN_DIR = 'plugin_models' 23 27 PLUGIN_LOG = os.path.join(os.path.expanduser("~"), '.sasview', PLUGIN_DIR, 24 28 "plugins.log") 29 PLUGIN_NAME_BASE = '[plug-in] ' 25 30 26 31 def get_model_python_path(): … … 138 143 type, value, tb = sys.exc_info() 139 144 if type is not None and issubclass(type, py_compile.PyCompileError): 140 print "Problem with", repr(value)145 print("Problem with", repr(value)) 141 146 raise type, value, tb 142 147 return 1 … … 158 163 159 164 160 def _find Models(dir):165 def _find_models(): 161 166 """ 162 167 Find custom models 163 168 """ 164 169 # List of plugin objects 165 dir = find_plugins_dir()170 directory = find_plugins_dir() 166 171 # Go through files in plug-in directory 167 if not os.path.isdir(dir ):168 msg = "SasView couldn't locate Model plugin folder %r." % dir 169 logg ing.warning(msg)172 if not os.path.isdir(directory): 173 msg = "SasView couldn't locate Model plugin folder %r." % directory 174 logger.warning(msg) 170 175 return {} 171 176 172 plugin_log("looking for models in: %s" % str(dir ))173 # compile_file(dir) #always recompile the folder plugin174 logg ing.info("plugin model dir: %s" % str(dir))177 plugin_log("looking for models in: %s" % str(directory)) 178 # compile_file(directory) #always recompile the folder plugin 179 logger.info("plugin model dir: %s" % str(directory)) 175 180 176 181 plugins = {} 177 for filename in os.listdir(dir ):182 for filename in os.listdir(directory): 178 183 name, ext = os.path.splitext(filename) 179 184 if ext == '.py' and not name == '__init__': 180 path = os.path.abspath(os.path.join(dir , filename))185 path = os.path.abspath(os.path.join(directory, filename)) 181 186 try: 182 187 model = load_custom_model(path) 183 model.name = "[plug-in] "+model.name188 model.name = PLUGIN_NAME_BASE + model.name 184 189 plugins[model.name] = model 185 190 except Exception: … … 187 192 msg += "\nwhile accessing model in %r" % path 188 193 plugin_log(msg) 189 logg ing.warning("Failed to load plugin %r. See %s for details"190 191 194 logger.warning("Failed to load plugin %r. See %s for details" 195 % (path, PLUGIN_LOG)) 196 192 197 return plugins 193 198 … … 259 264 temp = {} 260 265 if self.is_changed(): 261 return _find Models(dir)262 logg ing.info("plugin model : %s" % str(temp))266 return _find_models() 267 logger.info("plugin model : %s" % str(temp)) 263 268 return temp 264 269 … … 324 329 self.plugins.append(plug) 325 330 self.model_dictionary[name] = plug 326 self.model_combobox.set_list(" CustomizedModels", self.plugins)331 self.model_combobox.set_list("Plugin Models", self.plugins) 327 332 return self.model_combobox.get_list() 328 333 else: … … 334 339 """ 335 340 self.plugins = [] 336 new_plugins = _find Models(dir)341 new_plugins = _find_models() 337 342 for name, plug in new_plugins.iteritems(): 338 343 for stored_name, stored_plug in self.stored_plugins.iteritems(): … … 345 350 self.model_dictionary[name] = plug 346 351 347 self.model_combobox.reset_list(" CustomizedModels", self.plugins)352 self.model_combobox.reset_list("Plugin Models", self.plugins) 348 353 return self.model_combobox.get_list() 349 354 … … 388 393 # self.shape_indep_list) 389 394 self.model_combobox.set_list("Structure Factors", self.struct_list) 390 self.model_combobox.set_list(" CustomizedModels", self.plugins)395 self.model_combobox.set_list("Plugin Models", self.plugins) 391 396 self.model_combobox.set_list("P(Q)*S(Q)", self.multiplication_factor) 392 397 self.model_combobox.set_list("multiplication", -
src/sas/sasgui/perspectives/fitting/pagestate.py
rc8e1996 r959eb01 18 18 import copy 19 19 import logging 20 import numpy 20 import numpy as np 21 21 import traceback 22 22 … … 25 25 from lxml import etree 26 26 27 from sasmodels import convert 27 28 import sasmodels.weights 28 29 … … 32 33 from sas.sascalc.dataloader.data_info import Data2D, Collimation, Detector 33 34 from sas.sascalc.dataloader.data_info import Process, Aperture 35 36 logger = logging.getLogger(__name__) 37 34 38 # Information to read/write state as xml 35 39 FITTING_NODE_NAME = 'fitting_plug_in' 36 40 CANSAS_NS = "cansas1d/1.0" 41 42 CUSTOM_MODEL = 'Plugin Models' 43 CUSTOM_MODEL_OLD = 'Customized Models' 37 44 38 45 LIST_OF_DATA_ATTRIBUTES = [["is_data", "is_data", "bool"], … … 69 76 ["dq_l", "dq_l", "float"], 70 77 ["dq_r", "dq_r", "float"], 71 ["dx_max", "dx_max", "float"], 72 ["dx_min", "dx_min", "float"], 78 ["dx_percent", "dx_percent", "float"], 73 79 ["dxl", "dxl", "float"], 74 80 ["dxw", "dxw", "float"]] … … 210 216 self.dq_l = None 211 217 self.dq_r = None 212 self.dx_ max= None213 self.dx_ min = None218 self.dx_percent = None 219 self.dx_old = False 214 220 self.dxl = None 215 221 self.dxw = None … … 271 277 # store value of chisqr 272 278 self.tcChi = None 279 self.version = (1,0,0) 273 280 274 281 def clone(self): … … 337 344 obj.dq_l = copy.deepcopy(self.dq_l) 338 345 obj.dq_r = copy.deepcopy(self.dq_r) 339 obj.dx_ max = copy.deepcopy(self.dx_max)340 obj.dx_ min = copy.deepcopy(self.dx_min)346 obj.dx_percent = copy.deepcopy(self.dx_percent) 347 obj.dx_old = copy.deepcopy(self.dx_old) 341 348 obj.dxl = copy.deepcopy(self.dxl) 342 349 obj.dxw = copy.deepcopy(self.dxw) … … 349 356 obj.cb1 = copy.deepcopy(self.cb1) 350 357 obj.smearer = copy.deepcopy(self.smearer) 358 obj.version = copy.deepcopy(self.version) 351 359 352 360 for name, state in self.saved_states.iteritems(): … … 355 363 obj.saved_states[copy_name] = copy_state 356 364 return obj 365 366 def _old_first_model(self): 367 """ 368 Handle save states from 4.0.1 and before where the first item in the 369 selection boxes of category, formfactor and structurefactor were not 370 saved. 371 :return: None 372 """ 373 if self.categorycombobox == CUSTOM_MODEL_OLD: 374 self.categorycombobox = CUSTOM_MODEL 375 if self.formfactorcombobox == '': 376 FIRST_FORM = { 377 'Shapes' : 'BCCrystalModel', 378 'Uncategorized' : 'LineModel', 379 'StructureFactor' : 'HardsphereStructure', 380 'Ellipsoid' : 'core_shell_ellipsoid', 381 'Lamellae' : 'lamellar', 382 'Paracrystal' : 'bcc_paracrystal', 383 'Parallelepiped' : 'core_shell_parallelepiped', 384 'Shape Independent' : 'be_polyelectrolyte', 385 'Sphere' : 'adsorbed_layer', 386 'Structure Factor' : 'hardsphere', 387 CUSTOM_MODEL : '' 388 } 389 if self.categorycombobox == '': 390 if len(self.parameters) == 3: 391 self.categorycombobox = "Shape-Independent" 392 self.formfactorcombobox = 'PowerLawAbsModel' 393 elif len(self.parameters) == 9: 394 self.categorycombobox = 'Cylinder' 395 self.formfactorcombobox = 'barbell' 396 else: 397 msg = "Save state does not have enough information to load" 398 msg += " the all of the data." 399 logger.warning(msg=msg) 400 else: 401 self.formfactorcombobox = FIRST_FORM[self.categorycombobox] 402 403 @staticmethod 404 def param_remap_to_sasmodels_convert(params, is_string=False): 405 """ 406 Remaps the parameters for sasmodels conversion 407 408 :param params: list of parameters (likely self.parameters) 409 :return: remapped dictionary of parameters 410 """ 411 p = dict() 412 for fittable, name, value, _, uncert, lower, upper, units in params: 413 if not value: 414 value = np.nan 415 if not uncert or uncert[1] == '' or uncert[1] == 'None': 416 uncert[0] = False 417 uncert[1] = np.nan 418 if not upper or upper[1] == '' or upper[1] == 'None': 419 upper[0] = False 420 upper[1] = np.nan 421 if not lower or lower[1] == '' or lower[1] == 'None': 422 lower[0] = False 423 lower[1] = np.nan 424 if is_string: 425 p[name] = str(value) 426 else: 427 p[name] = float(value) 428 p[name + ".fittable"] = bool(fittable) 429 p[name + ".std"] = float(uncert[1]) 430 p[name + ".upper"] = float(upper[1]) 431 p[name + ".lower"] = float(lower[1]) 432 p[name + ".units"] = units 433 return p 434 435 @staticmethod 436 def param_remap_from_sasmodels_convert(params): 437 """ 438 Converts {name : value} map back to [] param list 439 :param params: parameter map returned from sasmodels 440 :return: None 441 """ 442 p_map = [] 443 for name, info in params.iteritems(): 444 if ".fittable" in name or ".std" in name or ".upper" in name or \ 445 ".lower" in name or ".units" in name: 446 pass 447 else: 448 fittable = params.get(name + ".fittable", True) 449 std = params.get(name + ".std", '0.0') 450 upper = params.get(name + ".upper", 'inf') 451 lower = params.get(name + ".lower", '-inf') 452 units = params.get(name + ".units") 453 if std is not None and std is not np.nan: 454 std = [True, str(std)] 455 else: 456 std = [False, ''] 457 if lower is not None and lower is not np.nan: 458 lower = [True, str(lower)] 459 else: 460 lower = [True, '-inf'] 461 if upper is not None and upper is not np.nan: 462 upper = [True, str(upper)] 463 else: 464 upper = [True, 'inf'] 465 param_list = [bool(fittable), str(name), str(info), 466 "+/-", std, lower, upper, str(units)] 467 p_map.append(param_list) 468 return p_map 469 470 def _convert_to_sasmodels(self): 471 """ 472 Convert parameters to a form usable by sasmodels converter 473 474 :return: None 475 """ 476 # Create conversion dictionary to send to sasmodels 477 self._old_first_model() 478 p = self.param_remap_to_sasmodels_convert(self.parameters) 479 structurefactor, params = convert.convert_model(self.structurecombobox, 480 p, False, self.version) 481 formfactor, params = convert.convert_model(self.formfactorcombobox, 482 params, False, self.version) 483 if len(self.str_parameters) > 0: 484 str_pars = self.param_remap_to_sasmodels_convert( 485 self.str_parameters, True) 486 formfactor, str_params = convert.convert_model( 487 self.formfactorcombobox, str_pars, False, self.version) 488 for key, value in str_params.iteritems(): 489 params[key] = value 490 491 if self.formfactorcombobox == 'SphericalSLDModel': 492 self.multi_factor += 1 493 self.formfactorcombobox = formfactor 494 self.structurecombobox = structurefactor 495 self.parameters = [] 496 self.parameters = self.param_remap_from_sasmodels_convert(params) 357 497 358 498 def _repr_helper(self, list, rep): … … 423 563 rep += "dq_l : %s\n" % self.dq_l 424 564 rep += "dq_r : %s\n" % self.dq_r 425 rep += "dx_max : %s\n" % str(self.dx_max) 426 rep += "dx_min : %s\n" % str(self.dx_min) 565 rep += "dx_percent : %s\n" % str(self.dx_percent) 427 566 rep += "dxl : %s\n" % str(self.dxl) 428 567 rep += "dxw : %s\n" % str(self.dxw) … … 483 622 except Exception: 484 623 msg = "Report string expected 'name: value' but got %r" % line 485 logg ing.error(msg)624 logger.error(msg) 486 625 if name.count("State created"): 487 626 repo_time = "" + value … … 525 664 except Exception: 526 665 msg = "While parsing 'data: ...'\n" 527 logg ing.error(msg + traceback.format_exc())666 logger.error(msg + traceback.format_exc()) 528 667 if name == "model name ": 529 668 try: … … 541 680 except Exception: 542 681 msg = "While parsing 'Plotting Range: ...'\n" 543 logg ing.error(msg + traceback.format_exc())682 logger.error(msg + traceback.format_exc()) 544 683 paramval = "" 545 684 for lines in param_string.split(":"): … … 682 821 683 822 attr = newdoc.createAttribute("version") 684 attr.nodeValue = '1.0' 823 from sas import sasview 824 attr.nodeValue = sasview.__version__ 825 # attr.nodeValue = '1.0' 685 826 top_element.setAttributeNode(attr) 686 827 … … 875 1016 raise RuntimeError, msg 876 1017 877 if node.get('version') and node.get('version') == '1.0': 1018 if node.get('version'): 1019 # Get the version for model conversion purposes 1020 self.version = tuple(int(e) for e in 1021 str.split(node.get('version'), ".")) 1022 # The tuple must be at least 3 items long 1023 while len(self.version) < 3: 1024 ver_list = list(self.version) 1025 ver_list.append(0) 1026 self.version = tuple(ver_list) 878 1027 879 1028 # Get file name … … 890 1039 msg = "PageState.fromXML: Could not" 891 1040 msg += " read timestamp\n %s" % sys.exc_value 892 logg ing.error(msg)1041 logger.error(msg) 893 1042 894 1043 if entry is not None: … … 899 1048 setattr(self, item[0], parse_entry_helper(node, item)) 900 1049 1050 dx_old_node = get_content('ns:%s' % 'dx_min', entry) 901 1051 for item in LIST_OF_STATE_ATTRIBUTES: 902 node = get_content('ns:%s' % item[0], entry) 903 setattr(self, item[0], parse_entry_helper(node, item)) 1052 if item[0] == "dx_percent" and dx_old_node is not None: 1053 dxmin = ["dx_min", "dx_min", "float"] 1054 setattr(self, item[0], parse_entry_helper(dx_old_node, 1055 dxmin)) 1056 self.dx_old = True 1057 else: 1058 node = get_content('ns:%s' % item[0], entry) 1059 setattr(self, item[0], parse_entry_helper(node, item)) 904 1060 905 1061 for item in LIST_OF_STATE_PARAMETERS: … … 923 1079 except Exception: 924 1080 base = "unable to load distribution %r for %s" 925 logg ing.error(base % (value, parameter))1081 logger.error(base % (value, parameter)) 926 1082 continue 927 1083 _disp_obj_dict = getattr(self, varname) … … 945 1101 msg = ("Error reading %r from %s %s\n" 946 1102 % (line, tagname, name)) 947 logg ing.error(msg + traceback.format_exc())948 dic[name] = n umpy.array(value_list)1103 logger.error(msg + traceback.format_exc()) 1104 dic[name] = np.array(value_list) 949 1105 setattr(self, varname, dic) 950 1106 … … 1033 1189 if self.cansas: 1034 1190 return self._read_cansas(path) 1035 1036 def _data2d_to_xml_doc(self, datainfo):1037 """1038 Create an XML document to contain the content of a Data2D1039 1040 :param datainfo: Data2D object1041 1042 """1043 if not issubclass(datainfo.__class__, Data2D):1044 raise RuntimeError, "The cansas writer expects a Data2D instance"1045 1046 title = "cansas1d/%s" % self.version1047 title += "http://svn.smallangles.net/svn/canSAS/1dwg/trunk/cansas1d.xsd"1048 doc = xml.dom.minidom.Document()1049 main_node = doc.createElement("SASroot")1050 main_node.setAttribute("version", self.version)1051 main_node.setAttribute("xmlns", "cansas1d/%s" % self.version)1052 main_node.setAttribute("xmlns:xsi",1053 "http://www.w3.org/2001/XMLSchema-instance")1054 main_node.setAttribute("xsi:schemaLocation", title)1055 1056 doc.appendChild(main_node)1057 1058 entry_node = doc.createElement("SASentry")1059 main_node.appendChild(entry_node)1060 1061 write_node(doc, entry_node, "Title", datainfo.title)1062 if datainfo is not None:1063 write_node(doc, entry_node, "data_class",1064 datainfo.__class__.__name__)1065 for item in datainfo.run:1066 runname = {}1067 if item in datainfo.run_name and \1068 len(str(datainfo.run_name[item])) > 1:1069 runname = {'name': datainfo.run_name[item]}1070 write_node(doc, entry_node, "Run", item, runname)1071 # Data info1072 new_node = doc.createElement("SASdata")1073 entry_node.appendChild(new_node)1074 for item in LIST_OF_DATA_2D_ATTR:1075 element = doc.createElement(item[0])1076 element.setAttribute(item[0], str(getattr(datainfo, item[1])))1077 new_node.appendChild(element)1078 1079 for item in LIST_OF_DATA_2D_VALUES:1080 root_node = doc.createElement(item[0])1081 new_node.appendChild(root_node)1082 temp_list = getattr(datainfo, item[1])1083 1084 if temp_list is None or len(temp_list) == 0:1085 element = doc.createElement(item[0])1086 element.appendChild(doc.createTextNode(str(temp_list)))1087 root_node.appendChild(element)1088 else:1089 for value in temp_list:1090 element = doc.createElement(item[0])1091 element.setAttribute(item[0], str(value))1092 root_node.appendChild(element)1093 1094 # Sample info1095 sample = doc.createElement("SASsample")1096 if datainfo.sample.name is not None:1097 sample.setAttribute("name", str(datainfo.sample.name))1098 entry_node.appendChild(sample)1099 write_node(doc, sample, "ID", str(datainfo.sample.ID))1100 write_node(doc, sample, "thickness", datainfo.sample.thickness,1101 {"unit": datainfo.sample.thickness_unit})1102 write_node(doc, sample, "transmission", datainfo.sample.transmission)1103 write_node(doc, sample, "temperature", datainfo.sample.temperature,1104 {"unit": datainfo.sample.temperature_unit})1105 1106 for item in datainfo.sample.details:1107 write_node(doc, sample, "details", item)1108 1109 pos = doc.createElement("position")1110 written = write_node(doc, pos, "x", datainfo.sample.position.x,1111 {"unit": datainfo.sample.position_unit})1112 written = written | write_node(doc, pos, "y",1113 datainfo.sample.position.y,1114 {"unit": datainfo.sample.position_unit})1115 written = written | write_node(doc, pos, "z",1116 datainfo.sample.position.z,1117 {"unit": datainfo.sample.position_unit})1118 if written:1119 sample.appendChild(pos)1120 1121 ori = doc.createElement("orientation")1122 written = write_node(doc, ori, "roll", datainfo.sample.orientation.x,1123 {"unit": datainfo.sample.orientation_unit})1124 written = written | write_node(doc, ori, "pitch",1125 datainfo.sample.orientation.y,1126 {"unit":1127 datainfo.sample.orientation_unit})1128 written = written | write_node(doc, ori, "yaw",1129 datainfo.sample.orientation.z,1130 {"unit":1131 datainfo.sample.orientation_unit})1132 if written:1133 sample.appendChild(ori)1134 1135 # Instrument info1136 instr = doc.createElement("SASinstrument")1137 entry_node.appendChild(instr)1138 1139 write_node(doc, instr, "name", datainfo.instrument)1140 1141 # Source1142 source = doc.createElement("SASsource")1143 if datainfo.source.name is not None:1144 source.setAttribute("name", str(datainfo.source.name))1145 instr.appendChild(source)1146 1147 write_node(doc, source, "radiation", datainfo.source.radiation)1148 write_node(doc, source, "beam_shape", datainfo.source.beam_shape)1149 size = doc.createElement("beam_size")1150 if datainfo.source.beam_size_name is not None:1151 size.setAttribute("name", str(datainfo.source.beam_size_name))1152 written = write_node(doc, size, "x", datainfo.source.beam_size.x,1153 {"unit": datainfo.source.beam_size_unit})1154 written = written | write_node(doc, size, "y",1155 datainfo.source.beam_size.y,1156 {"unit": datainfo.source.beam_size_unit})1157 written = written | write_node(doc, size, "z",1158 datainfo.source.beam_size.z,1159 {"unit": datainfo.source.beam_size_unit})1160 if written:1161 source.appendChild(size)1162 1163 write_node(doc, source, "wavelength", datainfo.source.wavelength,1164 {"unit": datainfo.source.wavelength_unit})1165 write_node(doc, source, "wavelength_min",1166 datainfo.source.wavelength_min,1167 {"unit": datainfo.source.wavelength_min_unit})1168 write_node(doc, source, "wavelength_max",1169 datainfo.source.wavelength_max,1170 {"unit": datainfo.source.wavelength_max_unit})1171 write_node(doc, source, "wavelength_spread",1172 datainfo.source.wavelength_spread,1173 {"unit": datainfo.source.wavelength_spread_unit})1174 1175 # Collimation1176 for item in datainfo.collimation:1177 coll = doc.createElement("SAScollimation")1178 if item.name is not None:1179 coll.setAttribute("name", str(item.name))1180 instr.appendChild(coll)1181 1182 write_node(doc, coll, "length", item.length,1183 {"unit": item.length_unit})1184 1185 for apert in item.aperture:1186 ap = doc.createElement("aperture")1187 if apert.name is not None:1188 ap.setAttribute("name", str(apert.name))1189 if apert.type is not None:1190 ap.setAttribute("type", str(apert.type))1191 coll.appendChild(ap)1192 1193 write_node(doc, ap, "distance", apert.distance,1194 {"unit": apert.distance_unit})1195 1196 size = doc.createElement("size")1197 if apert.size_name is not None:1198 size.setAttribute("name", str(apert.size_name))1199 written = write_node(doc, size, "x", apert.size.x,1200 {"unit": apert.size_unit})1201 written = written | write_node(doc, size, "y", apert.size.y,1202 {"unit": apert.size_unit})1203 written = written | write_node(doc, size, "z", apert.size.z,1204 {"unit": apert.size_unit})1205 if written:1206 ap.appendChild(size)1207 1208 # Detectors1209 for item in datainfo.detector:1210 det = doc.createElement("SASdetector")1211 written = write_node(doc, det, "name", item.name)1212 written = written | write_node(doc, det, "SDD", item.distance,1213 {"unit": item.distance_unit})1214 written = written | write_node(doc, det, "slit_length",1215 item.slit_length,1216 {"unit": item.slit_length_unit})1217 if written:1218 instr.appendChild(det)1219 1220 off = doc.createElement("offset")1221 written = write_node(doc, off, "x", item.offset.x,1222 {"unit": item.offset_unit})1223 written = written | write_node(doc, off, "y", item.offset.y,1224 {"unit": item.offset_unit})1225 written = written | write_node(doc, off, "z", item.offset.z,1226 {"unit": item.offset_unit})1227 if written:1228 det.appendChild(off)1229 1230 center = doc.createElement("beam_center")1231 written = write_node(doc, center, "x", item.beam_center.x,1232 {"unit": item.beam_center_unit})1233 written = written | write_node(doc, center, "y",1234 item.beam_center.y,1235 {"unit": item.beam_center_unit})1236 written = written | write_node(doc, center, "z",1237 item.beam_center.z,1238 {"unit": item.beam_center_unit})1239 if written:1240 det.appendChild(center)1241 1242 pix = doc.createElement("pixel_size")1243 written = write_node(doc, pix, "x", item.pixel_size.x,1244 {"unit": item.pixel_size_unit})1245 written = written | write_node(doc, pix, "y", item.pixel_size.y,1246 {"unit": item.pixel_size_unit})1247 written = written | write_node(doc, pix, "z", item.pixel_size.z,1248 {"unit": item.pixel_size_unit})1249 if written:1250 det.appendChild(pix)1251 1252 ori = doc.createElement("orientation")1253 written = write_node(doc, ori, "roll", item.orientation.x,1254 {"unit": item.orientation_unit})1255 written = written | write_node(doc, ori, "pitch",1256 item.orientation.y,1257 {"unit": item.orientation_unit})1258 written = written | write_node(doc, ori, "yaw", item.orientation.z,1259 {"unit": item.orientation_unit})1260 if written:1261 det.appendChild(ori)1262 1263 # Processes info1264 for item in datainfo.process:1265 node = doc.createElement("SASprocess")1266 entry_node.appendChild(node)1267 1268 write_node(doc, node, "name", item.name)1269 write_node(doc, node, "date", item.date)1270 write_node(doc, node, "description", item.description)1271 for term in item.term:1272 value = term['value']1273 del term['value']1274 write_node(doc, node, "term", value, term)1275 for note in item.notes:1276 write_node(doc, node, "SASprocessnote", note)1277 # Return the document, and the SASentry node associated with1278 # the data we just wrote1279 return doc, entry_node1280 1191 1281 1192 def _parse_state(self, entry): … … 1298 1209 1299 1210 except: 1300 logg ing.info("XML document does not contain fitting information.\n"1211 logger.info("XML document does not contain fitting information.\n" 1301 1212 + traceback.format_exc()) 1302 1213 … … 1354 1265 """ 1355 1266 node = dom.xpath('ns:data_class', namespaces={'ns': CANSAS_NS}) 1356 if not node or node[0].text.lstrip().rstrip() != "Data2D": 1357 return_value, _ = self._parse_entry(dom) 1358 numpy.trim_zeros(return_value.x) 1359 numpy.trim_zeros(return_value.y) 1360 numpy.trim_zeros(return_value.dy) 1361 size_dx = return_value.dx.size 1362 size_dxl = return_value.dxl.size 1363 size_dxw = return_value.dxw.size 1364 if size_dxl == 0 and size_dxw == 0: 1365 return_value.dxl = None 1366 return_value.dxw = None 1367 numpy.trim_zeros(return_value.dx) 1368 elif size_dx == 0: 1369 return_value.dx = None 1370 size_dx = size_dxl 1371 numpy.trim_zeros(return_value.dxl) 1372 numpy.trim_zeros(return_value.dxw) 1373 1374 return return_value, _ 1375 1376 # Parse 2D 1377 data_info = Data2D() 1378 1379 # Look up title 1380 self._store_content('ns:Title', dom, 'title', data_info) 1381 1382 # Look up run number 1383 nodes = dom.xpath('ns:Run', namespaces={'ns': CANSAS_NS}) 1384 for item in nodes: 1385 if item.text is not None: 1386 value = item.text.strip() 1387 if len(value) > 0: 1388 data_info.run.append(value) 1389 if item.get('name') is not None: 1390 data_info.run_name[value] = item.get('name') 1391 1392 # Look up instrument name 1393 self._store_content('ns:SASinstrument/ns:name', dom, 1394 'instrument', data_info) 1395 1396 # Notes 1397 note_list = dom.xpath('ns:SASnote', namespaces={'ns': CANSAS_NS}) 1398 for note in note_list: 1399 try: 1400 if note.text is not None: 1401 note_value = note.text.strip() 1402 if len(note_value) > 0: 1403 data_info.notes.append(note_value) 1404 except Exception: 1405 err_mess = "cansas_reader.read: error processing entry notes\n" 1406 err_mess += " %s" % sys.exc_value 1407 self.errors.append(err_mess) 1408 logging.error(err_mess) 1409 1410 # Sample info ################### 1411 entry = get_content('ns:SASsample', dom) 1412 if entry is not None: 1413 data_info.sample.name = entry.get('name') 1414 1415 self._store_content('ns:SASsample/ns:ID', dom, 'ID', data_info.sample) 1416 self._store_float('ns:SASsample/ns:thickness', dom, 'thickness', 1417 data_info.sample) 1418 self._store_float('ns:SASsample/ns:transmission', dom, 'transmission', 1419 data_info.sample) 1420 self._store_float('ns:SASsample/ns:temperature', dom, 'temperature', 1421 data_info.sample) 1422 1423 nodes = dom.xpath('ns:SASsample/ns:details', 1424 namespaces={'ns': CANSAS_NS}) 1425 for item in nodes: 1426 try: 1427 if item.text is not None: 1428 detail_value = item.text.strip() 1429 if len(detail_value) > 0: 1430 data_info.sample.details.append(detail_value) 1431 except Exception: 1432 err_mess = "cansas_reader.read: error processing entry notes\n" 1433 err_mess += " %s" % sys.exc_value 1434 self.errors.append(err_mess) 1435 logging.error(err_mess) 1436 1437 # Position (as a vector) 1438 self._store_float('ns:SASsample/ns:position/ns:x', dom, 'position.x', 1439 data_info.sample) 1440 self._store_float('ns:SASsample/ns:position/ns:y', dom, 'position.y', 1441 data_info.sample) 1442 self._store_float('ns:SASsample/ns:position/ns:z', dom, 'position.z', 1443 data_info.sample) 1444 1445 # Orientation (as a vector) 1446 self._store_float('ns:SASsample/ns:orientation/ns:roll', 1447 dom, 'orientation.x', data_info.sample) 1448 self._store_float('ns:SASsample/ns:orientation/ns:pitch', 1449 dom, 'orientation.y', data_info.sample) 1450 self._store_float('ns:SASsample/ns:orientation/ns:yaw', 1451 dom, 'orientation.z', data_info.sample) 1452 1453 # Source info ################### 1454 entry = get_content('ns:SASinstrument/ns:SASsource', dom) 1455 if entry is not None: 1456 data_info.source.name = entry.get('name') 1457 1458 self._store_content('ns:SASinstrument/ns:SASsource/ns:radiation', 1459 dom, 'radiation', data_info.source) 1460 self._store_content('ns:SASinstrument/ns:SASsource/ns:beam_shape', 1461 dom, 'beam_shape', data_info.source) 1462 self._store_float('ns:SASinstrument/ns:SASsource/ns:wavelength', 1463 dom, 'wavelength', data_info.source) 1464 self._store_float('ns:SASinstrument/ns:SASsource/ns:wavelength_min', 1465 dom, 'wavelength_min', data_info.source) 1466 self._store_float('ns:SASinstrument/ns:SASsource/ns:wavelength_max', 1467 dom, 'wavelength_max', data_info.source) 1468 self._store_float('ns:SASinstrument/ns:SASsource/ns:wavelength_spread', 1469 dom, 'wavelength_spread', data_info.source) 1470 1471 # Beam size (as a vector) 1472 entry = get_content('ns:SASinstrument/ns:SASsource/ns:beam_size', dom) 1473 if entry is not None: 1474 data_info.source.beam_size_name = entry.get('name') 1475 1476 self._store_float('ns:SASinstrument/ns:SASsource/ns:beam_size/ns:x', 1477 dom, 'beam_size.x', data_info.source) 1478 self._store_float('ns:SASinstrument/ns:SASsource/ns:beam_size/ns:y', 1479 dom, 'beam_size.y', data_info.source) 1480 self._store_float('ns:SASinstrument/ns:SASsource/ns:beam_size/ns:z', 1481 dom, 'beam_size.z', data_info.source) 1482 1483 # Collimation info ################### 1484 nodes = dom.xpath('ns:SASinstrument/ns:SAScollimation', 1485 namespaces={'ns': CANSAS_NS}) 1486 for item in nodes: 1487 collim = Collimation() 1488 if item.get('name') is not None: 1489 collim.name = item.get('name') 1490 self._store_float('ns:length', item, 'length', collim) 1491 1492 # Look for apertures 1493 apert_list = item.xpath('ns:aperture', 1494 namespaces={'ns': CANSAS_NS}) 1495 for apert in apert_list: 1496 aperture = Aperture() 1497 1498 # Get the name and type of the aperture 1499 aperture.name = apert.get('name') 1500 aperture.type = apert.get('type') 1501 1502 self._store_float('ns:distance', apert, 'distance', aperture) 1503 1504 entry = get_content('ns:size', apert) 1505 if entry is not None: 1506 aperture.size_name = entry.get('name') 1507 1508 self._store_float('ns:size/ns:x', apert, 'size.x', aperture) 1509 self._store_float('ns:size/ns:y', apert, 'size.y', aperture) 1510 self._store_float('ns:size/ns:z', apert, 'size.z', aperture) 1511 1512 collim.aperture.append(aperture) 1513 1514 data_info.collimation.append(collim) 1515 1516 # Detector info ###################### 1517 nodes = dom.xpath('ns:SASinstrument/ns:SASdetector', 1518 namespaces={'ns': CANSAS_NS}) 1519 for item in nodes: 1520 1521 detector = Detector() 1522 1523 self._store_content('ns:name', item, 'name', detector) 1524 self._store_float('ns:SDD', item, 'distance', detector) 1525 1526 # Detector offset (as a vector) 1527 self._store_float('ns:offset/ns:x', item, 'offset.x', detector) 1528 self._store_float('ns:offset/ns:y', item, 'offset.y', detector) 1529 self._store_float('ns:offset/ns:z', item, 'offset.z', detector) 1530 1531 # Detector orientation (as a vector) 1532 self._store_float('ns:orientation/ns:roll', item, 1533 'orientation.x', detector) 1534 self._store_float('ns:orientation/ns:pitch', item, 1535 'orientation.y', detector) 1536 self._store_float('ns:orientation/ns:yaw', item, 1537 'orientation.z', detector) 1538 1539 # Beam center (as a vector) 1540 self._store_float('ns:beam_center/ns:x', item, 1541 'beam_center.x', detector) 1542 self._store_float('ns:beam_center/ns:y', item, 1543 'beam_center.y', detector) 1544 self._store_float('ns:beam_center/ns:z', item, 1545 'beam_center.z', detector) 1546 1547 # Pixel size (as a vector) 1548 self._store_float('ns:pixel_size/ns:x', item, 1549 'pixel_size.x', detector) 1550 self._store_float('ns:pixel_size/ns:y', item, 1551 'pixel_size.y', detector) 1552 self._store_float('ns:pixel_size/ns:z', item, 1553 'pixel_size.z', detector) 1554 1555 self._store_float('ns:slit_length', item, 'slit_length', detector) 1556 1557 data_info.detector.append(detector) 1558 1559 # Processes info ###################### 1560 nodes = dom.xpath('ns:SASprocess', namespaces={'ns': CANSAS_NS}) 1561 for item in nodes: 1562 process = Process() 1563 self._store_content('ns:name', item, 'name', process) 1564 self._store_content('ns:date', item, 'date', process) 1565 self._store_content('ns:description', item, 'description', process) 1566 1567 term_list = item.xpath('ns:term', namespaces={'ns': CANSAS_NS}) 1568 for term in term_list: 1569 try: 1570 term_attr = {} 1571 for attr in term.keys(): 1572 term_attr[attr] = term.get(attr).strip() 1573 if term.text is not None: 1574 term_attr['value'] = term.text.strip() 1575 process.term.append(term_attr) 1576 except: 1577 err_mess = "cansas_reader.read: error processing " 1578 err_mess += "entry notes\n %s" % sys.exc_value 1579 self.errors.append(err_mess) 1580 logging.error(err_mess) 1581 1582 note_list = item.xpath('ns:SASprocessnote', 1583 namespaces={'ns': CANSAS_NS}) 1584 for note in note_list: 1585 if note.text is not None: 1586 process.notes.append(note.text.strip()) 1587 1588 data_info.process.append(process) 1589 1590 # Data info ###################### 1591 nodes = dom.xpath('ns:SASdata', namespaces={'ns': CANSAS_NS}) 1592 if len(nodes) > 1: 1593 raise RuntimeError, "CanSAS reader is not compatible with" + \ 1594 " multiple SASdata entries" 1595 1596 for entry in nodes: 1597 for item in LIST_OF_DATA_2D_ATTR: 1598 # get node 1599 node = get_content('ns:%s' % item[0], entry) 1600 setattr(data_info, item[1], parse_entry_helper(node, item)) 1601 1602 for item in LIST_OF_DATA_2D_VALUES: 1603 field = get_content('ns:%s' % item[0], entry) 1604 value_list = [] 1605 if field is not None: 1606 value_list = \ 1607 [parse_entry_helper(node, item) for node in field] 1608 if len(value_list) < 2: 1609 setattr(data_info, item[0], None) 1610 else: 1611 setattr(data_info, item[0], numpy.array(value_list)) 1612 1613 return data_info 1267 return_value, _ = self._parse_entry(dom) 1268 return return_value, _ 1614 1269 1615 1270 def _read_cansas(self, path): … … 1692 1347 name = original_fname 1693 1348 state.data.group_id = name 1349 state.version = fitstate.version 1694 1350 # store state in fitting 1695 1351 self.call_back(state=state, … … 1745 1401 state.data.run_name[0] = state.data.name 1746 1402 1747 if issubclass(state.data.__class__, 1748 sas.sascalc.dataloader.data_info.Data1D): 1749 data = state.data 1750 doc, sasentry = self._to_xml_doc(data) 1751 else: 1752 data = state.data 1753 doc, sasentry = self._data2d_to_xml_doc(data) 1403 data = state.data 1404 doc, sasentry = self._to_xml_doc(data) 1754 1405 1755 1406 if state is not None: -
src/sas/sasgui/perspectives/fitting/report_dialog.py
rd85c194 r7432acb 39 39 self.nimages = len(self.report_list[2]) 40 40 41 if self.report_list[2] !=None:41 if self.report_list[2] is not None: 42 42 # put image path in the report string 43 43 if len(self.report_list[2]) == 1: -
src/sas/sasgui/perspectives/fitting/utils.py
rd85c194 r959eb01 2 2 Module contains functions frequently used in this package 3 3 """ 4 import numpy 4 import numpy as np 5 5 6 6 … … 19 19 data = data.y 20 20 if flag == 0: 21 weight = n umpy.ones_like(data)21 weight = np.ones_like(data) 22 22 elif flag == 1: 23 23 weight = dy_data 24 24 elif flag == 2: 25 weight = n umpy.sqrt(numpy.abs(data))25 weight = np.sqrt(np.abs(data)) 26 26 elif flag == 3: 27 weight = n umpy.abs(data)27 weight = np.abs(data) 28 28 return weight
Note: See TracChangeset
for help on using the changeset viewer.