diff options
author | Anthony LaTorre <tlatorre9@gmail.com> | 2011-09-09 09:53:42 -0400 |
---|---|---|
committer | Anthony LaTorre <tlatorre9@gmail.com> | 2011-09-09 09:53:42 -0400 |
commit | 8f39536a7a5a15afeba52b1492f1d84fed95054f (patch) | |
tree | fdd78495d9fb3bfae47e182b386308a808420a1f | |
parent | 25de37ef26b8356d8fa012c709cd68c1fb327227 (diff) | |
download | chroma-8f39536a7a5a15afeba52b1492f1d84fed95054f.tar.gz chroma-8f39536a7a5a15afeba52b1492f1d84fed95054f.tar.bz2 chroma-8f39536a7a5a15afeba52b1492f1d84fed95054f.zip |
chroma-cam script now used to view geometries.
-rw-r--r-- | __init__.py | 4 | ||||
-rwxr-xr-x | camera.py | 333 | ||||
-rwxr-xr-x | chroma-cam | 43 | ||||
-rw-r--r-- | detectors/__init__.py | 46 | ||||
-rw-r--r-- | scenes/checkerboard.py | 4 | ||||
-rw-r--r-- | solids/__init__.py | 26 | ||||
-rw-r--r-- | solids/pmts.py | 2 |
7 files changed, 222 insertions, 236 deletions
diff --git a/__init__.py b/__init__.py index fa5c442..07a096c 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,4 @@ -from camera import Camera, view +from camera import Camera, EventViewer, view, build import geometry import event import fileio @@ -11,5 +11,5 @@ import optics import project import sample #import sim -import stl +from stl import mesh_from_stl import transform @@ -1,59 +1,33 @@ #!/usr/bin/env python import numpy as np -from itertools import product, count -from threading import Thread, Lock +import itertools +import threading +import multiprocessing import os -import sys -from chroma.color import map_wavelength, map_to_color -from chroma.geometry import Mesh, Solid, Geometry -import chroma.make as make -import matplotlib.pyplot as plt +from subprocess import call +import shutil +import tempfile +import inspect -from chroma import gpu -from chroma.tools import timeit +import pycuda.driver as cuda +from pycuda import gpuarray as ga + +from chroma.color import map_to_color +from chroma.geometry import Mesh, Solid, Geometry from chroma.transform import rotate -from chroma.optics import vacuum, lambertian_surface -import chroma.project as project +from chroma.optics import vacuum +from chroma.project import from_film from chroma.fileio.root import RootReader +from chroma import make +from chroma import gpu import pygame from pygame.locals import * -from pycuda import gpuarray as ga -from pycuda.characterize import sizeof -import pycuda.driver as cuda - -from subprocess import call -import shutil -import tempfile -import inspect - -def buildable(identifier): - """ - Create a decorator which tags a function as buildable and assigns the - identifying string `identifier`. - - Example: - >>> @buildable('my_sphere') - >>> def build_my_sphere(): - >>> g = Geometry() - >>> g.add_solid(Solid(sphere(), vacuum, water)) - >>> return g - """ - def tag_as_buildable(func): - func.buildable = True - func.identifier = identifier - return func - return tag_as_buildable - -def build(obj, bits): +def build(obj): """Construct and build a geometry from `obj`.""" if inspect.isfunction(obj): - try: - if obj.buildable: - obj = obj() - except AttributeError: - raise Exception('function %s is not buildable.' % obj.__name__) + obj = obj() if isinstance(obj, Geometry): geometry = obj @@ -62,11 +36,11 @@ def build(obj, bits): geometry.add_solid(obj) elif isinstance(obj, Mesh): geometry = Geometry() - geometry.add_solid(Solid(obj, vacuum, vacuum, surface=lambertian_surface, color=0x99ffffff)) + geometry.add_solid(Solid(obj, vacuum, vacuum, color=0x99ffffff)) else: - raise Exception('cannot build type %s' % type(obj)) + raise TypeError('cannot build type %s' % type(obj)) - geometry.build(bits) + geometry.build() return geometry @@ -82,39 +56,43 @@ def bvh_mesh(geometry, layer): mesh = make.box(dx, dy, dz, center) - for center, dx, dy, dz in zip(np.mean([lower_bounds,upper_bounds],axis=0),*zip(*upper_bounds-lower_bounds))[1:]: + for center, dx, dy, dz in zip(np.mean([lower_bounds,upper_bounds],axis=0), + *zip(*upper_bounds-lower_bounds))[1:]: mesh += make.box(dx,dy,dz,center) return mesh def encode_movie(dir): root, ext = 'movie', 'avi' - for i in count(): - filename = '.'.join([root + str(i).zfill(5), ext]) + for i in itertools.count(): + path = '.'.join([root + str(i).zfill(5), ext]) - if not os.path.exists(filename): + if not os.path.exists(path): break - call(['mencoder', 'mf://' + dir + '/*.png', '-mf', 'fps=10', '-o', filename, '-ovc', 'xvid', '-xvidencopts', 'bitrate=3000']) + call(['mencoder', 'mf://' + dir + '/*.png', '-mf', 'fps=10', '-o', + path, '-ovc', 'xvid', '-xvidencopts', 'bitrate=3000']) shutil.rmtree(dir) print 'movie saved to %s.' % filename -class Camera(Thread): - def __init__(self, geometry, size=(800,600), device_id=None, enable3d=False, green_magenta=False, alpha_depth=10): - Thread.__init__(self) +class Camera(multiprocessing.Process): + def __init__(self, geometry, size=(800,600), device_id=None): + multiprocessing.Process.__init__(self) self.geometry = geometry self.device_id = device_id self.size = size - self.enable3d = enable3d - self.green_magenta = green_magenta - self.alpha_depth = alpha_depth self.unique_bvh_layers = np.unique(self.geometry.layers) self.currentlayer = None self.bvh_layers = {} + self.display3d = False + self.green_magenta = False + self.max_alpha_depth = 10 + self.alpha_depth = 10 + try: import spnav as spnav_module self.spnav_module = spnav_module @@ -123,7 +101,8 @@ class Camera(Thread): self.spnav = False def init_gpu(self): - self.gpu_instance = gpu.GPU(self.device_id) + self.context = gpu.create_context(self.device_id) + self.gpu_geometry = gpu.GPUGeometry(self.geometry) self.gpu_funcs = gpu.GPUFuncs(gpu.get_cu_module('mesh.h')) self.hybrid_funcs = gpu.GPUFuncs(gpu.get_cu_module('hybrid_render.cu')) @@ -134,10 +113,6 @@ class Camera(Thread): self.npixels = self.width*self.height - pygame.init() - self.window = pygame.display.set_mode(self.size) - self.screen = pygame.Surface(self.size, pygame.SRCALPHA) - pygame.display.set_caption('') self.clock = pygame.time.Clock() self.doom_mode = False @@ -156,55 +131,73 @@ class Camera(Thread): self.nblocks = 64 - self.point = np.array([0, -self.scale*1.0, (lower_bound[2]+upper_bound[2])/2]) + self.point = np.array([0, -self.scale*1.0, + (lower_bound[2]+upper_bound[2])/2]) + self.axis1 = np.array([0,0,1], float) self.axis2 = np.array([1,0,0], float) self.film_width = 0.035 - if self.enable3d: - self.point1 = self.point-(self.scale/60,0,0) - self.point2 = self.point+(self.scale/60,0,0) + pos, dir = from_film(self.point, axis1=self.axis1, axis2=self.axis2, + size=self.size, width=self.film_width) - self.viewing_angle = 0.0 + self.rays = gpu.GPURays(pos, dir, max_alpha_depth=self.max_alpha_depth) - pos1, dir1 = project.from_film(self.point1, size=self.size, width=self.film_width) - pos2, dir2 = project.from_film(self.point2, size=self.size, width=self.film_width) + self.pixels_gpu = ga.empty(self.npixels, dtype=np.int32) - self.rays1 = gpu.GPURays(pos1, dir1) - self.rays2 = gpu.GPURays(pos2, dir2) + self.movie = False + self.movie_index = 0 + self.movie_dir = None + self.hybrid_render = False - scope_pos, scope_dir = project.from_film(self.point, size=np.array(self.size)/4.0, width=self.film_width/4.0) + def disable3d(self): + pos, dir = from_film(self.point, axis1=self.axis1, axis2=self.axis2, + size=self.size, width=self.film_width) - self.scope_rays = gpu.GPURays(scope_pos, scope_dir) + self.rays = gpu.GPURays(pos, dir, max_alpha_depth=self.max_alpha_depth) + + self.display3d = False - self.pixels1_gpu = ga.empty(self.width*self.height, dtype=np.int32) - self.pixels2_gpu = ga.empty(self.width*self.height, dtype=np.int32) + def enable3d(self): + self.point1 = self.point-(self.scale/60)*self.axis2 + self.point2 = self.point+(self.scale/60)*self.axis2 - self.distances_gpu = ga.empty(self.scope_rays.pos.size, dtype=np.float32) - else: - pos, dir = project.from_film(self.point, size=self.size, width=self.film_width) + self.viewing_angle = 0.0 - self.rays = gpu.GPURays(pos, dir) + pos1, dir1 = from_film(self.point1, axis1=self.axis1, axis2=self.axis2, + size=self.size, width=self.film_width) + pos2, dir2 = from_film(self.point2, axis1=self.axis1, axis2=self.axis2, + size=self.size, width=self.film_width) - self.distance_array = ga.empty(self.alpha_depth*self.rays.pos.size, dtype=np.float32) - self.index_array = ga.empty(self.alpha_depth*self.rays.pos.size, dtype=np.uint32) - self.n_array = ga.zeros(self.rays.pos.size, dtype=np.uint32) + self.rays1 = gpu.GPURays(pos1, dir1, + max_alpha_depth=self.max_alpha_depth) + self.rays2 = gpu.GPURays(pos2, dir2, + max_alpha_depth=self.max_alpha_depth) - self.pixels_gpu = ga.empty(self.npixels, dtype=np.int32) + scope_size = (self.size[0]//4, self.size[0]//4) - self.movie = False - self.movie_index = 0 - self.movie_dir = None - self.render = False + scope_pos, scope_dir = from_film(self.point, axis1=self.axis1, + axis2=self.axis2, size=scope_size, + width=self.film_width/4.0) + + self.scope_rays = gpu.GPURays(scope_pos, scope_dir) + + self.pixels1_gpu = ga.empty(self.width*self.height, dtype=np.int32) + self.pixels2_gpu = ga.empty(self.width*self.height, dtype=np.int32) + + self.distances_gpu = ga.empty(self.scope_rays.pos.size, + dtype=np.float32) + self.display3d = True - @timeit def initialize_render(self): self.rng_states_gpu = gpu.get_rng_states(self.npixels) - self.xyz_lookup1_gpu = ga.zeros(len(self.geometry.mesh.triangles), dtype=ga.vec.float3) - self.xyz_lookup2_gpu = ga.zeros(len(self.geometry.mesh.triangles), dtype=ga.vec.float3) + self.xyz_lookup1_gpu = ga.zeros(len(self.geometry.mesh.triangles), + dtype=ga.vec.float3) + self.xyz_lookup2_gpu = ga.zeros(len(self.geometry.mesh.triangles), + dtype=ga.vec.float3) - if self.enable3d: + if self.display3d: self.image1_gpu = ga.zeros(self.npixels, dtype=ga.vec.float3) self.image2_gpu = ga.zeros(self.npixels, dtype=ga.vec.float3) else: @@ -231,7 +224,7 @@ class Camera(Thread): self.nlookup_calls += 1 def clear_image(self): - if self.enable3d: + if self.display3d: self.image1_gpu.fill(ga.vec.make_float3(0.0,0.0,0.0)) self.image2_gpu.fill(ga.vec.make_float3(0.0,0.0,0.0)) else: @@ -245,7 +238,7 @@ class Camera(Thread): self.hybrid_funcs.update_xyz_image(np.int32(rays.pos.size), self.rng_states_gpu, rays.pos, rays.dir, np.float32(wavelength), ga.vec.make_float3(*rgb_tuple), self.xyz_lookup1_gpu, self.xyz_lookup2_gpu, image, np.int32(self.nlookup_calls), np.int32(self.max_steps), self.gpu_geometry.gpudata, block=(self.nblocks,1,1), grid=(rays.pos.size//self.nblocks+1,1)) def update_image(self): - if self.enable3d: + if self.display3d: self.update_image_from_rays(self.image1_gpu, self.rays1) self.update_image_from_rays(self.image2_gpu, self.rays2) else: @@ -254,7 +247,7 @@ class Camera(Thread): self.nimages += 1 def process_image(self): - if self.enable3d: + if self.display3d: self.hybrid_funcs.process_image(np.int32(self.pixels1_gpu.size), self.image1_gpu, self.pixels1_gpu, np.int32(self.nimages), block=(self.nblocks,1,1), grid=((self.pixels1_gpu.size)//self.nblocks+1,1)) self.hybrid_funcs.process_image(np.int32(self.pixels2_gpu.size), self.image2_gpu, self.pixels2_gpu, np.int32(self.nimages), block=(self.nblocks,1,1), grid=((self.pixels2_gpu.size)//self.nblocks+1,1)) else: @@ -263,17 +256,17 @@ class Camera(Thread): def screenshot(self, dir='', start=0): root, ext = 'screenshot', 'png' - for i in count(start): - filename = os.path.join(dir, '.'.join([root + str(i).zfill(5), ext])) + for i in itertools.count(start): + path = os.path.join(dir, '.'.join([root + str(i).zfill(5), ext])) - if not os.path.exists(filename): + if not os.path.exists(path): break - pygame.image.save(self.screen, filename) - print 'image saved to %s' % filename + pygame.image.save(self.screen, path) + print 'image saved to %s' % path def rotate(self, phi, n): - if self.enable3d: + if self.display3d: self.rays1.rotate(phi, n) self.rays2.rotate(phi, n) self.scope_rays.rotate(phi, n) @@ -287,7 +280,7 @@ class Camera(Thread): self.axis1 = rotate(self.axis1, phi, n) self.axis2 = rotate(self.axis2, phi, n) - if self.render: + if self.hybrid_render: self.clear_image() self.update() @@ -296,7 +289,7 @@ class Camera(Thread): self.axis1 = rotate(self.axis1, phi, n) self.axis2 = rotate(self.axis2, phi, n) - if self.enable3d: + if self.display3d: self.rays1.rotate_around_point(phi, n, point) self.rays2.rotate_around_point(phi, n, point) self.scope_rays.rotate_around_point(phi, n, point) @@ -304,7 +297,7 @@ class Camera(Thread): self.rays.rotate_around_point(phi, n, point) if redraw: - if self.render: + if self.hybrid_render: self.clear_image() self.update() @@ -312,7 +305,7 @@ class Camera(Thread): def translate(self, v, redraw=True): self.point += v - if self.enable3d: + if self.display3d: self.rays1.translate(v) self.rays2.translate(v) self.scope_rays.translate(v) @@ -323,7 +316,7 @@ class Camera(Thread): self.rays.translate(v) if redraw: - if self.render: + if self.hybrid_render: self.clear_image() self.update() @@ -332,13 +325,13 @@ class Camera(Thread): if gpu_geometry is None: gpu_geometry = self.gpu_geometry - if self.render: + if self.hybrid_render: while self.nlookup_calls < 10: self.update_xyz_lookup(self.source_position) self.update_image() self.process_image() else: - if self.enable3d: + if self.display3d: self.rays1.render(gpu_geometry, self.pixels1_gpu, self.alpha_depth, keep_last_render) self.rays2.render(gpu_geometry, self.pixels2_gpu, @@ -348,7 +341,7 @@ class Camera(Thread): self.alpha_depth, keep_last_render) def update_viewing_angle(self): - if self.enable3d: + if self.display3d: self.gpu_funcs.distance_to_mesh(np.int32(self.scope_rays.pos.size), self.scope_rays.pos, self.scope_rays.dir, self.gpu_geometry.gpudata, self.distances_gpu, block=(self.nblocks,1,1), grid=(self.scope_rays.pos.size//self.nblocks,1)) baseline = ga.min(self.distances_gpu).get().item() @@ -385,7 +378,7 @@ class Camera(Thread): self.viewing_angle = new_viewing_angle def update(self): - if self.enable3d: + if self.display3d: self.update_viewing_angle() n = len(self.gpu_geometries) @@ -395,7 +388,7 @@ class Camera(Thread): else: self.update_pixels(gpu_geometry, keep_last_render=True) - if self.enable3d: + if self.display3d: pixels1 = self.pixels1_gpu.get() pixels2 = self.pixels2_gpu.get() @@ -428,8 +421,8 @@ class Camera(Thread): try: gpu_geometry = self.bvh_layers[layer] except KeyError: - geometry = build(bvh_mesh(self.geometry, layer), 8) - gpu_geometry = gpu.GPUGeometry(geometry) + geometry = build(bvh_mesh(self.geometry, layer)) + gpu_geometry = gpu.GPUGeometry(geometry, print_usage=False) self.bvh_layers[layer] = gpu_geometry self.gpu_geometries = [self.gpu_geometry, gpu_geometry] @@ -470,7 +463,8 @@ class Camera(Thread): self.translate(v) else: phi = np.float32(2*np.pi*length/float(self.width)) - n = rotate(mouse_direction, np.pi/2, np.cross(self.axis1,self.axis2)) + n = rotate(mouse_direction, np.pi/2, + np.cross(self.axis1,self.axis2)) if pygame.key.get_mods() & KMOD_LCTRL: self.rotate_around_point(phi, n, self.point) @@ -512,11 +506,12 @@ class Camera(Thread): return elif event.key == K_EQUALS: - self.alpha_depth += 1 + if self.alpha_depth < self.max_alpha_depth: + self.alpha_depth += 1 self.update() elif event.key == K_MINUS: - if self.alpha_depth > 0: + if self.alpha_depth > 1: self.alpha_depth -= 1 self.update() @@ -542,6 +537,16 @@ class Camera(Thread): self.loadlayer(self.currentlayer) + elif event.key == K_3: + if self.display3d: + self.disable3d() + else: + self.enable3d() + self.update() + + elif event.key == K_g: + self.green_magenta = not self.green_magenta + elif event.key == K_F12: self.screenshot() @@ -549,7 +554,7 @@ class Camera(Thread): if not hasattr(self, 'rng_states_gpu'): self.initialize_render() - self.render = not self.render + self.hybrid_render = not self.hybrid_render self.clear_image() self.update() @@ -598,9 +603,10 @@ class Camera(Thread): angle = length * 0.0001 * accelerate_factor axis /= length #print 'rotate:', angle, axis - self.rotate_around_point(angle, axis, self.point, redraw=False) + self.rotate_around_point(angle, axis, self.point, + redraw=False) - if self.render: + if self.hybrid_render: self.clear_image() self.update() @@ -611,7 +617,7 @@ class Camera(Thread): if not hasattr(self, 'rng_states_gpu'): self.initialize_render() - self.render = not self.render + self.hybrid_render = not self.hybrid_render self.clear_image() self.update() pygame.event.clear(pygame.SYSWMEVENT) @@ -621,6 +627,10 @@ class Camera(Thread): return def run(self): + self.window = pygame.display.set_mode(self.size) + self.screen = pygame.Surface(self.size, pygame.SRCALPHA) + pygame.display.set_caption('') + self.init_gpu() if self.spnav: @@ -629,7 +639,7 @@ class Camera(Thread): self.spnav_module.spnav_x11_open(wm_info['display'], wm_info['window']) pygame.event.set_allowed(pygame.SYSWMEVENT) - print 'Space Navigator support enabled.' + #print 'Space Navigator support enabled.' except: self.spnav = False @@ -641,11 +651,13 @@ class Camera(Thread): while not self.done: self.clock.tick(20) - if self.render and not self.clicked and not pygame.event.peek(KEYDOWN): + if self.hybrid_render and not self.clicked and \ + not pygame.event.peek(KEYDOWN): self.update() # Grab only last SYSWMEVENT (SpaceNav!) to avoid lagged controls - for event in pygame.event.get(pygame.SYSWMEVENT)[-1:] + pygame.event.get(): + for event in pygame.event.get(pygame.SYSWMEVENT)[-1:] + \ + pygame.event.get(): self.process_event(event) if self.movie: @@ -655,7 +667,7 @@ class Camera(Thread): if self.spnav: self.spnav_module.spnav_close() - del self.gpu_instance + self.context.pop() class EventViewer(Camera): def __init__(self, geometry, filename, **kwargs): @@ -674,8 +686,6 @@ class EventViewer(Camera): self.gpu_geometries = [self.gpu_geometry, gpu_geometry] - self.update() - def color_hit_pmts(self): self.gpu_geometry.reset_colors() @@ -686,7 +696,6 @@ class EventViewer(Camera): # Important: Compute range only with HIT channels solid_colors = map_to_color(q, range=(q[hit].min(),q[hit].max())) self.gpu_geometry.color_solids(hit, solid_colors) - self.update() def process_event(self, event): if event.type == KEYDOWN: @@ -697,7 +706,11 @@ class EventViewer(Camera): pass else: self.color_hit_pmts() - self.render_particle_track() + + if self.ev.photons_beg is not None: + self.render_particle_track() + + self.update() return elif event.key == K_PAGEDOWN: @@ -707,68 +720,16 @@ class EventViewer(Camera): pass else: self.color_hit_pmts() - self.render_particle_track() + + if self.ev.photons_beg is not None: + self.render_particle_track() + + self.update() return Camera.process_event(self, event) def view(obj, size=(800,600), **camera_kwargs): - geometry = build(obj, 8) + geometry = build(obj) camera = Camera(geometry, size, **camera_kwargs) camera.start() - camera.join() - -if __name__ == '__main__': - import optparse - import inspect - - import chroma.solids - import chroma.detectors - import chroma.scenes - from chroma.stl import mesh_from_stl - - parser = optparse.OptionParser('%prog filename.stl') - parser.add_option('-b', '--bits', type='int', dest='bits', - help='bits for z-ordering space axes', default=10) - parser.add_option('-r', '--resolution', dest='resolution', - help='specify resolution', default='1024,576') - parser.add_option('--3d', action='store_true', dest='enable3d', - help='enable 3d', default=False) - parser.add_option('--green', action='store_true', dest='green_magenta', - help='3d with green and magenta lenses', default=False) - parser.add_option('-i', dest='io_file', default=None) - options, args = parser.parse_args() - - if len(args) < 1: - sys.exit(parser.format_help()) - - size = [int(s) for s in options.resolution.split(',')] - - if os.path.exists(args[0]): - root, ext = os.path.splitext(os.path.split(args[0])[1]) - - if ext.lower() in ('.stl', '.bz2'): - obj = mesh_from_stl(args[0]) - - else: - members = dict(inspect.getmembers(chroma.detectors) + inspect.getmembers(chroma.solids) + inspect.getmembers(chroma.scenes)) - - buildable_lookup = {} - for member in members.values(): - if inspect.isfunction(member) and \ - hasattr(member, 'buildable') and member.buildable == True: - buildable_lookup[member.identifier] = member - - if args[0] in buildable_lookup: - obj = buildable_lookup[args[0]] - else: - raise Exception("can't find object %s" % args[0]) - - geometry = build(obj, options.bits) - if options.io_file is not None: - camera = EventViewer(geometry, options.io_file, size=size, enable3d=options.enable3d, green_magenta=options.green_magenta) - else: - camera = Camera(geometry, size, enable3d=options.enable3d, green_magenta=options.green_magenta) - - camera.start() - camera.join() diff --git a/chroma-cam b/chroma-cam new file mode 100755 index 0000000..8465aaa --- /dev/null +++ b/chroma-cam @@ -0,0 +1,43 @@ +#!/usr/bin/env python +#--*-python-*- + +if __name__ == '__main__': + import optparse + import sys + import imp + import os + + from chroma import view, build, EventViewer + from chroma import mesh_from_stl + + parser = optparse.OptionParser('%prog') + parser.add_option('-r', '--resolution', dest='resolution', + help='specify window resolution', default='1024,576') + parser.add_option('-i', dest='io_file', default=None) + options, args = parser.parse_args() + + if len(args) < 1: + sys.exit(parser.format_help()) + + size = [int(s) for s in options.resolution.split(',')] + + if os.path.exists(args[0]) and args[0].lower().endswith(('.stl', '.bz2')): + obj = mesh_from_stl(args[0]) + else: + name, attr = args[0].split('.') + + try: + file, path, description = imp.find_module(name) + except ImportError: + raise + + module = imp.load_module(name, file, path, description) + + obj = getattr(module, attr) + + if options.io_file is None: + view(obj, size) + else: + geometry = build(obj) + viewer = EventViewer(geometry, options.io_file, size=size) + viewer.start() diff --git a/detectors/__init__.py b/detectors/__init__.py index 726a985..2028300 100644 --- a/detectors/__init__.py +++ b/detectors/__init__.py @@ -1,8 +1,6 @@ from lbne import build_lbne from sno import build_sno as build_sno_detector from miniclean import build_miniclean as build_miniclean_detector -from chroma.camera import buildable -import inspect # from LBNE document #3951 radius = 63.30/2 @@ -11,41 +9,27 @@ nstrings = 230 pmts_per_string = 88 endcap_spacing = 0.86 -@buildable('lbne_event_view') -def build_lbne_200kton_event_view(): - return build_lbne(radius, height, nstrings, pmts_per_string, endcap_spacing, physical_model=False) +def lbne_event_view(): + return build_lbne(radius, height, nstrings, pmts_per_string, + endcap_spacing, physical_model=False) -@buildable('lbne') -def build_lbne_200kton(): - return build_lbne(radius, height, nstrings, pmts_per_string, endcap_spacing) +def lbne(): + return build_lbne(radius, height, nstrings, pmts_per_string, + endcap_spacing) -@buildable('minilbne') -def build_minilbne(): - return build_lbne(radius/10, height/10, nstrings//10, pmts_per_string//10, endcap_spacing) +def minilbne(): + return build_lbne(radius/10, height/10, nstrings//10, pmts_per_string//10, + endcap_spacing) -@buildable('microlbne') -def build_microlbne(): - return build_lbne(radius/40, height/40, nstrings//40, pmts_per_string//40, endcap_spacing) +def microlbne(): + return build_lbne(radius/40, height/40, nstrings//40, pmts_per_string//40, + endcap_spacing) -@buildable('sno') -def build_sno(): +def sno(): return build_sno_detector() -@buildable('real_sno') -def build_real_sno(): +def cad_sno(): return build_sno_detector(real_av=True) -@buildable('miniclean') -def build_miniclean(): +def miniclean(): return build_miniclean_detector() - -def find(detector_name): - members = globals() - buildable_lookup = {} - for member in members.values(): - if inspect.isfunction(member) and \ - hasattr(member, 'buildable') and member.buildable == True: - buildable_lookup[member.identifier] = member - - if detector_name in buildable_lookup: - return buildable_lookup[detector_name]() diff --git a/scenes/checkerboard.py b/scenes/checkerboard.py index de7983e..c176b32 100644 --- a/scenes/checkerboard.py +++ b/scenes/checkerboard.py @@ -3,9 +3,9 @@ from chroma.itertoolset import * from chroma.geometry import Mesh, Solid, Geometry from chroma.optics import * from chroma.make import sphere -from chroma.camera import buildable +#from chroma.camera import buildable -@buildable('checkerboard_scene') +#@buildable('checkerboard_scene') def build_checkerboard_scene(checkers_per_side=10, squares_per_checker=50): x = np.linspace(-5.0, 5.0, checkers_per_side*squares_per_checker+1) y = np.linspace(-5.0, 5.0, checkers_per_side*squares_per_checker+1) diff --git a/solids/__init__.py b/solids/__init__.py index 421b66f..5ec11cf 100644 --- a/solids/__init__.py +++ b/solids/__init__.py @@ -1,14 +1,11 @@ -import numpy as np from pmts import build_pmt, build_light_collector, build_light_collector_from_file, build_pmt_shell from chroma.optics import * -from chroma.camera import buildable from os.path import dirname -@buildable('12inch_pmt') def build_12inch_pmt(outer_material=water, nsteps=16): - return build_pmt(dirname(__file__) + '/hamamatsu_12inch.txt', 0.003, outer_material, nsteps) + return build_pmt(dirname(__file__) + '/hamamatsu_12inch.txt', 0.003, + outer_material, nsteps) -@buildable('12inch_pmt_shell') def build_12inch_pmt_shell(outer_material=water, nsteps=16): return build_pmt_shell(dirname(__file__) + '/hamamatsu_12inch.txt') @@ -19,23 +16,24 @@ lc_12inch_d = 0.09548 lc_12inch_rmin = 0.1524 lc_12inch_rmax = 0.235072 -@buildable('12inch_pmt_with_lc') def build_12inch_pmt_with_lc(outer_material=water, nsteps=16): pmt = build_12inch_pmt(outer_material, nsteps) - return pmt + build_light_collector(pmt, a=lc_12inch_a, b=lc_12inch_b, d=lc_12inch_d, rmin=lc_12inch_rmin, rmax=lc_12inch_rmax) + return pmt + build_light_collector(pmt, a=lc_12inch_a, b=lc_12inch_b, + d=lc_12inch_d, rmin=lc_12inch_rmin, + rmax=lc_12inch_rmax) -@buildable('12inch_pmt_with_lc_hd') def build_12inch_pmt_with_lc_hd(outer_material=water, nsteps=128): pmt = build_12inch_pmt(outer_material, nsteps) - return pmt + build_light_collector(pmt, a=lc_12inch_a, b=lc_12inch_b, d=lc_12inch_d, rmin=lc_12inch_rmin, rmax=lc_12inch_rmax, npoints=100) + return pmt + build_light_collector(pmt, a=lc_12inch_a, b=lc_12inch_b, + d=lc_12inch_d, rmin=lc_12inch_rmin, + rmax=lc_12inch_rmax, npoints=100) - -@buildable('8inch_pmt') def build_8inch_pmt(outer_material=water, nsteps=24): - return build_pmt(dirname(__file__) + '/sno_pmt_reduced.txt', 0.003, outer_material, nsteps) + return build_pmt(dirname(__file__) + '/sno_pmt_reduced.txt', 0.003, + outer_material, nsteps) -@buildable('8inch_pmt_with_lc') def build_8inch_pmt_with_lc(outer_material=water, nsteps=24): pmt = build_8inch_pmt(outer_material, nsteps) - lc = build_light_collector_from_file(dirname(__file__) + '/sno_cone.txt', outer_material, nsteps) + lc = build_light_collector_from_file(dirname(__file__) + '/sno_cone.txt', + outer_material, nsteps) return pmt + lc diff --git a/solids/pmts.py b/solids/pmts.py index 43aed3f..4c8d288 100644 --- a/solids/pmts.py +++ b/solids/pmts.py @@ -38,7 +38,7 @@ def build_pmt_shell(filename, outer_material=water, nsteps=16): # convert mm -> m profile /= 1000.0 - return Solid(rotate_extrude(profile[:,0], profile[:,1], nsteps), glass, outer_material, color=0xeeffffff) + return Solid(rotate_extrude(profile[:,0], profile[:,1], nsteps), glass, outer_material, color=0x99ffffff) def build_pmt(filename, glass_thickness, outer_material=water, nsteps=16): profile = read_csv(filename) |