summaryrefslogtreecommitdiff
path: root/bin/chroma-sim
blob: 9b4a536b883cba3231582f60e31a6c8b440cfb8a (plain)
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()