summaryrefslogtreecommitdiff
path: root/materials.py
blob: 9feb8668430322ec7f4332b2548617aa5fb90915 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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