source: sasview/test/sasrealspace/test/sim_validation.py @ aaf5e49

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since aaf5e49 was aaf5e49, checked in by andyfaff, 7 years ago

MAINT: few more print instances

  • Property mode set to 100644
File size: 12.1 KB
Line 
1"""
2    Validation tests for real-space simulation of I(q)
3   
4    @copyright: University of Tennessee, 2007
5    @license: This software is provided as part of the DANSE project
6"""
7from __future__ import print_function
8
9import math, time, pylab
10
11try:
12    import VolumeCanvas
13    print("Testing local version")
14except:
15    print("Testing installed version")
16    import sas.sascalc.realspace.VolumeCanvas as VolumeCanvas
17     
18class Validator:
19 
20    def __init__(self):
21        self.density = 0.1
22        self.canvas  = None
23        self.ana     = None
24        self.create()
25       
26    def create(self):
27        pass
28         
29    def run_sim2D(self, qx, qy, density=None):
30        """
31            Calculate the mean and error of the simulation
32            @param q: q-value to calculate at
33            @param density: point density of simulation
34            #return: mean, error
35        """
36        if density is not None:
37            self.density = density
38            self.create()
39       
40        return self.canvas.getIq2DError(qx, qy)
41   
42    def run_sim(self, q, density=None):
43        """
44            Calculate the mean and error of the simulation
45            @param q: q-value to calculate at
46            @param density: point density of simulation
47            #return: mean, error
48        """
49        if density is not None:
50            self.density = density
51            self.create()
52       
53        return self.canvas.getIqError(q)
54         
55    def run_ana2D(self, qx, qy):
56        """
57            Return analytical value
58            @param q: q-value to evaluate at [float]
59            @return: analytical output [float]
60        """
61        return self.ana.runXY([qx, qy]) 
62         
63    def run_ana(self, q):
64        """
65            Return analytical value
66            @param q: q-value to evaluate at [float]
67            @return: analytical output [float]
68        """
69        return self.ana.run(q)     
70   
71class SphereValidator(Validator):
72   
73    def __init__(self, radius=15, density = 0.01):
74        from sas.models.SphereModel import SphereModel
75       
76        self.name = 'sphere'
77        self.radius = radius
78        self.density = density
79       
80        self.ana = SphereModel()
81        self.ana.setParam('scale', 1.0)
82        self.ana.setParam('contrast', 1.0)
83        self.ana.setParam('background', 0.0)
84        self.ana.setParam('radius', radius)
85        self.create()
86       
87    def create(self):
88        canvas = VolumeCanvas.VolumeCanvas()
89        canvas.setParam('lores_density', self.density)
90        handle = canvas.add('sphere')
91        canvas.setParam('%s.radius' % handle, self.radius)
92        canvas.setParam('scale' , 1.0)
93        canvas.setParam('%s.contrast' % handle, 1.0)
94        canvas.setParam('background' , 0.0)
95        self.canvas = canvas   
96           
97class CylinderValidator(Validator):
98   
99    def __init__(self, radius=15, length=100, density = 0.01):
100        from sas.models.CylinderModel import CylinderModel
101       
102        self.name = 'cylinder'
103        self.radius = radius
104        self.length = length
105        self.density = density
106       
107        self.ana = CylinderModel()
108        self.ana.setParam('scale', 1.0)
109        self.ana.setParam('contrast', 1.0)
110        self.ana.setParam('background', 0.0)
111        self.ana.setParam('radius', radius)
112        self.ana.setParam('length', length)
113        self.ana.setParam('cyl_theta', math.pi/2.0)
114        self.ana.setParam('cyl_phi', math.pi/2.0)
115        self.create()
116       
117    def create(self):
118        canvas = VolumeCanvas.VolumeCanvas()
119        canvas.setParam('lores_density', self.density)
120        handle = canvas.add('cylinder')
121        canvas.setParam('%s.radius' % handle, self.radius)
122        canvas.setParam('%s.length' % handle, self.length)
123        canvas.setParam('scale' , 1.0)
124        canvas.setParam('%s.contrast' % handle, 1.0)
125        canvas.setParam('background' , 0.0)
126        self.canvas = canvas   
127           
128class EllipsoidValidator(Validator):
129   
130    def __init__(self, radius_a=60, radius_b=10, density = 0.01):
131        from sas.models.EllipsoidModel import EllipsoidModel
132        #from sas.models.SphereModel import SphereModel
133       
134        self.name = 'ellipsoid'
135        self.radius_a = radius_a
136        self.radius_b = radius_b
137        self.density = density
138       
139        self.ana = EllipsoidModel()
140        #self.ana = SphereModel()
141        self.ana.setParam('scale', 1.0)
142        self.ana.setParam('contrast', 1.0)
143        self.ana.setParam('background', 0.0)
144        self.ana.setParam('radius_a', radius_a)
145        self.ana.setParam('radius_b', radius_b)
146        #self.ana.setParam('radius', radius_a)
147       
148        # Default orientation is there=1.57, phi=0
149        # Radius_a is along the x direction
150
151        self.create()
152       
153    def create(self):
154        canvas = VolumeCanvas.VolumeCanvas()
155        canvas.setParam('lores_density', self.density)
156        handle = canvas.add('ellipsoid')
157        canvas.setParam('%s.radius_x' % handle, self.radius_a)
158        canvas.setParam('%s.radius_y' % handle, self.radius_b)
159        canvas.setParam('%s.radius_z' % handle, self.radius_b)
160        canvas.setParam('scale' , 1.0)
161        canvas.setParam('%s.contrast' % handle, 1.0)
162        canvas.setParam('background' , 0.0)
163        self.canvas = canvas
164           
165class HelixValidator(Validator):
166   
167    def __init__(self, density = 0.01):
168        self.name = 'helix'
169        self.density = density
170        self.create()
171       
172    def create(self):
173        canvas = VolumeCanvas.VolumeCanvas()
174        canvas.setParam('lores_density', self.density)
175        handle = canvas.add('singlehelix')
176        canvas.setParam('scale' , 1.0)
177        canvas.setParam('%s.contrast' % handle, 1.0)
178        canvas.setParam('background' , 0.0)
179        self.canvas = canvas
180        # just to write the parameters to the output file
181        self.ana = canvas
182       
183    def run_ana(self, q):
184        return 1
185
186           
187class CoreShellValidator(Validator):
188   
189    def __init__(self, radius=15, thickness=5, density = 0.01):
190        from sas.models.CoreShellModel import CoreShellModel
191       
192        self.name = 'coreshell'
193        self.radius = radius
194       
195        core_vol = 4.0/3.0*math.pi*radius*radius*radius
196        self.outer_radius = radius+thickness
197        shell_vol = 4.0/3.0*math.pi*self.outer_radius*self.outer_radius*self.outer_radius - core_vol
198        self.shell_sld = -1.0*core_vol/shell_vol
199
200        self.density = density
201           
202        # Core-shell
203        sphere = CoreShellModel()
204        # Core radius
205        sphere.setParam('radius', self.radius)
206        # Shell thickness
207        sphere.setParam('thickness', thickness)
208        sphere.setParam('core_sld', 1.0)
209        sphere.setParam('shell_sld', self.shell_sld)
210        sphere.setParam('solvent_sld', 0.0)
211        sphere.setParam('background', 0.0)
212        sphere.setParam('scale', 1.0)
213        self.ana = sphere
214        self.create()
215       
216    def create(self):
217        canvas = VolumeCanvas.VolumeCanvas()       
218        canvas.setParam('lores_density', self.density)
219       
220        handle = canvas.add('sphere')
221        canvas.setParam('%s.radius' % handle, self.outer_radius)
222        canvas.setParam('%s.contrast' % handle, self.shell_sld)
223       
224        handle2 = canvas.add('sphere')
225        canvas.setParam('%s.radius' % handle2, self.radius)
226        canvas.setParam('%s.contrast' % handle2, 1.0)
227               
228        canvas.setParam('scale' , 1.0)
229        canvas.setParam('background' , 0.0)
230        self.canvas = canvas
231           
232def validate_model(validator, q_min, q_max, n_q):
233    """
234         Validate a model
235         An output file containing a comparison between
236         simulation and the analytical solution will be
237         produced.
238         
239         @param validator: validator object
240         @param q_min: minimum q
241         @param q_max: maximum q
242         @param n_q: number of q points
243         @param N: number of times to evaluate each simulation point
244    """
245   
246    q_list = pylab.arange(q_min, q_max*1.0001, (q_max-q_min)/(n_q-1))
247   
248    output = open('%s_d=%g_Iq.txt' % (validator.name, validator.density), 'w')
249    output.write("PARS: %s\n" % validator.ana.params)
250    output.write("<q>  <ana>  <sim>  <err>\n")
251    for q in q_list:
252        ana = validator.run_ana(q)
253        sim, err = validator.run_sim(q)
254        print("q=%-g  ana=%-g  sim=%-g  err=%-g  diff=%-g (%-g) %s" % (q, ana, sim, err, 
255                        (sim-ana), sim/ana, str(math.fabs(sim-ana)>err)))
256        output.write("%g  %g  %g  %g\n" % (q, ana, sim, err))
257    output.close()
258       
259def validate_model_2D(validator, q_min, q_max, phi, n_q):
260    """
261         Validate a model
262         An output file containing a comparison between
263         simulation and the analytical solution will be
264         produced.
265         
266         @param validator: validator object
267         @param q_min: minimum q
268         @param q_max: maximum q
269         @param n_q: number of q points
270         @param N: number of times to evaluate each simulation point
271    """
272   
273    q_list = pylab.arange(q_min, q_max*1.0001, (q_max-q_min)/(n_q-1))
274   
275    output = open('%s_d=%g_Iq2D.txt' % (validator.name, validator.density), 'w')
276    output.write("PARS: %s\n" % validator.ana.params)
277    output.write("<q>  <ana>  <sim>  <err>\n")
278    t_0 = time.time()
279    for q in q_list:
280        ana = validator.run_ana2D(q*math.cos(phi), q*math.sin(phi))
281        sim, err = validator.run_sim2D(q*math.cos(phi), q*math.sin(phi))
282        print("q=%-g  ana=%-g  sim=%-g  err=%-g  diff=%-g (%-g) %s" % (q, ana, sim, err, 
283                        (sim-ana), sim/ana, str(math.fabs(sim-ana)>err)))
284        output.write("%g  %g  %g  %g\n" % (q, ana, sim, err))
285    print("Time elapsed: ", time.time()-t_0)
286    output.close()
287       
288def check_density(validator, q, d_min, d_max, n_d): 
289    """
290       Check simulation output as a function of the density
291       An output file containing a comparison between
292       simulation and the analytical solution will be
293       produced.
294       
295       @param validator: validator object
296       @param q: q-value to evaluate at
297       @param d_min: minimum density
298       @param d_max: maximum density
299       @param n_d: number of density points
300       @param N: number of times to evaluate each simulation point
301    """
302    d_list = pylab.arange(d_min, d_max*1.0001, (d_max-d_min)/(n_d-1.0))
303   
304    output = open('%s_%g_density.txt' % (validator.name, q), 'w')
305    output.write("PARS: %s\n" % validator.ana.params)
306    output.write("<density>  <ana_d>  <sim_d>  <err_d>\n")
307    ana = validator.run_ana(q)
308    for d in d_list:
309        sim, err = validator.run_sim(q, density=d)
310        print("d=%-g  ana=%-g  sim=%-g  err=%-g  diff=%-g (%g) %s" % \
311            (d, ana, sim, err, (sim-ana), (sim-ana)/ana, 
312             str(math.fabs(sim-ana)>err)))
313        output.write("%g  %g  %g  %g \n" % (d, ana, sim, err))
314    output.close()
315
316   
317if __name__ == '__main__':
318   
319    # 2D: Density=5, 71.2 secs for 50 points
320    #vali = CoreShellValidator(radius = 15, thickness=5, density = 5.0)
321    #validate_model(vali, q_min=0.001, q_max=1, n_q=50)
322    #validate_model_2D(vali, q_min=0.001, q_max=1, phi=1.0, n_q=50)
323
324    # 2D: Density=2, 11.1 secs for 25 points
325    #vali = SphereValidator(radius = 20, density = 0.02)
326    #validate_model(vali, q_min=0.001, q_max=0.5, n_q=25)
327    #vali = SphereValidator(radius = 20, density = 2.0)
328    #validate_model_2D(vali, q_min=0.001, q_max=0.5, phi=1.0, n_q=25)
329   
330    # 2D: Density=1, 19.4 secs for 25 points
331    # 2D: Density=0.5, 9.8 secs for 25 points
332    #vali = CylinderValidator(radius = 20, length=100, density = 0.1)
333    #validate_model(vali, q_min=0.001, q_max=0.5, n_q=25)
334    vali = CylinderValidator(radius = 20, length=100, density = 0.5)
335    validate_model_2D(vali, q_min=0.001, q_max=0.2, phi=1.0, n_q=25)
336   
337    # 2D: Density=0.5, 2.26 secs for 25 points
338    #vali = EllipsoidValidator(radius_a = 20, radius_b=15, density = 0.05)
339    #validate_model(vali, q_min=0.001, q_max=0.5, n_q=25)
340    #vali = EllipsoidValidator(radius_a = 20, radius_b=15, density = 0.5)
341    #validate_model_2D(vali, q_min=0.001, q_max=0.5, phi=1.0, n_q=25)
342   
343    #vali = HelixValidator(density = 0.05)
344    #validate_model(vali, q_min=0.001, q_max=0.5, n_q=25)
345   
346   
Note: See TracBrowser for help on using the repository browser.