summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony LaTorre <tlatorre9@gmail.com>2011-08-12 18:50:31 -0400
committerAnthony LaTorre <tlatorre9@gmail.com>2011-08-12 18:50:31 -0400
commit8328b6e53f51974afb4b22c8a84e4d0a99cf162b (patch)
tree00132e8ec03de7a656314c01096084af5f131d59
parent56f17469d6e86b78f68ece3bce41d1a50a58b657 (diff)
parent3e02fe2a94366f2908006d41f7609f0e9555315b (diff)
downloadchroma-8328b6e53f51974afb4b22c8a84e4d0a99cf162b.tar.gz
chroma-8328b6e53f51974afb4b22c8a84e4d0a99cf162b.tar.bz2
chroma-8328b6e53f51974afb4b22c8a84e4d0a99cf162b.zip
merge
-rwxr-xr-xcamera.py4
-rwxr-xr-xsim.py51
2 files changed, 41 insertions, 14 deletions
diff --git a/camera.py b/camera.py
index 52a0add..d2d5d6c 100755
--- a/camera.py
+++ b/camera.py
@@ -36,7 +36,7 @@ def encode_movie(dir):
print 'movie saved to %s.' % filename
-def get_rays(position, size = (800, 600), width = 0.035, focal_length=0.05):
+def get_rays(position, size = (800, 600), width = 0.035, focal_length=0.018):
height = width*(size[1]/float(size[0]))
x = np.linspace(-width/2, width/2, size[0])
@@ -84,7 +84,7 @@ class Camera(Thread):
self.nblocks = 64
- self.point = np.array([0, self.scale*1.75, (lower_bound[2]+upper_bound[2])/2])
+ self.point = np.array([0, self.scale*1.0, (lower_bound[2]+upper_bound[2])/2])
self.axis1 = np.array([1,0,0], float)
self.axis2 = np.array([0,0,1], float)
diff --git a/sim.py b/sim.py
index b8382e6..4742ec9 100755
--- a/sim.py
+++ b/sim.py
@@ -33,7 +33,8 @@ def info(type, value, tb):
pdb.pm()
class GeneratorProcess(multiprocessing.Process):
- def __init__(self, particle, energy, position, direction, nevents, material, seed=None):
+ def __init__(self, particle, energy, position, direction, nevents, material,
+ queue, seed=None):
multiprocessing.Process.__init__(self)
self.particle = particle
@@ -43,7 +44,7 @@ class GeneratorProcess(multiprocessing.Process):
self.nevents = nevents
self.material = material
self.seed = seed
- self.queue = multiprocessing.Queue()
+ self.queue = queue
self.daemon = True
def run(self):
@@ -63,6 +64,24 @@ class GeneratorProcess(multiprocessing.Process):
self.queue.put(photons)
+def partition(num, partitions):
+ '''Generator that returns num//partitions, with the last item including the remainder.
+
+ Useful for partitioning a number into mostly equal parts while preserving the sum.
+
+ >>> list(partition(800, 3))
+ [266, 266, 268]
+ >>> sum(list(partition(800, 3)))
+ 800
+ '''
+ step = num // partitions
+ for i in xrange(partitions):
+ if i < partitions - 1:
+ yield step
+ else:
+ yield step + (num % partitions)
+
+
# Allow profile decorator to exist, but do nothing if not running under kernprof
try:
@@ -78,6 +97,8 @@ def main():
parser.add_option('-n', type='int', dest='nblocks', default=64)
parser.add_option('-s', type='int', dest='seed', default=None,
help='Set random number generator seed')
+ parser.add_option('-g', type='int', dest='ngenerators', default=4,
+ help='Number of GEANT4 generator processes')
parser.add_option('--detector', type='string', dest='detector', default='microlbne')
parser.add_option('--nevents', type='int', dest='nevents', default=100)
parser.add_option('--particle', type='string', dest='particle', default='e-')
@@ -112,18 +133,24 @@ def main():
print >>sys.stderr, 'Creating generator...'
detector_material = optics.water_wcsim
- generator_thread = GeneratorProcess(particle=options.particle,
- energy=options.energy,
- position=position,
- direction=direction,
- nevents=options.nevents,
- material=detector_material,
- seed=options.seed)
+ queue = multiprocessing.Queue()
+ generators = [GeneratorProcess(particle=options.particle,
+ energy=options.energy,
+ position=position,
+ direction=direction,
+ nevents=nevents,
+ material=detector_material,
+ seed=options.seed + seed_offset,
+ queue=queue)
+ for seed_offset, nevents in
+ enumerate(partition(options.nevents, options.ngenerators))]
+
print >>sys.stderr, 'WARNING: ASSUMING DETECTOR IS WCSIM WATER!!'
# Do this now so we can get ahead of the photon propagation
- print >>sys.stderr, 'Starting GEANT4 generator...'
- generator_thread.start()
+ print >>sys.stderr, 'Starting GEANT4 generators...'
+ for generator in generators:
+ generator.start()
print >>sys.stderr, 'Creating BVH for detector "%s" with %d bits...' % (options.detector, options.nbits)
detector.build(bits=options.nbits)
@@ -149,7 +176,7 @@ def main():
start_sim = time.time()
nphotons = 0
for i in xrange(options.nevents):
- photons = generator_thread.queue.get()
+ photons = queue.get()
assert len(photons['pos']) > 0, 'GEANT4 generated event with no photons!'