summaryrefslogtreecommitdiff
path: root/test/test_propagation.py
diff options
context:
space:
mode:
authorStan Seibert <stan@mtrr.org>2011-09-16 15:02:02 -0400
committerStan Seibert <stan@mtrr.org>2011-09-16 15:02:02 -0400
commit142b3c3caff164deb9bc7b2848e58e52387723ff (patch)
tree417da3ad69a2756aff7a21dca4b08733d3e87afb /test/test_propagation.py
parent084dfd08b714faefaea77cb7dc04d2e93dc04b1d (diff)
downloadchroma-142b3c3caff164deb9bc7b2848e58e52387723ff.tar.gz
chroma-142b3c3caff164deb9bc7b2848e58e52387723ff.tar.bz2
chroma-142b3c3caff164deb9bc7b2848e58e52387723ff.zip
Move CUDA source inside chroma package, rename tests directory to test
Diffstat (limited to 'test/test_propagation.py')
-rw-r--r--test/test_propagation.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/test/test_propagation.py b/test/test_propagation.py
new file mode 100644
index 0000000..43ecb9b
--- /dev/null
+++ b/test/test_propagation.py
@@ -0,0 +1,58 @@
+import unittest
+import numpy as np
+
+from chroma.geometry import Solid, Geometry
+from chroma.make import box
+from chroma.sim import Simulation
+from chroma.optics import vacuum
+from chroma.event import Photons
+
+class TestPropagation(unittest.TestCase):
+ def testAbort(self):
+ '''Photons that hit a triangle at normal incidence should not abort.
+
+ Photons that hit a triangle at exactly normal incidence can sometimes
+ produce a dot product that is outside the range allowed by acos().
+ Trigger these with axis aligned photons in a box.
+ '''
+
+ # Setup geometry
+ cube = Geometry(vacuum)
+ cube.add_solid(Solid(box(100,100,100), vacuum, vacuum))
+ cube.pmtids = [0]
+ cube.build(use_cache=False)
+ sim = Simulation(cube, geant4_processes=0)
+
+ # Create initial photons
+ nphotons = 10000
+ pos = np.tile([0,0,0], (nphotons,1)).astype(np.float32)
+ dir = np.tile([0,0,1], (nphotons,1)).astype(np.float32)
+ pol = np.zeros_like(pos)
+ phi = np.random.uniform(0, 2*np.pi, nphotons).astype(np.float32)
+ pol[:,0] = np.cos(phi)
+ pol[:,1] = np.sin(phi)
+ t = np.zeros(nphotons, dtype=np.float32)
+ wavelengths = np.empty(nphotons, np.float32)
+ wavelengths.fill(400.0)
+
+ photons = Photons(pos=pos, dir=dir, pol=pol, t=t,
+ wavelengths=wavelengths)
+
+ # First make one step to check for strangeness
+ photons_end = sim.simulate([photons], keep_photons_end=True,
+ max_steps=1).next().photons_end
+
+ self.assertFalse(np.isnan(photons_end.pos).any())
+ self.assertFalse(np.isnan(photons_end.dir).any())
+ self.assertFalse(np.isnan(photons_end.pol).any())
+ self.assertFalse(np.isnan(photons_end.t).any())
+ self.assertFalse(np.isnan(photons_end.wavelengths).any())
+
+ # Now let it run the usual ten steps
+ photons_end = sim.simulate([photons], keep_photons_end=True,
+ max_steps=10).next().photons_end
+ aborted = (photons_end.flags & (1 << 31)) > 0
+ print 'aborted photons: %1.1f' % \
+ (float(np.count_nonzero(aborted)) / nphotons)
+ self.assertFalse(aborted.any())
+