summaryrefslogtreecommitdiff
path: root/detectors/miniclean.py
diff options
context:
space:
mode:
Diffstat (limited to 'detectors/miniclean.py')
-rw-r--r--detectors/miniclean.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/detectors/miniclean.py b/detectors/miniclean.py
new file mode 100644
index 0000000..9223548
--- /dev/null
+++ b/detectors/miniclean.py
@@ -0,0 +1,80 @@
+import numpy as np
+import numpy.linalg
+import math
+from chroma.make import linear_extrude, sphere
+from chroma.geometry import *
+from chroma.optics import *
+from chroma.transform import rotate, make_rotation_matrix
+from chroma.itertoolset import grouper
+import os
+
+
+dir = os.path.split(os.path.realpath(__file__))[0]
+
+def read_polygons(filename):
+ polygons = {}
+ with open(filename) as f:
+ for line in f:
+ parts = line.split()
+ idnum = int(parts[0])
+ npoints = int(parts[1])
+ points = np.zeros(shape=(npoints,2), dtype=np.float32)
+ for i, (x,y) in enumerate(grouper(2, parts[2:])):
+ points[i] = [float(x), float(y)]
+ polygons[idnum] = points
+ return polygons
+
+def read_cassettes(filename):
+ cassettes = []
+ with open(filename) as f:
+ for line in f:
+ parts = line.split()
+ cassette_type = int(parts[0])
+ rotation = np.transpose(np.array(map(float, parts[1:10]), dtype=np.float32).reshape((3,3)))
+ displacement = np.array(map(float, parts[10:13]), dtype=np.float32)
+
+ cassettes.append({'type' : cassette_type, 'rotation' : rotation,
+ 'displacement' : displacement})
+
+ return cassettes
+
+def build_miniclean(real_av=False):
+ geo = Geometry()
+
+ simple_iv = sphere(0.818)
+ geo.add_solid(Solid(simple_iv, water, vacuum, color=0x33FF0000))
+
+ polygons = read_polygons(os.path.join(dir, 'miniclean_polygons.txt'))
+
+ height = 0.30
+ polygon_types = {}
+ for polygon_id, polygon_points in polygons.items():
+ mesh = linear_extrude(polygon_points[::-1,0]/1000.0,
+ polygon_points[::-1,1]/1000.0,
+ height=height,
+ center=[0,0,height/2])
+ colors = np.zeros(len(mesh.triangles), dtype=np.uint32)
+ colors.fill(0x03CCCCFF)
+ # Color the faces on one end
+ triangles = mesh.assemble(group=True)
+ triangle_centroids = triangles.mean(axis=1)
+ face = triangle_centroids[:,2] < 0.1
+ colors[face] = 0x1100FF00
+
+ polygon_types[polygon_id] = (mesh, colors)
+
+ cassettes = read_cassettes(os.path.join(dir, 'miniclean_cassettes.txt'))
+
+ geo.pmtids = []
+ geo.pmt_id_map = {}
+ for i, cassette in enumerate(cassettes):
+ polygon_mesh, polygon_colors = polygon_types[cassette['type']]
+ solid = Solid(polygon_mesh, water, water, surface=shiny_surface,
+ color=polygon_colors)
+
+ chroma_id = geo.add_solid(solid, cassette['rotation'],
+ cassette['displacement']/1000.0)
+ geo.pmt_id_map[chroma_id] = i
+ geo.pmtids.append(chroma_id)
+
+ return geo