diff options
author | Stan Seibert <stan@mtrr.org> | 2011-09-16 15:02:02 -0400 |
---|---|---|
committer | Stan Seibert <stan@mtrr.org> | 2011-09-16 15:02:02 -0400 |
commit | 142b3c3caff164deb9bc7b2848e58e52387723ff (patch) | |
tree | 417da3ad69a2756aff7a21dca4b08733d3e87afb /test/test_propagation.py | |
parent | 084dfd08b714faefaea77cb7dc04d2e93dc04b1d (diff) | |
download | chroma-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.py | 58 |
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()) + |