summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chroma/camera.py69
1 files changed, 57 insertions, 12 deletions
diff --git a/chroma/camera.py b/chroma/camera.py
index db7a1b5..4929519 100644
--- a/chroma/camera.py
+++ b/chroma/camera.py
@@ -7,6 +7,7 @@ import os
from subprocess import call
import shutil
import tempfile
+import sys
import pycuda.driver as cuda
from pycuda import gpuarray as ga
@@ -687,6 +688,7 @@ class EventViewer(Camera):
Camera.__init__(self, geometry, **kwargs)
self.rr = RootReader(filename)
self.display_mode = EventViewer.CHARGE
+ self.sum_mode = False
def render_particle_track(self):
x = 10.0
@@ -704,35 +706,68 @@ class EventViewer(Camera):
self.gpu_geometries = [self.gpu_geometry, gpu_geometry]
+ def sum_events(self):
+ print 'Summing events in file...'
+ nchannels = self.geometry.num_channels()
+ sum_hit = np.zeros(shape=nchannels, dtype=np.float)
+ sum_t = np.zeros(shape=nchannels, dtype=np.float)
+ sum_q = np.zeros(shape=nchannels, dtype=np.float)
+
+ nevents = len(self.rr)
+
+ for i, ev in enumerate(self.rr):
+ sum_hit += ev.channels.hit
+ sum_t[ev.channels.hit] += ev.channels.t[ev.channels.hit]
+ sum_q[ev.channels.hit] += ev.channels.q[ev.channels.hit]
+
+ if i % (nevents / 100 + 1) == 0:
+ print >>sys.stderr, '.',
+
+ self.sum_hit = sum_hit
+ self.sum_t = sum_t / sum_hit
+ self.sum_q = sum_q / sum_hit
+ print 'Done.'
+
def color_hit_pmts(self):
self.gpu_geometry.reset_colors()
- hit = self.ev.channels.hit
- t = self.ev.channels.t
- q = self.ev.channels.q
+ if self.sum_mode:
+ hit = self.sum_hit
+ t = self.sum_t
+ q = self.sum_q
+ select = hit > 0
+ else:
+ hit = self.ev.channels.hit
+ t = self.ev.channels.t
+ q = self.ev.channels.q
+ select = hit
# Important: Compute range only with HIT channels
if self.display_mode == EventViewer.CHARGE:
- channel_color = map_to_color(q, range=(q[hit].min(),q[hit].max()))
+ channel_color = map_to_color(q, range=(q[select].min(),q[select].max()))
print 'charge'
elif self.display_mode == EventViewer.TIME:
- channel_color = map_to_color(t, range=(t[hit].min(),t[hit].mean()))
- print 'time'
+ if self.sum_mode:
+ crange = (t[select].min(), t[select].max())
+ else:
+ crange = (t[select].min(), t[select].mean())
+ channel_color = map_to_color(t, range=crange)
+ print 'time'#, crange
elif self.display_mode == EventViewer.HIT:
- channel_color = map_to_color(hit, range=(0, 2))
- print 'hit'
+ channel_color = map_to_color(hit, range=(hit.min(), hit.max()))
+ print 'hit'#, hit.min(), hit.max()
solid_hit = np.zeros(len(self.geometry.mesh.triangles), dtype=np.bool)
solid_color = np.zeros(len(self.geometry.mesh.triangles), dtype=np.uint32)
- solid_hit[self.geometry.channel_index_to_solid_id] = hit
+ solid_hit[self.geometry.channel_index_to_solid_id] = select
solid_color[self.geometry.channel_index_to_solid_id] = channel_color
self.gpu_geometry.color_solids(solid_hit, solid_color)
def process_event(self, event):
if event.type == KEYDOWN:
- if event.key == K_PAGEUP:
+ if event.key == K_PAGEUP and not self.sum_mode:
try:
self.ev = self.rr.next()
except StopIteration:
@@ -746,7 +781,7 @@ class EventViewer(Camera):
self.update()
return
- elif event.key == K_PAGEDOWN:
+ elif event.key == K_PAGEDOWN and not self.sum_mode:
try:
self.ev = self.rr.prev()
except StopIteration:
@@ -763,11 +798,21 @@ class EventViewer(Camera):
self.display_mode = (self.display_mode + 1) % 3
self.color_hit_pmts()
- if self.ev.photons_beg is not None:
+ if not self.sum_mode and self.ev.photons_beg is not None:
self.render_particle_track()
self.update()
return
+ elif event.key == K_s:
+ self.sum_mode = not self.sum_mode
+ if self.sum_mode and not hasattr(self, 'sum_hit'):
+ self.sum_events()
+ elif not self.sum_mode and not hasattr(self, 'ev'):
+ return
+
+ self.color_hit_pmts()
+ self.update()
+ return
Camera.process_event(self, event)