Changeset 69363c7 in sasview for src/sas/sasgui/perspectives/calculator
- Timestamp:
- Sep 22, 2017 10:29:48 AM (7 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, 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 10:28:48)
- git-committer:
- Paul Kienzle <pkienzle@…> (09/22/17 10:29:48)
- 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 59 59 _, extension = os.path.splitext(basename) 60 60 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. 61 67 img = mpimg.imread(file_path) 62 68 is_png = extension.lower() == '.png' … … 89 95 if location is None: 90 96 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) 93 109 if dlg.ShowModal() == wx.ID_OK: 94 110 path = dlg.GetPaths() -
src/sas/sasgui/perspectives/calculator/media/density_calculator_help.rst
rd85c194 r6aad2e8 29 29 4) Click the 'Calculate' button to perform the calculation. 30 30 31 .. image:: density_tutor. gif31 .. image:: density_tutor.png 32 32 33 33 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ -
src/sas/sasgui/perspectives/calculator/media/gen_sas_help.html
rd85c194 r6aad2e8 19 19 by the particle 20 20 <p> 21 <img src="gen_i. gif"/>21 <img src="gen_i.png"/> 22 22 </p> 23 23 <br> … … 26 26 of the j'th pixel respectively. And the total volume 27 27 <p> 28 <img src="v_j. gif"/>28 <img src="v_j.png"/> 29 29 </p> 30 30 <br> … … 44 44 scattering length. (Figure below). 45 45 <p> 46 <img src="mag_vector. bmp"/>46 <img src="mag_vector.png"/> 47 47 </p> 48 48 <br> 49 49 The magnetic scattering length density is then 50 50 <p> 51 <img src="dm_eq. gif"/>51 <img src="dm_eq.png"/> 52 52 </p> 53 53 <br> … … 66 66 <br> 67 67 <p> 68 <img src="gen_mag_pic. bmp"/>68 <img src="gen_mag_pic.png"/> 69 69 </p> 70 70 <br> … … 75 75 densities , including the nuclear scattering length density (β <sub>N</sub>) are given as, for non-spin-flips, 76 76 <p> 77 <img src="sld1. gif"/>77 <img src="sld1.png"/> 78 78 </p> 79 79 <br> … … 81 81 for spin-flips, 82 82 <p> 83 <img src="sld2. gif"/>83 <img src="sld2.png"/> 84 84 </p> 85 85 <br> … … 87 87 where 88 88 <p> 89 <img src="mxp. gif"/>89 <img src="mxp.png"/> 90 90 </p> 91 91 <p> 92 <img src="myp. gif"/>92 <img src="myp.png"/> 93 93 </p> 94 94 <p> 95 <img src="mzp. gif"/>95 <img src="mzp.png"/> 96 96 </p> 97 97 <p> 98 <img src="mqx. gif"/>98 <img src="mqx.png"/> 99 99 </p> 100 100 <p> 101 <img src="mqy. gif"/>101 <img src="mqy.png"/> 102 102 </p> 103 103 <br> … … 110 110 <br> 111 111 <p> 112 <img src="gen_gui_help. bmp"/>112 <img src="gen_gui_help.png"/> 113 113 </p> 114 114 <br> … … 136 136 in a 2D output, whileas the scattering calculation averaged over all the orientations uses the Debye equation providing a 1D output: 137 137 <p> 138 <img src="gen_debye_eq. gif"/>138 <img src="gen_debye_eq.png"/> 139 139 </p> 140 140 <br> -
src/sas/sasgui/perspectives/calculator/media/image_viewer_help.rst
rda456fb r412e9e8b 34 34 will be displayed. 35 35 36 .. image:: load_image. bmp36 .. image:: load_image.png 37 37 38 38 3) To save, print, or copy the image, or to apply a grid overlay, right-click 39 39 anywhere in the plot. 40 40 41 .. image:: pic_plot. bmp41 .. image:: pic_plot.png 42 42 43 43 4. If the image is taken from a 2D detector, SasView can attempt to convert … … 51 51 then click the OK. 52 52 53 .. image:: pic_convert. bmp53 .. image:: pic_convert.png 54 54 55 55 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ -
src/sas/sasgui/perspectives/calculator/media/kiessig_calculator_help.rst
r7805458 r5ed76f8 10 10 ----------- 11 11 12 This tool is approximately estimates the thickness of a layer or the diameter13 of particles from the position of the Kiessig fringe/Bragg peak in NR/SAS data 14 usingthe relation12 This tool estimates real space dimensions from the position or spacing of 13 features in recipricol space. In particular a particle of size $d$ will 14 give rise to Bragg peaks with spacing $\Delta q$ according to the relation 15 15 16 (thickness *or* size) = 2 * |pi| / (fringe_width *or* peak position) 17 16 .. math:: 17 18 d = 2\pi / \Delta q 19 20 Similarly, the spacing between the peaks in Kiessig fringes in reflectometry 21 data arise from layers of thickness $d$. 22 18 23 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 19 24 … … 21 26 -------------- 22 27 23 To get a rough thickness or particle size, simply type the fringe or peak 28 To get a rough thickness or particle size, simply type the fringe or peak 24 29 position (in units of 1/|Ang|\) and click on the *Compute* button. 25 30 26 31 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 27 32 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 10 10 ----------- 11 11 12 This tool is approximately estimates the resolution of Q from SAS instrumental13 parameter values assuming that the detector is flat and normal to the 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 14 14 incident beam. 15 15 … … 23 23 2) Select the source (Neutron or Photon) and source type (Monochromatic or TOF). 24 24 25 *NOTE! The computational difference between the sources is only the 25 *NOTE! The computational difference between the sources is only the 26 26 gravitational contribution due to the mass of the particles.* 27 27 28 3) Change the default values of the instrumental parameters as required. Be 28 3) Change the default values of the instrumental parameters as required. Be 29 29 careful to note that distances are specified in cm! 30 30 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 31 4) 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 35 35 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 40 40 will be used for the corresponding wavelength spread. 41 41 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 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 44 44 be loaded by selecting *Add new* in the combo box. 45 45 46 6) When ready, click the *Compute* button. Depending on the computation the 46 6) When ready, click the *Compute* button. Depending on the computation the 47 47 calculation time will vary. 48 48 49 7) 1D and 2D dQ values will be displayed at the bottom of the panel, and a 2D50 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 the49 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 52 52 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 accessible53 54 TOF only: green lines indicate the limits of the maximum $Q$ range accessible 55 55 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 Q58 region near the beam block/stop59 56 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})$] 61 61 62 62 the variance is slightly under estimated. 63 63 64 8) A summary of the calculation is written to the SasView *Console* at the 64 8) A summary of the calculation is written to the SasView *Console* at the 65 65 bottom of the main SasView window. 66 66 67 .. image:: resolution_tutor. gif67 .. image:: resolution_tutor.png 68 68 69 69 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 74 74 The scattering wave transfer vector is by definition 75 75 76 .. image:: q. gif76 .. image:: q.png 77 77 78 In the small-angle limit, the variance of Q is to a first-order78 In the small-angle limit, the variance of $Q$ is to a first-order 79 79 approximation 80 80 81 .. image:: sigma_q. gif81 .. image:: sigma_q.png 82 82 83 83 The geometric and gravitational contributions can then be summarised as 84 84 85 .. image:: sigma_table. gif85 .. image:: sigma_table.png 86 86 87 Finally, a Gaussian function is used to describe the 2D weighting distribution 88 of the uncertainty in Q.87 Finally, a Gaussian function is used to describe the 2D weighting distribution 88 of the uncertainty in $Q$. 89 89 90 90 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 93 93 ---------- 94 94 95 D.F.R. Mildner and J.M. Carpenter 95 D.F.R. Mildner and J.M. Carpenter 96 96 *J. Appl. Cryst.* 17 (1984) 249-256 97 97 98 D.F.R. Mildner, J.M. Carpenter and D.L. Worcester 98 D.F.R. Mildner, J.M. Carpenter and D.L. Worcester 99 99 *J. Appl. Cryst.* 19 (1986) 311-319 100 100 -
src/sas/sasgui/perspectives/calculator/media/sas_calculator_help.rst
rda456fb r5ed76f8 19 19 ------ 20 20 21 In general, a particle with a volume *V* can be described by an ensemble22 containing *N* 3-dimensional rectangular pixels where each pixel is much23 smaller than *V*.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$. 24 24 25 Assuming that all the pixel sizes are the same, the elastic scattering 25 Assuming that all the pixel sizes are the same, the elastic scattering 26 26 intensity from the particle is 27 27 28 .. image:: gen_i. gif28 .. image:: gen_i.png 29 29 30 30 Equation 1. 31 31 32 where |beta|\ :sub:`j` and *r*\ :sub:`j` are the scattering length density and33 the position of the j'thpixel respectively.32 where $\beta_j$ and $r_j$ are the scattering length density and 33 the position of the $j^\text{th}$ pixel respectively. 34 34 35 The total volume *V*35 The total volume $V$ 36 36 37 .. image:: v_j.gif37 .. math:: 38 38 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 41 for $\beta_j \ne 0$ where $v_j$ is the volume of the $j^\text{th}$ 42 pixel (or the $j^\text{th}$ natural atomic volume (= atomic mass / (natural molar 41 43 density * Avogadro number) for the atomic structures). 42 44 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 46 atomic structure (such as taken from a PDB file) to get the right normalization. 45 47 46 *NOTE! * |beta|\ :sub:`j` *displayed in the GUI may be incorrect but this will not48 *NOTE! $\beta_j$ displayed in the GUI may be incorrect but this will not 47 49 affect the scattering computation if the correction of the total volume V is made.* 48 50 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 51 The scattering length density (SLD) of each pixel, where the SLD is uniform, is 52 a combination of the nuclear and magnetic SLDs and depends on the spin states 51 53 of the neutrons as follows. 52 54 … … 54 56 ^^^^^^^^^^^^^^^^^^^ 55 57 56 For magnetic scattering, only the magnetization component, *M*\ :sub:`perp`\ ,57 perpendicular to the scattering vector *Q* contributes to the magnetic58 For magnetic scattering, only the magnetization component, $M_\perp$, 59 perpendicular to the scattering vector $Q$ contributes to the magnetic 58 60 scattering length. 59 61 60 .. image:: mag_vector. bmp62 .. image:: mag_vector.png 61 63 62 64 The magnetic scattering length density is then 63 65 64 .. image:: dm_eq. gif66 .. image:: dm_eq.png 65 67 66 where the gyromagnetic ratio |gamma| = -1.913, |mu|\ :sub:`B` is the Bohr67 magneton, *r*\ :sub:`0` is the classical radius of electron, and |sigma| is the68 where the gyromagnetic ratio is $\gamma = -1.913$, $\mu_B$ is the Bohr 69 magneton, $r_0$ is the classical radius of electron, and $\sigma$ is the 68 70 Pauli spin. 69 71 70 72 For a polarized neutron, the magnetic scattering is depending on the spin states. 71 73 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 74 Let us consider that the incident neutrons are polarised both parallel (+) and 75 anti-parallel (-) to the x' axis (see below). The possible states after 76 scattering from the sample are then 75 77 76 78 * Non-spin flips: (+ +) and (- -) 77 79 * Spin flips: (+ -) and (- +) 78 80 79 .. image:: gen_mag_pic. bmp81 .. image:: gen_mag_pic.png 80 82 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`\ )83 Now let us assume that the angles of the *Q* vector and the spin-axis (x') 84 to the x-axis are $\phi$ and $\theta_\text{up}$ respectively (see above). Then, 85 depending upon the polarization (spin) state of neutrons, the scattering 86 length densities, including the nuclear scattering length density ($\beta_N$) 85 87 are given as 86 88 87 89 * for non-spin-flips 88 90 89 .. image:: sld1. gif91 .. image:: sld1.png 90 92 91 93 * for spin-flips 92 94 93 .. image:: sld2. gif95 .. image:: sld2.png 94 96 95 97 where 96 98 97 .. image:: mxp. gif99 .. image:: mxp.png 98 100 99 .. image:: myp. gif101 .. image:: myp.png 100 102 101 .. image:: mzp. gif103 .. image:: mzp.png 102 104 103 .. image:: mqx. gif105 .. image:: mqx.png 104 106 105 .. image:: mqy. gif107 .. image:: mqy.png 106 108 107 Here the *M0*\ :sub:`x`\ , *M0*\ :sub:`y` and *M0*\ :sub:`z` are the x, y and z108 components of the magnetisation vector in the laboratory xyz frame.109 Here the $M0_x$, $M0_y$ and $M0_z$ are the $x$, $y$ and $z$ 110 components of the magnetisation vector in the laboratory $xyz$ frame. 109 111 110 112 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 113 115 -------------- 114 116 115 .. image:: gen_gui_help. bmp117 .. image:: gen_gui_help.png 116 118 117 After computation the result will appear in the *Theory* box in the SasView 119 After computation the result will appear in the *Theory* box in the SasView 118 120 *Data Explorer* panel. 119 121 120 *Up_frac_in* and *Up_frac_out* are the ratio 122 *Up_frac_in* and *Up_frac_out* are the ratio 121 123 122 124 (spin up) / (spin up + spin down) 123 125 124 126 of neutrons before the sample and at the analyzer, respectively. 125 127 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 127 129 0.0 to 1.0. Both values are 0.5 for unpolarized neutrons.* 128 130 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 130 132 in xyz coordinates. No angular orientational averaging is considered.* 131 133 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 133 135 is taken account.* 134 136 … … 139 141 140 142 The 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 143 polarized/magnetic scattering when doing so, thus related parameters such as 142 144 *Up_frac_in*, etc, will be ignored. 143 145 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 146 The calculation for fixed orientation uses Equation 1 above resulting in a 2D 147 output, whereas the scattering calculation averaged over all the orientations 146 148 uses the Debye equation below providing a 1D output 147 149 148 .. image:: gen_debye_eq. gif150 .. image:: gen_debye_eq.png 149 151 150 where *v*\ :sub:`j` |beta|\ :sub:`j` |equiv| *b*\ :sub:`j` is the scattering151 length of the j'th atom. The calculation output is passed to the *Data Explorer*152 where $v_j \beta_j \equiv b_j$ is the scattering 153 length of the $j^\text{th}$ atom. The calculation output is passed to the *Data Explorer* 152 154 for further use. 153 155 -
src/sas/sasgui/perspectives/calculator/media/sld_calculator_help.rst
rf93b473f r5ed76f8 10 10 ----------- 11 11 12 The neutron scattering length density (SLD ) is defined as12 The neutron scattering length density (SLD, $\beta_N$) is defined as 13 13 14 SLD = (b_c1 + b_c2 + ... + b_cn) / Vm 14 .. math:: 15 15 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 18 where $b_{ci}$ is the bound coherent scattering length of ith of n atoms in a molecule 19 with the molecular volume $V_m$. 18 20 19 21 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 22 24 ---------------------------- 23 25 24 To calculate scattering length densities enter the empirical formula of a 26 To calculate scattering length densities enter the empirical formula of a 25 27 compound and its mass density and click "Calculate". 26 28 27 Entering a wavelength value is optional (a default value of 6.0 |Ang| will 29 Entering a wavelength value is optional (a default value of 6.0 |Ang| will 28 30 be used). 29 31 … … 38 40 * Parentheses can be nested, such as "(CaCO3(H2O)6)1". 39 41 40 * Isotopes are represented by their atomic number in *square brackets*, such 42 * Isotopes are represented by their atomic number in *square brackets*, such 41 43 as "CaCO[18]3+6H2O", H[1], or H[2]. 42 44 43 45 * Numbers of atoms can be integer or decimal, such as "CaCO3+(3HO0.5)2". 44 46 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 46 48 mixture of H2O/D2O write "H14O7+D6O3" or more simply "H7D3O5" (i.e. this says 47 49 7 hydrogens, 3 deuteriums, and 5 oxygens) and enter a mass density calculated 48 50 on the percentages of H2O and D2O. 49 51 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 51 53 deuterium atoms, and 6 Oxygen-18 atoms). 52 54 53 55 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 54 56 55 .. note:: This help document was last changed by Steve King, 01May201557 .. note:: This help document was last changed by Paul Kienzle, 05Apr2017 56 58 -
src/sas/sasgui/perspectives/calculator/media/slit_calculator_help.rst
rf93b473f r5ed76f8 11 11 ----------- 12 12 13 This tool enables X-ray users to calculate the slit size (FWHM/2) for smearing 13 This tool enables X-ray users to calculate the slit size (FWHM/2) for smearing 14 14 based on their half beam profile data. 15 15 16 16 *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.* 17 only been tested with beam profile data from Anton-Paar SAXSess:sup:`TM` software.* 19 18 20 19 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 27 26 2) Load a beam profile file in the *Data* field using the *Browse* button. 28 27 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 30 29 beam profile.DAT in your {installation_directory}/SasView/test folder.* 31 30 32 3) Once a data is loaded, the slit size is automatically computed and displayed 31 3) Once a data is loaded, the slit size is automatically computed and displayed 33 32 in the tool window. 34 33 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 36 35 the Q data. This calculator assumes the data has units of 1/\ |Ang|\ . If the 37 36 data is not in these units it must be manually converted beforehand.* -
src/sas/sasgui/perspectives/calculator/model_editor.py
r277257f r69363c7 109 109 self.model2_string = "cylinder" 110 110 self.name = 'Sum' + M_NAME 111 self.factor = 'scale_factor'112 111 self._notes = '' 113 112 self._operator = '+' … … 136 135 self.model2_name = str(self.model2.GetValue()) 137 136 self.good_name = True 138 self.fill_op rator_combox()137 self.fill_operator_combox() 139 138 140 139 def _layout_name(self): … … 494 493 a sum or multiply model then create the appropriate string 495 494 """ 496 497 495 name = '' 498 499 496 if operator == '*': 500 497 name = 'Multi' 501 factor = 'BackGround' 502 f_oper = '+' 498 factor = 'background' 503 499 else: 504 500 name = 'Sum' 505 501 factor = 'scale_factor' 506 f_oper = '*' 507 508 self.factor = factor 502 509 503 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) 512 506 self.explanationctr.SetLabel(self.explanation) 513 507 self.name = name + M_NAME 514 508 515 509 516 def fill_op rator_combox(self):510 def fill_operator_combox(self): 517 511 """ 518 512 fill the current combobox with the operator … … 530 524 return [self.model1_name, self.model2_name] 531 525 532 def write_string(self, fname, name1, name2):526 def write_string(self, fname, model1_name, model2_name): 533 527 """ 534 528 Write and Save file … … 536 530 self.fname = fname 537 531 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) 609 542 610 543 def compile_file(self, path): … … 646 579 self.name_hsizer = None 647 580 self.name_tcl = None 581 self.overwrite_cb = None 648 582 self.desc_sizer = None 649 583 self.desc_tcl = None … … 692 626 #title name [string] 693 627 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) 698 632 self.name_tcl = wx.TextCtrl(self, -1, size=(PANEL_WIDTH * 3 / 5, -1)) 699 633 self.name_tcl.Bind(wx.EVT_TEXT_ENTER, self.on_change_name) … … 703 637 self.name_tcl.SetToolTipString(hint_name) 704 638 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)]) 706 640 self.name_sizer.AddMany([(name_txt, 0, wx.LEFT | wx.TOP, 10), 707 641 (self.name_hsizer, 0, … … 991 925 info = 'Error' 992 926 color = 'red' 927 self.overwrite_cb.SetValue(True) 928 self.overwrite_name = True 993 929 else: 994 930 self._notes = result … … 1030 966 out_f.write('parameters = [ \n') 1031 967 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): 1033 969 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): 1037 973 param_names.append(pname) 1038 974 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)) 1041 977 out_f.write(' ]\n') 1042 978 … … 1081 1017 for line in param_str.replace(';', ',').split('\n'): 1082 1018 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') 1086 1021 if name: 1087 yield name, value1022 yield [v.strip() for v in (name, value, desc)] 1088 1023 1089 1024 def set_function_helper(self, line): … … 1218 1153 1219 1154 SUM_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!" 1155 from sasmodels.core import load_model_info 1156 from sasmodels.sasview_model import make_model_from_info 1157 1158 model_info = load_model_info('{model1}{operator}{model2}') 1159 model_info.name = '{name}'{desc_line} 1160 Model = make_model_from_info(model_info) 1538 1161 """ 1539 1540 1162 if __name__ == "__main__": 1541 1163 main_app = wx.App() -
src/sas/sasgui/perspectives/calculator/pyconsole.py
r7432acb r4627657 37 37 Iqxy = model.evalDistribution([qx, qy]) 38 38 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) 43 42 44 43 return result … … 89 88 ok = wx.Button(self, wx.ID_OK, "OK") 90 89 91 # Mysterious constraint layouts from 90 # Mysterious constraint layouts from 92 91 # https://www.wxpython.org/docs/api/wx.lib.layoutf.Layoutf-class.html 93 92 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.