summaryrefslogtreecommitdiff
path: root/likelihood.py
diff options
context:
space:
mode:
Diffstat (limited to 'likelihood.py')
-rw-r--r--likelihood.py49
1 files changed, 18 insertions, 31 deletions
diff --git a/likelihood.py b/likelihood.py
index ae712d8..b31f8fa 100644
--- a/likelihood.py
+++ b/likelihood.py
@@ -1,32 +1,26 @@
import sys
+import time
import numpy as np
-
from pycuda import autoinit
from pycuda.compiler import SourceModule
from pycuda import gpuarray
import pycuda.driver as cuda
-
from uncertainties import ufloat, umath
-
from detectors import LBNE
-
from histogram import Histogram
-
from photon import uniform_sphere
-
import layout
print 'device %s' % autoinit.device.name()
source = open(layout.source + '/kernel.cu').read()
module = SourceModule(source, options=['-I' + layout.source], no_extern_c=True, cache_dir=False)
-
-geometry = LBNE()
-geometry.build(bits=6)
-texrefs = geometry.load(module)
-
propagate = module.get_function('propagate')
+lbne = LBNE()
+lbne.build(bits=9)
+texrefs = lbne.load(module)
+
nblocks = 64
def generate_event(z=0.0, nphotons=1000):
@@ -43,14 +37,15 @@ def generate_event(z=0.0, nphotons=1000):
dest = np.empty(nphotons, dtype=np.int32)
dest_gpu = cuda.to_device(dest)
- propagate(np.int32(nphotons), origins_gpu, directions_gpu, np.int32(geometry.first_leaf), dest_gpu, block=(nblocks,1,1), grid=(nphotons//nblocks+1,1))
+ propagate(np.int32(nphotons), origins_gpu, directions_gpu, np.int32(lbne.node_map.size-1), np.int32(lbne.first_node), dest_gpu, block=(nblocks,1,1), grid=(nphotons//nblocks+1,1), texrefs=texrefs)
+ cuda.Context.synchronize()
cuda.memcpy_dtoh(dest, dest_gpu)
triangles = dest[(dest != -1)]
- event_bincount = np.zeros(len(geometry.solids))
- gpu_bincount = np.bincount(geometry.solid_index[triangles])
+ event_bincount = np.zeros(len(lbne.solids))
+ gpu_bincount = np.bincount(lbne.solid_index[triangles])
event_bincount[:gpu_bincount.size] = gpu_bincount
return event_bincount
@@ -59,9 +54,9 @@ def likelihood(event_bincount, z=0.0, nphotons=1000, neval=1000):
origins = np.tile(gpuarray.vec.make_float3(0,0,z), (nphotons,1))
origins_gpu = cuda.to_device(origins)
- bincount = np.zeros((neval, len(geometry.solids)))
+ bincount = np.zeros((neval, len(lbne.solids)))
for i in range(neval):
- print '\reval %i' % i,
+ print '\revent: %i' % (i+1),
sys.stdout.flush()
directions = uniform_sphere(nphotons)
@@ -74,36 +69,28 @@ def likelihood(event_bincount, z=0.0, nphotons=1000, neval=1000):
dest = np.empty(nphotons, dtype=np.int32)
dest_gpu = cuda.to_device(dest)
- propagate(np.int32(nphotons), origins_gpu, directions_gpu, np.int32(geometry.first_leaf), dest_gpu, block=(nblocks,1,1), grid=(nphotons//nblocks+1,1))
+ propagate(np.int32(nphotons), origins_gpu, directions_gpu, np.int32(lbne.node_map.size-1), np.int32(lbne.first_node), dest_gpu, block=(nblocks,1,1), grid=(nphotons//nblocks+1,1))
+ cuda.Context.synchronize()
cuda.memcpy_dtoh(dest, dest_gpu)
triangles = dest[(dest != -1)]
- gpu_bincount = np.bincount(geometry.solid_index[triangles])
+ gpu_bincount = np.bincount(lbne.solid_index[triangles])
bincount[i][:gpu_bincount.size] = gpu_bincount
print
- histograms = []
- for i in range(len(geometry.solids)):
+ log_likelihood = ufloat((0,0))
+ for i in range(len(lbne.solids)):
h = Histogram(100, (-0.5, 99.5))
h.fill(bincount[:,i])
h.normalize()
- histograms.append(h)
- log_likelihood = ufloat((0,0))
- for i, h in enumerate(histograms):
- probability = ufloat((h.eval(event_bincount[i]), h.eval_err(event_bincount[i])))
+ probability = h.ueval(event_bincount[i])
if probability.nominal_value == 0.0:
- return None
+ probability = ufloat((0.5/h.nentries, 0.5/h.nentries))
log_likelihood += umath.log(probability)
return -log_likelihood
-
-if __name__ == '__main__':
- event_bincount = generate_event()
-
- for z in np.arange(-2.5,2.5,0.1):
- print 'z, likelihood = (%f, %s)' % (z, likelihood(event_bincount,z))