diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/test_reemission.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/test/test_reemission.py b/test/test_reemission.py new file mode 100644 index 0000000..c6854be --- /dev/null +++ b/test/test_reemission.py @@ -0,0 +1,77 @@ +import unittest +import numpy as np +import scipy.stats +#import matplotlib.pyplot as plt + +from chroma.geometry import Solid, Geometry, Surface, Material +from chroma.loader import create_geometry_from_obj +from chroma.make import sphere +from chroma.sim import Simulation +from chroma.demo.optics import vacuum +from chroma.event import Photons, SURFACE_DETECT +from chroma.tools import enable_debug_on_crash + +class TestReemission(unittest.TestCase): + def testBulkReemission(self): + '''Test bulk reemission by starting a bunch of monoenergetic photons at + the center of a wavelength-shifting sphere, forcing reemission, and + checking that the final wavelength distribution matches the wls + spectrum. + ''' + nphotons = 1000 + + # set up detector -- a sphere of 'scintillator' surrounded by a + # detecting sphere + scint = Material('scint') + scint.set('refractive_index', 1) + scint.set('absorption_length', 1) + scint.set('scattering_length', 1e7) + scint.set('reemission_prob', 1) + + x = np.arange(0,1000,10) + norm = scipy.stats.norm(scale=50, loc=600) + pdf = nphotons * 10 * norm.pdf(x) + cdf = norm.cdf(x) + scint.reemission_cdf = np.array(zip(x, cdf)) + + detector = Surface('detector') + detector.set('detect', 1) + + world = Geometry(vacuum) + world.add_solid(Solid(sphere(1000), vacuum, vacuum, surface=detector)) + world.add_solid(Solid(sphere(100), scint, vacuum)) + w = create_geometry_from_obj(world) + + sim = Simulation(w, geant4_processes=0) + + # initial photons -- isotropic 250 nm at the origin + pos = np.tile([0,0,0], (nphotons,1)).astype(np.float32) + dir = np.random.rand(nphotons, 3).astype(np.float32) * 2 - 1 + dir /= np.sqrt(dir[:,0]**2 + dir[:,1]**2 + dir[:,2]**2)[:,np.newaxis] + pol = np.zeros_like(pos) + t = np.zeros(nphotons, dtype=np.float32) + wavelengths = np.ones(nphotons).astype(np.float32) * 250 + + photons = Photons(pos=pos, dir=dir, pol=pol, t=t, wavelengths=wavelengths) + + # run simulation and extract final wavelengths + event = sim.simulate([photons], keep_photons_end=True).next() + mask = (event.photons_end.flags & SURFACE_DETECT) > 0 + final_wavelengths = event.photons_end.wavelengths[mask] + + # compare wavelength distribution to scintillator's reemission pdf + hist, edges = np.histogram(final_wavelengths, bins=x) + print 'detected', sum(hist), 'of', nphotons, 'photons' + + chi2 = scipy.stats.chisquare(hist, pdf[:-1])[1] + print 'chi2 =', chi2 + + # show histogram comparison + #plt.figure(1) + #width = edges[1] - edges[0] + #plt.bar(left=edges, height=pdf, width=width, color='red') + #plt.bar(left=edges[:-1], height=hist, width=width) + #plt.show() + + self.assertTrue(chi2 > 0.75) + |