Changeset 934a001 in sasmodels


Ignore:
Timestamp:
Mar 30, 2019 6:43:50 AM (5 years ago)
Author:
richardh
Branches:
master, ticket_1156, ticket_822_more_unit_tests
Children:
adb84f6
Parents:
db3947c
Message:

tidied up unit tests in sphere, now understand beta approx ones

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/models/sphere.py

    rdb3947c r934a001  
    3636References 
    3737---------- 
    38  
    39 .. [#] A Guinier and G. Fournet, *Small-Angle Scattering of X-Rays*, John Wiley and Sons, New York, (1955) 
     38  
     39.. [#] A Guinier and G. Fournet, *Small-Angle Scattering of X-Rays*, 
     40   John Wiley and Sons, New York, (1955) 
    4041 
    4142Source 
     
    9091    ) 
    9192    return pars 
    92  
     93#2345678901234567890123456789012345678901234567890123456789012345678901234567890 
    9394tests = [ 
    94      [{}, 0.2, 0.726362], # each test starts with default parameter values inside { }, unless modified. Then Q and expected value of I(Q) 
     95     [{}, 0.2, 0.726362], # each test starts with default parameter values  
     96     #            inside { }, unless modified. Then Q and expected value of I(Q) 
     97     # putting None for an expected result will pass the test if there are no  
     98     # errors from the routine, but without any check on the value of the result 
     99    [{"scale": 1., "background": 0., "sld": 6., "sld_solvent": 1., 
     100       "radius": 120.}, [0.01,0.1,0.2],  
     101     [1.34836265e+04, 6.20114062e+00, 1.04733914e-01]], 
    95102     [{"scale": 1., "background": 0., "sld": 6., "sld_solvent": 1., 
    96        "radius": 120.}, [0.01,0.1,0.2], [1.34836265e+04, 6.20114062e+00, 1.04733914e-01]], # each test starts with default parameter values inside { }, unless modified. Then Q and expected value of I(Q) 
    97      [{"scale": 1., "background": 0., "sld": 6., "sld_solvent": 1.,  # careful tests here R=120 Pd=.2,  
    98       #                                        then with S(Q) at default Reff=50 (but this gets changeded to 120) phi=0,2 
     103     #  careful tests here R=120 Pd=.2, then with S(Q) at default Reff=50  
     104     #  (but this gets changed to 120) phi=0,2 
    99105       "radius": 120., "radius_pd": 0.2, "radius_pd_n":45}, 
    100       [0.01,0.1,0.2], [1.74395295e+04, 3.68016987e+00, 2.28843099e-01]],  # a list of Q values and list of expected results is also possible 
    101     [{"scale": 1., "background": 0., "sld": 6., "sld_solvent": 1.,"radius": 120., "radius_pd": 0.2, "radius_pd_n":45}, 
    102       0.01, 335839.88055473, 1.41045057e+11, 120.0, 8087664.122641933, 1.0], # the longer list here checks  F1, F2, R_eff, volume, volume_ratio = call_Fq(kernel, pars) 
     106      [0.01,0.1,0.2], [1.74395295e+04, 3.68016987e+00, 2.28843099e-01]],   
     107     # a list of Q values and list of expected results is also possible 
     108    [{"scale": 1., "background": 0., "sld": 6., "sld_solvent": 1., 
     109     "radius": 120., "radius_pd": 0.2, "radius_pd_n":45}, 
     110      0.01, 335839.88055473, 1.41045057e+11, 120.0, 8087664.122641933, 1.0],  
     111     # the longer list here checks  F1, F2, R_eff, volume, volume_ratio  
    103112    [{"radius": 120., "radius_pd": 0.2, "radius_pd_n":45}, 
    104       0.1, 482.93824329, 29763977.79867414, 120.0, 8087664.122641933, 1.0], # the longer list here checks  F1, F2, R_eff, volume, volume_ratio = call_Fq(kernel, pars) 
     113      0.1, 482.93824329, 29763977.79867414, 120.0, 8087664.122641933, 1.0],  
    105114    [{"radius": 120., "radius_pd": 0.2, "radius_pd_n":45}, 
    106       0.2, 1.23330406, 1850806.1197361, 120.0, 8087664.122641933, 1.0], # the longer list here checks  F1, F2, R_eff, volume, volume_ratio = call_Fq(kernel, pars) 
     115      0.2, 1.23330406, 1850806.1197361, 120.0, 8087664.122641933, 1.0], 
    107116   #  But note P(Q) = F2/volume 
    108    #  F and F^2 are "unscaled", with for  n <F F*>S(q) or for beta approx I(q) = n [<F F*> + <F><F*> (S(q) - 1)] 
    109    #  for n the number density and <.> the orientation average, and F = integral rho(r) exp(i q . r) dr. 
     117   #  F and F^2 are "unscaled", with for  n <F F*>S(q) or for beta approx  
     118   #          I(q) = n [<F F*> + <F><F*> (S(q) - 1)] 
     119   #  for n the number density and <.> the orientation average, and  
     120   #  F = integral rho(r) exp(i q . r) dr. 
    110121   #  The number density is volume fraction divided by particle volume. 
    111    #  Effectively, this leaves F = V drho form, where form is the usual 3 j1(qr)/(qr) or whatever depending on the shape. 
    112    # NOTE the @S multiplication by S(Q) also multiplies the answer by volfraction, thus you may like to put in scale at 1/volfraction 
     122   #  Effectively, this leaves F = V drho form, where form is the usual  
     123   #  3 j1(qr)/(qr) or whatever depending on the shape. 
     124   # @S RESULTS using F1 and F2 from the longer test strng above: 
     125   # 
     126   # I(Q) = (F2 + F1^2*(S(Q) -1))*volfraction*scale/Volume  + background 
     127   # 
     128   # with by default scale=1.0, background=0.001 
     129   # NOTE currently S(Q) volfraction is also included in scaling 
     130   #  structure_factor_mode 0 = normal decoupling approx,  
     131   #                        1 = beta(Q) approx 
     132   # radius_effective_mode  0 is for free choice,  
     133   #                        1 is use radius from F2(Q) 
     134   #    (sphere only has two choices, other models may have more) 
     135    [{"@S": "hardsphere", 
     136     "radius": 120., "radius_pd": 0.2, "radius_pd_n":45,"volfraction":0.2, 
     137     #"radius_effective":50.0,    # hard sphere structure factor 
     138     "structure_factor_mode": 1,  # mode 0 = normal decoupling approx,  
     139     #                                   1 = beta(Q) approx 
     140     "radius_effective_mode": 0   # this used default hardsphere Reff=50     
     141     }, [0.01,0.1,0.2], [1.32473756e+03, 7.36633631e-01, 4.67686201e-02]  ], 
    113142    [{"@S": "hardsphere", 
    114143     "radius": 120., "radius_pd": 0.2, "radius_pd_n":45, 
    115144     "volfraction":0.2, 
    116      "radius_effective":45.0,     # uses this as gives different answer to either 50 or 120 (check) 
    117      "structure_factor_mode": 1,  # 0 = normal decoupling approximation, 1 = beta(Q) approx 
    118      "radius_effective_mode": 0   # equivalent sphere, there is only one valid mode for sphere. says -this used r_eff =0 or default 50? 
     145     "radius_effective":45.0,     # explicit Reff over rides either 50 or 120 
     146     "structure_factor_mode": 1,  # beta approx 
     147     "radius_effective_mode": 0   #  
    119148     }, 0.01, 1316.2990966463444 ], 
    120149    [{"@S": "hardsphere", 
    121150     "radius": 120., "radius_pd": 0.2, "radius_pd_n":45, 
    122151     "volfraction":0.2, 
    123      #"radius_effective":50.0,        # hard sphere structure factor 
    124      "structure_factor_mode": 1,  # 0 = normal decoupling approximation, 1 = beta(Q) approx 
    125      "radius_effective_mode": 0   # this used default 50? 
    126      }, [0.01,0.1,0.2], [1.32473756e+03, 7.36633631e-01, 4.67686201e-02]  ], 
    127     [{"@S": "hardsphere", 
    128      "radius": 120., "radius_pd": 0.2, "radius_pd_n":45, 
    129      "volfraction":0.2, 
    130      "radius_effective":120.0,        # hard sphere structure factor 
    131      "structure_factor_mode": 1,  # 0 = normal decoupling approximation, 1 = beta(Q) approx 
    132      "radius_effective_mode": 0   # 1 uses 120,  
     152     "radius_effective":120.0,    # over ride Reff 
     153     "structure_factor_mode": 1,  # beta approx 
     154     "radius_effective_mode": 0   # (mode=1 here also uses 120)  
    133155     }, [0.01,0.1,0.2], [1.57928589e+03, 7.37067923e-01, 4.67686197e-02  ]], 
    134156    [{"@S": "hardsphere", 
    135157     "radius": 120., "radius_pd": 0.2, "radius_pd_n":45, 
    136158     "volfraction":0.2, 
    137      #"radius_effective":120.0,        # hard sphere structure factor 
    138      "structure_factor_mode": 0,  # 0 = normal decoupling approximation, 1 = beta(Q) approx 
    139      "radius_effective_mode": 1   # this used 120 from the form factor 
     159     #"radius_effective":120.0,   # hard sphere structure factor 
     160     "structure_factor_mode": 0,  # normal decoupling approximation 
     161     "radius_effective_mode": 1   # this uses 120 from the form factor 
    140162     }, [0.01,0.1,0.2], [1.10112335e+03, 7.41366536e-01, 4.66630207e-02]], 
    141163    [{"@S": "hardsphere", 
    142164     "radius": 120., "radius_pd": 0.2, "radius_pd_n":45, 
    143165     "volfraction":0.2, 
    144      #"radius_effective":50.0,        # hard sphere structure factor 
    145      "structure_factor_mode": 0,  # 0 = normal decoupling approximation, 1 = beta(Q) approx 
     166     #"radius_effective":50.0,    # hard sphere structure factor 
     167     "structure_factor_mode": 0,  # normal decoupling approximation 
    146168     "radius_effective_mode": 0   # this used 50 the default for hardsphere 
    147169     }, [0.01,0.1,0.2], [7.82803598e+02, 6.85943611e-01, 4.71586457e-02 ]] 
    148 ]# putting None for expected result will pass the test if there are no errors from the routine, but without any check on the value of the result 
     170] 
     171# 
Note: See TracChangeset for help on using the changeset viewer.