Changeset c416a17 in sasview for src/sas/sasgui/perspectives/fitting


Ignore:
Timestamp:
May 26, 2017 7:41:44 AM (8 years ago)
Author:
Piotr Rozyczko <rozyczko@…>
Branches:
ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
Children:
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.
Message:

Merge branch 'master' into ESS_GUI

Location:
src/sas/sasgui/perspectives/fitting
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/fitting/basepage.py

    r9687d58 rc416a17  
    22Base Page for fitting 
    33""" 
     4from __future__ import print_function 
     5 
    46import sys 
    57import os 
    68import wx 
    7 import numpy 
     9import numpy as np 
    810import time 
    911import copy 
     
    3436from sas.sasgui.guiframe.documentation_window import DocumentationWindow 
    3537 
     38logger = logging.getLogger(__name__) 
    3639 
    3740(PageInfoEvent, EVT_PAGE_INFO) = wx.lib.newevent.NewEvent() 
     
    5356    ON_MAC = True 
    5457 
     58CUSTOM_MODEL = 'Plugin Models' 
     59 
    5560class BasicPage(ScrolledPanel, PanelBase): 
    5661    """ 
    57     This class provide general structure of fitpanel page 
     62    This class provide general structure of the fitpanel page 
    5863    """ 
    5964    # Internal name for the AUI manager 
     
    98103        self.graph_id = None 
    99104        # Q range for data set 
    100         self.qmin_data_set = numpy.inf 
     105        self.qmin_data_set = np.inf 
    101106        self.qmax_data_set = None 
    102107        self.npts_data_set = 0 
     
    118123        self.dxw = None 
    119124        # pinhole smear 
    120         self.dx_min = None 
    121         self.dx_max = None 
     125        self.dx_percent = None 
    122126        # smear attrbs 
    123127        self.enable_smearer = None 
     
    277281 
    278282        """ 
    279         x = numpy.linspace(start=self.qmin_x, stop=self.qmax_x, 
     283        x = np.linspace(start=self.qmin_x, stop=self.qmax_x, 
    280284                           num=self.npts_x, endpoint=True) 
    281285        self.data = Data1D(x=x) 
     
    294298        """ 
    295299        if self.qmin_x >= 1.e-10: 
    296             qmin = numpy.log10(self.qmin_x) 
     300            qmin = np.log10(self.qmin_x) 
    297301        else: 
    298302            qmin = -10. 
    299303 
    300304        if self.qmax_x <= 1.e10: 
    301             qmax = numpy.log10(self.qmax_x) 
     305            qmax = np.log10(self.qmax_x) 
    302306        else: 
    303307            qmax = 10. 
    304308 
    305         x = numpy.logspace(start=qmin, stop=qmax, 
     309        x = np.logspace(start=qmin, stop=qmax, 
    306310                           num=self.npts_x, endpoint=True, base=10.0) 
    307311        self.data = Data1D(x=x) 
     
    340344        qstep = self.npts_x 
    341345 
    342         x = numpy.linspace(start=xmin, stop=xmax, num=qstep, endpoint=True) 
    343         y = numpy.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) 
    344348        # use data info instead 
    345         new_x = numpy.tile(x, (len(y), 1)) 
    346         new_y = numpy.tile(y, (len(x), 1)) 
     349        new_x = np.tile(x, (len(y), 1)) 
     350        new_y = np.tile(y, (len(x), 1)) 
    347351        new_y = new_y.swapaxes(0, 1) 
    348352        # all data reuire now in 1d array 
    349353        qx_data = new_x.flatten() 
    350354        qy_data = new_y.flatten() 
    351         q_data = numpy.sqrt(qx_data * qx_data + qy_data * qy_data) 
     355        q_data = np.sqrt(qx_data * qx_data + qy_data * qy_data) 
    352356        # set all True (standing for unmasked) as default 
    353         mask = numpy.ones(len(qx_data), dtype=bool) 
     357        mask = np.ones(len(qx_data), dtype=bool) 
    354358        # store x and y bin centers in q space 
    355359        x_bins = x 
     
    357361 
    358362        self.data.source = Source() 
    359         self.data.data = numpy.ones(len(mask)) 
    360         self.data.err_data = numpy.ones(len(mask)) 
     363        self.data.data = np.ones(len(mask)) 
     364        self.data.err_data = np.ones(len(mask)) 
    361365        self.data.qx_data = qx_data 
    362366        self.data.qy_data = qy_data 
     
    655659        # It seems MAC needs wxCallAfter 
    656660        if event.GetId() == GUIFRAME_ID.COPYEX_ID: 
    657             print "copy excel" 
     661            print("copy excel") 
    658662            wx.CallAfter(self.get_copy_excel) 
    659663        elif event.GetId() == GUIFRAME_ID.COPYLAT_ID: 
    660             print "copy latex" 
     664            print("copy latex") 
    661665            wx.CallAfter(self.get_copy_latex) 
    662666        else: 
     
    677681    def _copy_info(self, flag): 
    678682        """ 
    679         Send event dpemding on flag 
    680  
    681         : Param flag: flag that distinguish event 
     683        Send event depending on flag 
     684 
     685        : Param flag: flag that distinguishes the event 
    682686        """ 
    683687        # messages depending on the flag 
     
    781785                except Exception: 
    782786                    # Skip non-data lines 
    783                     logging.error(traceback.format_exc()) 
    784             return numpy.array(angles), numpy.array(weights) 
     787                    logger.error(traceback.format_exc()) 
     788            return np.array(angles), np.array(weights) 
    785789        except: 
    786790            raise 
     
    847851        self.state.pinhole_smearer = \ 
    848852                                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) 
    851854        self.state.dxl = copy.deepcopy(self.dxl) 
    852855        self.state.dxw = copy.deepcopy(self.dxw) 
     
    11051108        """ 
    11061109        for key, value in self.master_category_dict.iteritems(): 
     1110            formfactor = state.formfactorcombobox.split(":") 
     1111            if isinstance(formfactor, list): 
     1112                formfactor = formfactor[0] 
    11071113            for list_item in value: 
    1108                 if state.formfactorcombobox in list_item: 
     1114                if formfactor in list_item: 
    11091115                    return self.categorybox.Items.index(key) 
    11101116        return 0 
     
    11161122        :precondition: the page is already drawn or created 
    11171123 
    1118         :postcondition: the state of the underlying data change as well as the 
     1124        :postcondition: the state of the underlying data changes as well as the 
    11191125            state of the graphic interface 
    11201126        """ 
     
    11521158        self._show_combox_helper() 
    11531159        # 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) 
    11691168 
    11701169        self.categorybox.Select(category_pos) 
    11711170        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) 
    11811192                    break 
    1182  
    1183         self.formfactorbox.Select(formfactor_pos) 
    1184  
    1185         structfactor_pos = 0 
    1186         try: 
    1187             # to support older version 
    1188             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                         break 
    11971193 
    11981194        self.structurebox.SetSelection(structfactor_pos) 
     
    12521248        # we have two more options for smearing 
    12531249        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) 
    12601255            self.onPinholeSmear(event=None) 
    12611256        elif self.slit_smearer.GetValue(): 
     
    13121307                    [state.values, state.weights] 
    13131308            except Exception: 
    1314                 logging.error(traceback.format_exc()) 
     1309                logger.error(traceback.format_exc()) 
    13151310            selection = self._find_polyfunc_selection(disp_model) 
    13161311            for list in self.fittable_param: 
     
    13291324                            list[6].Disable() 
    13301325                        except Exception: 
    1331                             logging.error(traceback.format_exc()) 
     1326                            logger.error(traceback.format_exc()) 
    13321327            # For array, disable all fixed params 
    13331328            if selection == 1: 
     
    13381333                            item[2].Disable() 
    13391334                        except Exception: 
    1340                             logging.error(traceback.format_exc()) 
     1335                            logger.error(traceback.format_exc()) 
    13411336 
    13421337    def _selectDlg(self): 
    13431338        """ 
    1344         open a dialog file to selected the customized dispersity 
     1339        open a dialog file to select the customized polydispersity function 
    13451340        """ 
    13461341        if self.parent is not None: 
     
    13841379        # self.state.struct_rbutton = self.struct_rbutton.GetValue() 
    13851380        # self.state.plugin_rbutton = self.plugin_rbutton.GetValue() 
    1386         self.state.structurecombobox = self.structurebox.GetLabel() 
    1387         self.state.formfactorcombobox = self.formfactorbox.GetLabel() 
    1388         self.state.categorycombobox = self.categorybox.GetLabel() 
     1381        self.state.structurecombobox = self.structurebox.GetValue() 
     1382        self.state.formfactorcombobox = self.formfactorbox.GetValue() 
     1383        self.state.categorycombobox = self.categorybox.GetValue() 
    13891384 
    13901385        # post state to fit panel 
     
    14571452                self.state_change = True 
    14581453                self._draw_model() 
    1459                 # Time delay has been introduced to prevent _handle error 
    1460                 # on Windows 
    1461                 # This part of code is executed when model is selected and 
    1462                 # it's parameters are changed (with respect to previously 
    1463                 # selected model). There are two Iq evaluations occuring one 
    1464                 # after another and therefore there may be compilation error 
    1465                 # if model is calculated for the first time. 
    1466                 # This seems to be Windows only issue - haven't tested on Linux 
    1467                 # though.The proper solution (other than time delay) requires 
    1468                 # more fundemental code refatoring 
    1469                 # Wojtek P. Nov 7, 2016 
    1470                 if not ON_MAC: 
    1471                     time.sleep(0.1) 
    14721454                self.Refresh() 
    14731455 
    1474         # logging.info("is_modified flag set to %g",is_modified) 
     1456        # logger.info("is_modified flag set to %g",is_modified) 
    14751457        return is_modified 
    14761458 
     
    15761558            self.save_current_state() 
    15771559        except Exception: 
    1578             logging.error(traceback.format_exc()) 
     1560            logger.error(traceback.format_exc()) 
    15791561 
    15801562        return flag, is_modified 
     
    15861568        if len(statelist) == 0 or len(listtorestore) == 0: 
    15871569            return 
    1588         if len(statelist) != len(listtorestore): 
    1589             return 
    15901570 
    15911571        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 
    16251610 
    16261611    def _reset_strparam_state(self, listtorestore, statelist): 
     
    17631748    def _set_multfactor_combobox(self, multiplicity=10): 
    17641749        """ 
    1765         Set comboBox for muitfactor of CoreMultiShellModel 
     1750        Set comboBox for multitfactor of CoreMultiShellModel 
    17661751        :param multiplicit: no. of multi-functionality 
    17671752        """ 
     
    18011786        Fill panel's combo box according to the type of model selected 
    18021787        """ 
    1803         custom_model = 'Customized Models' 
     1788 
    18041789        mod_cat = self.categorybox.GetStringSelection() 
    18051790        self.structurebox.SetSelection(0) 
     
    18101795        m_list = [] 
    18111796        try: 
    1812             if mod_cat == custom_model: 
     1797            if mod_cat == CUSTOM_MODEL: 
    18131798                for model in self.model_list_box[mod_cat]: 
    18141799                    m_list.append(self.model_dict[model.name]) 
     
    21252110        for data in self.data_list: 
    21262111            # q value from qx and qy 
    2127             radius = numpy.sqrt(data.qx_data * data.qx_data + 
     2112            radius = np.sqrt(data.qx_data * data.qx_data + 
    21282113                                data.qy_data * data.qy_data) 
    21292114            # get unmasked index 
     
    21312116                         (radius <= float(self.qmax.GetValue())) 
    21322117            index_data = (index_data) & (data.mask) 
    2133             index_data = (index_data) & (numpy.isfinite(data.data)) 
     2118            index_data = (index_data) & (np.isfinite(data.data)) 
    21342119 
    21352120            if len(index_data[index_data]) < 10: 
     
    21662151            index_data = (float(self.qmin.GetValue()) <= radius) & \ 
    21672152                         (radius <= float(self.qmax.GetValue())) 
    2168             index_data = (index_data) & (numpy.isfinite(data.y)) 
     2153            index_data = (index_data) & (np.isfinite(data.y)) 
    21692154 
    21702155            if len(index_data[index_data]) < 5: 
     
    22382223 
    22392224                # Check that min is less than max 
    2240                 low = -numpy.inf if min_str == "" else float(min_str) 
    2241                 high = numpy.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) 
    22422227                if high < low: 
    22432228                    min_ctrl.SetBackgroundColour("pink") 
     
    23892374                    self.model.set_dispersion(p, disp_model) 
    23902375                except Exception: 
    2391                     logging.error(traceback.format_exc()) 
     2376                    logger.error(traceback.format_exc()) 
    23922377 
    23932378        # save state into 
     
    25042489            self.Refresh() 
    25052490        except Exception: 
    2506             logging.error(traceback.format_exc()) 
     2491            logger.error(traceback.format_exc()) 
    25072492            # Error msg 
    25082493            msg = "Error occurred:" 
     
    26052590                del self.state.model._persistency_dict[name.split('.')[0]] 
    26062591        except Exception: 
    2607             logging.error(traceback.format_exc()) 
     2592            logger.error(traceback.format_exc()) 
    26082593 
    26092594    def _lay_out(self): 
     
    26142599            Layout is called after fitting. 
    26152600        """ 
    2616         self._sleep4sec() 
    26172601        self.Layout() 
    26182602        return 
    2619  
    2620     def _sleep4sec(self): 
    2621         """ 
    2622             sleep for 1 sec only applied on Mac 
    2623             Note: This 1sec helps for Mac not to crash on self. 
    2624             Layout after self._draw_model 
    2625         """ 
    2626         if ON_MAC: 
    2627             time.sleep(1) 
    26282603 
    26292604    def _find_polyfunc_selection(self, disp_func=None): 
     
    26592634            self.qmin_x = data_min 
    26602635            self.qmax_x = math.sqrt(x * x + y * y) 
    2661             # self.data.mask = numpy.ones(len(self.data.data),dtype=bool) 
     2636            # self.data.mask = np.ones(len(self.data.data),dtype=bool) 
    26622637            # check smearing 
    26632638            if not self.disable_smearer.GetValue(): 
     
    27472722            except Exception: 
    27482723                # Not for control panels 
    2749                 logging.error(traceback.format_exc()) 
     2724                logger.error(traceback.format_exc()) 
    27502725        # Make sure the resduals plot goes to the last 
    27512726        if res_item is not None: 
     
    30803055                    disfunc = str(item[7].GetValue()) 
    30813056            except Exception: 
    3082                 logging.error(traceback.format_exc()) 
     3057                logger.error(traceback.format_exc()) 
    30833058 
    30843059            # 2D 
     
    31233098                        disfunc += ' ' + str(weight) 
    31243099            except Exception: 
    3125                 logging.error(traceback.format_exc()) 
     3100                logger.error(traceback.format_exc()) 
    31263101            content += name + ',' + str(check) + ',' + value + disfunc + ',' + \ 
    31273102                       bound_lo + ',' + bound_hi + ':' 
     
    33713346 
    33723347            if value[1] == 'array': 
    3373                 pd_vals = numpy.array(value[2]) 
    3374                 pd_weights = numpy.array(value[3]) 
     3348                pd_vals = np.array(value[2]) 
     3349                pd_weights = np.array(value[3]) 
    33753350                if len(pd_vals) == 0 or len(pd_vals) != len(pd_weights): 
    33763351                    msg = ("bad array distribution parameters for %s" 
     
    33943369 
    33953370        except Exception: 
    3396             logging.error(traceback.format_exc()) 
    3397             print "Error in BasePage._paste_poly_help: %s" % \ 
    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]) 
    33993374 
    34003375    def _set_disp_cb(self, isarray, item): 
     
    34253400            Moveit; This method doesn't belong here 
    34263401        """ 
    3427         print "BasicPage.update_pinhole_smear was called: skipping" 
     3402        print("BasicPage.update_pinhole_smear was called: skipping") 
    34283403        return 
    34293404 
     
    34573432        fills out the category list box 
    34583433        """ 
    3459         uncat_str = 'Customized Models' 
     3434        uncat_str = 'Plugin Models' 
    34603435        self._read_category_info() 
    34613436 
     
    34863461        self.model_box.Clear() 
    34873462 
    3488         if category == 'Customized Models': 
     3463        if category == 'Plugin Models': 
    34893464            for model in self.model_list_box[category]: 
    34903465                str_m = str(model).split(".")[0] 
     
    36013576        # check model type to show sizer 
    36023577        if self.model is not None: 
    3603             print "_set_model_sizer_selection: disabled." 
     3578            print("_set_model_sizer_selection: disabled.") 
    36043579            # self._set_model_sizer_selection(self.model) 
    36053580 
  • src/sas/sasgui/perspectives/fitting/batchfitpage.py

    rdbce805 r7432acb  
    200200#         self.state.formfactorcombobox = self.formfactorbox.GetCurrentSelection() 
    201201#        
    202 #         if self.model != None: 
     202#         if self.model is not None: 
    203203#             self._set_copy_flag(True) 
    204204#             self._set_paste_flag(True) 
    205 #             if self.data != None: 
     205#             if self.data is not None: 
    206206#                 self._set_bookmark_flag(False) 
    207207#                 self._keep.Enable(False) 
     
    225225#  
    226226#              
    227 #         if event != None: 
     227#         if event is not None: 
    228228#             ## post state to fit panel 
    229229#             new_event = PageInfoEvent(page = self) 
     
    254254#         is_modified = False 
    255255#  
    256 #         if self.model != None:            
     256#         if self.model is not None: 
    257257#             ##Check the values 
    258258#             self._check_value_enter( self.fittable_param) 
     
    291291#         else: 
    292292#             #self.btFit.Enable(True) 
    293 #             if self._is_2D() and  self.data != None: 
     293#             if self._is_2D() and  self.data is not None: 
    294294#                 self.btEditMask.Enable(True) 
    295295#  
     
    335335#             self._set_save_flag(False) 
    336336#         else: 
    337 #             if self.model != None: 
     337#             if self.model is not None: 
    338338#                 self._set_bookmark_flag(False) 
    339339#                 self._keep.Enable(False) 
  • src/sas/sasgui/perspectives/fitting/fit_thread.py

    rf182f93 rc416a17  
    1  
    21import sys 
    32import time 
     
    8988                          elapsed=time.time() - self.starttime) 
    9089 
    91             return result[0], time.time()-self.starttime 
    92  
    9390        except KeyboardInterrupt, msg: 
    9491            # Thread was interrupted, just proceed and re-raise. 
     
    10299            if self.handler is not None: 
    103100                self.handler.stop(msg=msg) 
    104         except Exception as ex: 
    105             #print "EXCEPTION: ", ex 
     101        except: 
    106102            import traceback 
    107103            if self.handler is not None: 
    108104                self.handler.error(msg=traceback.format_exc()) 
    109  
    110  
    111  
  • src/sas/sasgui/perspectives/fitting/fitpage.py

    r24fd27a red2276f  
    66import wx 
    77import wx.lib.newevent 
    8 import numpy 
     8import numpy as np 
    99import copy 
    1010import math 
     
    2929_BOX_WIDTH = 76 
    3030_DATA_BOX_WIDTH = 300 
    31 SMEAR_SIZE_L = 0.00 
    3231SMEAR_SIZE_H = 0.00 
    33  
     32CUSTOM_MODEL = 'Plugin Models' 
    3433 
    3534class FitPage(BasicPage): 
     
    164163        On_select_data 
    165164        """ 
    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 
    171167            data = self.dataSource.GetClientData(pos) 
    172168            self.set_data(data) 
     
    213209              "Please enter only the value of interest to customize smearing..." 
    214210        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..." 
    216212        smear_message_2d_x_title = "<dQp>[1/A]:" 
    217213        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[%]:" 
    220215        smear_message_slit_height_title = "Slit height[1/A]:" 
    221216        smear_message_slit_width_title = "Slit width[1/A]:" 
     
    256251        self.Bind(wx.EVT_RADIOBUTTON, self.onWeighting, 
    257252                  id=self.dI_idata.GetId()) 
    258         self.dI_didata.SetValue(True) 
     253        self.dI_noweight.SetValue(True) 
    259254        # add 4 types of weighting to the sizer 
    260255        sizer_weighting.Add(self.dI_noweight, 0, wx.LEFT, 10) 
     
    266261        sizer_weighting.Add(self.dI_idata) 
    267262        sizer_weighting.Add((10, 10)) 
    268         self.dI_noweight.Enable(False) 
     263        self.dI_noweight.Enable(True) 
    269264        self.dI_didata.Enable(False) 
    270265        self.dI_sqrdata.Enable(False) 
     
    310305         
    311306        # 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) 
    320312        self.smear_slit_height = ModelTextCtrl(self, wx.ID_ANY, 
    321313                            size=(_BOX_WIDTH - 25, 20), 
     
    336328 
    337329        # 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)) 
    340331        self.smear_slit_height.SetValue(str(self.dxl)) 
    341332        self.smear_slit_width.SetValue(str(self.dxw)) 
     
    362353        self.Bind(wx.EVT_RADIOBUTTON, self.onSlitSmear, 
    363354                  id=self.slit_smearer.GetId()) 
    364         self.enable_smearer.SetValue(True) 
     355        self.disable_smearer.SetValue(True) 
    365356 
    366357        sizer_smearer.Add(self.disable_smearer, 0, wx.LEFT, 10) 
     
    429420        self.smear_description_2d_y.SetToolTipString( 
    430421                                    " 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) 
    435425        self.smear_description_slit_height = wx.StaticText(self, wx.ID_ANY, 
    436426                        smear_message_slit_height_title, style=wx.ALIGN_LEFT) 
     
    456446        self.sizer_new_smear.Add((15, -1)) 
    457447        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) 
    460448        self.sizer_new_smear.Add(self.smear_description_slit_height, 
    461449                                 0, wx.CENTER, 10) 
    462450 
    463         self.sizer_new_smear.Add(self.smear_pinhole_min, 0, wx.CENTER, 10) 
    464451        self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 
    465452        self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) 
     
    467454        self.sizer_new_smear.Add(self.smear_description_2d_y, 
    468455                                 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, 
    470457                                 0, wx.CENTER, 10) 
    471458        self.sizer_new_smear.Add(self.smear_description_slit_width, 
    472459                                 0, wx.CENTER, 10) 
    473460 
    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) 
    475462        self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 
    476463        self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) 
     
    11281115            if item.GetValue(): 
    11291116                if button_list.index(item) == 0: 
    1130                     flag = 0  # dy = numpy.ones_like(dy_data) 
     1117                    flag = 0  # dy = np.ones_like(dy_data) 
    11311118                elif button_list.index(item) == 1: 
    11321119                    flag = 1  # dy = dy_data 
    11331120                elif button_list.index(item) == 2: 
    1134                     flag = 2  # dy = numpy.sqrt(numpy.abs(data)) 
     1121                    flag = 2  # dy = np.sqrt(np.abs(data)) 
    11351122                elif button_list.index(item) == 3: 
    1136                     flag = 3  # dy = numpy.abs(data) 
     1123                    flag = 3  # dy = np.abs(data) 
    11371124                break 
    11381125        return flag 
     
    11901177        self.state.slit_smearer = self.slit_smearer.GetValue() 
    11911178 
    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() 
    11941182        self.enable_fit_button() 
    11951183        if self.model is not None: 
     
    12481236            wx.PostEvent(self.parent, new_event) 
    12491237            # update list of plugins if new plugin is available 
    1250             custom_model = 'Customized Models' 
     1238            custom_model = CUSTOM_MODEL 
    12511239            mod_cat = self.categorybox.GetStringSelection() 
    12521240            if mod_cat == custom_model: 
     
    12701258            if copy_flag: 
    12711259                self.get_paste_params(copy_flag) 
    1272                 wx.CallAfter(self._onDraw, None) 
     1260            wx.CallAfter(self._onDraw, None) 
    12731261 
    12741262        else: 
     
    14341422        key = event.GetKeyCode() 
    14351423        length = len(self.data.x) 
    1436         indx = (numpy.abs(self.data.x - x_data)).argmin() 
     1424        indx = (np.abs(self.data.x - x_data)).argmin() 
    14371425        # return array.flat[idx] 
    14381426        if key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP: 
     
    14891477                    self.enable2D: 
    14901478                # set mask 
    1491                 radius = numpy.sqrt(self.data.qx_data * self.data.qx_data + 
     1479                radius = np.sqrt(self.data.qx_data * self.data.qx_data + 
    14921480                                    self.data.qy_data * self.data.qy_data) 
    14931481                index_data = ((self.qmin_x <= radius) & (radius <= self.qmax_x)) 
    14941482                index_data = (index_data) & (self.data.mask) 
    1495                 index_data = (index_data) & (numpy.isfinite(self.data.data)) 
     1483                index_data = (index_data) & (np.isfinite(self.data.data)) 
    14961484                if len(index_data[index_data]) < 10: 
    14971485                    msg = "Cannot Plot :No or too little npts in" 
     
    15831571        if self.dxw is None: 
    15841572            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 
    15891575 
    15901576    def _get_smear_info(self): 
     
    16121598                and data.dqx_data.any() != 0: 
    16131599                self.smear_type = "Pinhole2d" 
    1614                 self.dq_l = format_number(numpy.average(data.dqx_data)) 
    1615                 self.dq_r = format_number(numpy.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)) 
    16161602                return 
    16171603            else: 
    16181604                return 
    16191605        # check if it is pinhole smear and get min max if it is. 
    1620         if data.dx is not None and numpy.any(data.dx): 
     1606        if data.dx is not None and np.any(data.dx): 
    16211607            self.smear_type = "Pinhole" 
    16221608            self.dq_l = data.dx[0] 
     
    16261612        elif data.dxl is not None or data.dxw is not None: 
    16271613            self.smear_type = "Slit" 
    1628             if data.dxl is not None and not numpy.all(data.dxl, 0): 
     1614            if data.dxl is not None and np.all(data.dxl, 0): 
    16291615                self.dq_l = data.dxl[0] 
    1630             if data.dxw is not None and not numpy.all(data.dxw, 0): 
     1616            if data.dxw is not None and np.all(data.dxw, 0): 
    16311617                self.dq_r = data.dxw[0] 
    16321618        # return self.smear_type,self.dq_l,self.dq_r 
     
    16481634            self.smear_description_2d_y.Show(True) 
    16491635            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) 
    16521637        # smear from data 
    16531638        elif self.enable_smearer.GetValue(): 
     
    16601645                    self.smear_description_slit_width.Show(True) 
    16611646                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) 
    16641648                self.smear_description_smear_type.Show(True) 
    16651649                self.smear_description_type.Show(True) 
     
    16701654            if self.smear_type == 'Pinhole': 
    16711655                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) 
    16771659        # custom slit smear 
    16781660        elif self.slit_smearer.GetValue(): 
     
    16991681        self.smear_data_left.Hide() 
    17001682        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() 
    17051685        self.smear_description_slit_height.Hide() 
    17061686        self.smear_slit_height.Hide() 
     
    18281808        if not flag: 
    18291809            self.onSmear(None) 
    1830  
    1831     def _mac_sleep(self, sec=0.2): 
    1832         """ 
    1833         Give sleep to MAC 
    1834         """ 
    1835         if self.is_mac: 
    1836             time.sleep(sec) 
    18371810 
    18381811    def get_view_mode(self): 
     
    19331906 
    19341907            # more disables for 2D 
     1908            di_flag = False 
     1909            dq_flag = False 
    19351910            if self.data.__class__.__name__ == "Data2D" or \ 
    19361911                        self.enable2D: 
     
    19381913                self.pinhole_smearer.Enable(True) 
    19391914                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 
    19501921            else: 
    19511922                self.slit_smearer.Enable(True) 
    19521923                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 
    19641949            # Enable weighting radio buttons 
    19651950            self.dI_noweight.Enable(True) 
     
    20031988            self.EditMask_title.Disable() 
    20041989 
     1990        self.on_smear_helper() 
    20051991        self.on_set_focus(None) 
    20061992        self.Refresh() 
     
    20742060        if self.data.__class__.__name__ == "Data2D" or \ 
    20752061                        self.enable2D: 
    2076             radius = numpy.sqrt(self.data.qx_data * self.data.qx_data + 
     2062            radius = np.sqrt(self.data.qx_data * self.data.qx_data + 
    20772063                                self.data.qy_data * self.data.qy_data) 
    20782064            index_data = (self.qmin_x <= radius) & (radius <= self.qmax_x) 
    20792065            index_data = (index_data) & (self.data.mask) 
    2080             index_data = (index_data) & (numpy.isfinite(self.data.data)) 
     2066            index_data = (index_data) & (np.isfinite(self.data.data)) 
    20812067            npts2fit = len(self.data.data[index_data]) 
    20822068        else: 
     
    21112097        # make sure stop button to fit button all the time 
    21122098        self._on_fit_complete() 
    2113         if out is None or not numpy.isfinite(chisqr): 
     2099        if out is None or not np.isfinite(chisqr): 
    21142100            raise ValueError, "Fit error occured..." 
    21152101 
     
    21222108 
    21232109        # Check if chi2 is finite 
    2124         if chisqr is not None and numpy.isfinite(chisqr): 
     2110        if chisqr is not None and np.isfinite(chisqr): 
    21252111            # format chi2 
    21262112            chi2 = format_number(chisqr, True) 
     
    21742160 
    21752161                        if cov[ind] is not None: 
    2176                             if numpy.isfinite(float(cov[ind])): 
     2162                            if np.isfinite(float(cov[ind])): 
    21772163                                val_err = format_number(cov[ind], True) 
    21782164                                item[4].SetForegroundColour(wx.BLACK) 
     
    21952181        self.save_current_state() 
    21962182 
    2197         if not self.is_mac: 
    2198             self.Layout() 
    2199             self.Refresh() 
    2200         self._mac_sleep(0.1) 
    22012183        # plot model ( when drawing, do not update chisqr value again) 
    22022184        self._draw_model(update_chisqr=False, source='fit') 
     
    22382220            # event case of radio button 
    22392221            if tcrtl.GetValue(): 
    2240                 self.dx_min = 0.0 
    2241                 self.dx_max = 0.0 
     2222                self.dx_percent = 0.0 
    22422223                is_new_pinhole = True 
    22432224            else: 
     
    22762257        """ 
    22772258        # 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 
    22822262        try: 
    2283             dx_min = float(pin_min) 
     2263            dx_percent = float(pin_percent) 
    22842264        except: 
    22852265            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: 
    22952267            return True 
    22962268        return False 
     
    23082280            self.smear_type = 'Pinhole2d' 
    23092281            len_data = len(data.data) 
    2310             data.dqx_data = numpy.zeros(len_data) 
    2311             data.dqy_data = numpy.zeros(len_data) 
     2282            data.dqx_data = np.zeros(len_data) 
     2283            data.dqy_data = np.zeros(len_data) 
    23122284        else: 
    23132285            self.smear_type = 'Pinhole' 
    23142286            len_data = len(data.x) 
    2315             data.dx = numpy.zeros(len_data) 
     2287            data.dx = np.zeros(len_data) 
    23162288            data.dxl = None 
    23172289            data.dxw = None 
    23182290        msg = None 
    23192291 
    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") 
    23282296            msg = "Model Error:wrong value entered!!!" 
    23292297        else: 
    23302298            if len_data < 2: 
    23312299                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") 
    23362303                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 
    23412306                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 
    23462309                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 
    23612311            self.current_smearer = smear_selection(data, self.model) 
    23622312            # 2D need to set accuracy 
     
    23682318            wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    23692319        else: 
    2370             get_pin_min.SetBackgroundColour("white") 
    2371             get_pin_max.SetBackgroundColour("white") 
     2320            get_pin_percent.SetBackgroundColour("white") 
    23722321        # set smearing value whether or not the data contain the smearing info 
    23732322 
     
    25092458        try: 
    25102459            self.dxl = float(self.smear_slit_height.GetValue()) 
    2511             data.dxl = self.dxl * numpy.ones(data_len) 
     2460            data.dxl = self.dxl * np.ones(data_len) 
    25122461            self.smear_slit_height.SetBackgroundColour(wx.WHITE) 
    25132462        except: 
    25142463            self.dxl = None 
    2515             data.dxl = numpy.zeros(data_len) 
     2464            data.dxl = np.zeros(data_len) 
    25162465            if self.smear_slit_height.GetValue().lstrip().rstrip() != "": 
    25172466                self.smear_slit_height.SetBackgroundColour("pink") 
     
    25222471            self.dxw = float(self.smear_slit_width.GetValue()) 
    25232472            self.smear_slit_width.SetBackgroundColour(wx.WHITE) 
    2524             data.dxw = self.dxw * numpy.ones(data_len) 
     2473            data.dxw = self.dxw * np.ones(data_len) 
    25252474        except: 
    25262475            self.dxw = None 
    2527             data.dxw = numpy.zeros(data_len) 
     2476            data.dxw = np.zeros(data_len) 
    25282477            if self.smear_slit_width.GetValue().lstrip().rstrip() != "": 
    25292478                self.smear_slit_width.SetBackgroundColour("pink") 
     
    26522601            if event is None: 
    26532602                output = "-" 
    2654             elif not numpy.isfinite(event.output): 
     2603            elif not np.isfinite(event.output): 
    26552604                output = "-" 
    26562605            else: 
  • src/sas/sasgui/perspectives/fitting/fitting.py

    r9687d58 rc416a17  
    1111#copyright 2009, University of Tennessee 
    1212################################################################################ 
     13from __future__ import print_function 
     14 
    1315import re 
    1416import sys 
     
    1618import wx 
    1719import logging 
    18 import numpy 
     20import numpy as np 
    1921import time 
    2022from copy import deepcopy 
     
    4850 
    4951from . import models 
     52 
     53logger = logging.getLogger(__name__) 
    5054 
    5155MAX_NBR_DATA = 4 
     
    119123        self.page_finder = {} 
    120124        # Log startup 
    121         logging.info("Fitting plug-in started") 
     125        logger.info("Fitting plug-in started") 
    122126        self.batch_capable = self.get_batch_capable() 
    123127 
     
    225229 
    226230        self.id_edit = wx.NewId() 
    227         editmodel_help = "Edit customized model sample file" 
    228231        self.menu1.AppendMenu(self.id_edit, "Plugin Model Operations", 
    229                               self.edit_model_menu, editmodel_help) 
     232                              self.edit_model_menu) 
    230233        #create  menubar items 
    231234        return [(self.menu1, self.sub_menu)] 
     
    260263            self.update_custom_combo() 
    261264            if os.path.isfile(p_path): 
    262                 msg = "Sorry! Could not be able to delete the default " 
    263                 msg += "custom model... \n" 
     265                msg = "Sorry! unable to delete the default " 
     266                msg += "plugin model... \n" 
    264267                msg += "Please manually remove the files (.py, .pyc) " 
    265268                msg += "in the 'plugin_models' folder \n" 
     
    274277                    if item.GetLabel() == label: 
    275278                        self.edit_menu.DeleteItem(item) 
    276                         msg = "The custom model, %s, has been deleted." % label 
     279                        msg = "The plugin model, %s, has been deleted." % label 
    277280                        evt = StatusEvent(status=msg, type='stop', info='info') 
    278281                        wx.PostEvent(self.parent, evt) 
     
    301304        Make new model 
    302305        """ 
    303         if self.new_model_frame != None: 
     306        if self.new_model_frame is not None: 
    304307            self.new_model_frame.Show(False) 
    305308            self.new_model_frame.Show(True) 
     
    331334            temp = self.fit_panel.reset_pmodel_list() 
    332335            if temp: 
    333                 # Set the new custom model list for all fit pages 
     336                # Set the new plugin model list for all fit pages 
    334337                for uid, page in self.fit_panel.opened_pages.iteritems(): 
    335338                    if hasattr(page, "formfactorbox"): 
     
    347350                                page.formfactorbox.SetLabel(current_val) 
    348351        except: 
    349             logging.error("update_custom_combo: %s", sys.exc_value) 
     352            logger.error("update_custom_combo: %s", sys.exc_value) 
    350353 
    351354    def set_edit_menu(self, owner): 
     
    385388        help for setting list of the edit model menu labels 
    386389        """ 
    387         if menu == None: 
     390        if menu is None: 
    388391            menu = self.edit_custom_model 
    389392        list_fnames = os.listdir(models.find_plugins_dir()) 
     
    440443            wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    441444 
    442         if page != None: 
     445        if page is not None: 
    443446            return set_focus_page(page) 
    444447        if caption == "Const & Simul Fit": 
     
    587590                msg = "Fitting: cannot deal with the theory received" 
    588591                evt = StatusEvent(status=msg, info="error") 
    589                 logging.error("set_theory " + msg + "\n" + str(sys.exc_value)) 
     592                logger.error("set_theory " + msg + "\n" + str(sys.exc_value)) 
    590593                wx.PostEvent(self.parent, evt) 
    591594 
     
    633636            state = self.temp_state[self.state_index] 
    634637            #panel state should have model selection to set_state 
    635             if state.formfactorcombobox != None: 
     638            if state.formfactorcombobox is not None: 
    636639                #set state 
    637640                data = self.parent.create_gui_data(state.data) 
     
    876879                enable1D=enable1D, enable2D=enable2D, 
    877880                qmin=qmin, qmax=qmax, weight=weight) 
    878  
    879     def _mac_sleep(self, sec=0.2): 
    880         """ 
    881         Give sleep to MAC 
    882         """ 
    883         if ON_MAC: 
    884             time.sleep(sec) 
    885881 
    886882    def draw_model(self, model, page_id, data=None, smearer=None, 
     
    10221018                return False 
    10231019        ## 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(): 
    10251021        #    self.calc_fit.stop() 
    10261022        msg = "Fitting is in progress..." 
     
    10311027                                manager=self, 
    10321028                                improvement_delta=0.1) 
    1033         self._mac_sleep(0.2) 
    10341029 
    10351030        # batch fit 
     
    11131108            page = self.fit_panel.add_empty_page() 
    11141109            # add data associated to the page created 
    1115             if page != None: 
     1110            if page is not None: 
    11161111                evt = StatusEvent(status="Page Created", info="info") 
    11171112                wx.PostEvent(self.parent, evt) 
     
    11321127        page = self.fit_panel.set_data(data) 
    11331128        # page could be None when loading state files 
    1134         if page == None: 
     1129        if page is None: 
    11351130            return page 
    11361131        #append Data1D to the panel containing its theory 
     
    12001195        """ 
    12011196        # case that uid is not specified 
    1202         if uid == None: 
     1197        if uid is None: 
    12031198            for page_id in self.page_finder.keys(): 
    12041199                self.page_finder[page_id].schedule_tofit(value) 
     
    12231218            for item in param: 
    12241219                ## 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: 
    12261221                    listOfConstraint.append((item[0], item[1])) 
    12271222        new_model = model 
     
    12381233        """ 
    12391234        panel = self.plot_panel 
    1240         if panel == None: 
     1235        if panel is None: 
    12411236            raise ValueError, "Fitting:_onSelect: NonType panel" 
    12421237        Plugin.on_perspective(self, event=event) 
     
    12601255        """ 
    12611256        """ 
    1262         print "update_fit result", result 
     1257        print("update_fit result", result) 
    12631258 
    12641259    def _batch_fit_complete(self, result, pars, page_id, 
     
    12711266        :param elapsed: time spent at the fitting level 
    12721267        """ 
    1273         self._mac_sleep(0.2) 
    12741268        uid = page_id[0] 
    12751269        if uid in self.fit_thread_list.keys(): 
     
    13331327                    new_theory = copy_data.data 
    13341328                    new_theory[res.index] = res.theory 
    1335                     new_theory[res.index == False] = numpy.nan 
     1329                    new_theory[res.index == False] = np.nan 
    13361330                    correct_result = True 
    13371331                #get all fittable parameters of the current model 
     
    13421336                        param_list.remove(param) 
    13431337                if not correct_result or res.fitness is None or \ 
    1344                     not numpy.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)): 
    13471341                    data_name = str(None) 
    13481342                    if data is not None: 
     
    13531347                    msg += "Data %s and Model %s did not fit.\n" % (data_name, 
    13541348                                                                    model_name) 
    1355                     ERROR = numpy.NAN 
     1349                    ERROR = np.NAN 
    13561350                    cell = BatchCell() 
    13571351                    cell.label = res.fitness 
     
    13671361                            batch_inputs["error on %s" % str(param)].append(ERROR) 
    13681362                else: 
    1369                     # TODO: Why sometimes res.pvec comes with numpy.float64? 
     1363                    # TODO: Why sometimes res.pvec comes with np.float64? 
    13701364                    # probably from scipy lmfit 
    1371                     if res.pvec.__class__ == numpy.float64: 
     1365                    if res.pvec.__class__ == np.float64: 
    13721366                        res.pvec = [res.pvec] 
    13731367 
     
    14651459        cell.value = index 
    14661460 
    1467         if theory_data != None: 
     1461        if theory_data is not None: 
    14681462            #Suucessful fit 
    14691463            theory_data.id = wx.NewId() 
     
    15211515            page_id = [] 
    15221516        ## fit more than 1 model at the same time 
    1523         self._mac_sleep(0.2) 
    15241517        try: 
    15251518            index = 0 
     
    15341527                fit_msg = res.mesg 
    15351528                if res.fitness is None or \ 
    1536                     not numpy.isfinite(res.fitness) or \ 
    1537                     numpy.any(res.pvec == None) or \ 
    1538                     not numpy.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)): 
    15391532                    fit_msg += "\nFitting did not converge!!!" 
    15401533                    wx.CallAfter(self._update_fit_button, page_id) 
    15411534                else: 
    15421535                    #set the panel when fit result are float not list 
    1543                     if res.pvec.__class__ == numpy.float64: 
     1536                    if res.pvec.__class__ == np.float64: 
    15441537                        pvec = [res.pvec] 
    15451538                    else: 
    15461539                        pvec = res.pvec 
    1547                     if res.stderr.__class__ == numpy.float64: 
     1540                    if res.stderr.__class__ == np.float64: 
    15481541                        stderr = [res.stderr] 
    15491542                    else: 
     
    15531546                    #(CallAfter is important to MAC) 
    15541547                    try: 
    1555                         #if res != None: 
     1548                        #if res is not None: 
    15561549                        wx.CallAfter(cpage.onsetValues, res.fitness, 
    15571550                                     res.param_list, 
     
    15961589        """ 
    15971590        event.Skip() 
    1598         if self.menu1 == None: 
     1591        if self.menu1 is None: 
    15991592            return 
    16001593        menu_item = self.menu1.FindItemById(self.id_reset_flag) 
     
    16551648        caption = evt.caption 
    16561649        enable_smearer = evt.enable_smearer 
    1657         if model == None: 
     1650        if model is None: 
    16581651            return 
    16591652        if uid not in self.page_finder.keys(): 
     
    16931686        if dy is None: 
    16941687            new_plot.is_data = False 
    1695             new_plot.dy = numpy.zeros(len(y)) 
     1688            new_plot.dy = np.zeros(len(y)) 
    16961689            # If this is a theory curve, pick the proper symbol to make it a curve 
    16971690            new_plot.symbol = GUIFRAME_ID.CURVE_SYMBOL_NUM 
     
    17071700        new_plot.title = data.name 
    17081701        new_plot.group_id = data.group_id 
    1709         if new_plot.group_id == None: 
     1702        if new_plot.group_id is None: 
    17101703            new_plot.group_id = data.group_id 
    17111704        new_plot.id = data_id 
     
    17421735        """ 
    17431736        try: 
    1744             numpy.nan_to_num(y) 
     1737            np.nan_to_num(y) 
    17451738            new_plot = self.create_theory_1D(x, y, page_id, model, data, state, 
    17461739                                             data_description=model.name, 
     
    17561749                                          data_id="Data  " + data.name + " unsmeared", 
    17571750                                          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)") 
    17671759 
    17681760            current_pg = self.fit_panel.get_page_by_id(page_id) 
     
    18081800        Handle exception from calculator by posting it as an error. 
    18091801        """ 
    1810         logging.error("".join(traceback.format_exception(etype, value, tb))) 
     1802        logger.error("".join(traceback.format_exception(etype, value, tb))) 
    18111803        msg = traceback.format_exception(etype, value, tb, limit=1) 
    18121804        evt = StatusEvent(status="".join(msg), type="stop", info="error") 
     
    18271819        that can be plot. 
    18281820        """ 
    1829         numpy.nan_to_num(image) 
     1821        np.nan_to_num(image) 
    18301822        new_plot = Data2D(image=image, err_image=data.err_data) 
    18311823        new_plot.name = model.name + '2d' 
     
    19651957                ## then kill itself but cannot.  Paul Kienzle came up with 
    19661958                ## 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. 
    19681961                ## We still don't know why the fit sometimes lauched a second 
    19691962                ## thread -- something which should also be investigated. 
     
    20112004        chisqr = None 
    20122005        #to compute chisq make sure data has valid data 
    2013         # return None if data == None 
    2014         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: 
    20152008            return chisqr 
    20162009 
    20172010        # Get data: data I, theory I, and data dI in order 
    20182011        if data_copy.__class__.__name__ == "Data2D": 
    2019             if index == None: 
    2020                 index = numpy.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: 
    20222015                data_copy.err_data = weight 
    20232016            # get rid of zero error points 
    20242017            index = index & (data_copy.err_data != 0) 
    2025             index = index & (numpy.isfinite(data_copy.data)) 
     2018            index = index & (np.isfinite(data_copy.data)) 
    20262019            fn = data_copy.data[index] 
    20272020            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: 
    20292022                return chisqr 
    20302023            gn = theory_data.data[index] 
     
    20322025        else: 
    20332026            # 1 d theory from model_thread is only in the range of index 
    2034             if index == None: 
    2035                 index = numpy.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: 
    20372030                data_copy.dy = weight 
    2038             if data_copy.dy == None or data_copy.dy == []: 
    2039                 dy = numpy.ones(len(data_copy.y)) 
     2031            if data_copy.dy is None or data_copy.dy == []: 
     2032                dy = np.ones(len(data_copy.y)) 
    20402033            else: 
    20412034                ## Set consistently w/AbstractFitengine: 
     
    20462039 
    20472040            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: 
    20492042                return chisqr 
    20502043            gn = theory_data.y 
     
    20552048            res = (fn - gn) / en 
    20562049        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))) 
    20582051            return 
    20592052 
    2060         residuals = res[numpy.isfinite(res)] 
     2053        residuals = res[np.isfinite(res)] 
    20612054        # get chisqr only w/finite 
    2062         chisqr = numpy.average(residuals * residuals) 
     2055        chisqr = np.average(residuals * residuals) 
    20632056 
    20642057        self._plot_residuals(page_id=page_id, data=data_copy, 
     
    20892082            theory_data = self.page_finder[page_id].get_theory_data(fid=data_copy.id) 
    20902083            gn = theory_data.data 
    2091             if weight == None: 
     2084            if weight is None: 
    20922085                en = data_copy.err_data 
    20932086            else: 
     
    20972090            residuals.qy_data = data_copy.qy_data 
    20982091            residuals.q_data = data_copy.q_data 
    2099             residuals.err_data = numpy.ones(len(residuals.data)) 
     2092            residuals.err_data = np.ones(len(residuals.data)) 
    21002093            residuals.xmin = min(residuals.qx_data) 
    21012094            residuals.xmax = max(residuals.qx_data) 
     
    21102103        else: 
    21112104            # 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 = numpy.ones(len(data_copy.y)) 
     2105            if data_copy.dy is None or data_copy.dy == []: 
     2106                dy = np.ones(len(data_copy.y)) 
    21142107            else: 
    2115                 if weight == None: 
    2116                     dy = numpy.ones(len(data_copy.y)) 
     2108                if weight is None: 
     2109                    dy = np.ones(len(data_copy.y)) 
    21172110                ## Set consitently w/AbstractFitengine: 
    21182111                ## But this should be corrected later. 
     
    21332126                residuals.y = (fn - gn[index]) / en 
    21342127            residuals.x = data_copy.x[index] 
    2135             residuals.dy = numpy.ones(len(residuals.y)) 
     2128            residuals.dy = np.ones(len(residuals.y)) 
    21362129            residuals.dx = None 
    21372130            residuals.dxl = None 
     
    21512144        ##group_id specify on which panel to plot this data 
    21522145        group_id = self.page_finder[page_id].get_graph_id() 
    2153         if group_id == None: 
     2146        if group_id is None: 
    21542147            group_id = data.group_id 
    21552148        new_plot.group_id = "res" + str(group_id) 
  • src/sas/sasgui/perspectives/fitting/media/plugin.rst

    r9687d58 r72100ee  
    538538    sin, cos, tan, asin, acos, atan: 
    539539        Trigonometry functions and inverses, operating on radians. 
    540     sinh, cos, tanh, asinh, acosh, atanh: 
     540    sinh, cosh, tanh, asinh, acosh, atanh: 
    541541        Hyperbolic trigonometry functions. 
    542542    atan2(y,x): 
  • src/sas/sasgui/perspectives/fitting/model_thread.py

    r9687d58 rc416a17  
    44 
    55import time 
    6 import numpy 
     6import numpy as np 
    77import math 
    88from sas.sascalc.data_util.calcthread import CalcThread 
     
    5353        self.starttime = time.time() 
    5454        # Determine appropriate q range 
    55         if self.qmin == None: 
     55        if self.qmin is None: 
    5656            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: 
    5959                newx = math.pow(max(math.fabs(self.data.xmax), 
    6060                                   math.fabs(self.data.xmin)), 2) 
     
    6868 
    6969        # Define matrix where data will be plotted 
    70         radius = numpy.sqrt((self.data.qx_data * self.data.qx_data) + \ 
     70        radius = np.sqrt((self.data.qx_data * self.data.qx_data) + \ 
    7171                    (self.data.qy_data * self.data.qy_data)) 
    7272 
     
    7575        index_model = (self.qmin <= radius) & (radius <= self.qmax) 
    7676        index_model = index_model & self.data.mask 
    77         index_model = index_model & numpy.isfinite(self.data.data) 
     77        index_model = index_model & np.isfinite(self.data.data) 
    7878 
    7979        if self.smearer is not None: 
     
    9191                self.data.qy_data[index_model] 
    9292            ]) 
    93         output = numpy.zeros(len(self.data.qx_data)) 
     93        output = np.zeros(len(self.data.qx_data)) 
    9494        # output default is None 
    9595        # This method is to distinguish between masked 
     
    177177        """ 
    178178        self.starttime = time.time() 
    179         output = numpy.zeros((len(self.data.x))) 
     179        output = np.zeros((len(self.data.x))) 
    180180        index = (self.qmin <= self.data.x) & (self.data.x <= self.qmax) 
    181181 
     
    189189                                                             self.qmax) 
    190190            mask = self.data.x[first_bin:last_bin+1] 
    191             unsmeared_output = numpy.zeros((len(self.data.x))) 
     191            unsmeared_output = np.zeros((len(self.data.x))) 
    192192            unsmeared_output[first_bin:last_bin+1] = self.model.evalDistribution(mask) 
     193            self.smearer.model = self.model 
    193194            output = self.smearer(unsmeared_output, first_bin, last_bin) 
    194195 
     
    196197            # Check that the arrays are compatible. If we only have a model but no data, 
    197198            # the length of data.y will be zero. 
    198             if isinstance(self.data.y, numpy.ndarray) and output.shape == self.data.y.shape: 
    199                 unsmeared_data = numpy.zeros((len(self.data.x))) 
    200                 unsmeared_error = numpy.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))) 
    201202                unsmeared_data[first_bin:last_bin+1] = self.data.y[first_bin:last_bin+1]\ 
    202203                                                        * unsmeared_output[first_bin:last_bin+1]\ 
     
    222223 
    223224        if p_model is not None and s_model is not None: 
    224             sq_values = numpy.zeros((len(self.data.x))) 
    225             pq_values = numpy.zeros((len(self.data.x))) 
     225            sq_values = np.zeros((len(self.data.x))) 
     226            pq_values = np.zeros((len(self.data.x))) 
    226227            sq_values[index] = s_model.evalDistribution(self.data.x[index]) 
    227228            pq_values[index] = p_model.evalDistribution(self.data.x[index]) 
  • src/sas/sasgui/perspectives/fitting/models.py

    r313c5c9 r81b1f4d  
    22    Utilities to manage models 
    33""" 
     4from __future__ import print_function 
     5 
    46import traceback 
    57import os 
     
    1921from sasmodels.sasview_model import load_custom_model, load_standard_models 
    2022 
     23logger = logging.getLogger(__name__) 
     24 
    2125 
    2226PLUGIN_DIR = 'plugin_models' 
    2327PLUGIN_LOG = os.path.join(os.path.expanduser("~"), '.sasview', PLUGIN_DIR, 
    2428                          "plugins.log") 
     29PLUGIN_NAME_BASE = '[plug-in] ' 
    2530 
    2631def get_model_python_path(): 
     
    138143        type, value, tb = sys.exc_info() 
    139144        if type is not None and issubclass(type, py_compile.PyCompileError): 
    140             print "Problem with", repr(value) 
     145            print("Problem with", repr(value)) 
    141146            raise type, value, tb 
    142147        return 1 
     
    158163 
    159164 
    160 def _findModels(dir): 
     165def _find_models(): 
    161166    """ 
    162167    Find custom models 
    163168    """ 
    164169    # List of plugin objects 
    165     dir = find_plugins_dir() 
     170    directory = find_plugins_dir() 
    166171    # 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         logging.warning(msg) 
     172    if not os.path.isdir(directory): 
     173        msg = "SasView couldn't locate Model plugin folder %r." % directory 
     174        logger.warning(msg) 
    170175        return {} 
    171176 
    172     plugin_log("looking for models in: %s" % str(dir)) 
    173     #compile_file(dir)  #always recompile the folder plugin 
    174     logging.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)) 
    175180 
    176181    plugins = {} 
    177     for filename in os.listdir(dir): 
     182    for filename in os.listdir(directory): 
    178183        name, ext = os.path.splitext(filename) 
    179184        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)) 
    181186            try: 
    182187                model = load_custom_model(path) 
    183                 model.name = "[plug-in] "+model.name 
     188                model.name = PLUGIN_NAME_BASE + model.name 
    184189                plugins[model.name] = model 
    185190            except Exception: 
     
    187192                msg += "\nwhile accessing model in %r" % path 
    188193                plugin_log(msg) 
    189                 logging.warning("Failed to load plugin %r. See %s for details" 
    190                                 % (path, PLUGIN_LOG)) 
    191              
     194                logger.warning("Failed to load plugin %r. See %s for details" 
     195                               % (path, PLUGIN_LOG)) 
     196 
    192197    return plugins 
    193198 
     
    259264        temp = {} 
    260265        if self.is_changed(): 
    261             return  _findModels(dir) 
    262         logging.info("plugin model : %s" % str(temp)) 
     266            return  _find_models() 
     267        logger.info("plugin model : %s" % str(temp)) 
    263268        return temp 
    264269 
     
    324329                    self.plugins.append(plug) 
    325330                    self.model_dictionary[name] = plug 
    326             self.model_combobox.set_list("Customized Models", self.plugins) 
     331            self.model_combobox.set_list("Plugin Models", self.plugins) 
    327332            return self.model_combobox.get_list() 
    328333        else: 
     
    334339        """ 
    335340        self.plugins = [] 
    336         new_plugins = _findModels(dir) 
     341        new_plugins = _find_models() 
    337342        for name, plug in  new_plugins.iteritems(): 
    338343            for stored_name, stored_plug in self.stored_plugins.iteritems(): 
     
    345350            self.model_dictionary[name] = plug 
    346351 
    347         self.model_combobox.reset_list("Customized Models", self.plugins) 
     352        self.model_combobox.reset_list("Plugin Models", self.plugins) 
    348353        return self.model_combobox.get_list() 
    349354 
     
    388393#                                     self.shape_indep_list) 
    389394        self.model_combobox.set_list("Structure Factors", self.struct_list) 
    390         self.model_combobox.set_list("Customized Models", self.plugins) 
     395        self.model_combobox.set_list("Plugin Models", self.plugins) 
    391396        self.model_combobox.set_list("P(Q)*S(Q)", self.multiplication_factor) 
    392397        self.model_combobox.set_list("multiplication", 
  • src/sas/sasgui/perspectives/fitting/pagestate.py

    rc8e1996 r959eb01  
    1818import copy 
    1919import logging 
    20 import numpy 
     20import numpy as np 
    2121import traceback 
    2222 
     
    2525from lxml import etree 
    2626 
     27from sasmodels import convert 
    2728import sasmodels.weights 
    2829 
     
    3233from sas.sascalc.dataloader.data_info import Data2D, Collimation, Detector 
    3334from sas.sascalc.dataloader.data_info import Process, Aperture 
     35 
     36logger = logging.getLogger(__name__) 
     37 
    3438# Information to read/write state as xml 
    3539FITTING_NODE_NAME = 'fitting_plug_in' 
    3640CANSAS_NS = "cansas1d/1.0" 
     41 
     42CUSTOM_MODEL = 'Plugin Models' 
     43CUSTOM_MODEL_OLD = 'Customized Models' 
    3744 
    3845LIST_OF_DATA_ATTRIBUTES = [["is_data", "is_data", "bool"], 
     
    6976                            ["dq_l", "dq_l", "float"], 
    7077                            ["dq_r", "dq_r", "float"], 
    71                             ["dx_max", "dx_max", "float"], 
    72                             ["dx_min", "dx_min", "float"], 
     78                            ["dx_percent", "dx_percent", "float"], 
    7379                            ["dxl", "dxl", "float"], 
    7480                            ["dxw", "dxw", "float"]] 
     
    210216        self.dq_l = None 
    211217        self.dq_r = None 
    212         self.dx_max = None 
    213         self.dx_min = None 
     218        self.dx_percent = None 
     219        self.dx_old = False 
    214220        self.dxl = None 
    215221        self.dxw = None 
     
    271277        # store value of chisqr 
    272278        self.tcChi = None 
     279        self.version = (1,0,0) 
    273280 
    274281    def clone(self): 
     
    337344        obj.dq_l = copy.deepcopy(self.dq_l) 
    338345        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) 
    341348        obj.dxl = copy.deepcopy(self.dxl) 
    342349        obj.dxw = copy.deepcopy(self.dxw) 
     
    349356        obj.cb1 = copy.deepcopy(self.cb1) 
    350357        obj.smearer = copy.deepcopy(self.smearer) 
     358        obj.version = copy.deepcopy(self.version) 
    351359 
    352360        for name, state in self.saved_states.iteritems(): 
     
    355363            obj.saved_states[copy_name] = copy_state 
    356364        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) 
    357497 
    358498    def _repr_helper(self, list, rep): 
     
    423563        rep += "dq_l  : %s\n" % self.dq_l 
    424564        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) 
    427566        rep += "dxl  : %s\n" % str(self.dxl) 
    428567        rep += "dxw : %s\n" % str(self.dxw) 
     
    483622            except Exception: 
    484623                msg = "Report string expected 'name: value' but got %r" % line 
    485                 logging.error(msg) 
     624                logger.error(msg) 
    486625            if name.count("State created"): 
    487626                repo_time = "" + value 
     
    525664                except Exception: 
    526665                    msg = "While parsing 'data: ...'\n" 
    527                     logging.error(msg + traceback.format_exc()) 
     666                    logger.error(msg + traceback.format_exc()) 
    528667            if name == "model name ": 
    529668                try: 
     
    541680                except Exception: 
    542681                    msg = "While parsing 'Plotting Range: ...'\n" 
    543                     logging.error(msg + traceback.format_exc()) 
     682                    logger.error(msg + traceback.format_exc()) 
    544683        paramval = "" 
    545684        for lines in param_string.split(":"): 
     
    682821 
    683822        attr = newdoc.createAttribute("version") 
    684         attr.nodeValue = '1.0' 
     823        from sas import sasview 
     824        attr.nodeValue = sasview.__version__ 
     825        # attr.nodeValue = '1.0' 
    685826        top_element.setAttributeNode(attr) 
    686827 
     
    8751016            raise RuntimeError, msg 
    8761017 
    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) 
    8781027 
    8791028            # Get file name 
     
    8901039                    msg = "PageState.fromXML: Could not" 
    8911040                    msg += " read timestamp\n %s" % sys.exc_value 
    892                     logging.error(msg) 
     1041                    logger.error(msg) 
    8931042 
    8941043            if entry is not None: 
     
    8991048                    setattr(self, item[0], parse_entry_helper(node, item)) 
    9001049 
     1050                dx_old_node = get_content('ns:%s' % 'dx_min', entry) 
    9011051                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)) 
    9041060 
    9051061                for item in LIST_OF_STATE_PARAMETERS: 
     
    9231079                            except Exception: 
    9241080                                base = "unable to load distribution %r for %s" 
    925                                 logging.error(base % (value, parameter)) 
     1081                                logger.error(base % (value, parameter)) 
    9261082                                continue 
    9271083                        _disp_obj_dict = getattr(self, varname) 
     
    9451101                                msg = ("Error reading %r from %s %s\n" 
    9461102                                       % (line, tagname, name)) 
    947                                 logging.error(msg + traceback.format_exc()) 
    948                         dic[name] = numpy.array(value_list) 
     1103                                logger.error(msg + traceback.format_exc()) 
     1104                        dic[name] = np.array(value_list) 
    9491105                    setattr(self, varname, dic) 
    9501106 
     
    10331189        if self.cansas: 
    10341190            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 Data2D 
    1039  
    1040         :param datainfo: Data2D object 
    1041  
    1042         """ 
    1043         if not issubclass(datainfo.__class__, Data2D): 
    1044             raise RuntimeError, "The cansas writer expects a Data2D instance" 
    1045  
    1046         title = "cansas1d/%s" % self.version 
    1047         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 info 
    1072         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 info 
    1095         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 info 
    1136         instr = doc.createElement("SASinstrument") 
    1137         entry_node.appendChild(instr) 
    1138  
    1139         write_node(doc, instr, "name", datainfo.instrument) 
    1140  
    1141         #   Source 
    1142         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         #   Collimation 
    1176         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         #   Detectors 
    1209         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 info 
    1264         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 with 
    1278         # the data we just wrote 
    1279         return doc, entry_node 
    12801191 
    12811192    def _parse_state(self, entry): 
     
    12981209 
    12991210        except: 
    1300             logging.info("XML document does not contain fitting information.\n" 
     1211            logger.info("XML document does not contain fitting information.\n" 
    13011212                         + traceback.format_exc()) 
    13021213 
     
    13541265        """ 
    13551266        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, _ 
    16141269 
    16151270    def _read_cansas(self, path): 
     
    16921347                        name = original_fname 
    16931348                    state.data.group_id = name 
     1349                    state.version = fitstate.version 
    16941350                    # store state in fitting 
    16951351                    self.call_back(state=state, 
     
    17451401            state.data.run_name[0] = state.data.name 
    17461402 
    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) 
    17541405 
    17551406        if state is not None: 
  • src/sas/sasgui/perspectives/fitting/report_dialog.py

    rd85c194 r7432acb  
    3939        self.nimages = len(self.report_list[2]) 
    4040 
    41         if self.report_list[2] != None: 
     41        if self.report_list[2] is not None: 
    4242            # put image path in the report string 
    4343            if len(self.report_list[2]) == 1: 
  • src/sas/sasgui/perspectives/fitting/utils.py

    rd85c194 r959eb01  
    22Module contains functions frequently used in this package 
    33""" 
    4 import numpy 
     4import numpy as np 
    55 
    66 
     
    1919        data = data.y 
    2020    if flag == 0: 
    21         weight = numpy.ones_like(data) 
     21        weight = np.ones_like(data) 
    2222    elif flag == 1: 
    2323        weight = dy_data 
    2424    elif flag == 2: 
    25         weight = numpy.sqrt(numpy.abs(data)) 
     25        weight = np.sqrt(np.abs(data)) 
    2626    elif flag == 3: 
    27         weight = numpy.abs(data) 
     27        weight = np.abs(data) 
    2828    return weight 
Note: See TracChangeset for help on using the changeset viewer.