Project

General

Profile

Bug #1852 » random_seed.patch

Rogers, Chris, 06 June 2016 17:35

View differences:

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()
(2-2/5)