Bug #1852 » random_seed.patch
src/map/MapPyBeamlineSimulation/MapPyBeamlineSimulation.py 2016-06-06 10:38:29 +0000 | ||
---|---|---|
19 | 19 |
# along with MAUS. If not, see <http://www.gnu.org/licenses/>. |
20 | 20 | |
21 | 21 |
import os |
22 |
import sys |
|
22 | 23 |
import json |
23 | 24 |
import Queue |
24 | 25 |
import random |
26 |
import numpy |
|
25 | 27 |
from CallG4bl import CallG4bl |
26 | 28 | |
27 | 29 |
class MapPyBeamlineSimulation: #pylint: disable = R0902 |
... | ... | |
85 | 87 |
self.newline = '' |
86 | 88 |
self.grid_job = 0 |
87 | 89 |
self.protonabsorberin = 1 |
88 |
|
|
90 |
self.particles = [] |
|
91 | ||
89 | 92 |
def birth(self, json_configuration): #pylint: disable=R0912, R0915 |
90 | 93 |
"birth doc string" |
91 | 94 |
good_birth = True |
... | ... | |
238 | 241 |
good_birth = False |
239 | 242 | |
240 | 243 |
try: |
244 |
self.seed_using_spill_number = False |
|
241 | 245 |
self.random_seed = config_doc["g4bl"]["random_seed"] |
242 | 246 |
if self.random_seed == -1: |
243 | 247 |
self.random_seed = random.randint(1, 1000000) |
248 |
elif self.random_seed == -2: |
|
249 |
self.random_seed = 0 # int32 |
|
250 |
self.seed_using_spill_number = True |
|
244 | 251 |
except Exception: #pylint: disable = W0703 |
245 | 252 |
print("Error: random_seed is not found in the config file!") |
246 | 253 |
good_birth = False |
... | ... | |
284 | 291 | |
285 | 292 |
return good_birth |
286 | 293 | |
294 |
def new_random_seed(self, spill_number, event_number): |
|
295 |
""" |
|
296 |
Pick a random seed based on the current spill number and the last event |
|
297 |
generated |
|
298 |
- spill_number integer spill number |
|
299 |
- event_number integer event number |
|
300 |
""" |
|
301 |
numpy.random.seed(spill_number) |
|
302 |
self.random_seed = numpy.random.randint(sys.maxint) # not python3 safe |
|
303 |
numpy.random.seed(self.random_seed+event_number) |
|
304 |
self.random_seed = numpy.random.randint(sys.maxint) # not python3 safe |
|
305 | ||
306 | ||
287 | 307 |
def process(self, json_spill_doc): #pylint: disable=R0912 |
288 | 308 |
""" |
289 | 309 |
Execute G4beamline and create a simulation based on the read in parameters. |
290 | 310 |
Fill buffer first time spill is called for |
291 | 311 |
""" |
292 | ||
293 | 312 |
spill = {} |
294 | 313 |
spill = json.loads(json_spill_doc) |
295 | 314 | |
296 | 315 |
if self.queue == 0: |
297 | 316 |
self.queue = Queue.Queue() |
317 |
if self.seed_using_spill_number: |
|
318 |
self.new_random_seed(spill["spill_number"], 0) |
|
298 | 319 |
particles = CallG4bl(self.newline, self.file_path, \ |
299 |
self.rotation_angle, \ |
|
300 |
self.translation_z, \ |
|
301 |
self.path_g4bl, \ |
|
302 |
self.output_path, \ |
|
303 |
self.run_number, \ |
|
304 |
self.get_magnet_currents_pa_cdb, \ |
|
305 |
self.random_seed) |
|
320 |
self.rotation_angle, \ |
|
321 |
self.translation_z, \ |
|
322 |
self.path_g4bl, \ |
|
323 |
self.output_path, \ |
|
324 |
self.run_number, \ |
|
325 |
self.get_magnet_currents_pa_cdb, \ |
|
326 |
self.random_seed) |
|
327 | ||
306 | 328 |
print("Filling buffer. This may take a while...") |
307 | 329 |
self.particles = particles.particles |
308 | 330 |
for i in range(len(self.particles)): |
... | ... | |
336 | 358 |
May take a while...") |
337 | 359 |
while self.queue.qsize()<self.particles_per_spill: |
338 | 360 |
try: |
361 |
if self.seed_using_spill_number: |
|
362 |
self.new_random_seed(spill["spill_number"], |
|
363 |
self.queue.qsize()) |
|
339 | 364 |
particles = CallG4bl(self.newline, \ |
340 | 365 |
self.file_path, \ |
341 | 366 |
self.rotation_angle, \ |
... | ... | |
369 | 394 |
return json.dumps(spill) |
370 | 395 |
else: |
371 | 396 |
print("Warning: G4BL simulated zero output particles!") |
372 |
raise SystemExit
|
|
397 |
raise IndexError("G4BL simulated zero output particles")
|
|
373 | 398 |
|
374 | 399 |
def death(self): #pylint: disable = R0201 |
375 | 400 |
""" |
src/map/MapPyBeamlineSimulation/test_mappybeamlinesimulation.py 2016-06-06 14:58:03 +0000 | ||
---|---|---|
19 | 19 | |
20 | 20 |
import unittest |
21 | 21 |
import json |
22 |
from MapPyBeamlineSimulation import MapPyBeamlineSimulation |
|
22 |
import MapPyBeamlineSimulation |
|
23 |
from CallG4bl import CallG4bl |
|
23 | 24 | |
24 | 25 |
""" |
25 | 26 |
Test Process function by taking all particles in spill generated by g4bl and |
... | ... | |
127 | 128 |
} |
128 | 129 |
} |
129 | 130 | |
131 |
""" |
|
132 |
Test random seed - seed from spill |
|
133 | ||
134 |
""" #pylint: disable = W0105 |
|
135 |
TEST_8 = { |
|
136 |
"g4bl":{"q_1":1.16, "q_2":-1.45, "q_3":1.006, "d_1":-1.41, "d_2":1., \ |
|
137 |
"proton_absorber_thickness":11,'d_s':200,\ |
|
138 |
"proton_number":100,'particles_per_spill':10,\ |
|
139 |
"particle_charge":"positive", 'rotation_angle':0,\ |
|
140 |
'translation_z':20000.0,\ |
|
141 |
"random_seed":-2,"run_number":0,"get_magnet_currents_pa_cdb":False,\ |
|
142 |
"proton_weight":1 |
|
143 | ||
144 |
} |
|
145 |
} |
|
146 | ||
147 |
class MockCallG4bl(object): |
|
148 |
def __init__(#pylint: disable=C0103, R0903, R0912, R0913, R0914, R0915 |
|
149 |
self, newline='', file_path='', theta=0, deltaz=0, |
|
150 |
path_g4bl='', output_path='', run_number=0, |
|
151 |
get_magnet_currents_pa_cdb='', random_seed=0): |
|
152 |
self.particles = {} |
|
153 |
for i in range(self.number_of_entries): |
|
154 |
self.particles['entry'+str(i)] = {} |
|
155 | ||
156 |
number_of_entries = 10 |
|
130 | 157 | |
131 | 158 | |
132 | 159 |
class TestMapPyBeamlineSimulation(unittest.TestCase): #pylint: disable = R0904 |
... | ... | |
134 | 161 |
@classmethod |
135 | 162 |
def setUp(cls): #pylint: disable = C0103 |
136 | 163 |
"""Initialise beam_maker object""" |
137 |
cls.g4bl = MapPyBeamlineSimulation() |
|
164 |
cls.g4bl = MapPyBeamlineSimulation.MapPyBeamlineSimulation()
|
|
138 | 165 | |
139 | 166 |
def teardown(cls): #pylint: disable = E0213 |
140 | 167 |
"""Close beam_maker object""" |
... | ... | |
197 | 224 |
self.g4bl.birth(json.dumps(TEST_7)) |
198 | 225 |
self.g4bl.process(json.dumps({})) |
199 | 226 | |
227 |
def test_process_test_8(self): |
|
228 |
""" Test random seed from spill""" |
|
229 |
MapPyBeamlineSimulation.CallG4bl = MockCallG4bl |
|
230 |
self.g4bl = MapPyBeamlineSimulation() |
|
231 |
self.g4bl.birth(json.dumps(TEST_8)) |
|
232 |
random_seed = self.g4bl.random_seed |
|
233 |
try: # spill = 0, ev = 0 |
|
234 |
self.g4bl.process(json.dumps({"spill_number":0})) |
|
235 |
except IndexError: |
|
236 |
pass |
|
237 |
self.assertNotEqual(self.g4bl.random_seed, random_seed) |
|
238 |
random_seed = self.g4bl.random_seed |
|
239 |
try: # spill = 0, ev = 0 |
|
240 |
self.g4bl.process(json.dumps({"spill_number":0})) |
|
241 |
except IndexError: |
|
242 |
pass |
|
243 |
self.assertEqual(self.g4bl.random_seed, random_seed) |
|
244 |
random_seed = self.g4bl.random_seed |
|
245 |
try: # spill = 1, ev = 0; old random number |
|
246 |
self.g4bl.process(json.dumps({"spill_number":1})) |
|
247 |
except IndexError: |
|
248 |
pass |
|
249 |
self.assertNotEqual(self.g4bl.random_seed, random_seed) |
|
250 |
random_seed = self.g4bl.random_seed |
|
251 |
MockCallG4bl.number_of_entries = 5 |
|
252 |
try: # spill = 1, ev = 5; new random number |
|
253 |
self.g4bl.process(json.dumps({"spill_number":1})) |
|
254 |
except IndexError: |
|
255 |
pass |
|
256 |
self.assertNotEqual(self.g4bl.random_seed, random_seed) |
|
257 |
MapPyBeamlineSimulation.CallG4bl = CallG4bl |
|
258 | ||
259 | ||
200 | 260 |
if __name__ == "__main__": |
201 | 261 |
unittest.main() |