Changeset 8aec639 in sasview for src/sas/sasgui/perspectives
- Timestamp:
- Dec 19, 2016 1:59:52 PM (8 years ago)
- 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 13:59:52)
- git-committer:
- GitHub <noreply@…> (12/19/16 13:59:52)
- Location:
- src/sas/sasgui/perspectives
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/fitting/basepage.py
r0633048 r8aec639 1427 1427 self.qmax_x = tempmax 1428 1428 is_modified = True 1429 1430 1429 if is_2Ddata: 1431 # set mask1432 1430 is_modified = self._validate_Npts() 1433 1431 else: 1432 is_modified = self._validate_Npts_1D() 1434 1433 else: 1435 1434 self.fitrange = False … … 1446 1445 # Theory case: need to get npts value to draw 1447 1446 self.npts_x = float(self.Npts_total.GetValue()) 1447 self.Npts_fit.SetValue(str(self.Npts_total.GetValue())) 1448 self._save_plotting_range() 1448 1449 self.create_default_data() 1449 1450 self.state_change = True … … 1520 1521 index_data = ((self.qmin_x <= self.data.x) & 1521 1522 (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)) 1524 1526 else: 1525 1527 # No data in the panel … … 2162 2164 flag = False 2163 2165 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)) 2165 2169 self.fitrange = True 2166 2170 -
src/sas/sasgui/perspectives/fitting/fitpanel.py
rc8e1996 r67b0a99 189 189 # use while-loop, for-loop will not do the job well. 190 190 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) 193 192 if self._manager.parent.panel_on_focus == page: 194 193 self._manager.parent.panel_on_focus = None 195 194 self._close_helper(selected_page=page) 196 self.DeletePage( 0)195 self.DeletePage(self.GetPageCount() - 1) 197 196 # Clear list of names 198 197 self.fit_page_name = {} … … 400 399 temp = self.GetSelection() 401 400 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 402 410 if self.GetPageCount() == 0: 403 411 self._manager.on_add_new_page(event=None) -
src/sas/sasgui/perspectives/fitting/media/plugin.rst
r20cfa23 rca1eaeb 560 560 561 561 M_PI_180, M_4PI_3: 562 $\ pi/{180}$, $\tfrac{4}{3}\pi$562 $\frac{\pi}{180}$, $\frac{4\pi}{3}$ 563 563 SINCOS(x, s, c): 564 564 Macro which sets s=sin(x) and c=cos(x). The variables *c* and *s* … … 596 596 These functions have been tuned to be fast and numerically stable down 597 597 to $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!!! 598 which appear on some platforms but not others, so use them where needed. 599 Add the files listed in :code:`source = ["lib/file.c", ...]` to your *model.py* 600 file in the order given, otherwise these functions will not be available. 599 601 600 602 polevl(x, c, n): 601 Polynomial evaluation $p(x) = \sum_{i=0}^n c_i x^ {n-i}$ using Horner's603 Polynomial evaluation $p(x) = \sum_{i=0}^n c_i x^i$ using Horner's 602 604 method so it is faster and more accurate. 603 605 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 604 618 :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. 609 626 610 627 :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): 613 631 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$ 615 633 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 618 637 on some platforms. 619 638 620 639 :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 624 644 $J_0(x) = \frac{1}{\pi}\int_0^\pi \cos(x\sin(\tau))\,d\tau$. 625 645 646 The standard math function j0(x) is not available on all platforms. 647 626 648 :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 630 653 $J_1(x) = \frac{1}{\pi}\int_0^\pi \cos(\tau - x\sin(\tau))\,d\tau$. 631 654 655 The standard math function j1(x) is not available on all platforms. 656 632 657 :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 636 663 $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. 637 667 638 668 :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): 641 672 Sine integral $\text{Si}(x) = \int_0^x \tfrac{\sin t}{t}\,dt$. 642 673 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): 646 696 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. 650 702 651 703 :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. 655 711 656 712 :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 665 727 666 728 Problems with C models -
src/sas/sasgui/perspectives/fitting/fitpage.py
r345e7e4 r77910cf 1190 1190 self.state.slit_smearer = self.slit_smearer.GetValue() 1191 1191 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() 1194 1195 self.enable_fit_button() 1195 1196 if self.model is not None: -
src/sas/sasgui/perspectives/fitting/pagestate.py
rc8e1996 r0633048 25 25 from lxml import etree 26 26 27 from sasmodels import convert 27 28 import sasmodels.weights 28 29 … … 355 356 obj.saved_states[copy_name] = copy_state 356 357 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) 357 490 358 491 def _repr_helper(self, list, rep): -
src/sas/sasgui/perspectives/invariant/invariant_state.py
rcb93b40 rdb5294e 423 423 for item in DEFAULT_STATE: 424 424 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 = '' 426 429 if input_field is not None: 427 430 temp_state[item] = val … … 433 436 for item in DEFAULT_STATE: 434 437 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 = '' 436 442 if input_field is not None: 437 443 self.set_saved_state(name=item, value=val)
Note: See TracChangeset
for help on using the changeset viewer.