diff options
author | Anthony LaTorre <tlatorre9@gmail.com> | 2011-07-19 15:09:50 -0400 |
---|---|---|
committer | Anthony LaTorre <tlatorre9@gmail.com> | 2011-07-19 15:09:50 -0400 |
commit | f5a328b72ebb643b51cae41a991c934da712f0e5 (patch) | |
tree | f90f89c335743d0da239cf413fcca09fb711acd0 /solids | |
parent | 842e3a9dfecdd6411b1f27084ab6dcbe92fa32b9 (diff) | |
download | chroma-f5a328b72ebb643b51cae41a991c934da712f0e5.tar.gz chroma-f5a328b72ebb643b51cae41a991c934da712f0e5.tar.bz2 chroma-f5a328b72ebb643b51cae41a991c934da712f0e5.zip |
removed STL pmt models; pmt models are now built by calling rotate_extrude() on a profile of the PMT model (see build_pmt() in solids/pmts.py). triangle intersection now allows one of the two coefficients multiplying the vectors which span the triangle to float slightly negative (up to -EPSILON; EPSILON is defined in src/intersect.h) in order to eliminate rays passing through the line between two triangles. cleaned up a lot of unused code. pulled duplicate code in view() and render() into functions in view.py. in order to allow view.py and render.py to search pre-defined geometries, solids, meshes, etc. without requiring them to be pre-built, pre-defined geometries, solids, meshes, etc. should be returned by a function tagged by the decorator @buildable(identifier) defined in view.py, where identifier is a string used to identify the object as an argument to either view.py or render.py. optical materials and surfaces are now defined in optics.py. added an image directory to save cool screenshots.
Diffstat (limited to 'solids')
-rw-r--r-- | solids/__init__.py | 2 | ||||
-rw-r--r-- | solids/hamamatsu_12inch.txt | 55 | ||||
-rw-r--r-- | solids/pmts.py | 66 | ||||
-rw-r--r-- | solids/r11708.py | 48 | ||||
-rw-r--r-- | solids/r11708_cut.py | 48 |
5 files changed, 121 insertions, 98 deletions
diff --git a/solids/__init__.py b/solids/__init__.py deleted file mode 100644 index f4c5812..0000000 --- a/solids/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from r11708 import r11708 -from r11708_cut import r11708_cut diff --git a/solids/hamamatsu_12inch.txt b/solids/hamamatsu_12inch.txt new file mode 100644 index 0000000..e896b94 --- /dev/null +++ b/solids/hamamatsu_12inch.txt @@ -0,0 +1,55 @@ +#DataThief /Users/stan/Downloads/./Dimension_of_12inch_bulb_100826.png Monday 16-May-2011 12:22:34 PM +109.1514, 83.9786 +123.0527, 70.9583 +134.8946, 56.9466 +145.1919, 40.944 +150.8554, 23.4594 +152.4, 3.9922 +150.8554, -15.4649 +145.7067, -32.914 +136.4392, -49.3517 +123.0527, -64.2787 +108.6364, -75.2102 +92.1608, -86.1349 +76.2, -97.0612 +66.4176, -112.0001 +63.3284, -130.9531 +63.3284, -150.9143 +63.3284, -170.3764 +56.6351, -187.8206 +44.7932, -202.7527 +28.8324, -211.1839 +10.8122, -212.6219 +-9.2676, -213.5543 +-28.8324, -210.995 +-45.823, -201.9569 +-57.6649, -186.9473 +-63.8432, -169.96 +-63.8432, -150.4979 +-63.8432, -130.5367 +-66.4176, -111.0661 +-76.7149, -96.0615 +-93.1905, -85.0289 +-108.6364, -74.4987 +-123.0527, -63.4727 +-135.4095, -49.9586 +-144.677, -33.9593 +-150.3405, -16.4747 +-152.9149, 2.4968 +-151.3703, 21.4549 +-146.2216, 39.4031 +-136.4392, 55.34 +-124.0824, 70.2704 +-109.6662, 83.198 +-93.7054, 94.1244 +-76.7149, 103.0513 +-59.2095, 109.4813 +-40.6743, 113.9119 +-21.1095, 117.3411 +-1.0297, 118.2734 +19.05, 117.2096 +38.6149, 114.1513 +57.15, 109.5994 +75.1703, 103.053 +92.1608, 94.5138 +104.0027, 88.4867 diff --git a/solids/pmts.py b/solids/pmts.py new file mode 100644 index 0000000..6b10522 --- /dev/null +++ b/solids/pmts.py @@ -0,0 +1,66 @@ +import os +import sys + +dir = os.path.split(os.path.realpath(__file__))[0] +sys.path.append(dir + '/..') + +import numpy as np +from geometry import Solid +from make import rotate_extrude +from optics import * +from tools import read_csv, offset + +def get_lc_profile(radii, a, b, d, rmin, rmax): + c = -b*np.sqrt(1 - (rmin-d)**2/a**2) + return -c - b*np.sqrt(1-(radii-d)**2/a**2) + +def build_light_collector(pmt, a, b, d, rmin, rmax, npoints=10): + if not isinstance(pmt, Solid): + raise Exception('`pmt` must be an instance of %s' % Solid) + + lc_radii = np.linspace(rmin, rmax, npoints) + lc_profile = get_lc_profile(lc_radii, a, b, d, rmin, rmax) + + pmt_face_profile = pmt.profile[pmt.profile[:,1] > -1e-3] + + lc_offset = np.interp(lc_radii[0], list(reversed(pmt_face_profile[:,0])), list(reversed(pmt_face_profile[:,1]))) + + lc_mesh = rotate_extrude(lc_radii, lc_profile + lc_offset, pmt.theta) + + return Solid(lc_mesh, pmt.outer_material, pmt.outer_material, color=0xff0000, surface=shiny_surface) + +def build_pmt(filename, glass_thickness, outer_material=water, theta=np.pi/8): + profile = read_csv(filename) + + # slice profile in half + profile = profile[profile[:,0] < 0] + profile[:,0] = -profile[:,0] + # order profile from base to face + profile = profile[np.argsort(profile[:,1])] + # set x coordinate to 0.0 for first and last profile along the profile + # so that the mesh is closed + profile[0,0] = 0.0 + profile[-1,0] = 0.0 + # convert mm -> m + profile /= 1000.0 + + offset_profile = offset(profile, -glass_thickness) + + outer_envelope_mesh = rotate_extrude(profile[:,0], profile[:,1], theta) + inner_envelope_mesh = rotate_extrude(offset_profile[:,0], offset_profile[:,1], theta) + + outer_envelope = Solid(outer_envelope_mesh, glass, outer_material) + + photocathode = np.mean(inner_envelope_mesh[:], axis=1)[:,1] > 0 + + inner_envelope = Solid(inner_envelope_mesh, vacuum, glass, surface=np.where(photocathode, r7081hqe_photocathode, shiny_surface), color=np.where(photocathode, 0xff00, 0xff0000)) + + pmt = outer_envelope + inner_envelope + + # profile points, outer_material, and theta are used to construct the + # light collector + pmt.profile = profile + pmt.outer_material = outer_material + pmt.theta = theta + + return pmt diff --git a/solids/r11708.py b/solids/r11708.py deleted file mode 100644 index d1a5514..0000000 --- a/solids/r11708.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -import sys -import numpy as np - -dir = os.path.split(os.path.realpath(__file__))[0] -sys.path.append(dir + '/..') - -import models -from stl import mesh_from_stl -from geometry import * -from materials import * - -r11708_outer_mesh = mesh_from_stl(models.dir + '/hamamatsu_12inch_outer.stl') -r11708_inner_mesh = mesh_from_stl(models.dir + '/hamamatsu_12inch_inner.stl') - -photocathode_triangles = np.mean(r11708_inner_mesh[:], axis=1)[:,1] > 0 - -inner_color = np.empty(len(r11708_inner_mesh.triangles), np.uint32) -inner_color[photocathode_triangles] = 0xff0000 -inner_color[~photocathode_triangles] = 0x00ff00 - -inner_surface = np.empty(len(r11708_inner_mesh.triangles), np.object) -inner_surface[photocathode_triangles] = r7081hqe_photocathode -inner_surface[~photocathode_triangles] = shiny_surface - -r11708_inner_solid = Solid(r11708_inner_mesh, vacuum, glass, inner_surface, color=inner_color) -r11708_outer_solid = Solid(r11708_outer_mesh, glass, lightwater_sno) - -r11708 = r11708_inner_solid + r11708_outer_solid - -if __name__ == '__main__': - from view import view - from copy import deepcopy - - r11708_outer_mesh_cutaway = deepcopy(r11708_outer_mesh) - r11708_outer_mesh_cutaway.triangles = \ - r11708_outer_mesh_cutaway.triangles[\ - np.mean(r11708_outer_mesh_cutaway[:], axis=1)[:,0] > 0] - - r11708_outer_solid_cutaway = Solid(r11708_outer_mesh_cutaway, glass, lightwater_sno) - - r11708_cutaway = r11708_inner_solid + r11708_outer_solid_cutaway - - geometry = Geometry() - geometry.add_solid(r11708_cutaway) - geometry.build(bits=8) - - view(geometry, 'r11708_cutaway') diff --git a/solids/r11708_cut.py b/solids/r11708_cut.py deleted file mode 100644 index 14cfff0..0000000 --- a/solids/r11708_cut.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -import sys -import numpy as np - -dir = os.path.split(os.path.realpath(__file__))[0] -sys.path.append(dir + '/..') - -import models -from stl import mesh_from_stl -from geometry import * -from materials import * - -r11708_outer_mesh = mesh_from_stl(models.dir + '/hamamatsu_12inch_outer_cut.stl') -r11708_inner_mesh = mesh_from_stl(models.dir + '/hamamatsu_12inch_inner_cut.stl') - -photocathode_triangles = np.mean(r11708_inner_mesh[:], axis=1)[:,1] > 0 - -inner_color = np.empty(len(r11708_inner_mesh.triangles), np.uint32) -inner_color[photocathode_triangles] = 0xff0000 -inner_color[~photocathode_triangles] = 0x00ff00 - -inner_surface = np.empty(len(r11708_inner_mesh.triangles), np.object) -inner_surface[photocathode_triangles] = r7081hqe_photocathode -inner_surface[~photocathode_triangles] = shiny_surface - -r11708_inner_solid = Solid(r11708_inner_mesh, vacuum, glass, inner_surface, color=inner_color) -r11708_outer_solid = Solid(r11708_outer_mesh, glass, lightwater_sno) - -r11708_cut = r11708_inner_solid + r11708_outer_solid - -if __name__ == '__main__': - from view import view - from copy import deepcopy - - r11708_outer_mesh_cutaway = deepcopy(r11708_outer_mesh) - r11708_outer_mesh_cutaway.triangles = \ - r11708_outer_mesh_cutaway.triangles[\ - np.mean(r11708_outer_mesh_cutaway[:], axis=1)[:,0] > 0] - - r11708_outer_solid_cutaway = Solid(r11708_outer_mesh_cutaway, glass, lightwater_sno) - - r11708_cutaway = r11708_inner_solid + r11708_outer_solid_cutaway - - geometry = Geometry() - geometry.add_solid(r11708_cutaway) - geometry.build(bits=8) - - view(geometry, 'r11708_cutaway') |