1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#!/usr/bin/env python
#--*-python-*-
if __name__ == '__main__':
import optparse
import sys
import imp
import os
import inspect
import numpy as np
from chroma import event
from chroma import itertoolset
from chroma import Simulation
from chroma import root
parser = optparse.OptionParser('%prog <detector>')
parser.add_option('-o', dest='output_filename',
help='output filename', default='out.root')
parser.add_option('-j', type='int', dest='device',
help='CUDA device number', default=None)
parser.add_option('-s', type='int', dest='seed',
help='random number generator seed')
parser.add_option('-g', type='int', dest='ngenerators',
help='number of GEANT4 processes', default=4)
parser.add_option('-n', '--nevents', type='int', dest='nevents',
default=100)
parser.add_option('-p', '--particle', dest='particle',
help='particle name', default='e-')
parser.add_option('-k', '--ke', type='float', dest='ke',
help='kinetic energy (MeV)', default=100.0)
parser.add_option('--pos', dest='pos',
help='particle vertex origin', default='0,0,0')
parser.add_option('--dir', dest='dir',
help='particle vertex direction', default='1,0,0')
parser.add_option('--save-photons-beg', action='store_true',
dest='save_photons_beg',
help='save initial photons to disk', default=False)
parser.add_option('--save-photons-end', action='store_true',
dest='save_photons_end',
help='save final photons to disk', default=False)
options, args = parser.parse_args()
if len(args) < 1:
sys.exit(parser.format_help())
module_name, function_name = args[0].rsplit('.', 1)
try:
module = __import__(module_name, fromlist=[function_name])
except ImportError:
raise
detector = getattr(module, function_name)
if inspect.isfunction(detector):
detector = detector()
pos = np.array([float(s) for s in options.pos.split(',')], dtype=float)
dir = np.array([float(s) for s in options.dir.split(',')], dtype=float)
vertex = event.Vertex(options.particle, pos, dir, options.ke)
sim = Simulation(detector, seed=options.seed, cuda_device=options.device,
geant4_processes=options.ngenerators)
print 'RNG seed: %i' % sim.seed
writer = root.RootWriter(options.output_filename)
for i, ev in \
enumerate(sim.simulate(itertoolset.repeatcopy(vertex,
options.nevents),
keep_photons_beg=options.save_photons_beg,
keep_photons_end=options.save_photons_end)):
print '\rEvent: %i' % (i+1),
sys.stdout.flush()
assert ev.nphotons > 0, 'Geant4 generated event with no photons!'
writer.write_event(ev)
print
writer.close()
|