Ignore:
Timestamp:
Sep 22, 2017 8:29:48 AM (7 years ago)
Author:
Paul Kienzle <pkienzle@…>
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, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
ab0b93f
Parents:
1386b2f (diff), d76c43a (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:
Paul Kienzle <pkienzle@…> (09/22/17 08:28:48)
git-committer:
Paul Kienzle <pkienzle@…> (09/22/17 08:29:48)
Message:

Merge branch 'master' into ticket-853-fit-gui-to-calc

Location:
src/sas/sasgui/perspectives/calculator
Files:
22 added
22 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/calculator/image_viewer.py

    ra1b8fee r412e9e8b  
    5959            _, extension = os.path.splitext(basename) 
    6060            try: 
     61                # Note that matplotlib only reads png natively. 
     62                # Any other formats (tiff, jpeg, etc) are passed 
     63                # to PIL which seems to have a problem in version 
     64                # 1.1.7 that causes a close error which shows up in  
     65                # the log file.  This does not seem to have any adverse 
     66                # effects.  PDB   --- September 17, 2017. 
    6167                img = mpimg.imread(file_path) 
    6268                is_png = extension.lower() == '.png' 
     
    8995        if location is None: 
    9096            location = os.getcwd() 
    91         dlg = wx.FileDialog(self.parent, "Image Viewer: Choose a image file", 
    92                             location, "", "", style=wx.FD_OPEN | wx.FD_MULTIPLE) 
     97        wildcard="Images (*.bmp;*.gif;*jpeg,*jpg;*.png;*tif;*.tiff)|*bmp;\ 
     98            *.gif; *.jpg; *.jpeg;*png;*.png;*.tif;*.tiff|"\ 
     99            "Bitmap (*.bmp)|*.bmp|"\ 
     100            "GIF (*.gif)|*.gif|"\ 
     101            "JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|"\ 
     102            "PNG (*.png)|*.png|"\ 
     103            "TIFF (*.tif;*.tiff)|*.tif;*tiff|"\ 
     104            "All Files (*.*)|*.*|" 
     105 
     106        dlg = wx.FileDialog(self.parent, "Image Viewer: Choose an image file", 
     107                            location, "", wildcard, style=wx.FD_OPEN 
     108                            | wx.FD_MULTIPLE) 
    93109        if dlg.ShowModal() == wx.ID_OK: 
    94110            path = dlg.GetPaths() 
  • src/sas/sasgui/perspectives/calculator/media/density_calculator_help.rst

    rd85c194 r6aad2e8  
    29294) Click the 'Calculate' button to perform the calculation. 
    3030 
    31 .. image:: density_tutor.gif 
     31.. image:: density_tutor.png 
    3232 
    3333.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
  • src/sas/sasgui/perspectives/calculator/media/gen_sas_help.html

    rd85c194 r6aad2e8  
    1919by the particle  
    2020<p> 
    21 <img src="gen_i.gif"/> 
     21<img src="gen_i.png"/> 
    2222</p> 
    2323<br> 
     
    2626of the j'th pixel respectively. And the total volume 
    2727<p> 
    28 <img src="v_j.gif"/> 
     28<img src="v_j.png"/> 
    2929</p> 
    3030<br> 
     
    4444scattering length. (Figure below). 
    4545<p> 
    46 <img src="mag_vector.bmp"/> 
     46<img src="mag_vector.png"/> 
    4747</p> 
    4848<br> 
    4949The magnetic scattering length density is then 
    5050<p> 
    51 <img src="dm_eq.gif"/> 
     51<img src="dm_eq.png"/> 
    5252</p> 
    5353<br> 
     
    6666<br> 
    6767<p> 
    68 <img src="gen_mag_pic.bmp"/> 
     68<img src="gen_mag_pic.png"/> 
    6969</p> 
    7070<br> 
     
    7575densities , including the nuclear scattering length density (&#946; <sub>N</sub>) are given as, for non-spin-flips, 
    7676<p> 
    77 <img src="sld1.gif"/> 
     77<img src="sld1.png"/> 
    7878</p> 
    7979<br> 
     
    8181for spin-flips, 
    8282<p> 
    83 <img src="sld2.gif"/> 
     83<img src="sld2.png"/> 
    8484</p> 
    8585<br> 
     
    8787where 
    8888<p> 
    89 <img src="mxp.gif"/> 
     89<img src="mxp.png"/> 
    9090</p> 
    9191<p> 
    92 <img src="myp.gif"/> 
     92<img src="myp.png"/> 
    9393</p> 
    9494<p> 
    95 <img src="mzp.gif"/> 
     95<img src="mzp.png"/> 
    9696</p> 
    9797<p> 
    98 <img src="mqx.gif"/> 
     98<img src="mqx.png"/> 
    9999</p> 
    100100<p> 
    101 <img src="mqy.gif"/> 
     101<img src="mqy.png"/> 
    102102</p> 
    103103<br> 
     
    110110<br> 
    111111<p> 
    112 <img src="gen_gui_help.bmp"/> 
     112<img src="gen_gui_help.png"/> 
    113113</p> 
    114114<br> 
     
    136136in a 2D output, whileas the scattering calculation averaged over all the orientations uses the Debye equation providing a 1D output: 
    137137 <p> 
    138 <img src="gen_debye_eq.gif"/> 
     138<img src="gen_debye_eq.png"/> 
    139139</p> 
    140140<br> 
  • src/sas/sasgui/perspectives/calculator/media/image_viewer_help.rst

    rda456fb r412e9e8b  
    3434   will be displayed. 
    3535 
    36 .. image:: load_image.bmp 
     36.. image:: load_image.png 
    3737 
    38383) To save, print, or copy the image, or to apply a grid overlay, right-click  
    3939   anywhere in the plot. 
    4040 
    41 .. image:: pic_plot.bmp 
     41.. image:: pic_plot.png 
    4242 
    43434. If the image is taken from a 2D detector, SasView can attempt to convert  
     
    5151   then click the OK. 
    5252 
    53 .. image:: pic_convert.bmp 
     53.. image:: pic_convert.png 
    5454 
    5555.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
  • src/sas/sasgui/perspectives/calculator/media/kiessig_calculator_help.rst

    r7805458 r5ed76f8  
    1010----------- 
    1111 
    12 This tool is approximately estimates the thickness of a layer or the diameter  
    13 of particles from the position of the Kiessig fringe/Bragg peak in NR/SAS data  
    14 using the relation 
     12This tool estimates real space dimensions from the position or spacing of 
     13features in recipricol space.  In particular a particle of size $d$ will 
     14give rise to Bragg peaks with spacing $\Delta q$ according to the relation 
    1515 
    16 (thickness *or* size) = 2 * |pi| / (fringe_width *or* peak position) 
    17    
     16.. math:: 
     17 
     18    d = 2\pi / \Delta q 
     19 
     20Similarly, the spacing between the peaks in Kiessig fringes in reflectometry 
     21data arise from layers of thickness $d$. 
     22 
    1823.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    1924 
     
    2126-------------- 
    2227 
    23 To get a rough thickness or particle size, simply type the fringe or peak  
     28To get a rough thickness or particle size, simply type the fringe or peak 
    2429position (in units of 1/|Ang|\) and click on the *Compute* button. 
    2530 
    2631.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    2732 
    28 .. note::  This help document was last changed by Steve King, 01May2015 
    29  
     33.. note::  This help document was last changed by Paul Kienzle, 05Apr2017 
  • src/sas/sasgui/perspectives/calculator/media/resolution_calculator_help.rst

    r7805458 r5ed76f8  
    1010----------- 
    1111 
    12 This tool is approximately estimates the resolution of Q from SAS instrumental  
    13 parameter values assuming that the detector is flat and normal to the  
     12This tool is approximately estimates the resolution of $Q$ from SAS instrumental 
     13parameter values assuming that the detector is flat and normal to the 
    1414incident beam. 
    1515 
     
    23232) Select the source (Neutron or Photon) and source type (Monochromatic or TOF). 
    2424 
    25    *NOTE! The computational difference between the sources is only the  
     25   *NOTE! The computational difference between the sources is only the 
    2626   gravitational contribution due to the mass of the particles.* 
    2727 
    28 3) Change the default values of the instrumental parameters as required. Be  
     283) Change the default values of the instrumental parameters as required. Be 
    2929   careful to note that distances are specified in cm! 
    3030 
    31 4) Enter values for the source wavelength(s), |lambda|\ , and its spread (= FWHM/|lambda|\ ). 
    32     
    33    For monochromatic sources, the inputs are just one value. For TOF sources,  
    34    the minimum and maximum values should be separated by a '-' to specify a  
     314) Enter values for the source wavelength(s), $\lambda$, and its spread (= $\text{FWHM}/\lambda$). 
     32 
     33   For monochromatic sources, the inputs are just one value. For TOF sources, 
     34   the minimum and maximum values should be separated by a '-' to specify a 
    3535   range. 
    36     
    37    Optionally, the wavelength (BUT NOT of the wavelength spread) can be extended  
    38    by adding '; nn' where the 'nn' specifies the number of the bins for the  
    39    numerical integration. The default value is nn = 10. The same number of bins  
     36 
     37   Optionally, the wavelength (BUT NOT of the wavelength spread) can be extended 
     38   by adding '; nn' where the 'nn' specifies the number of the bins for the 
     39   numerical integration. The default value is nn = 10. The same number of bins 
    4040   will be used for the corresponding wavelength spread. 
    4141 
    42 5) For TOF, the default wavelength spectrum is flat. A custom spectral  
    43    distribution file (2-column text: wavelength (|Ang|\) vs Intensity) can also  
     425) For TOF, the default wavelength spectrum is flat. A custom spectral 
     43   distribution file (2-column text: wavelength (|Ang|\) vs Intensity) can also 
    4444   be loaded by selecting *Add new* in the combo box. 
    4545 
    46 6) When ready, click the *Compute* button. Depending on the computation the  
     466) When ready, click the *Compute* button. Depending on the computation the 
    4747   calculation time will vary. 
    4848 
    49 7) 1D and 2D dQ values will be displayed at the bottom of the panel, and a 2D  
    50    resolution weight distribution (a 2D elliptical Gaussian function) will also  
    51    be displayed in the plot panel even if the Q inputs are outside of the  
     497) 1D and 2D $dQ$ values will be displayed at the bottom of the panel, and a 2D 
     50   resolution weight distribution (a 2D elliptical Gaussian function) will also 
     51   be displayed in the plot panel even if the $Q$ inputs are outside of the 
    5252   detector limit (the red lines indicate the limits of the detector). 
    53     
    54    TOF only: green lines indicate the limits of the maximum Q range accessible  
     53 
     54   TOF only: green lines indicate the limits of the maximum $Q$ range accessible 
    5555   for the longest wavelength due to the size of the detector. 
    56      
    57    Note that the effect from the beam block/stop is ignored, so in the small Q  
    58    region near the beam block/stop  
    5956 
    60    [ie., Q < 2. |pi|\ .(beam block diameter) / (sample-to-detector distance) / |lambda|\_min]  
     57   Note that the effect from the beam block/stop is ignored, so in the small $Q$ 
     58   region near the beam block/stop 
     59 
     60   [i.e., $Q < (2 \pi \cdot \text{beam block diameter}) / (\text{sample-to-detector distance} \cdot \lambda_\text{min})$] 
    6161 
    6262   the variance is slightly under estimated. 
    6363 
    64 8) A summary of the calculation is written to the SasView *Console* at the  
     648) A summary of the calculation is written to the SasView *Console* at the 
    6565   bottom of the main SasView window. 
    6666 
    67 .. image:: resolution_tutor.gif 
     67.. image:: resolution_tutor.png 
    6868 
    6969.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     
    7474The scattering wave transfer vector is by definition 
    7575 
    76 .. image:: q.gif 
     76.. image:: q.png 
    7777 
    78 In the small-angle limit, the variance of Q is to a first-order  
     78In the small-angle limit, the variance of $Q$ is to a first-order 
    7979approximation 
    8080 
    81 .. image:: sigma_q.gif 
     81.. image:: sigma_q.png 
    8282 
    8383The geometric and gravitational contributions can then be summarised as 
    8484 
    85 .. image:: sigma_table.gif 
     85.. image:: sigma_table.png 
    8686 
    87 Finally, a Gaussian function is used to describe the 2D weighting distribution  
    88 of the uncertainty in Q. 
     87Finally, a Gaussian function is used to describe the 2D weighting distribution 
     88of the uncertainty in $Q$. 
    8989 
    9090.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     
    9393---------- 
    9494 
    95 D.F.R. Mildner and J.M. Carpenter  
     95D.F.R. Mildner and J.M. Carpenter 
    9696*J. Appl. Cryst.* 17 (1984) 249-256 
    9797 
    98 D.F.R. Mildner, J.M. Carpenter and D.L. Worcester  
     98D.F.R. Mildner, J.M. Carpenter and D.L. Worcester 
    9999*J. Appl. Cryst.* 19 (1986) 311-319 
    100100 
  • src/sas/sasgui/perspectives/calculator/media/sas_calculator_help.rst

    rda456fb r5ed76f8  
    1919------ 
    2020 
    21 In general, a particle with a volume *V* can be described by an ensemble  
    22 containing *N* 3-dimensional rectangular pixels where each pixel is much  
    23 smaller than *V*. 
     21In general, a particle with a volume $V$ can be described by an ensemble 
     22containing $N$ 3-dimensional rectangular pixels where each pixel is much 
     23smaller than $V$. 
    2424 
    25 Assuming that all the pixel sizes are the same, the elastic scattering  
     25Assuming that all the pixel sizes are the same, the elastic scattering 
    2626intensity from the particle is 
    2727 
    28 .. image:: gen_i.gif 
     28.. image:: gen_i.png 
    2929 
    3030Equation 1. 
    3131 
    32 where |beta|\ :sub:`j` and *r*\ :sub:`j` are the scattering length density and  
    33 the position of the j'th pixel respectively. 
     32where $\beta_j$ and $r_j$ are the scattering length density and 
     33the position of the $j^\text{th}$ pixel respectively. 
    3434 
    35 The total volume *V* 
     35The total volume $V$ 
    3636 
    37 .. image:: v_j.gif 
     37.. math:: 
    3838 
    39 for |beta|\ :sub:`j` |noteql|\0 where *v*\ :sub:`j` is the volume of the j'th  
    40 pixel (or the j'th natural atomic volume (= atomic mass / (natural molar  
     39    V = \sum_j^N v_j 
     40 
     41for $\beta_j \ne 0$ where $v_j$ is the volume of the $j^\text{th}$ 
     42pixel (or the $j^\text{th}$ natural atomic volume (= atomic mass / (natural molar 
    4143density * Avogadro number) for the atomic structures). 
    4244 
    43 *V* can be corrected by users. This correction is useful especially for an  
    44 atomic structure (such as taken from a PDB file) to get the right normalization.  
     45$V$ can be corrected by users. This correction is useful especially for an 
     46atomic structure (such as taken from a PDB file) to get the right normalization. 
    4547 
    46 *NOTE!* |beta|\ :sub:`j` *displayed in the GUI may be incorrect but this will not  
     48*NOTE! $\beta_j$ displayed in the GUI may be incorrect but this will not 
    4749affect the scattering computation if the correction of the total volume V is made.* 
    4850 
    49 The scattering length density (SLD) of each pixel, where the SLD is uniform, is  
    50 a combination of the nuclear and magnetic SLDs and depends on the spin states  
     51The scattering length density (SLD) of each pixel, where the SLD is uniform, is 
     52a combination of the nuclear and magnetic SLDs and depends on the spin states 
    5153of the neutrons as follows. 
    5254 
     
    5456^^^^^^^^^^^^^^^^^^^ 
    5557 
    56 For magnetic scattering, only the magnetization component, *M*\ :sub:`perp`\ ,  
    57 perpendicular to the scattering vector *Q* contributes to the magnetic  
     58For magnetic scattering, only the magnetization component, $M_\perp$, 
     59perpendicular to the scattering vector $Q$ contributes to the magnetic 
    5860scattering length. 
    5961 
    60 .. image:: mag_vector.bmp 
     62.. image:: mag_vector.png 
    6163 
    6264The magnetic scattering length density is then 
    6365 
    64 .. image:: dm_eq.gif 
     66.. image:: dm_eq.png 
    6567 
    66 where the gyromagnetic ratio |gamma| = -1.913, |mu|\ :sub:`B` is the Bohr  
    67 magneton, *r*\ :sub:`0` is the classical radius of electron, and |sigma| is the  
     68where the gyromagnetic ratio is $\gamma = -1.913$, $\mu_B$ is the Bohr 
     69magneton, $r_0$ is the classical radius of electron, and $\sigma$ is the 
    6870Pauli spin. 
    6971 
    7072For a polarized neutron, the magnetic scattering is depending on the spin states. 
    7173 
    72 Let us consider that the incident neutrons are polarised both parallel (+) and   
    73 anti-parallel (-) to the x' axis (see below). The possible states after  
    74 scattering from the sample are then  
     74Let us consider that the incident neutrons are polarised both parallel (+) and 
     75anti-parallel (-) to the x' axis (see below). The possible states after 
     76scattering from the sample are then 
    7577 
    7678*  Non-spin flips: (+ +) and (- -) 
    7779*  Spin flips:     (+ -) and (- +) 
    7880 
    79 .. image:: gen_mag_pic.bmp 
     81.. image:: gen_mag_pic.png 
    8082 
    81 Now let us assume that the angles of the *Q* vector and the spin-axis (x')  
    82 to the x-axis are |phi| and |theta|\ :sub:`up` respectively (see above). Then,  
    83 depending upon the polarization (spin) state of neutrons, the scattering  
    84 length densities, including the nuclear scattering length density (|beta|\ :sub:`N`\ )  
     83Now let us assume that the angles of the *Q* vector and the spin-axis (x') 
     84to the x-axis are $\phi$ and $\theta_\text{up}$ respectively (see above). Then, 
     85depending upon the polarization (spin) state of neutrons, the scattering 
     86length densities, including the nuclear scattering length density ($\beta_N$) 
    8587are given as 
    8688 
    8789*  for non-spin-flips 
    8890 
    89    .. image:: sld1.gif 
     91   .. image:: sld1.png 
    9092 
    9193*  for spin-flips 
    9294 
    93    .. image:: sld2.gif 
     95   .. image:: sld2.png 
    9496 
    9597where 
    9698 
    97 .. image:: mxp.gif 
     99.. image:: mxp.png 
    98100 
    99 .. image:: myp.gif 
     101.. image:: myp.png 
    100102 
    101 .. image:: mzp.gif 
     103.. image:: mzp.png 
    102104 
    103 .. image:: mqx.gif 
     105.. image:: mqx.png 
    104106 
    105 .. image:: mqy.gif 
     107.. image:: mqy.png 
    106108 
    107 Here the *M0*\ :sub:`x`\ , *M0*\ :sub:`y` and *M0*\ :sub:`z` are the x, y and z  
    108 components of the magnetisation vector in the laboratory xyz frame.  
     109Here the $M0_x$, $M0_y$ and $M0_z$ are the $x$, $y$ and $z$ 
     110components of the magnetisation vector in the laboratory $xyz$ frame. 
    109111 
    110112.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     
    113115-------------- 
    114116 
    115 .. image:: gen_gui_help.bmp 
     117.. image:: gen_gui_help.png 
    116118 
    117 After computation the result will appear in the *Theory* box in the SasView   
     119After computation the result will appear in the *Theory* box in the SasView 
    118120*Data Explorer* panel. 
    119121 
    120 *Up_frac_in* and *Up_frac_out* are the ratio  
     122*Up_frac_in* and *Up_frac_out* are the ratio 
    121123 
    122124   (spin up) / (spin up + spin down) 
    123     
     125 
    124126of neutrons before the sample and at the analyzer, respectively. 
    125127 
    126 *NOTE 1. The values of* Up_frac_in *and* Up_frac_out *must be in the range  
     128*NOTE 1. The values of* Up_frac_in *and* Up_frac_out *must be in the range 
    1271290.0 to 1.0. Both values are 0.5 for unpolarized neutrons.* 
    128130 
    129 *NOTE 2. This computation is totally based on the pixel (or atomic) data fixed  
     131*NOTE 2. This computation is totally based on the pixel (or atomic) data fixed 
    130132in xyz coordinates. No angular orientational averaging is considered.* 
    131133 
    132 *NOTE 3. For the nuclear scattering length density, only the real component  
     134*NOTE 3. For the nuclear scattering length density, only the real component 
    133135is taken account.* 
    134136 
     
    139141 
    140142The SANS Calculator tool can read some PDB, OMF or SLD files but ignores 
    141 polarized/magnetic scattering when doing so, thus related parameters such as  
     143polarized/magnetic scattering when doing so, thus related parameters such as 
    142144*Up_frac_in*, etc, will be ignored. 
    143145 
    144 The calculation for fixed orientation uses Equation 1 above resulting in a 2D  
    145 output, whereas the scattering calculation averaged over all the orientations  
     146The calculation for fixed orientation uses Equation 1 above resulting in a 2D 
     147output, whereas the scattering calculation averaged over all the orientations 
    146148uses the Debye equation below providing a 1D output 
    147149 
    148 .. image:: gen_debye_eq.gif 
     150.. image:: gen_debye_eq.png 
    149151 
    150 where *v*\ :sub:`j` |beta|\ :sub:`j` |equiv| *b*\ :sub:`j` is the scattering  
    151 length of the j'th atom. The calculation output is passed to the *Data Explorer*  
     152where $v_j \beta_j \equiv b_j$ is the scattering 
     153length of the $j^\text{th}$ atom. The calculation output is passed to the *Data Explorer* 
    152154for further use. 
    153155 
  • src/sas/sasgui/perspectives/calculator/media/sld_calculator_help.rst

    rf93b473f r5ed76f8  
    1010----------- 
    1111 
    12 The neutron scattering length density (SLD) is defined as 
     12The neutron scattering length density (SLD, $\beta_N$) is defined as 
    1313 
    14   SLD = (b_c1 + b_c2 + ... + b_cn) / Vm 
     14.. math:: 
    1515 
    16 where b_ci is the bound coherent scattering length of ith of n atoms in a molecule 
    17 with the molecular volume Vm 
     16  \beta_N = (b_{c1} + b_{c2} + ... + b_{cn}) / V_m 
     17 
     18where $b_{ci}$ is the bound coherent scattering length of ith of n atoms in a molecule 
     19with the molecular volume $V_m$. 
    1820 
    1921.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     
    2224---------------------------- 
    2325 
    24 To calculate scattering length densities enter the empirical formula of a  
     26To calculate scattering length densities enter the empirical formula of a 
    2527compound and its mass density and click "Calculate". 
    2628 
    27 Entering a wavelength value is optional (a default value of 6.0 |Ang| will  
     29Entering a wavelength value is optional (a default value of 6.0 |Ang| will 
    2830be used). 
    2931 
     
    3840*  Parentheses can be nested, such as "(CaCO3(H2O)6)1". 
    3941 
    40 *  Isotopes are represented by their atomic number in *square brackets*, such  
     42*  Isotopes are represented by their atomic number in *square brackets*, such 
    4143   as "CaCO[18]3+6H2O", H[1], or H[2]. 
    4244 
    4345*  Numbers of atoms can be integer or decimal, such as "CaCO3+(3HO0.5)2". 
    4446 
    45 *  The SLD of mixtures can be calculated as well. For example, for a 70-30  
     47*  The SLD of mixtures can be calculated as well. For example, for a 70-30 
    4648   mixture of H2O/D2O write "H14O7+D6O3" or more simply "H7D3O5" (i.e. this says 
    4749   7 hydrogens, 3 deuteriums, and 5 oxygens) and enter a mass density calculated 
    4850   on the percentages of H2O and D2O. 
    4951 
    50 *  Type "C[13]6 H[2]12 O[18]6" for C(13)6H(2)12O(18)6 (6 Carbon-13 atoms, 12  
     52*  Type "C[13]6 H[2]12 O[18]6" for C(13)6H(2)12O(18)6 (6 Carbon-13 atoms, 12 
    5153   deuterium atoms, and 6 Oxygen-18 atoms). 
    52     
     54 
    5355.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    5456 
    55 .. note::  This help document was last changed by Steve King, 01May2015 
     57.. note::  This help document was last changed by Paul Kienzle, 05Apr2017 
    5658 
  • src/sas/sasgui/perspectives/calculator/media/slit_calculator_help.rst

    rf93b473f r5ed76f8  
    1111----------- 
    1212 
    13 This tool enables X-ray users to calculate the slit size (FWHM/2) for smearing  
     13This tool enables X-ray users to calculate the slit size (FWHM/2) for smearing 
    1414based on their half beam profile data. 
    1515 
    1616*NOTE! Whilst it may have some more generic applicability, the calculator has 
    17 only been tested with beam profile data from Anton-Paar SAXSess*\ |TM|\   
    18 *software.* 
     17only been tested with beam profile data from Anton-Paar SAXSess:sup:`TM` software.* 
    1918 
    2019.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     
    27262) Load a beam profile file in the *Data* field using the *Browse* button. 
    2827 
    29    *NOTE! To see an example of the beam profile file format, visit the file  
     28   *NOTE! To see an example of the beam profile file format, visit the file 
    3029   beam profile.DAT in your {installation_directory}/SasView/test folder.* 
    3130 
    32 3) Once a data is loaded, the slit size is automatically computed and displayed  
     313) Once a data is loaded, the slit size is automatically computed and displayed 
    3332   in the tool window. 
    3433 
    35 *NOTE! The beam profile file does not carry any information about the units of  
     34*NOTE! The beam profile file does not carry any information about the units of 
    3635the Q data. This calculator assumes the data has units of 1/\ |Ang|\ . If the 
    3736data is not in these units it must be manually converted beforehand.* 
  • src/sas/sasgui/perspectives/calculator/model_editor.py

    r277257f r69363c7  
    109109        self.model2_string = "cylinder" 
    110110        self.name = 'Sum' + M_NAME 
    111         self.factor = 'scale_factor' 
    112111        self._notes = '' 
    113112        self._operator = '+' 
     
    136135        self.model2_name = str(self.model2.GetValue()) 
    137136        self.good_name = True 
    138         self.fill_oprator_combox() 
     137        self.fill_operator_combox() 
    139138 
    140139    def _layout_name(self): 
     
    494493        a sum or multiply model then create the appropriate string 
    495494        """ 
    496  
    497495        name = '' 
    498  
    499496        if operator == '*': 
    500497            name = 'Multi' 
    501             factor = 'BackGround' 
    502             f_oper = '+' 
     498            factor = 'background' 
    503499        else: 
    504500            name = 'Sum' 
    505501            factor = 'scale_factor' 
    506             f_oper = '*' 
    507  
    508         self.factor = factor 
     502 
    509503        self._operator = operator 
    510         self.explanation = "  Plugin Model = %s %s (model1 %s model2)\n" % \ 
    511                            (self.factor, f_oper, self._operator) 
     504        self.explanation = ("  Plugin_model = scale_factor * (model_1 {} " 
     505            "model_2) + background").format(operator) 
    512506        self.explanationctr.SetLabel(self.explanation) 
    513507        self.name = name + M_NAME 
    514508 
    515509 
    516     def fill_oprator_combox(self): 
     510    def fill_operator_combox(self): 
    517511        """ 
    518512        fill the current combobox with the operator 
     
    530524        return [self.model1_name, self.model2_name] 
    531525 
    532     def write_string(self, fname, name1, name2): 
     526    def write_string(self, fname, model1_name, model2_name): 
    533527        """ 
    534528        Write and Save file 
     
    536530        self.fname = fname 
    537531        description = self.desc_tcl.GetValue().lstrip().rstrip() 
    538         if description == '': 
    539             description = name1 + self._operator + name2 
    540         text = self._operator_choice.GetValue() 
    541         if text.count('+') > 0: 
    542             factor = 'scale_factor' 
    543             f_oper = '*' 
    544             default_val = '1.0' 
    545         else: 
    546             factor = 'BackGround' 
    547             f_oper = '+' 
    548             default_val = '0.0' 
    549         path = self.fname 
    550         try: 
    551             out_f = open(path, 'w') 
    552         except: 
    553             raise 
    554         lines = SUM_TEMPLATE.split('\n') 
    555         for line in lines: 
    556             try: 
    557                 if line.count("scale_factor"): 
    558                     line = line.replace('scale_factor', factor) 
    559                     #print "scale_factor", line 
    560                 if line.count("= %s"): 
    561                     out_f.write(line % (default_val) + "\n") 
    562                 elif line.count("import Model as P1"): 
    563                     if self.is_p1_custom: 
    564                         line = line.replace('#', '') 
    565                         out_f.write(line % name1 + "\n") 
    566                     else: 
    567                         out_f.write(line + "\n") 
    568                 elif line.count("import %s as P1"): 
    569                     if not self.is_p1_custom: 
    570                         line = line.replace('#', '') 
    571                         out_f.write(line % (name1) + "\n") 
    572                     else: 
    573                         out_f.write(line + "\n") 
    574                 elif line.count("import Model as P2"): 
    575                     if self.is_p2_custom: 
    576                         line = line.replace('#', '') 
    577                         out_f.write(line % name2 + "\n") 
    578                     else: 
    579                         out_f.write(line + "\n") 
    580                 elif line.count("import %s as P2"): 
    581                     if not self.is_p2_custom: 
    582                         line = line.replace('#', '') 
    583                         out_f.write(line % (name2) + "\n") 
    584                     else: 
    585                         out_f.write(line + "\n") 
    586                 elif line.count("P1 = find_model"): 
    587                     out_f.write(line % (name1) + "\n") 
    588                 elif line.count("P2 = find_model"): 
    589                     out_f.write(line % (name2) + "\n") 
    590  
    591                 elif line.count("self.description = '%s'"): 
    592                     out_f.write(line % description + "\n") 
    593                 #elif line.count("run") and line.count("%s"): 
    594                 #    out_f.write(line % self._operator + "\n") 
    595                 #elif line.count("evalDistribution") and line.count("%s"): 
    596                 #    out_f.write(line % self._operator + "\n") 
    597                 elif line.count("return") and line.count("%s") == 2: 
    598                     #print "line return", line 
    599                     out_f.write(line % (f_oper, self._operator) + "\n") 
    600                 elif line.count("out2")and line.count("%s"): 
    601                     out_f.write(line % self._operator + "\n") 
    602                 else: 
    603                     out_f.write(line + "\n") 
    604             except: 
    605                 raise 
    606         out_f.close() 
    607         #else: 
    608         #    msg = "Name exists already." 
     532        desc_line = '' 
     533        if description.strip() != '': 
     534            # Sasmodels generates a description for us. If the user provides 
     535            # their own description, add a line to overwrite the sasmodels one 
     536            desc_line = "\nmodel_info.description = '{}'".format(description) 
     537        name = os.path.splitext(os.path.basename(self.fname))[0] 
     538        output = SUM_TEMPLATE.format(name=name, model1=model1_name, 
     539            model2=model2_name, operator=self._operator, desc_line=desc_line) 
     540        with open(self.fname, 'w') as out_f: 
     541            out_f.write(output) 
    609542 
    610543    def compile_file(self, path): 
     
    646579        self.name_hsizer = None 
    647580        self.name_tcl = None 
     581        self.overwrite_cb = None 
    648582        self.desc_sizer = None 
    649583        self.desc_tcl = None 
     
    692626        #title name [string] 
    693627        name_txt = wx.StaticText(self, -1, 'Function Name : ') 
    694         overwrite_cb = wx.CheckBox(self, -1, "Overwrite existing plugin model of this name?", (10, 10)) 
    695         overwrite_cb.SetValue(False) 
    696         overwrite_cb.SetToolTipString("Overwrite it if already exists?") 
    697         wx.EVT_CHECKBOX(self, overwrite_cb.GetId(), self.on_over_cb) 
     628        self.overwrite_cb = wx.CheckBox(self, -1, "Overwrite existing plugin model of this name?", (10, 10)) 
     629        self.overwrite_cb.SetValue(False) 
     630        self.overwrite_cb.SetToolTipString("Overwrite it if already exists?") 
     631        wx.EVT_CHECKBOX(self, self.overwrite_cb.GetId(), self.on_over_cb) 
    698632        self.name_tcl = wx.TextCtrl(self, -1, size=(PANEL_WIDTH * 3 / 5, -1)) 
    699633        self.name_tcl.Bind(wx.EVT_TEXT_ENTER, self.on_change_name) 
     
    703637        self.name_tcl.SetToolTipString(hint_name) 
    704638        self.name_hsizer.AddMany([(self.name_tcl, 0, wx.LEFT | wx.TOP, 0), 
    705                                   (overwrite_cb, 0, wx.LEFT, 20)]) 
     639                                  (self.overwrite_cb, 0, wx.LEFT, 20)]) 
    706640        self.name_sizer.AddMany([(name_txt, 0, wx.LEFT | wx.TOP, 10), 
    707641                                 (self.name_hsizer, 0, 
     
    991925            info = 'Error' 
    992926            color = 'red' 
     927            self.overwrite_cb.SetValue(True) 
     928            self.overwrite_name = True 
    993929        else: 
    994930            self._notes = result 
     
    1030966        out_f.write('parameters = [ \n') 
    1031967        out_f.write('#   ["name", "units", default, [lower, upper], "type", "description"],\n') 
    1032         for pname, pvalue in self.get_param_helper(param_str): 
     968        for pname, pvalue, desc in self.get_param_helper(param_str): 
    1033969            param_names.append(pname) 
    1034             out_f.write("    ['%s', '', %s, [-inf, inf], '', ''],\n" 
    1035                         % (pname, pvalue)) 
    1036         for pname, pvalue in self.get_param_helper(pd_param_str): 
     970            out_f.write("    ['%s', '', %s, [-inf, inf], '', '%s'],\n" 
     971                        % (pname, pvalue, desc)) 
     972        for pname, pvalue, desc in self.get_param_helper(pd_param_str): 
    1037973            param_names.append(pname) 
    1038974            pd_params.append(pname) 
    1039             out_f.write("    ['%s', '', %s, [-inf, inf], 'volume', ''],\n" 
    1040                         % (pname, pvalue)) 
     975            out_f.write("    ['%s', '', %s, [-inf, inf], 'volume', '%s'],\n" 
     976                        % (pname, pvalue, desc)) 
    1041977        out_f.write('    ]\n') 
    1042978 
     
    10811017        for line in param_str.replace(';', ',').split('\n'): 
    10821018            for item in line.split(','): 
    1083                 parts = item.plit('=') 
    1084                 name = parts[0].strip() 
    1085                 value = parts[1] if len(parts) > 0 else '1.0' 
     1019                defn, desc = item.split('#', 1) if '#' in item else (item, '') 
     1020                name, value = defn.split('=', 1) if '=' in defn else (defn, '1.0') 
    10861021                if name: 
    1087                     yield name, value 
     1022                    yield [v.strip() for v in (name, value, desc)] 
    10881023 
    10891024    def set_function_helper(self, line): 
     
    12181153 
    12191154SUM_TEMPLATE = """ 
    1220 # A sample of an experimental model function for Sum/Multiply(Pmodel1,Pmodel2) 
    1221 import os 
    1222 import sys 
    1223 import copy 
    1224 import collections 
    1225  
    1226 import numpy 
    1227  
    1228 from sas.sascalc.fit.pluginmodel import Model1DPlugin 
    1229 from sasmodels.sasview_model import find_model 
    1230  
    1231 class Model(Model1DPlugin): 
    1232     name = os.path.splitext(os.path.basename(__file__))[0] 
    1233     is_multiplicity_model = False 
    1234     def __init__(self, multiplicity=1): 
    1235         Model1DPlugin.__init__(self, name='') 
    1236         P1 = find_model('%s') 
    1237         P2 = find_model('%s') 
    1238         p_model1 = P1() 
    1239         p_model2 = P2() 
    1240         ## Setting  model name model description 
    1241         self.description = '%s' 
    1242         if self.name.rstrip().lstrip() == '': 
    1243             self.name = self._get_name(p_model1.name, p_model2.name) 
    1244         if self.description.rstrip().lstrip() == '': 
    1245             self.description = p_model1.name 
    1246             self.description += p_model2.name 
    1247             self.fill_description(p_model1, p_model2) 
    1248  
    1249         ## Define parameters 
    1250         self.params = collections.OrderedDict() 
    1251  
    1252         ## Parameter details [units, min, max] 
    1253         self.details = {} 
    1254         ## Magnetic Panrameters 
    1255         self.magnetic_params = [] 
    1256         # non-fittable parameters 
    1257         self.non_fittable = p_model1.non_fittable 
    1258         self.non_fittable += p_model2.non_fittable 
    1259  
    1260         ##models 
    1261         self.p_model1= p_model1 
    1262         self.p_model2= p_model2 
    1263  
    1264  
    1265         ## dispersion 
    1266         self._set_dispersion() 
    1267         ## Define parameters 
    1268         self._set_params() 
    1269         ## New parameter:scaling_factor 
    1270         self.params['scale_factor'] = %s 
    1271  
    1272         ## Parameter details [units, min, max] 
    1273         self._set_details() 
    1274         self.details['scale_factor'] = ['', 0.0, numpy.inf] 
    1275  
    1276  
    1277         #list of parameter that can be fitted 
    1278         self._set_fixed_params() 
    1279  
    1280         ## parameters with orientation 
    1281         self.orientation_params = [] 
    1282         for item in self.p_model1.orientation_params: 
    1283             new_item = "p1_" + item 
    1284             if not new_item in self.orientation_params: 
    1285                 self.orientation_params.append(new_item) 
    1286  
    1287         for item in self.p_model2.orientation_params: 
    1288             new_item = "p2_" + item 
    1289             if not new_item in self.orientation_params: 
    1290                 self.orientation_params.append(new_item) 
    1291         ## magnetic params 
    1292         self.magnetic_params = [] 
    1293         for item in self.p_model1.magnetic_params: 
    1294             new_item = "p1_" + item 
    1295             if not new_item in self.magnetic_params: 
    1296                 self.magnetic_params.append(new_item) 
    1297  
    1298         for item in self.p_model2.magnetic_params: 
    1299             new_item = "p2_" + item 
    1300             if not new_item in self.magnetic_params: 
    1301                 self.magnetic_params.append(new_item) 
    1302         # get multiplicity if model provide it, else 1. 
    1303         try: 
    1304             multiplicity1 = p_model1.multiplicity 
    1305             try: 
    1306                 multiplicity2 = p_model2.multiplicity 
    1307             except: 
    1308                 multiplicity2 = 1 
    1309         except: 
    1310             multiplicity1 = 1 
    1311             multiplicity2 = 1 
    1312         ## functional multiplicity of the model 
    1313         self.multiplicity1 = multiplicity1 
    1314         self.multiplicity2 = multiplicity2 
    1315         self.multiplicity_info = [] 
    1316  
    1317     def _clone(self, obj): 
    1318         import copy 
    1319         obj.params     = copy.deepcopy(self.params) 
    1320         obj.description     = copy.deepcopy(self.description) 
    1321         obj.details    = copy.deepcopy(self.details) 
    1322         obj.dispersion = copy.deepcopy(self.dispersion) 
    1323         obj.p_model1  = self.p_model1.clone() 
    1324         obj.p_model2  = self.p_model2.clone() 
    1325         #obj = copy.deepcopy(self) 
    1326         return obj 
    1327  
    1328     def _get_name(self, name1, name2): 
    1329         p1_name = self._get_upper_name(name1) 
    1330         if not p1_name: 
    1331             p1_name = name1 
    1332         name = p1_name 
    1333         name += "_and_" 
    1334         p2_name = self._get_upper_name(name2) 
    1335         if not p2_name: 
    1336             p2_name = name2 
    1337         name += p2_name 
    1338         return name 
    1339  
    1340     def _get_upper_name(self, name=None): 
    1341         if name is None: 
    1342             return "" 
    1343         upper_name = "" 
    1344         str_name = str(name) 
    1345         for index in range(len(str_name)): 
    1346             if str_name[index].isupper(): 
    1347                 upper_name += str_name[index] 
    1348         return upper_name 
    1349  
    1350     def _set_dispersion(self): 
    1351         self.dispersion = collections.OrderedDict() 
    1352         ##set dispersion only from p_model 
    1353         for name , value in self.p_model1.dispersion.iteritems(): 
    1354             #if name.lower() not in self.p_model1.orientation_params: 
    1355             new_name = "p1_" + name 
    1356             self.dispersion[new_name]= value 
    1357         for name , value in self.p_model2.dispersion.iteritems(): 
    1358             #if name.lower() not in self.p_model2.orientation_params: 
    1359             new_name = "p2_" + name 
    1360             self.dispersion[new_name]= value 
    1361  
    1362     def function(self, x=0.0): 
    1363         return 0 
    1364  
    1365     def getProfile(self): 
    1366         try: 
    1367             x,y = self.p_model1.getProfile() 
    1368         except: 
    1369             x = None 
    1370             y = None 
    1371  
    1372         return x, y 
    1373  
    1374     def _set_params(self): 
    1375         for name , value in self.p_model1.params.iteritems(): 
    1376             # No 2D-supported 
    1377             #if name not in self.p_model1.orientation_params: 
    1378             new_name = "p1_" + name 
    1379             self.params[new_name]= value 
    1380  
    1381         for name , value in self.p_model2.params.iteritems(): 
    1382             # No 2D-supported 
    1383             #if name not in self.p_model2.orientation_params: 
    1384             new_name = "p2_" + name 
    1385             self.params[new_name]= value 
    1386  
    1387         # Set "scale" as initializing 
    1388         self._set_scale_factor() 
    1389  
    1390  
    1391     def _set_details(self): 
    1392         for name ,detail in self.p_model1.details.iteritems(): 
    1393             new_name = "p1_" + name 
    1394             #if new_name not in self.orientation_params: 
    1395             self.details[new_name]= detail 
    1396  
    1397         for name ,detail in self.p_model2.details.iteritems(): 
    1398             new_name = "p2_" + name 
    1399             #if new_name not in self.orientation_params: 
    1400             self.details[new_name]= detail 
    1401  
    1402     def _set_scale_factor(self): 
    1403         pass 
    1404  
    1405  
    1406     def setParam(self, name, value): 
    1407         # set param to this (p1, p2) model 
    1408         self._setParamHelper(name, value) 
    1409  
    1410         ## setParam to p model 
    1411         model_pre = '' 
    1412         new_name = '' 
    1413         name_split = name.split('_', 1) 
    1414         if len(name_split) == 2: 
    1415             model_pre = name.split('_', 1)[0] 
    1416             new_name = name.split('_', 1)[1] 
    1417         if model_pre == "p1": 
    1418             if new_name in self.p_model1.getParamList(): 
    1419                 self.p_model1.setParam(new_name, value) 
    1420         elif model_pre == "p2": 
    1421              if new_name in self.p_model2.getParamList(): 
    1422                 self.p_model2.setParam(new_name, value) 
    1423         elif name == 'scale_factor': 
    1424             self.params['scale_factor'] = value 
    1425         else: 
    1426             raise ValueError, "Model does not contain parameter %s" % name 
    1427  
    1428     def getParam(self, name): 
    1429         # Look for dispersion parameters 
    1430         toks = name.split('.') 
    1431         if len(toks)==2: 
    1432             for item in self.dispersion.keys(): 
    1433                 # 2D not supported 
    1434                 if item.lower()==toks[0].lower(): 
    1435                     for par in self.dispersion[item]: 
    1436                         if par.lower() == toks[1].lower(): 
    1437                             return self.dispersion[item][par] 
    1438         else: 
    1439             # Look for standard parameter 
    1440             for item in self.params.keys(): 
    1441                 if item.lower()==name.lower(): 
    1442                     return self.params[item] 
    1443         return 
    1444         #raise ValueError, "Model does not contain parameter %s" % name 
    1445  
    1446     def _setParamHelper(self, name, value): 
    1447         # Look for dispersion parameters 
    1448         toks = name.split('.') 
    1449         if len(toks)== 2: 
    1450             for item in self.dispersion.keys(): 
    1451                 if item.lower()== toks[0].lower(): 
    1452                     for par in self.dispersion[item]: 
    1453                         if par.lower() == toks[1].lower(): 
    1454                             self.dispersion[item][par] = value 
    1455                             return 
    1456         else: 
    1457             # Look for standard parameter 
    1458             for item in self.params.keys(): 
    1459                 if item.lower()== name.lower(): 
    1460                     self.params[item] = value 
    1461                     return 
    1462  
    1463         raise ValueError, "Model does not contain parameter %s" % name 
    1464  
    1465  
    1466     def _set_fixed_params(self): 
    1467         self.fixed = [] 
    1468         for item in self.p_model1.fixed: 
    1469             new_item = "p1" + item 
    1470             self.fixed.append(new_item) 
    1471         for item in self.p_model2.fixed: 
    1472             new_item = "p2" + item 
    1473             self.fixed.append(new_item) 
    1474  
    1475         self.fixed.sort() 
    1476  
    1477  
    1478     def run(self, x = 0.0): 
    1479         self._set_scale_factor() 
    1480         return self.params['scale_factor'] %s \ 
    1481 (self.p_model1.run(x) %s self.p_model2.run(x)) 
    1482  
    1483     def runXY(self, x = 0.0): 
    1484         self._set_scale_factor() 
    1485         return self.params['scale_factor'] %s \ 
    1486 (self.p_model1.runXY(x) %s self.p_model2.runXY(x)) 
    1487  
    1488     ## Now (May27,10) directly uses the model eval function 
    1489     ## instead of the for-loop in Base Component. 
    1490     def evalDistribution(self, x = []): 
    1491         self._set_scale_factor() 
    1492         return self.params['scale_factor'] %s \ 
    1493 (self.p_model1.evalDistribution(x) %s \ 
    1494 self.p_model2.evalDistribution(x)) 
    1495  
    1496     def set_dispersion(self, parameter, dispersion): 
    1497         value= None 
    1498         new_pre = parameter.split("_", 1)[0] 
    1499         new_parameter = parameter.split("_", 1)[1] 
    1500         try: 
    1501             if new_pre == 'p1' and \ 
    1502 new_parameter in self.p_model1.dispersion.keys(): 
    1503                 value= self.p_model1.set_dispersion(new_parameter, dispersion) 
    1504             if new_pre == 'p2' and \ 
    1505 new_parameter in self.p_model2.dispersion.keys(): 
    1506                 value= self.p_model2.set_dispersion(new_parameter, dispersion) 
    1507             self._set_dispersion() 
    1508             return value 
    1509         except: 
    1510             raise 
    1511  
    1512     def fill_description(self, p_model1, p_model2): 
    1513         description = "" 
    1514         description += "This model gives the summation or multiplication of" 
    1515         description += "%s and %s. "% ( p_model1.name, p_model2.name ) 
    1516         self.description += description 
    1517  
    1518 if __name__ == "__main__": 
    1519     m1= Model() 
    1520     #m1.setParam("p1_scale", 25) 
    1521     #m1.setParam("p1_length", 1000) 
    1522     #m1.setParam("p2_scale", 100) 
    1523     #m1.setParam("p2_rg", 100) 
    1524     out1 = m1.runXY(0.01) 
    1525  
    1526     m2= Model() 
    1527     #m2.p_model1.setParam("scale", 25) 
    1528     #m2.p_model1.setParam("length", 1000) 
    1529     #m2.p_model2.setParam("scale", 100) 
    1530     #m2.p_model2.setParam("rg", 100) 
    1531     out2 = m2.p_model1.runXY(0.01) %s m2.p_model2.runXY(0.01)\n 
    1532     print "My name is %s."% m1.name 
    1533     print out1, " = ", out2 
    1534     if out1 == out2: 
    1535         print "===> Simple Test: Passed!" 
    1536     else: 
    1537         print "===> Simple Test: Failed!" 
     1155from sasmodels.core import load_model_info 
     1156from sasmodels.sasview_model import make_model_from_info 
     1157 
     1158model_info = load_model_info('{model1}{operator}{model2}') 
     1159model_info.name = '{name}'{desc_line} 
     1160Model = make_model_from_info(model_info) 
    15381161""" 
    1539  
    15401162if __name__ == "__main__": 
    15411163    main_app = wx.App() 
  • src/sas/sasgui/perspectives/calculator/pyconsole.py

    r7432acb r4627657  
    3737    Iqxy = model.evalDistribution([qx, qy]) 
    3838 
    39     result = """ 
    40     Iq(%s) = %s 
    41     Iqxy(%s, %s) = %s 
    42     """%(q, Iq, qx, qy, Iqxy) 
     39    # check the model's unit tests run 
     40    from sasmodels.model_test import run_one 
     41    result = run_one(path) 
    4342 
    4443    return result 
     
    8988        ok = wx.Button(self, wx.ID_OK, "OK") 
    9089 
    91         # Mysterious constraint layouts from  
     90        # Mysterious constraint layouts from 
    9291        # https://www.wxpython.org/docs/api/wx.lib.layoutf.Layoutf-class.html 
    9392        lc = layoutf.Layoutf('t=t5#1;b=t5#2;l=l5#1;r=r5#1', (self,ok)) 
Note: See TracChangeset for help on using the changeset viewer.