Changeset 8aec639 in sasview for src/sas/sasgui/perspectives


Ignore:
Timestamp:
Dec 19, 2016 11:59:52 AM (7 years ago)
Author:
GitHub <noreply@…>
Branches:
master, 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, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
6b9e76f
Parents:
0633048 (diff), 09fdc89 (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.
git-author:
Jeff Krzywon <krzywon@…> (12/19/16 11:59:52)
git-committer:
GitHub <noreply@…> (12/19/16 11:59:52)
Message:

Merge branch 'master' into ticket-795

Location:
src/sas/sasgui/perspectives
Files:
6 edited

Legend:

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

    r0633048 r8aec639  
    14271427                    self.qmax_x = tempmax 
    14281428                    is_modified = True 
    1429  
    14301429                if is_2Ddata: 
    1431                     # set mask 
    14321430                    is_modified = self._validate_Npts() 
    1433  
     1431                else: 
     1432                    is_modified = self._validate_Npts_1D() 
    14341433            else: 
    14351434                self.fitrange = False 
     
    14461445                # Theory case: need to get npts value to draw 
    14471446                self.npts_x = float(self.Npts_total.GetValue()) 
     1447                self.Npts_fit.SetValue(str(self.Npts_total.GetValue())) 
     1448                self._save_plotting_range() 
    14481449                self.create_default_data() 
    14491450                self.state_change = True 
     
    15201521                        index_data = ((self.qmin_x <= self.data.x) & 
    15211522                                      (self.data.x <= self.qmax_x)) 
    1522                         val = str(len([index_data is True])) 
    1523                         self.Npts_fit.SetValue(val) 
     1523                        val = self.data.x[index_data is True] 
     1524                        val = len(val) if isinstance(val, list) else 1 
     1525                        self.Npts_fit.SetValue(str(val)) 
    15241526                    else: 
    15251527                        # No data in the panel 
     
    21622164                flag = False 
    21632165            else: 
    2164                 self.Npts_fit.SetValue(str(len(index_data[index_data is True]))) 
     2166                val = index_data[index_data is True] 
     2167                val = len(val) if isinstance(val, list) else 1 
     2168                self.Npts_fit.SetValue(str(val)) 
    21652169                self.fitrange = True 
    21662170 
  • src/sas/sasgui/perspectives/fitting/fitpanel.py

    rc8e1996 r67b0a99  
    189189        # use while-loop, for-loop will not do the job well. 
    190190        while (self.GetPageCount() > 0): 
    191             # delete the first page until no page exists 
    192             page = self.GetPage(0) 
     191            page = self.GetPage(self.GetPageCount() - 1) 
    193192            if self._manager.parent.panel_on_focus == page: 
    194193                self._manager.parent.panel_on_focus = None 
    195194            self._close_helper(selected_page=page) 
    196             self.DeletePage(0) 
     195            self.DeletePage(self.GetPageCount() - 1) 
    197196        # Clear list of names 
    198197        self.fit_page_name = {} 
     
    400399                    temp = self.GetSelection() 
    401400                    self.DeletePage(temp) 
     401            if self.sim_page is not None: 
     402                if len(self.sim_page.model_list) == 0: 
     403                    pos = self.GetPageIndex(self.sim_page) 
     404                    self.SetSelection(pos) 
     405                    self.on_close_page(event=None) 
     406                    temp = self.GetSelection() 
     407                    self.DeletePage(temp) 
     408                    self.sim_page = None 
     409                    self.batch_on = False 
    402410            if self.GetPageCount() == 0: 
    403411                self._manager.on_add_new_page(event=None) 
  • src/sas/sasgui/perspectives/fitting/media/plugin.rst

    r20cfa23 rca1eaeb  
    560560 
    561561    M_PI_180, M_4PI_3: 
    562         $\pi/{180}$, $\tfrac{4}{3}\pi$ 
     562        $\frac{\pi}{180}$, $\frac{4\pi}{3}$ 
    563563    SINCOS(x, s, c): 
    564564        Macro which sets s=sin(x) and c=cos(x). The variables *c* and *s* 
     
    596596These functions have been tuned to be fast and numerically stable down 
    597597to $q=0$ even in single precision.  In some cases they work around bugs 
    598 which appear on some platforms but not others. So use them where needed!!! 
     598which appear on some platforms but not others, so use them where needed. 
     599Add the files listed in :code:`source = ["lib/file.c", ...]` to your *model.py* 
     600file in the order given, otherwise these functions will not be available. 
    599601 
    600602    polevl(x, c, n): 
    601         Polynomial evaluation $p(x) = \sum_{i=0}^n c_i x^{n-i}$ using Horner's 
     603        Polynomial evaluation $p(x) = \sum_{i=0}^n c_i x^i$ using Horner's 
    602604        method so it is faster and more accurate. 
    603605 
     606        $c = \{c_n, c_{n-1}, \ldots, c_0 \}$ is the table of coefficients, 
     607        sorted from highest to lowest. 
     608 
     609        :code:`source = ["lib/polevl.c", ...]` (`link to code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/polevl.c>`_) 
     610 
     611    p1evl(x, c, n): 
     612        Evaluation of normalized polynomial $p(x) = x^n + \sum_{i=0}^{n-1} c_i x^i$ 
     613        using Horner's method so it is faster and more accurate. 
     614 
     615        $c = \{c_{n-1}, c_{n-2} \ldots, c_0 \}$ is the table of coefficients, 
     616        sorted from highest to lowest. 
     617 
    604618        :code:`source = ["lib/polevl.c", ...]` 
    605  
    606     sas_gamma: 
    607         Gamma function $\text{sas_gamma}(x) = \Gamma(x)$.  The standard math 
    608         library gamma function, tgamma(x) is unstable below 1 on some platforms. 
     619        (`link to code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/polevl.c>`_) 
     620 
     621    sas_gamma(x): 
     622        Gamma function $\text{sas_gamma}(x) = \Gamma(x)$. 
     623 
     624        The standard math function, tgamma(x) is unstable for $x < 1$ 
     625        on some platforms. 
    609626 
    610627        :code:`source = ["lib/sasgamma.c", ...]` 
    611  
    612     erf, erfc: 
     628        (`link to code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/sas_gamma.c>`_) 
     629 
     630    sas_erf(x), sas_erfc(x): 
    613631        Error function 
    614         $\text{erf}(x) = \frac{1}{\sqrt\pi}\int_0^x e^{-t^2}\,dt$ 
     632        $\text{sas_erf}(x) = \frac{2}{\sqrt\pi}\int_0^x e^{-t^2}\,dt$ 
    615633        and complementary error function 
    616         $\text{erfc}(x) = \frac{1}{\sqrt\pi}\int_x^\inf e^{-t^2}\,dt$. 
    617         The standard math library erf and erfc are slower and broken 
     634        $\text{sas_erfc}(x) = \frac{2}{\sqrt\pi}\int_x^{\infty} e^{-t^2}\,dt$. 
     635 
     636        The standard math functions erf(x) and erfc(x) are slower and broken 
    618637        on some platforms. 
    619638 
    620639        :code:`source = ["lib/polevl.c", "lib/sas_erf.c", ...]` 
    621  
    622     sas_J0: 
    623         Bessel function of the first kind where 
     640        (`link to error functions' code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/sas_erf.c>`_) 
     641 
     642    sas_J0(x): 
     643        Bessel function of the first kind $\text{sas_J0}(x)=J_0(x)$ where 
    624644        $J_0(x) = \frac{1}{\pi}\int_0^\pi \cos(x\sin(\tau))\,d\tau$. 
    625645 
     646        The standard math function j0(x) is not available on all platforms. 
     647 
    626648        :code:`source = ["lib/polevl.c", "lib/sas_J0.c", ...]` 
    627  
    628     sas_J1: 
    629         Bessel function of the first kind where 
     649        (`link to Bessel function's code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/sas_J0.c>`_) 
     650 
     651    sas_J1(x): 
     652        Bessel function of the first kind  $\text{sas_J1}(x)=J_1(x)$ where 
    630653        $J_1(x) = \frac{1}{\pi}\int_0^\pi \cos(\tau - x\sin(\tau))\,d\tau$. 
    631654 
     655        The standard math function j1(x) is not available on all platforms. 
     656 
    632657        :code:`source = ["lib/polevl.c", "lib/sas_J1.c", ...]` 
    633  
    634     sas_JN: 
    635         Bessel function of the first kind where 
     658        (`link to Bessel function's code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/sas_J1.c>`_) 
     659 
     660    sas_JN(n, x): 
     661        Bessel function of the first kind and integer order $n$: 
     662        $\text{sas_JN}(n, x)=J_n(x)$ where 
    636663        $J_n(x) = \frac{1}{\pi}\int_0^\pi \cos(n\tau - x\sin(\tau))\,d\tau$. 
     664        If $n$ = 0 or 1, it uses sas_J0(x) or sas_J1(x), respectively. 
     665 
     666        The standard math function jn(n, x) is not available on all platforms. 
    637667 
    638668        :code:`source = ["lib/polevl.c", "lib/sas_J0.c", "lib/sas_J1.c", "lib/sas_JN.c", ...]` 
    639  
    640     Si: 
     669        (`link to Bessel function's code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/sas_JN.c>`_) 
     670 
     671    Si(x): 
    641672        Sine integral $\text{Si}(x) = \int_0^x \tfrac{\sin t}{t}\,dt$. 
    642673 
    643         :code:`soure = ["lib/Si.c", ...]` 
    644  
    645     sph_j1c(qr): 
     674        This function uses Taylor series for small and large arguments: 
     675 
     676        For large arguments, 
     677 
     678        .. math:: 
     679 
     680             \text{Si}(x) \sim \frac{\pi}{2} 
     681             - \frac{\cos(x)}{x}\left(1 - \frac{2!}{x^2} + \frac{4!}{x^4} - \frac{6!}{x^6} \right) 
     682             - \frac{\sin(x)}{x}\left(\frac{1}{x} - \frac{3!}{x^3} + \frac{5!}{x^5} - \frac{7!}{x^7}\right) 
     683 
     684        For small arguments, 
     685 
     686        .. math:: 
     687 
     688           \text{Si}(x) \sim x 
     689           - \frac{x^3}{3\times 3!} + \frac{x^5}{5 \times 5!} - \frac{x^7}{7 \times 7!} 
     690           + \frac{x^9}{9\times 9!} - \frac{x^{11}}{11\times 11!} 
     691 
     692        :code:`source = ["lib/Si.c", ...]` 
     693        (`link to code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/Si.c>`_) 
     694 
     695    sph_j1c(x): 
    646696        Spherical Bessel form 
    647         $F(qr) = 3 j_1(qr)/(qr) = 3 (\sin(qr) - qr \cos(qr))/{(qr)^3}$, 
    648         with a limiting value of 1 at $qr=0$.  This function uses a Taylor 
    649         series for small $qr$ for numerical accuracy. 
     697        $\text{sph_j1c}(x) = 3 j_1(x)/x = 3 (\sin(x) - x \cos(x))/x^3$, 
     698        with a limiting value of 1 at $x=0$, where $j_1(x)$ is the spherical 
     699        Bessel function of the first kind and first order. 
     700 
     701        This function uses a Taylor series for small $x$ for numerical accuracy. 
    650702 
    651703        :code:`source = ["lib/sph_j1c.c", ...]` 
    652  
    653     sas_J1c(qr): 
    654         Bessel form $F(qr) = 2 J_1(qr)/{(qr)}$, with a limiting value of 1 at $qr=0$. 
     704        (`link to code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/sph_j1c.c>`_) 
     705 
     706 
     707    sas_J1c(x): 
     708        Bessel form $\text{sas_J1c}(x) = 2 J_1(x)/x$, with a limiting value 
     709        of 1 at $x=0$, where $J_1(x)$ is the Bessel function of first kind 
     710        and first order. 
    655711 
    656712        :code:`source = ["lib/polevl.c", "lib/sas_J1.c", ...]` 
    657  
    658     Gauss76z[i], Gauss76Wt[i]: 
    659         Points $z_i$ and weights $w_i$ for 76-point Gaussian quadrature, 
    660         computing $\int_{-1}^1 f(z)\,dz \approx \sum_{i=1}^{76} w_i f(z_i)$. 
    661         Similar arrays are available in :code:`gauss20.c` for 20 point 
    662         quadrature and in :code:`gauss150.c` for 150 point quadrature. 
    663  
    664         :code:`source = ["gauss76.c", ...]` 
     713        (`link to Bessel form's code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/sas_J1.c>`_) 
     714 
     715 
     716    Gauss76Z[i], Gauss76Wt[i]: 
     717        Points $z_i$ and weights $w_i$ for 76-point Gaussian quadrature, respectively, 
     718        computing $\int_{-1}^1 f(z)\,dz \approx \sum_{i=1}^{76} w_i\,f(z_i)$. 
     719 
     720        Similar arrays are available in :code:`gauss20.c` for 20-point 
     721        quadrature and in :code:`gauss150.c` for 150-point quadrature. 
     722 
     723        :code:`source = ["lib/gauss76.c", ...]` 
     724        (`link to code <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib/gauss76.c>`_) 
     725 
     726 
    665727 
    666728Problems with C models 
  • src/sas/sasgui/perspectives/fitting/fitpage.py

    r345e7e4 r77910cf  
    11901190        self.state.slit_smearer = self.slit_smearer.GetValue() 
    11911191 
    1192         self.state.structurecombobox = self.structurebox.GetLabel() 
    1193         self.state.formfactorcombobox = self.formfactorbox.GetLabel() 
     1192        self.state.structurecombobox = self.structurebox.GetValue() 
     1193        self.state.formfactorcombobox = self.formfactorbox.GetValue() 
     1194        self.state.categorycombobox = self.categorybox.GetValue() 
    11941195        self.enable_fit_button() 
    11951196        if self.model is not None: 
  • src/sas/sasgui/perspectives/fitting/pagestate.py

    rc8e1996 r0633048  
    2525from lxml import etree 
    2626 
     27from sasmodels import convert 
    2728import sasmodels.weights 
    2829 
     
    355356            obj.saved_states[copy_name] = copy_state 
    356357        return obj 
     358 
     359    def _old_first_model(self): 
     360        """ 
     361        A check to see if the loaded save state was saved in SasView v4_0+ 
     362        :return: None 
     363        """ 
     364        if self.formfactorcombobox == '': 
     365            if self.categorycombobox == '' and len(self.parameters) == 3: 
     366                self.categorycombobox = "Shape-Independent" 
     367                self.formfactorcombobox = 'PowerLawAbsModel' 
     368            elif self.categorycombobox == '' and len(self.parameters) == 9: 
     369                self.categorycombobox = 'Cylinder' 
     370                self.formfactorcombobox = 'barbell' 
     371            elif self.categorycombobox == 'Shapes': 
     372                self.formfactorcombobox = 'BCCrystalModel' 
     373            elif self.categorycombobox == 'Uncategorized': 
     374                self.formfactorcombobox = 'LineModel' 
     375            elif self.categorycombobox == 'StructureFactor': 
     376                self.structurecombobox = 'HardsphereStructure' 
     377            elif self.categorycombobox == 'Customized Models': 
     378                self.formfactorcombobox = 'MySumFunction' 
     379            elif self.categorycombobox == 'Ellipsoid': 
     380                self.formfactorcombobox = 'core_shell_ellipsoid' 
     381            elif self.categorycombobox == 'Lamellae': 
     382                self.formfactorcombobox = 'lamellar' 
     383            elif self.categorycombobox == 'Paracrystal': 
     384                self.formfactorcombobox = 'bcc_paracrystal' 
     385            elif self.categorycombobox == 'Parallelepiped': 
     386                self.formfactorcombobox = 'core_shell_parallelepiped' 
     387            elif self.categorycombobox == 'Shape Independent': 
     388                self.formfactorcombobox = 'be_polyelectrolyte' 
     389            elif self.categorycombobox == 'Sphere': 
     390                self.formfactorcombobox = 'adsorbed_layer' 
     391            elif self.categorycombobox == 'Structure Factor': 
     392                self.formfactorcombobox = 'hardsphere' 
     393 
     394    def param_remap_to_sasmodels_convert(self, params, is_string=False): 
     395        """ 
     396        Remaps the parameters for sasmodels conversion 
     397 
     398        :param params: list of parameters (likely self.parameters) 
     399        :return: remapped dictionary of parameters 
     400        """ 
     401        p = dict() 
     402        for fittable, name, value, _, uncert, lower, upper, units in params: 
     403            if not value: 
     404                value = numpy.nan 
     405            if not uncert or uncert[1] == '' or uncert[1] == 'None': 
     406                uncert[0] = False 
     407                uncert[1] = numpy.nan 
     408            if not upper or upper[1] == '' or upper[1] == 'None': 
     409                upper[0] = False 
     410                upper[1] = numpy.nan 
     411            if not lower or lower[1] == '' or lower[1] == 'None': 
     412                lower[0] = False 
     413                lower[1] = numpy.nan 
     414            if is_string: 
     415                p[name] = str(value) 
     416            else: 
     417                p[name] = float(value) 
     418            p[name + ".fittable"] = bool(fittable) 
     419            p[name + ".std"] = float(uncert[1]) 
     420            p[name + ".upper"] = float(upper[1]) 
     421            p[name + ".lower"] = float(lower[1]) 
     422            p[name + ".units"] = units 
     423        return p 
     424 
     425    def param_remap_from_sasmodels_convert(self, params): 
     426        """ 
     427        Converts {name : value} map back to [] param list 
     428        :param params: parameter map returned from sasmodels 
     429        :return: None 
     430        """ 
     431        p_map = [] 
     432        for name, info in params.iteritems(): 
     433            if ".fittable" in name or ".std" in name or ".upper" in name or \ 
     434                            ".lower" in name or ".units" in name: 
     435                pass 
     436            else: 
     437                fittable = params.get(name + ".fittable", True) 
     438                std = params.get(name + ".std", '0.0') 
     439                upper = params.get(name + ".upper", 'inf') 
     440                lower = params.get(name + ".lower", '-inf') 
     441                units = params.get(name + ".units") 
     442                if std is not None and std is not numpy.nan: 
     443                    std = [True, str(std)] 
     444                else: 
     445                    std = [False, ''] 
     446                if lower is not None and lower is not numpy.nan: 
     447                    lower = [True, str(lower)] 
     448                else: 
     449                    lower = [True, '-inf'] 
     450                if upper is not None and upper is not numpy.nan: 
     451                    upper = [True, str(upper)] 
     452                else: 
     453                    upper = [True, 'inf'] 
     454                param_list = [bool(fittable), str(name), str(info), 
     455                              "+/-", std, lower, upper, str(units)] 
     456                p_map.append(param_list) 
     457        return p_map 
     458 
     459    def _convert_to_sasmodels(self): 
     460        """ 
     461        Convert parameters to a form usable by sasmodels converter 
     462 
     463        :return: None 
     464        """ 
     465        # Create conversion dictionary to send to sasmodels 
     466        self._old_first_model() 
     467        p = self.param_remap_to_sasmodels_convert(self.parameters) 
     468        structurefactor, params = \ 
     469            convert.convert_model(self.structurecombobox, p) 
     470        formfactor, params = \ 
     471            convert.convert_model(self.formfactorcombobox, params) 
     472        if len(self.str_parameters) > 0: 
     473            str_pars = self.param_remap_to_sasmodels_convert( 
     474                self.str_parameters, True) 
     475            formfactor, str_params = convert.convert_model( 
     476                self.formfactorcombobox, str_pars) 
     477            for key, value in str_params.iteritems(): 
     478                params[key] = value 
     479 
     480        # Only convert if old != new, otherwise all the same 
     481        if formfactor != self.formfactorcombobox or \ 
     482                        structurefactor != self.structurecombobox: 
     483            # Spherical SLD number of layers changed between 3.1.2 and 4.0 
     484            if self.formfactorcombobox == 'SphericalSLDModel': 
     485                self.multi_factor += 1 
     486            self.formfactorcombobox = formfactor 
     487            self.structurecombobox = structurefactor 
     488            self.parameters = [] 
     489            self.parameters = self.param_remap_from_sasmodels_convert(params) 
    357490 
    358491    def _repr_helper(self, list, rep): 
  • src/sas/sasgui/perspectives/invariant/invariant_state.py

    rcb93b40 rdb5294e  
    423423                    for item in DEFAULT_STATE: 
    424424                        input_field = get_content('ns:%s' % item, entry) 
    425                         val = str(input_field.text.strip()) 
     425                        if input_field.text is not None: 
     426                            val = str(input_field.text.strip()) 
     427                        else: 
     428                            val = '' 
    426429                        if input_field is not None: 
    427430                            temp_state[item] = val 
     
    433436                for item in DEFAULT_STATE: 
    434437                    input_field = get_content('ns:%s' % item, entry) 
    435                     val = str(input_field.text.strip()) 
     438                    if input_field.text is not None: 
     439                        val = str(input_field.text.strip()) 
     440                    else: 
     441                        val = '' 
    436442                    if input_field is not None: 
    437443                        self.set_saved_state(name=item, value=val) 
Note: See TracChangeset for help on using the changeset viewer.