Changes in / [ef74a8b:3d5e629] in sasview


Ignore:
File:
1 edited

Legend:

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

    rba1c145 rca4f40d  
    1313import time 
    1414import traceback 
     15import logging 
    1516 
    1617from sasmodels.weights import MODELS as POLYDISPERSITY_MODELS 
    1718 
    1819from sas.sascalc.fit.qsmearing import smear_selection 
     20from sas.sascalc.dataloader.data_info import Data1D, Data2D 
    1921 
    2022from sas.sasgui.guiframe.events import StatusEvent, NewPlotEvent, \ 
     
    2830    PageInfoEvent 
    2931from .basepage import ModelTextCtrl 
     32 
     33logger = logging.getLogger(__name__) 
    3034 
    3135(Chi2UpdateEvent, EVT_CHI2_UPDATE) = wx.lib.newevent.NewEvent() 
     
    184188        :return: True or False 
    185189        """ 
    186         if self.data.__class__.__name__ == "Data2D" or \ 
    187                         self.enable2D: 
     190        if isinstance(self.data, Data2D) or self.enable2D: 
    188191            return True 
    189192        return False 
     
    199202 
    200203        # Check if data is 2D 
    201         if self.data.__class__.__name__ == "Data2D" or \ 
    202                         self.enable2D: 
     204        if isinstance(self.data, Data2D) or self.enable2D: 
    203205            is_2d_data = True 
    204206 
     
    213215        smear_message_new_psmear = \ 
    214216              "Please enter a fixed percentage to be applied to all Q values..." 
    215         smear_message_2d_x_title = "<dQp>[1/A]:" 
    216         smear_message_2d_y_title = "<dQs>[1/A]:" 
    217         smear_message_pinhole_percent_title = "dQ[%]:" 
     217        smear_message_2d_x_title = "<dQ/Q>_r[%]:" 
     218        smear_message_2d_y_title = "<dQ/Q>_phi[%]:" 
     219        smear_message_pinhole_percent_min_title = "[dQ/Q]min(%):" 
     220        smear_message_pinhole_percent_max_title = "[dQ/Q]max(%):" 
     221        smear_message_pinhole_percent_title = "dQ/Q(%):" 
    218222        smear_message_slit_height_title = "Slit height[1/A]:" 
    219223        smear_message_slit_width_title = "Slit width[1/A]:" 
     
    418422                            smear_message_2d_x_title, style=wx.ALIGN_LEFT) 
    419423        self.smear_description_2d_x.SetToolTipString( 
    420                                         "  dQp(parallel) in q_r direction.") 
     424                                        "  dQ_r q_r in polar coordinates.") 
    421425        self.smear_description_2d_y = wx.StaticText(self, wx.ID_ANY, 
    422426                            smear_message_2d_y_title, style=wx.ALIGN_LEFT) 
    423427        self.smear_description_2d_y.SetToolTipString( 
    424                                     " dQs(perpendicular) in q_phi direction.") 
     428                                    " dQ_phi q_phi in polar coordinates.") 
     429        self.smear_description_pin_percent_min = wx.StaticText(self, wx.ID_ANY, 
     430                                            smear_message_pinhole_percent_min_title, 
     431                                            style=wx.ALIGN_LEFT) 
     432        self.smear_description_pin_percent_max = wx.StaticText(self, wx.ID_ANY, 
     433                                            smear_message_pinhole_percent_max_title, 
     434                                            style=wx.ALIGN_LEFT) 
    425435        self.smear_description_pin_percent = wx.StaticText(self, wx.ID_ANY, 
    426436                                            smear_message_pinhole_percent_title, 
     
    449459        self.sizer_new_smear.Add((15, -1)) 
    450460        self.sizer_new_smear.Add(self.smear_description_2d_x, 0, wx.CENTER, 10) 
     461        self.sizer_new_smear.Add(self.smear_description_pin_percent_min, 
     462                                 0, wx.CENTER, 10) 
     463        self.sizer_new_smear.Add(self.smear_description_pin_percent, 
     464                                 0, wx.CENTER, 10) 
    451465        self.sizer_new_smear.Add(self.smear_description_slit_height, 
    452466                                 0, wx.CENTER, 10) 
    453467 
     468        self.sizer_new_smear.Add(self.smear_pinhole_percent, 0, wx.CENTER, 10) 
    454469        self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 
    455470        self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) 
     
    457472        self.sizer_new_smear.Add(self.smear_description_2d_y, 
    458473                                 0, wx.CENTER, 10) 
    459         self.sizer_new_smear.Add(self.smear_description_pin_percent, 
     474        self.sizer_new_smear.Add(self.smear_description_pin_percent_max, 
    460475                                 0, wx.CENTER, 10) 
    461476        self.sizer_new_smear.Add(self.smear_description_slit_width, 
    462477                                 0, wx.CENTER, 10) 
    463478 
    464         self.sizer_new_smear.Add(self.smear_pinhole_percent, 0, wx.CENTER, 10) 
    465479        self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 
    466480        self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) 
     
    503517 
    504518        # check if it is 2D data 
    505         if self.data.__class__.__name__ == "Data2D" or self.enable2D: 
     519        if isinstance(self.data, Data2D) or self.enable2D: 
    506520            is_2d_data = True 
    507521 
     
    806820                        self.sizer4_4.Add(cb, (iy, ix), (1, 1), 
    807821                                wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 
    808                         if self.data.__class__.__name__ == "Data2D" or \ 
    809                                     self.enable2D: 
     822                        if isinstance(self.data, Data2D) or self.enable2D: 
    810823                            cb.Show(True) 
    811824                        elif cb.IsShown(): 
     
    819832                        ctl1.SetToolTipString(poly_tip) 
    820833                        ctl1.SetValue(str(format_number(value, True))) 
    821                         if self.data.__class__.__name__ == "Data2D" or \ 
    822                                     self.enable2D: 
     834                        if isinstance(self.data, Data2D) or self.enable2D: 
    823835                            if first_orient: 
    824836                                values.SetLabel('PD[ratio], Sig[deg]') 
     
    854866 
    855867                        ctl2.Hide() 
    856                         if self.data.__class__.__name__ == "Data2D" or \ 
    857                                 self.enable2D: 
     868                        if isinstance(self.data, Data2D) or self.enable2D: 
    858869                            if self.is_mac: 
    859870                                text2.Show(True) 
     
    880891                        ctl4.Hide() 
    881892 
    882                         if self.data.__class__.__name__ == "Data2D" or \ 
    883                                 self.enable2D: 
     893                        if isinstance(self.data, Data2D) or self.enable2D: 
    884894                            ctl3.Show(True) 
    885895                            ctl4.Show(True) 
     
    893903 
    894904                        Tctl.SetValue(str(format_number(value))) 
    895                         if self.data.__class__.__name__ == "Data2D" or \ 
    896                                 self.enable2D: 
     905                        if isinstance(self.data, Data2D) or self.enable2D: 
    897906                            Tctl.Show(True) 
    898907                        else: 
     
    913922 
    914923                        Tct2.SetValue(str(format_number(value))) 
    915                         if self.data.__class__.__name__ == "Data2D" or \ 
    916                                 self.enable2D: 
     924                        if isinstance(self.data, Data2D) or self.enable2D: 
    917925                            Tct2.Show(True) 
    918926                        else: 
     
    941949                                            text2, ctl2, ctl3, ctl4, disp_box]) 
    942950 
    943                 if self.data.__class__.__name__ == "Data2D" or \ 
    944                                 self.enable2D: 
     951                if isinstance(self.data, Data2D) or self.enable2D: 
    945952                    disp_box.Show(True) 
    946953                else: 
     
    13271334                        flag1 = self.update_pinhole_smear() 
    13281335                        flag = flag or flag1 
    1329                 elif self.data.__class__.__name__ != "Data2D" and \ 
    1330                         not self.enable2D: 
     1336                elif not isinstance(self.data, Data2D) and not self.enable2D: 
    13311337                    enable_smearer = not self.disable_smearer.GetValue() 
    13321338                    self._manager.set_smearer(smearer=temp_smearer, 
     
    14011407        if event is not None: 
    14021408            event.Skip() 
    1403         if self.data.__class__.__name__ == "Data2D": 
     1409        if isinstance(self.data, Data2D): 
    14041410            return 
    14051411        is_click = event.LeftDown() 
     
    14191425        if event is not None: 
    14201426            event.Skip() 
    1421         if self.data.__class__.__name__ == "Data2D": 
     1427        if isinstance(self.data, Data2D): 
    14221428            return 
    14231429        act_ctrl = event.GetEventObject() 
     
    14351441        """ 
    14361442        event.Skip() 
    1437         if self.data.__class__.__name__ == "Data2D": 
     1443        if isinstance(self.data, Data2D): 
    14381444            return 
    14391445        ctrl = event.GetEventObject() 
     
    14961502            # Check if # of points for theory model are valid(>0). 
    14971503            # check for 2d 
    1498             if self.data.__class__.__name__ == "Data2D" or \ 
    1499                     self.enable2D: 
     1504            if isinstance(self.data, Data2D) or self.enable2D: 
    15001505                # set mask 
    15011506                radius = np.sqrt(self.data.qx_data * self.data.qx_data + 
     
    15491554                if item[0].IsShown(): 
    15501555                    # Skip the angle parameters if 1D data 
    1551                     if self.data.__class__.__name__ != "Data2D" and \ 
    1552                             not self.enable2D: 
     1556                    if not isinstance(self.data, Data2D) and not self.enable2D: 
    15531557                        if item in self.orientation_params: 
    15541558                            continue 
     
    15681572                if item[0].IsShown(): 
    15691573                    # Skip the angle parameters if 1D data 
    1570                     if self.data.__class__.__name__ != "Data2D" and \ 
    1571                             not self.enable2D: 
     1574                    if not isinstance(self.data, Data2D) and not self.enable2D: 
    15721575                        if item in self.orientation_params: 
    15731576                            continue 
     
    16011604 
    16021605        :return: self.smear_type, self.dq_l and self.dq_r, 
    1603             respectively the type of the smear, dq_min and 
    1604             dq_max for pinhole smear data 
    1605             while dxl and dxw for slit smear 
    1606         """ 
    1607         # default 
     1606            respectively the type of the smear, The average <dq/q> radial(p) 
     1607            and <dq/q> theta (s)s for 2D pinhole resolution in % (slit is not 
     1608            currently supported in 2D), (dq/q)_min and (dq/q)_max for 1D pinhole 
     1609            smeared data, again in %, and dxl and/or dxw for slit smeared data 
     1610            given in 1/A and assumed constant. 
     1611        """ 
     1612        # set up defaults 
    16081613        self.smear_type = None 
    16091614        self.dq_l = None 
    16101615        self.dq_r = None 
    16111616        data = self.data 
     1617        #sanity check - this should only be called if data exits 
    16121618        if self.data is None: 
    16131619            return 
    1614         elif self.data.__class__.__name__ == "Data2D" or \ 
    1615             self.enable2D: 
    1616             if data.dqx_data is None or data.dqy_data is None: 
    1617                 return 
    1618             elif self.current_smearer is not None \ 
    1619                 and data.dqx_data.any() != 0 \ 
    1620                 and data.dqx_data.any() != 0: 
     1620        #First check if data is 2D 
     1621        #If so check that data set has smearing info and that none are zero. 
     1622        #Otherwise no smearing can be applied using smear from data (a Gaussian 
     1623        #width of zero will cause a divide by zero error) 
     1624        if isinstance(self.data, Data2D): 
     1625            if data.dqx_data is not None and data.dqy_data is not None \ 
     1626              and data.dqx_data.all()and data.dqy_data.all(): 
    16211627                self.smear_type = "Pinhole2d" 
    1622                 self.dq_l = format_number(np.average(data.dqx_data)) 
    1623                 self.dq_r = format_number(np.average(data.dqy_data)) 
    1624                 return 
     1628                #report as average dQ/Q % as for 1D pinhole 
     1629                self.dq_l = format_number(np.average(data.dqx_data 
     1630                                                     / abs(data.qx_data)) * 100) 
     1631                self.dq_r = format_number(np.average(data.dqy_data 
     1632                                                     / abs(data.qy_data)) * 100) 
     1633            #if not then log that data did not contain resolutin info                                         / abs(data.qy_data)) * 100) 
    16251634            else: 
    1626                 return 
    1627         # check if it is pinhole smear and get min max if it is. 
    1628         if data.dx is not None and np.any(data.dx): 
    1629             self.smear_type = "Pinhole" 
    1630             self.dq_l = data.dx[0] 
    1631             self.dq_r = data.dx[-1] 
    1632  
    1633         # check if it is slit smear and get min max if it is. 
    1634         elif data.dxl is not None or data.dxw is not None: 
    1635             self.smear_type = "Slit" 
    1636             if data.dxl is not None and np.all(data.dxl, 0): 
    1637                 self.dq_l = data.dxl[0] 
    1638             if data.dxw is not None and np.all(data.dxw, 0): 
    1639                 self.dq_r = data.dxw[0] 
     1635                self.msg = "2D Data did not contain recognizable " \ 
     1636                           "resolution info." 
     1637                logger.info(self.msg) 
     1638        #If not check that data is 1D 
     1639        #If so check for pinhole vs slit by veryfing whehter dx or dxl or dxw 
     1640        #have data (currently sasview only supports either dx or dxl/dxw but 
     1641        #not both simultaneously) and, as for 2D, are non zero . 
     1642        #Otherwise no smearing can be applied using smear from data (a Gaussian 
     1643        #width of zero will cause a divide by zero error) 
     1644        elif isinstance(self.data, Data1D): 
     1645            #is it valid 1D pinhole resolution data? 
     1646            if data.dx is not None and np.all(data.dx): 
     1647                self.smear_type = "Pinhole" 
     1648                #report in % for display makes more sense than absolute value 
     1649                #for pinhole smearing .. but keep old names of dq_l 
     1650                self.dq_l = format_number(data.dx[0] / data.x[0] * 100,1) 
     1651                self.dq_r = format_number(data.dx[-1] / data.x[-1] * 100,1) 
     1652            #If not, is it valid 1D slit resolution data? 
     1653            elif (data.dxl is not None or data.dxw is not None) \ 
     1654                and (np.all(data.dxl, 0) or np.all(data.dxw, 0)): 
     1655                self.smear_type = "Slit" 
     1656                #for slit units of 1/A make most sense 
     1657                if data.dxl is not None and np.all(data.dxl, 0): 
     1658                    self.dq_l = format_number(data.dxl[0],1) 
     1659                if data.dxw is not None and np.all(data.dxw, 0): 
     1660                    self.dq_r = format_number(data.dxw[0],1) 
     1661            #otherwise log that the data did not conatain resolution info 
     1662            else: 
     1663                self.msg = "1D Data did not contain recognizable " \ 
     1664                           "resolution info." 
     1665                logger.info(self.msg) 
     1666        #If drops to here it is neither data1D or data2D so log that 
     1667        else: 
     1668            self.msg = "Data was not recognized as either 1D or 2D data." 
     1669            logger.info(self.msg) 
    16401670        # return self.smear_type,self.dq_l,self.dq_r 
    16411671 
     
    16441674        Show only the sizers depending on smear selection 
    16451675        """ 
    1646         # smear disabled 
     1676        # smear disabled = No Smearing used 
    16471677        if self.disable_smearer.GetValue(): 
    16481678            self.smear_description_none.Show(True) 
    1649         # 2Dsmear 
     1679        # 2Dsmearing - for use with 2D data only 
    16501680        elif self._is_2D(): 
    16511681            self.smear_description_accuracy_type.Show(True) 
    16521682            self.smear_accuracy.Show(True) 
    1653             self.smear_description_accuracy_type.Show(True) 
    16541683            self.smear_description_2d.Show(True) 
    1655             self.smear_description_2d_x.Show(True) 
    1656             self.smear_description_2d_y.Show(True) 
     1684            #2D custom pinhole smearing 
    16571685            if self.pinhole_smearer.GetValue(): 
     1686                self.smear_description_pin_percent.Show(True) 
    16581687                self.smear_pinhole_percent.Show(True) 
    1659         # smear from data 
     1688            #get 2D smearing from data 
     1689            elif self.enable_smearer.GetValue(): 
     1690                self.smear_description_2d_x.Show(True) 
     1691                self.smear_description_2d_y.Show(True) 
     1692                self.smear_data_left.Show(True) 
     1693                self.smear_data_right.Show(True) 
     1694            #Currently 2D custom slit smearing is not currently supported 
     1695            else: 
     1696                logger.error("2D custom smearing cannot use slit smearing") 
     1697 
     1698        # 1D smearing from data 
    16601699        elif self.enable_smearer.GetValue(): 
    1661  
    16621700            self.smear_description_dqdata.Show(True) 
    16631701            if self.smear_type is not None: 
    16641702                self.smear_description_smear_type.Show(True) 
     1703                #1D data has slit smearing 
    16651704                if self.smear_type == 'Slit': 
    16661705                    self.smear_description_slit_height.Show(True) 
    16671706                    self.smear_description_slit_width.Show(True) 
     1707                #1D data has pinhole smearing 
    16681708                elif self.smear_type == 'Pinhole': 
    1669                     self.smear_description_pin_percent.Show(True) 
     1709                    self.smear_description_pin_percent_min.Show(True) 
     1710                    self.smear_description_pin_percent_max.Show(True) 
    16701711                self.smear_description_smear_type.Show(True) 
    16711712                self.smear_description_type.Show(True) 
    16721713                self.smear_data_left.Show(True) 
    16731714                self.smear_data_right.Show(True) 
    1674         # custom pinhole smear 
     1715        # 1D custom pinhole smearing 
    16751716        elif self.pinhole_smearer.GetValue(): 
    1676             if self.smear_type == 'Pinhole': 
    1677                 self.smear_message_new_p.Show(True) 
    1678                 self.smear_description_pin_percent.Show(True) 
    1679  
     1717            self.smear_message_new_p.Show(True) 
     1718            self.smear_description_pin_percent.Show(True) 
    16801719            self.smear_pinhole_percent.Show(True) 
    1681         # custom slit smear 
     1720        # 1D custom slit smear 
    16821721        elif self.slit_smearer.GetValue(): 
    16831722            self.smear_message_new_s.Show(True) 
     
    16861725            self.smear_description_slit_width.Show(True) 
    16871726            self.smear_slit_width.Show(True) 
     1727        else: 
     1728            logger.error("smearing type is not defined") 
    16881729 
    16891730    def _hide_all_smear_info(self): 
     
    17031744        self.smear_data_left.Hide() 
    17041745        self.smear_data_right.Hide() 
     1746        self.smear_description_pin_percent_min.Hide() 
     1747        self.smear_description_pin_percent_max.Hide() 
    17051748        self.smear_description_pin_percent.Hide() 
    17061749        self.smear_pinhole_percent.Hide() 
     
    19201963            di_flag = False 
    19211964            dq_flag = False 
    1922             if self.data.__class__.__name__ == "Data2D" or \ 
    1923                         self.enable2D: 
     1965            if isinstance(self.data, Data2D) or self.enable2D: 
    19241966                self.slit_smearer.Disable() 
    19251967                self.pinhole_smearer.Enable(True) 
     
    20062048        # update model plot with new data information 
    20072049        if flag: 
    2008             if self.data.__class__.__name__ == "Data2D": 
     2050            if isinstance(self.data, Data2D): 
    20092051                self.enable2D = True 
    20102052                self.model_view.SetLabel("2D Mode") 
     
    20732115        npts2fit = 0 
    20742116        qmin, qmax = self.get_range() 
    2075         if self.data.__class__.__name__ == "Data2D" or \ 
    2076                         self.enable2D: 
     2117        if isinstance(self.data, Data2D) or self.enable2D: 
    20772118            radius = np.sqrt(self.data.qx_data * self.data.qx_data + 
    20782119                                self.data.qy_data * self.data.qy_data) 
     
    24642505            of the values entered for slit smear 
    24652506        """ 
    2466         if self.data.__class__.__name__ == "Data2D" or self.enable2D: 
     2507        if isinstance(self.data, Data2D) or self.enable2D: 
    24672508            return 
    24682509        # make sure once more if it is smearer 
     
    26602701        for item in self.parameters: 
    26612702            # Skip t ifhe angle parameters if 1D data 
    2662             if self.data.__class__.__name__ != "Data2D" and\ 
    2663                         not self.enable2D: 
     2703            if not isinstance(self.data, Data2D) and not self.enable2D: 
    26642704                if item in self.orientation_params: 
    26652705                    continue 
     
    26772717        for item in self.fittable_param: 
    26782718            # Skip t ifhe angle parameters if 1D data 
    2679             if self.data.__class__.__name__ != "Data2D" and\ 
    2680                         not self.enable2D: 
     2719            if not isinstance(self.data, Data2D) and not self.enable2D: 
    26812720                if item in self.orientation_params: 
    26822721                    continue 
     
    26902729 
    26912730        # Calculate num. of angle parameters 
    2692         if self.data.__class__.__name__ == "Data2D" or \ 
    2693                        self.enable2D: 
     2731        if isinstance(self.data, Data2D) or self.enable2D: 
    26942732            len_orient_para = 0 
    26952733        else: 
     
    29843022                if not self._has_magnetic: 
    29853023                    mag_on_button.Show(False) 
    2986                 elif not self.data.__class__.__name__ == "Data2D": 
     3024                elif not isinstance(self.data, Data2D): 
    29873025                    mag_on_button.Show(False) 
    29883026                else: 
     
    30003038                        mag_angle_help_button.Show(False) 
    30013039 
    3002                 if not self.data.__class__.__name__ == "Data2D" and \ 
    3003                         not self.enable2D: 
     3040                if not isinstance(self.data, Data2D) and not self.enable2D: 
    30043041                    orient_angle.Hide() 
    30053042                else: 
     
    30253062                    cb.SetToolTipString("Check mark to fit") 
    30263063                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 
    3027                     if self.data.__class__.__name__ == "Data2D" or \ 
    3028                             self.enable2D: 
     3064                    if isinstance(self.data, Data2D) or self.enable2D: 
    30293065                        cb.Show(True) 
    30303066                    else: 
     
    30413077                                "Hit 'Enter' after typing to update the plot.") 
    30423078                    ctl1.SetValue(format_number(value, True)) 
    3043                     if self.data.__class__.__name__ == "Data2D" or \ 
    3044                             self.enable2D: 
     3079                    if isinstance(self.data, Data2D) or self.enable2D: 
    30453080                        ctl1.Show(True) 
    30463081                    else: 
     
    30823117                    ctl4.Hide() 
    30833118 
    3084                     if self.data.__class__.__name__ == "Data2D" or \ 
    3085                             self.enable2D: 
     3119                    if isinstance(self.data, Data2D) or self.enable2D: 
    30863120                        if self.is_mac: 
    30873121                            text2.Show(True) 
     
    30993133                        units = wx.StaticText(self, -1, "", 
    31003134                                              style=wx.ALIGN_LEFT) 
    3101                     if self.data.__class__.__name__ == "Data2D" or \ 
    3102                             self.enable2D: 
     3135                    if isinstance(self.data, Data2D) or self.enable2D: 
    31033136                        units.Show(True) 
    31043137                    else: 
     
    31793212        """ 
    31803213        # more disables for 2D 
    3181         if self.data.__class__.__name__ == "Data2D" or \ 
    3182                     self.enable2D: 
     3214        if isinstance(self.data, Data2D) or self.enable2D: 
    31833215            self.slit_smearer.Disable() 
    3184             self.pinhole_smearer.Enable(True) 
    31853216            self.default_mask = copy.deepcopy(self.data.mask) 
    3186         else: 
    3187             self.slit_smearer.Enable(True) 
    3188             self.pinhole_smearer.Enable(True) 
     3217            if self.model is not None: 
     3218                self.pinhole_smearer.Enable(True) 
     3219 
     3220        elif isinstance(self.data, Data1D): 
     3221            if self.model is not None: 
     3222                self.slit_smearer.Enable(True) 
     3223                self.pinhole_smearer.Enable(True) 
     3224        else: 
     3225            msg="data is not recognized as either 1D or 2D" 
     3226            logger.info(msg) 
    31893227 
    31903228 
Note: See TracChangeset for help on using the changeset viewer.