Changeset 23df833 in sasmodels
- Timestamp:
- Oct 30, 2018 6:19:38 PM (6 years ago)
- Branches:
- master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 5024a56
- Parents:
- aa8c6e0
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/guide/scripting.rst
rbd7630d r23df833 188 188 python kernel. Once the kernel is in hand, we can then marshal a set of 189 189 parameters into a :class:`sasmodels.details.CallDetails` object and ship it to 190 the kernel using the :func:`sansmodels.direct_model.call_kernel` function. An 191 example should help, *example/cylinder_eval.py*:: 192 193 from numpy import logspace 190 the kernel using the :func:`sansmodels.direct_model.call_kernel` function. To 191 accesses the underlying $<F(q)>$ and $<F^2(q)>$, use 192 :func:`sasmodels.direct_model.call_Fq` instead. 193 194 The following example should 195 help, *example/cylinder_eval.py*:: 196 197 from numpy import logspace, sqrt 194 198 from matplotlib import pyplot as plt 195 199 from sasmodels.core import load_model 196 from sasmodels.direct_model import call_kernel 200 from sasmodels.direct_model import call_kernel, call_Fq 197 201 198 202 model = load_model('cylinder') 199 203 q = logspace(-3, -1, 200) 200 204 kernel = model.make_kernel([q]) 201 Iq = call_kernel(kernel, dict(radius=200.)) 202 plt.loglog(q, Iq) 205 pars = {'radius': 200, 'radius_pd': 0.1, 'scale': 2} 206 Iq = call_kernel(kernel, pars) 207 F, Fsq, Reff, V, Vratio = call_Fq(kernel, pars) 208 209 plt.loglog(q, Iq, label='2 I(q)') 210 plt.loglog(q, F**2/V, label='<F(q)>^2/V') 211 plt.loglog(q, Fsq/V, label='<F^2(q)>/V') 212 plt.xlabel('q (1/A)') 213 plt.ylabel('I(q) (1/cm)') 214 plt.title('Cylinder with radius 200.') 215 plt.legend() 203 216 plt.show() 204 217 205 On windows, this can be called from the cmd prompt using sasview as:: 218 .. figure:: direct_call.png 219 220 Comparison between $I(q)$, $<F(q)>$ and $<F^2(q)>$ for cylinder model. 221 222 This compares $I(q)$ with $<F(q)>$ and $<F^2(q)>$ for a cylinder 223 with *radius=200 +/- 20* and *scale=2*. Note that *call_Fq* does not 224 include scale and background, nor does it normalize by the average volume. 225 The definition of $F = \rho V \hat F$ scaled by the contrast and 226 volume, compared to the canonical cylinder $\hat F$, with $\hat F(0) = 1$. 227 Integrating over polydispersity and orientation, the returned values are 228 $\sum_{r,w\in N(r_o, r_o/10)} \sum_\theta w F(q,r_o,\theta)\sin\theta$ and 229 $\sum_{r,w\in N(r_o, r_o/10)} \sum_\theta w F^2(q,r_o,\theta)\sin\theta$. 230 231 On windows, this example can be called from the cmd prompt using sasview as 232 as the python interpreter:: 206 233 207 234 SasViewCom example/cylinder_eval.py -
example/cylinder_eval.py
r2e66ef5 r23df833 3 3 """ 4 4 5 from numpy import logspace 5 from numpy import logspace, sqrt 6 6 from matplotlib import pyplot as plt 7 7 from sasmodels.core import load_model 8 from sasmodels.direct_model import call_kernel 8 from sasmodels.direct_model import call_kernel, call_Fq 9 9 10 10 model = load_model('cylinder') 11 11 q = logspace(-3, -1, 200) 12 12 kernel = model.make_kernel([q]) 13 Iq = call_kernel(kernel, dict(radius=200.)) 14 plt.loglog(q, Iq) 13 pars = {'radius': 200, 'radius_pd': 0.1, 'scale': 2} 14 Iq = call_kernel(kernel, pars) 15 F, Fsq, Reff, V, Vratio = call_Fq(kernel, pars) 16 plt.loglog(q, Iq, label='2 I(q)') 17 plt.loglog(q, F**2/V, label='<F(q)>^2/V') 18 plt.loglog(q, Fsq/V, label='<F^2(q)>/V') 15 19 plt.xlabel('q (1/A)') 16 plt.ylabel('I(q) ')20 plt.ylabel('I(q) (1/cm)') 17 21 plt.title('Cylinder with radius 200.') 22 plt.legend() 18 23 plt.show() -
sasmodels/direct_model.py
r304c775 r23df833 67 67 # type: (Kernel, ParameterSet, float, bool) -> np.ndarray 68 68 """ 69 Like :func:`call_kernel`, but returning F, F^2, R_eff, V, V_form/V_shell. 69 Like :func:`call_kernel`, but returning F, F^2, R_eff, V_shell, V_form/V_shell. 70 71 For solid objects V_shell is equal to V_form and the volume ratio is 1. 70 72 """ 71 73 R_eff_type = int(pars.pop('radius_effective_type', 1.0)) … … 76 78 return calculator.Fq(call_details, values, cutoff, is_magnetic, R_eff_type) 77 79 78 def call_profile(model_info, **pars):79 # type: (ModelInfo, ...) -> Tuple[np.ndarray, np.ndarray, Tuple[str, str]]80 def call_profile(model_info, pars=None): 81 # type: (ModelInfo, ParameterSet) -> Tuple[np.ndarray, np.ndarray, Tuple[str, str]] 80 82 """ 81 83 Returns the profile *x, y, (xlabel, ylabel)* representing the model. 82 84 """ 85 if pars is None: 86 pars = {} 83 87 args = {} 84 88 for p in model_info.parameters.kernel_parameters: … … 377 381 Generate a plottable profile. 378 382 """ 379 return call_profile(self.model.info, **pars)383 return call_profile(self.model.info, pars) 380 384 381 385 def main():
Note: See TracChangeset
for help on using the changeset viewer.