Changeset 82d88d5 in sasview for src/sas/sasgui/perspectives/fitting/fitpage.py
- Timestamp:
- Mar 6, 2019 4:18:09 PM (5 years ago)
- Branches:
- master, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1249
- Children:
- f923967
- Parents:
- cb64d86 (diff), f205d3a (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/fitting/fitpage.py
r5251ec6 r82d88d5 13 13 import time 14 14 import traceback 15 import logging 15 16 16 17 from sasmodels.weights import MODELS as POLYDISPERSITY_MODELS 17 18 18 19 from sas.sascalc.fit.qsmearing import smear_selection 20 from sas.sascalc.dataloader.data_info import Data1D, Data2D 19 21 20 22 from sas.sasgui.guiframe.events import StatusEvent, NewPlotEvent, \ … … 28 30 PageInfoEvent 29 31 from .basepage import ModelTextCtrl 32 33 logger = logging.getLogger(__name__) 30 34 31 35 (Chi2UpdateEvent, EVT_CHI2_UPDATE) = wx.lib.newevent.NewEvent() … … 184 188 :return: True or False 185 189 """ 186 if self.data.__class__.__name__ == "Data2D" or \ 187 self.enable2D: 190 if isinstance(self.data, Data2D) or self.enable2D: 188 191 return True 189 192 return False … … 199 202 200 203 # 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: 203 205 is_2d_data = True 204 206 … … 213 215 smear_message_new_psmear = \ 214 216 "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(%):" 218 222 smear_message_slit_height_title = "Slit height[1/A]:" 219 223 smear_message_slit_width_title = "Slit width[1/A]:" … … 418 422 smear_message_2d_x_title, style=wx.ALIGN_LEFT) 419 423 self.smear_description_2d_x.SetToolTipString( 420 " dQ p(parallel) in q_r direction.")424 " dQ_r q_r in polar coordinates.") 421 425 self.smear_description_2d_y = wx.StaticText(self, wx.ID_ANY, 422 426 smear_message_2d_y_title, style=wx.ALIGN_LEFT) 423 427 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) 425 435 self.smear_description_pin_percent = wx.StaticText(self, wx.ID_ANY, 426 436 smear_message_pinhole_percent_title, … … 449 459 self.sizer_new_smear.Add((15, -1)) 450 460 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) 451 465 self.sizer_new_smear.Add(self.smear_description_slit_height, 452 466 0, wx.CENTER, 10) 453 467 468 self.sizer_new_smear.Add(self.smear_pinhole_percent, 0, wx.CENTER, 10) 454 469 self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 455 470 self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) … … 457 472 self.sizer_new_smear.Add(self.smear_description_2d_y, 458 473 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, 460 475 0, wx.CENTER, 10) 461 476 self.sizer_new_smear.Add(self.smear_description_slit_width, 462 477 0, wx.CENTER, 10) 463 478 464 self.sizer_new_smear.Add(self.smear_pinhole_percent, 0, wx.CENTER, 10)465 479 self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 466 480 self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) … … 503 517 504 518 # 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: 506 520 is_2d_data = True 507 521 … … 806 820 self.sizer4_4.Add(cb, (iy, ix), (1, 1), 807 821 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: 810 823 cb.Show(True) 811 824 elif cb.IsShown(): … … 819 832 ctl1.SetToolTipString(poly_tip) 820 833 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: 823 835 if first_orient: 824 836 values.SetLabel('PD[ratio], Sig[deg]') … … 854 866 855 867 ctl2.Hide() 856 if self.data.__class__.__name__ == "Data2D" or \ 857 self.enable2D: 868 if isinstance(self.data, Data2D) or self.enable2D: 858 869 if self.is_mac: 859 870 text2.Show(True) … … 880 891 ctl4.Hide() 881 892 882 if self.data.__class__.__name__ == "Data2D" or \ 883 self.enable2D: 893 if isinstance(self.data, Data2D) or self.enable2D: 884 894 ctl3.Show(True) 885 895 ctl4.Show(True) … … 893 903 894 904 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: 897 906 Tctl.Show(True) 898 907 else: … … 913 922 914 923 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: 917 925 Tct2.Show(True) 918 926 else: … … 941 949 text2, ctl2, ctl3, ctl4, disp_box]) 942 950 943 if self.data.__class__.__name__ == "Data2D" or \ 944 self.enable2D: 951 if isinstance(self.data, Data2D) or self.enable2D: 945 952 disp_box.Show(True) 946 953 else: … … 1327 1334 flag1 = self.update_pinhole_smear() 1328 1335 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: 1331 1337 enable_smearer = not self.disable_smearer.GetValue() 1332 1338 self._manager.set_smearer(smearer=temp_smearer, … … 1401 1407 if event is not None: 1402 1408 event.Skip() 1403 if self.data.__class__.__name__ == "Data2D":1409 if isinstance(self.data, Data2D): 1404 1410 return 1405 1411 is_click = event.LeftDown() … … 1419 1425 if event is not None: 1420 1426 event.Skip() 1421 if self.data.__class__.__name__ == "Data2D":1427 if isinstance(self.data, Data2D): 1422 1428 return 1423 1429 act_ctrl = event.GetEventObject() … … 1435 1441 """ 1436 1442 event.Skip() 1437 if self.data.__class__.__name__ == "Data2D":1443 if isinstance(self.data, Data2D): 1438 1444 return 1439 1445 ctrl = event.GetEventObject() … … 1497 1503 # Check if # of points for theory model are valid(>0). 1498 1504 # check for 2d 1499 if self.data.__class__.__name__ == "Data2D" or \ 1500 self.enable2D: 1505 if isinstance(self.data, Data2D) or self.enable2D: 1501 1506 # set mask 1502 1507 radius = np.sqrt(self.data.qx_data * self.data.qx_data + … … 1550 1555 if item[0].IsShown(): 1551 1556 # Skip the angle parameters if 1D data 1552 if self.data.__class__.__name__ != "Data2D" and \ 1553 not self.enable2D: 1557 if not isinstance(self.data, Data2D) and not self.enable2D: 1554 1558 if item in self.orientation_params: 1555 1559 continue … … 1569 1573 if item[0].IsShown(): 1570 1574 # Skip the angle parameters if 1D data 1571 if self.data.__class__.__name__ != "Data2D" and \ 1572 not self.enable2D: 1575 if not isinstance(self.data, Data2D) and not self.enable2D: 1573 1576 if item in self.orientation_params: 1574 1577 continue … … 1602 1605 1603 1606 :return: self.smear_type, self.dq_l and self.dq_r, 1604 respectively the type of the smear, dq_min and 1605 dq_max for pinhole smear data 1606 while dxl and dxw for slit smear 1607 """ 1608 # default 1607 respectively the type of the smear, The average <dq/q> radial(p) 1608 and <dq/q> theta (s)s for 2D pinhole resolution in % (slit is not 1609 currently supported in 2D), (dq/q)_min and (dq/q)_max for 1D pinhole 1610 smeared data, again in %, and dxl and/or dxw for slit smeared data 1611 given in 1/A and assumed constant. 1612 """ 1613 # set up defaults 1609 1614 self.smear_type = None 1610 1615 self.dq_l = None 1611 1616 self.dq_r = None 1612 1617 data = self.data 1618 #sanity check - this should only be called if data exits 1613 1619 if self.data is None: 1614 1620 return 1615 elif self.data.__class__.__name__ == "Data2D" or \1616 self.enable2D:1617 if data.dqx_data is None or data.dqy_data is None:1618 return1619 elif self.current_smearer is not None \1620 and data.dqx_data.any() != 0\1621 and data.dqx_data.any() != 0:1621 #First check if data is 2D 1622 #If so check that data set has smearing info and that none are zero. 1623 #Otherwise no smearing can be applied using smear from data (a Gaussian 1624 #width of zero will cause a divide by zero error) 1625 if isinstance(self.data, Data2D): 1626 if data.dqx_data is not None and data.dqy_data is not None \ 1627 and data.dqx_data.all()and data.dqy_data.all(): 1622 1628 self.smear_type = "Pinhole2d" 1623 self.dq_l = format_number(np.average(data.dqx_data)) 1624 self.dq_r = format_number(np.average(data.dqy_data)) 1625 return 1629 #report as average dQ/Q % as for 1D pinhole 1630 self.dq_l = format_number(np.average(data.dqx_data 1631 / abs(data.qx_data)) * 100) 1632 self.dq_r = format_number(np.average(data.dqy_data 1633 / abs(data.qy_data)) * 100) 1634 #if not then log that data did not contain resolutin info / abs(data.qy_data)) * 100) 1626 1635 else: 1627 return 1628 # check if it is pinhole smear and get min max if it is. 1629 if data.dx is not None and np.any(data.dx): 1630 self.smear_type = "Pinhole" 1631 self.dq_l = data.dx[0] 1632 self.dq_r = data.dx[-1] 1633 1634 # check if it is slit smear and get min max if it is. 1635 elif data.dxl is not None or data.dxw is not None: 1636 self.smear_type = "Slit" 1637 if data.dxl is not None and np.all(data.dxl, 0): 1638 self.dq_l = data.dxl[0] 1639 if data.dxw is not None and np.all(data.dxw, 0): 1640 self.dq_r = data.dxw[0] 1636 self.msg = "2D Data did not contain recognizable " \ 1637 "resolution info." 1638 logger.info(self.msg) 1639 #If not check that data is 1D 1640 #If so check for pinhole vs slit by veryfing whehter dx or dxl or dxw 1641 #have data (currently sasview only supports either dx or dxl/dxw but 1642 #not both simultaneously) and, as for 2D, are non zero . 1643 #Otherwise no smearing can be applied using smear from data (a Gaussian 1644 #width of zero will cause a divide by zero error) 1645 elif isinstance(self.data, Data1D): 1646 #is it valid 1D pinhole resolution data? 1647 if data.dx is not None and np.all(data.dx): 1648 self.smear_type = "Pinhole" 1649 #report in % for display makes more sense than absolute value 1650 #for pinhole smearing .. but keep old names of dq_l 1651 self.dq_l = format_number(data.dx[0] / data.x[0] * 100,1) 1652 self.dq_r = format_number(data.dx[-1] / data.x[-1] * 100,1) 1653 #If not, is it valid 1D slit resolution data? 1654 elif (data.dxl is not None or data.dxw is not None) \ 1655 and (np.all(data.dxl, 0) or np.all(data.dxw, 0)): 1656 self.smear_type = "Slit" 1657 #for slit units of 1/A make most sense 1658 if data.dxl is not None and np.all(data.dxl, 0): 1659 self.dq_l = format_number(data.dxl[0],1) 1660 if data.dxw is not None and np.all(data.dxw, 0): 1661 self.dq_r = format_number(data.dxw[0],1) 1662 #otherwise log that the data did not conatain resolution info 1663 else: 1664 self.msg = "1D Data did not contain recognizable " \ 1665 "resolution info." 1666 logger.info(self.msg) 1667 #If drops to here it is neither data1D or data2D so log that 1668 else: 1669 self.msg = "Data was not recognized as either 1D or 2D data." 1670 logger.info(self.msg) 1641 1671 # return self.smear_type,self.dq_l,self.dq_r 1642 1672 … … 1645 1675 Show only the sizers depending on smear selection 1646 1676 """ 1647 # smear disabled 1677 # smear disabled = No Smearing used 1648 1678 if self.disable_smearer.GetValue(): 1649 1679 self.smear_description_none.Show(True) 1650 # 2Dsmear 1680 # 2Dsmearing - for use with 2D data only 1651 1681 elif self._is_2D(): 1652 1682 self.smear_description_accuracy_type.Show(True) 1653 1683 self.smear_accuracy.Show(True) 1654 self.smear_description_accuracy_type.Show(True)1655 1684 self.smear_description_2d.Show(True) 1656 self.smear_description_2d_x.Show(True) 1657 self.smear_description_2d_y.Show(True) 1685 #2D custom pinhole smearing 1658 1686 if self.pinhole_smearer.GetValue(): 1687 self.smear_description_pin_percent.Show(True) 1659 1688 self.smear_pinhole_percent.Show(True) 1660 # smear from data 1689 #get 2D smearing from data 1690 elif self.enable_smearer.GetValue(): 1691 self.smear_description_2d_x.Show(True) 1692 self.smear_description_2d_y.Show(True) 1693 self.smear_data_left.Show(True) 1694 self.smear_data_right.Show(True) 1695 #Currently 2D custom slit smearing is not currently supported 1696 else: 1697 logger.error("2D custom smearing cannot use slit smearing") 1698 1699 # 1D smearing from data 1661 1700 elif self.enable_smearer.GetValue(): 1662 1663 1701 self.smear_description_dqdata.Show(True) 1664 1702 if self.smear_type is not None: 1665 1703 self.smear_description_smear_type.Show(True) 1704 #1D data has slit smearing 1666 1705 if self.smear_type == 'Slit': 1667 1706 self.smear_description_slit_height.Show(True) 1668 1707 self.smear_description_slit_width.Show(True) 1708 #1D data has pinhole smearing 1669 1709 elif self.smear_type == 'Pinhole': 1670 self.smear_description_pin_percent.Show(True) 1710 self.smear_description_pin_percent_min.Show(True) 1711 self.smear_description_pin_percent_max.Show(True) 1671 1712 self.smear_description_smear_type.Show(True) 1672 1713 self.smear_description_type.Show(True) 1673 1714 self.smear_data_left.Show(True) 1674 1715 self.smear_data_right.Show(True) 1675 # custom pinhole smear1716 # 1D custom pinhole smearing 1676 1717 elif self.pinhole_smearer.GetValue(): 1677 if self.smear_type == 'Pinhole': 1678 self.smear_message_new_p.Show(True) 1679 self.smear_description_pin_percent.Show(True) 1680 1718 self.smear_message_new_p.Show(True) 1719 self.smear_description_pin_percent.Show(True) 1681 1720 self.smear_pinhole_percent.Show(True) 1682 # custom slit smear1721 # 1D custom slit smear 1683 1722 elif self.slit_smearer.GetValue(): 1684 1723 self.smear_message_new_s.Show(True) … … 1687 1726 self.smear_description_slit_width.Show(True) 1688 1727 self.smear_slit_width.Show(True) 1728 else: 1729 logger.error("smearing type is not defined") 1689 1730 1690 1731 def _hide_all_smear_info(self): … … 1704 1745 self.smear_data_left.Hide() 1705 1746 self.smear_data_right.Hide() 1747 self.smear_description_pin_percent_min.Hide() 1748 self.smear_description_pin_percent_max.Hide() 1706 1749 self.smear_description_pin_percent.Hide() 1707 1750 self.smear_pinhole_percent.Hide() … … 1921 1964 di_flag = False 1922 1965 dq_flag = False 1923 if self.data.__class__.__name__ == "Data2D" or \ 1924 self.enable2D: 1966 if isinstance(self.data, Data2D) or self.enable2D: 1925 1967 self.slit_smearer.Disable() 1926 1968 self.pinhole_smearer.Enable(True) … … 2007 2049 # update model plot with new data information 2008 2050 if flag: 2009 if self.data.__class__.__name__ == "Data2D":2051 if isinstance(self.data, Data2D): 2010 2052 self.enable2D = True 2011 2053 self.model_view.SetLabel("2D Mode") … … 2074 2116 npts2fit = 0 2075 2117 qmin, qmax = self.get_range() 2076 if self.data.__class__.__name__ == "Data2D" or \ 2077 self.enable2D: 2118 if isinstance(self.data, Data2D) or self.enable2D: 2078 2119 radius = np.sqrt(self.data.qx_data * self.data.qx_data + 2079 2120 self.data.qy_data * self.data.qy_data) … … 2465 2506 of the values entered for slit smear 2466 2507 """ 2467 if self.data.__class__.__name__ == "Data2D"or self.enable2D:2508 if isinstance(self.data, Data2D) or self.enable2D: 2468 2509 return 2469 2510 # make sure once more if it is smearer … … 2661 2702 for item in self.parameters: 2662 2703 # Skip t ifhe angle parameters if 1D data 2663 if self.data.__class__.__name__ != "Data2D" and\ 2664 not self.enable2D: 2704 if not isinstance(self.data, Data2D) and not self.enable2D: 2665 2705 if item in self.orientation_params: 2666 2706 continue … … 2678 2718 for item in self.fittable_param: 2679 2719 # Skip t ifhe angle parameters if 1D data 2680 if self.data.__class__.__name__ != "Data2D" and\ 2681 not self.enable2D: 2720 if not isinstance(self.data, Data2D) and not self.enable2D: 2682 2721 if item in self.orientation_params: 2683 2722 continue … … 2691 2730 2692 2731 # Calculate num. of angle parameters 2693 if self.data.__class__.__name__ == "Data2D" or \ 2694 self.enable2D: 2732 if isinstance(self.data, Data2D) or self.enable2D: 2695 2733 len_orient_para = 0 2696 2734 else: … … 2985 3023 if not self._has_magnetic: 2986 3024 mag_on_button.Show(False) 2987 elif not self.data.__class__.__name__ == "Data2D":3025 elif not isinstance(self.data, Data2D): 2988 3026 mag_on_button.Show(False) 2989 3027 else: … … 3001 3039 mag_angle_help_button.Show(False) 3002 3040 3003 if not self.data.__class__.__name__ == "Data2D" and \ 3004 not self.enable2D: 3041 if not isinstance(self.data, Data2D) and not self.enable2D: 3005 3042 orient_angle.Hide() 3006 3043 else: … … 3026 3063 cb.SetToolTipString("Check mark to fit") 3027 3064 wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 3028 if self.data.__class__.__name__ == "Data2D" or \ 3029 self.enable2D: 3065 if isinstance(self.data, Data2D) or self.enable2D: 3030 3066 cb.Show(True) 3031 3067 else: … … 3042 3078 "Hit 'Enter' after typing to update the plot.") 3043 3079 ctl1.SetValue(format_number(value, True)) 3044 if self.data.__class__.__name__ == "Data2D" or \ 3045 self.enable2D: 3080 if isinstance(self.data, Data2D) or self.enable2D: 3046 3081 ctl1.Show(True) 3047 3082 else: … … 3083 3118 ctl4.Hide() 3084 3119 3085 if self.data.__class__.__name__ == "Data2D" or \ 3086 self.enable2D: 3120 if isinstance(self.data, Data2D) or self.enable2D: 3087 3121 if self.is_mac: 3088 3122 text2.Show(True) … … 3100 3134 units = wx.StaticText(self, -1, "", 3101 3135 style=wx.ALIGN_LEFT) 3102 if self.data.__class__.__name__ == "Data2D" or \ 3103 self.enable2D: 3136 if isinstance(self.data, Data2D) or self.enable2D: 3104 3137 units.Show(True) 3105 3138 else: … … 3180 3213 """ 3181 3214 # more disables for 2D 3182 if self.data.__class__.__name__ == "Data2D" or \ 3183 self.enable2D: 3215 if isinstance(self.data, Data2D) or self.enable2D: 3184 3216 self.slit_smearer.Disable() 3185 self.pinhole_smearer.Enable(True)3186 3217 self.default_mask = copy.deepcopy(self.data.mask) 3187 else: 3188 self.slit_smearer.Enable(True) 3189 self.pinhole_smearer.Enable(True) 3218 if self.model is not None: 3219 self.pinhole_smearer.Enable(True) 3220 3221 elif isinstance(self.data, Data1D): 3222 if self.model is not None: 3223 self.slit_smearer.Enable(True) 3224 self.pinhole_smearer.Enable(True) 3225 else: 3226 msg="data is not recognized as either 1D or 2D" 3227 logger.info(msg) 3190 3228 3191 3229
Note: See TracChangeset
for help on using the changeset viewer.