import numpy as np from ratdb import load standard_wavelengths = np.arange(200, 810, 20).astype(np.float32) class Material(object): """Material optical properties.""" def __init__(self, name='none'): self.name = name self.refractive_index = None self.absorption_length = None self.scattering_length = None def set(self, name, value, wavelengths=standard_wavelengths): if np.iterable(value): if len(value) != len(wavelengths): raise ValueError('shape mismatch') else: value = np.tile(value, len(wavelengths)) self.__dict__[name] = np.array(zip(wavelengths, value), dtype=np.float32) class Surface(object): """Surface optical properties.""" def __init__(self, name='none'): self.name = name self.absorption = None self.reflection_diffuse = None self.reflection_specular = None def set(self, name, value, wavelengths=standard_wavelengths): if np.iterable(value): if len(value) != len(wavelengths): raise ValueError('shape mismatch') else: value = np.tile(value, len(wavelengths)) self.__dict__[name] = np.array(zip(wavelengths, value), dtype=np.float32) vacuum = Material('vacuum') vacuum.set('refractive_index', 1) vacuum.set('absorption_length', np.finfo(np.float32).max) vacuum.set('scattering_length', np.finfo(np.float32).max) lambertian_surface = Surface('lambertian_surface') lambertian_surface.set('absorption', 0) lambertian_surface.set('reflection_specular', 0) lambertian_surface.set('reflection_diffuse', 1) black_surface = Surface('black_surface') black_surface.set('absorption', 1) black_surface.set('reflection_specular', 0) black_surface.set('reflection_diffuse', 0) shiny_surface = Surface('shiny_surface') shiny_surface.set('absorption', 0) shiny_surface.set('reflection_specular', 1) shiny_surface.set('reflection_diffuse', 0) db = load(open('OPTICS.ratdb'))['OPTICS'] glass = Material('pmt_glass') glass.set('refractive_index', db['glass']['RINDEX_value2'], db['glass']['RINDEX_value1']) glass.set('absorption_length', db['glass']['ABSLENGTH_value2'], db['glass']['ABSLENGTH_value1']) # convert mm -> m glass.absorption_length[:,1] /= 1000.0 # scattering length for glass? glass.set('scattering_length', np.finfo(np.float32).max) lightwater_sno = Material('lightwater_sno') lightwater_sno.set('refractive_index', db['lightwater_sno']['RINDEX_value2'], db['lightwater_sno']['RINDEX_value1']) lightwater_sno.set('absorption_length', db['lightwater_sno']['ABSLENGTH_value2'], db['lightwater_sno']['ABSLENGTH_value1']) # convert mm -> m lightwater_sno.absorption_length[:,1] /= 1000.0 lightwater_sno.set('scattering_length', db['lightwater_sno']['RSLENGTH_value2'], db['lightwater_sno']['RSLENGTH_value1']) # convert mm -> m lightwater_sno.scattering_length[:,1] /= 1000.0 acrylic_sno = Material('acrylic_sno') acrylic_sno.set('refractive_index', db['acrylic_sno']['RINDEX_value2'], db['lightwater_sno']['RINDEX_value1']) acrylic_sno.set('absorption_length', db['acrylic_sno']['ABSLENGTH_value2'], db['acrylic_sno']['ABSLENGTH_value1']) # convert mm -> m acrylic_sno.absorption_length[:,1] /= 1000.0 acrylic_sno.set('scattering_length', db['acrylic_sno']['RSLENGTH_value2'], db['acrylic_sno']['RSLENGTH_value1']) # convert mm -> m acrylic_sno.scattering_length[:,1] /= 1000.0