summaryrefslogtreecommitdiff
path: root/bin/chroma-sim
diff options
context:
space:
mode:
authorStan Seibert <stan@mtrr.org>2011-09-16 14:27:46 -0400
committerStan Seibert <stan@mtrr.org>2011-09-16 14:27:46 -0400
commit084dfd08b714faefaea77cb7dc04d2e93dc04b1d (patch)
tree5be8c1f1d30dc52d74c70c4964ec54f66294c265 /bin/chroma-sim
parentcfecff941fc619eb7269128afc62d9c11ae78aff (diff)
downloadchroma-084dfd08b714faefaea77cb7dc04d2e93dc04b1d.tar.gz
chroma-084dfd08b714faefaea77cb7dc04d2e93dc04b1d.tar.bz2
chroma-084dfd08b714faefaea77cb7dc04d2e93dc04b1d.zip
File reorganization to move toward standard python package layout
Diffstat (limited to 'bin/chroma-sim')
-rwxr-xr-xbin/chroma-sim87
1 files changed, 87 insertions, 0 deletions
diff --git a/bin/chroma-sim b/bin/chroma-sim
new file mode 100755
index 0000000..fa106a2
--- /dev/null
+++ b/bin/chroma-sim
@@ -0,0 +1,87 @@
+#!/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())
+
+ name, attr = args[0].split('.')
+
+ try:
+ file, path, description = imp.find_module(name)
+ except ImportError:
+ raise
+
+ module = imp.load_module(name, file, path, description)
+
+ detector = getattr(module, attr)
+
+ 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()