A collection of lightbulb realizations, from perusing the source and playing around running tests etc..
ZMQ sockets are used to communicate between the G4ParallelGenerator controller and a handful of worker G4GeneratorProcess instances. The G4ParallelGenerator provides the photon_generator used by chroma.sim.Simulation.
08 class G4GeneratorProcess(multiprocessing.Process)
09 def __init__(self, idnum, material, vertex_socket_address, photon_socket_address, seed=None):
10 multiprocessing.Process.__init__(self)
Each instance corresponds to a separate process. While run this waits to receive a vertex (via ZMQ socket PULL) Vertices are passed to g4gen to generate photons which are populated into ev.photon_beg and pushed via ZMQ socket.
65 class G4ParallelGenerator(object):
66 def __init__(self, nprocesses, material, base_seed=None):
Manages a handful of G4GeneratorProcess instances, ensuring distinct seeds, which it communicates to via zmq sockets. When generate_events is called with vertices these are pushed to the G4GeneratorProcess instances running in separate processes and the photon socket is iterated over in order to receive the resulting events with ev.photon_beg populated once G4 has completed their generation.
19 class Simulation(object):
20 def __init__(self, detector, seed=None, cuda_device=None,
21 geant4_processes=4, nthreads_per_block=64, max_blocks=1024):
..
36 if geant4_processes > 0:
37 self.photon_generator = generator.photon.G4ParallelGenerator(geant4_processes, detector.detector_material, base_seed=self.seed)
38 else:
39 self.photon_generator = None