source: sasview/sansmodels/test/prototypes/test_simulation.py @ 0abf7bf

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.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 0abf7bf was 18e250c, checked in by Gervaise Alina <gervyh@…>, 13 years ago

move test to sansmodels top level

  • Property mode set to 100644
File size: 8.0 KB
Line 
1try:
2    from sans.models.prototypes.SimCylinder import SimCylinder
3except:
4    print "This test uses the prototypes module."
5   
6from sans.models.CylinderModel import CylinderModel
7
8import os, sys
9
10def simulate(filename="simul.txt", npts=500):
11    output_file = open(filename, 'w')
12    #output_file = open("simul_phi=0_theta=1_57_l=400_r=20_9.txt", 'w')
13   
14    sim = SimCylinder()
15    sim.setParam('scale', 1.0)
16    #sim.setParam('length', 100.0)
17    #sim.setParam('radius', 40.0)
18    sim.setParam('length', 400.0)
19    sim.setParam('radius', 20.0)
20    sim.setParam('theta', 1.57)
21    sim.setParam('phi', 0.0)
22    sim.setParam('qmax', 0.2)
23   
24    output_file.write("<q_value>  <ana_value>  <sim_value>\n")
25    norma = 0
26    for i in range(npts):
27        q = 1.0/npts*(i+1)
28       
29        cyl_val = sim.run(q)
30        sim_val = sim.run([q, 0.0])
31        if i==0:
32            norma = cyl_val/sim_val
33       
34        #print q, cyl_val, sim_val, sim_val/cyl_val
35        output_file.write("%10g %10g %10g\n" % (q, cyl_val, sim_val*norma))
36       
37    output_file.close()
38     
39def create_model():
40    sim = SimCylinder()
41    sim.setParam('scale', 1.0)
42    sim.setParam('length', 100.0)
43    sim.setParam('radius', 40.0)
44    # simul and simul_2
45    #sim.setParam('theta', 1.57)
46    #sim.setParam('phi', 0.0)
47    sim.setParam('theta', 0.0)
48    sim.setParam('phi', 1.0)
49    sim.setParam('qmax', 0.2)
50    return sim
51   
52def comp(): 
53    """
54        Simple test that should give 1 for the ratio
55        of simulated and analytical
56    """
57    sim = create_model()
58   
59    ana_val = sim.run(.05)
60    sim_val = sim.run([0.05, 0])
61    print ana_val, sim_val, ana_val/sim_val
62   
63   
64#    ana_val = sim.run(.05)
65#    sim_val = sim.run([0.05, 1])
66#    print ana_val, sim_val, ana_val/sim_val
67   
68#    sim = create_model()
69#    sim.setParam('theta', 1.0)
70#    sim.setParam('phi', 1.0)   
71#    ana_val = sim.run(.05)
72#    sim_val = sim.run([0.05, 1])
73#    print ana_val, sim_val, ana_val/sim_val
74   
75#    sim = create_model()
76#    sim.setParam('theta', 1.0)
77#    sim.setParam('phi', 2.0)
78#    ana_val = sim.run(.05)
79#    sim_val = sim.run([0.05, 1])
80#    print ana_val, sim_val, ana_val/sim_val
81   
82    sim = create_model()
83    sim.setParam('theta', 1.0)
84    sim.setParam('phi', -2.0)
85    ana_val = sim.run(.05)
86    sim_val = sim.run([0.15, 1])
87    print ana_val, sim_val, ana_val/sim_val
88   
89def add_error_to_file(prefix = "", dir = "output"):
90    import os, math
91   
92    # Open standard deviation file
93    std_file = open("%s/std_simul.txt" % dir, 'r')
94    std_content = std_file.read()
95    std_lines = std_content.split('\n')
96   
97    std_values = {}
98    for line in std_lines:
99        if line == std_lines[0]:
100            continue
101       
102        toks = line.split()
103        if not len(toks) > 3:
104            continue
105
106        std_values[toks[0]] = float(toks[2])
107   
108    std_file.close()
109   
110    # Read the files
111   
112    file_list = os.listdir(dir)
113   
114    for file in file_list:
115        if file.count(prefix)>0:
116            print "Reading", file
117   
118            file_obj = open("%s/%s" % (dir, file), 'r')
119           
120            # open new file
121            file_new = open("%s/error-%s" % (dir, file), 'w')
122            file_content = file_obj.read()
123            lines = file_content.split('\n')
124            for line in lines:
125                if line == lines[0]:
126                    file_new.write(line+'\n')
127                    continue
128                   
129                toks = line.split()
130               
131                if not len(toks) == 3:
132                    file_new.write(line+'\n')
133                    continue
134           
135                error = 0
136                if toks[0].lower() in std_values:
137                    error = float(toks[2]) * std_values[toks[0].lower()]
138                   
139                file_new.write(line+" %10g\n" % error)
140               
141            file_obj.close()
142            file_new.close()
143   
144   
145   
146def std_estimate(prefix = "", dir="output"):
147    import os, math
148   
149    file_list = os.listdir(dir)
150    output_file = open("%s/std_simul.txt" % dir, 'w')
151    output_file.write("<q_value>   <std>  <frac>\n")
152    values = {}
153   
154    for file in file_list:
155        if file.count(prefix)>0:
156            print "Reading", file
157            file_obj = open("%s/%s" % (dir, file), 'r')
158            file_content = file_obj.read()
159            lines = file_content.split('\n')
160            for line in lines:
161                if line == lines[0]:
162                    continue
163                toks = line.split()
164               
165                if not len(toks) == 3:
166                    continue
167               
168                if toks[0] not in values:
169                    values[toks[0]] = []
170                   
171                values[toks[0]].append(float(toks[2]))
172                                       
173    q_list = values.keys()
174    q_list.sort()                 
175    for q in q_list:
176        num = len(values[q])
177        sum = 0
178        mean = 0
179        for val in range(num):
180            mean += values[q][val] 
181        mean /= num
182           
183        for val in range(num):
184            diff = values[q][val] - mean
185            sum += diff * diff
186        sum /= (num-1)
187        #print q, math.sqrt(sum)
188   
189        output_file.write("%10s %10g %10g %10g\n" % (q, math.sqrt(sum), math.sqrt(sum)/mean, math.sqrt(sum)/mean*100.0))
190       
191    output_file.close()
192   
193   
194    # sqrt( 1/(N-1) sum[ (x-mean)**2 ] )
195   
196def test_volume_pts():
197    import random, math, time
198   
199    print "Generating points"
200    pt_list = []
201    for i in range(50000):
202        x = random.random()
203        y = random.random()
204        z = random.random()
205        pt_list.append([x, y, z])
206       
207    # Compute list of closest distance for each point
208    print "Computing distances"
209    closest_list = []
210    t_init = time.time()
211   
212    for i in range(len(pt_list)):
213        if math.fmod(i,100)==0:
214            print i, time.time()-t_init
215            t_init = time.time()
216        pt = pt_list[i]
217       
218        min_dist = -1.0
219        for j in range(i+1, len(pt_list)):
220            pt_2 = pt_list[j]
221            #print pt_2
222            dx = pt[0]-pt_2[0]
223            dy = pt[1]-pt_2[1]
224            dz = pt[2]-pt_2[2]
225            dist = math.sqrt( dx*dx + dy*dy + dz*dz ) 
226            if min_dist<0 or dist < min_dist:
227                min_dist = dist
228             
229        closest_list.append(min_dist)       
230       
231    # Analyze list of distances
232    print "Analyzing"
233    sum = 0
234    for d in closest_list:
235        sum += d
236    average = sum/len(closest_list)
237   
238    sum = 0
239    for d in closest_list:
240        diff = d - average
241        sum += diff*diff
242    sum /= len(closest_list)
243   
244    print "%5g +/- %5g)" % (average, math.sqrt(sum))
245   
246                             
247           
248   
249if __name__ == '__main__':
250    #test_volume_pts()
251    #simulate("simul_phi=0_theta=1_57_l=400_r=20_test.txt")
252    #std_estimate("simul_phi=0_theta=1_57_l=400_r=20")
253    #add_error_to_file("l=400_r=20.txt")
254   
255    option = "error"
256   
257    #if len(sys.argv)>1:
258    if len(option)>0:
259        if option=="gen":
260            ifile = 0
261            for i in range(100):
262                ifile += 1
263                #print "simul_qmax=1_phi=0_theta=1_57_l=400_r=20_%g.txt" % ifile
264                #simulate("simul_phi=0_theta=1_57_l=400_r=20_%g.txt" % ifile)
265                print "simul_qmax=1_phi=0_theta=1_57_l=400_r=20_%g.txt" % ifile
266                simulate("output/pt5000/simul_phi=0_theta=1_57_l=400_r=20_%g.txt" % ifile)
267        elif option=="comp":
268            comp()
269        elif option=="std":
270            #std_estimate("simul_phi=0_theta=1_57_l=400_r=20")
271            std_estimate("simul_phi=0_theta=1_57_l=400_r=20", "output/pt5000")
272        elif option=="error":
273            #add_error_to_file("l=400_r=20.txt")
274            add_error_to_file("l=400_r=20_1.txt", "output/pt5000")
275           
Note: See TracBrowser for help on using the repository browser.