From 384f0b75d72cb034b8a148d4ae572f3f9cbe2454 Mon Sep 17 00:00:00 2001 From: Stan Seibert Date: Wed, 17 Aug 2011 23:14:15 -0400 Subject: Start of MiniCLEAN geometry. --- detectors/miniclean.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 detectors/miniclean.py (limited to 'detectors/miniclean.py') 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 -- cgit