-
Notifications
You must be signed in to change notification settings - Fork 0
/
Model.py
130 lines (106 loc) · 4.75 KB
/
Model.py
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# -*- coding: utf-8 -*-
""" Classes for MSTM Model Manager's data model
This module provides the classes necessary for the MVC "Model" portion of the
MSTM Model Manager program.
Classes:
Sphere
SphereGroup
"""
from math import sqrt, pi
class Sphere:
"""A class describing the spheres used in the MSTM model
This class holds the physical and optical properties of the spheres used in
the MSTM model. The physical properties are required variables while the
optical properties are optional. The units used for x, y, z, and r should
be identical.
Attributes:
x (float): the x coordinate for the center of the sphere
y (float): the y coordinate for the center of the sphere
z (float): the z coordinate for the center of the sphere
r (float): the radius of the sphere
n (float): the real portion of the index of refraction
k (float): the imaginary portion of the index of refraction (extinction
coefficient)
real_chiral (float): the real portion of the chiral factor beta
imag_chiral (float): the imaginary portion of the chiral factor beta
tmatrix_file (str): the name of the file containing the previously
calculated T-matrix for this sphere
"""
def __init__(self, x, y, z, r, n=None, k=None, real_chiral=None,
imag_chiral=None, tmatrix_file=None):
"""Constructor
Note: x, y, z, and r must be in identical units
Args:
x (float): the x coordinate for the center of the sphere
y (float): the y coordinate for the center of the sphere
z (float): the z coordinate for the center of the sphere
r (float): the radius of the sphere
n (float, optional): the real portion of the index of refraction
(default=None)
k (float, optional): the imaginary portion of the index of
refraction a.k.a. extinction coefficient (default=None)
real_chiral (float, optional): the real portion of the chiral
factor "beta" (default=None)
imag_chiral (float, optional): the imaginary portion of the chiral
factor "beta" (default=None)
tmatrix_file (str, optional): the name of the file containing the
previously calculated T-matrix for this sphere (default=None)
Returns: a Sphere object
"""
self.x = x
self.y = y
self.z = z
self.r = r
self.n = n
self.k = k
self.real_chiral = real_chiral
self.imag_chiral = imag_chiral
self.tmatrix_file = tmatrix_file
def distance_from(self, x1, y1, z1):
"""Return the distance of the center of this sphere from the provided
coordinates.
Args:
x1 -- the x coord of the point from which distance is calculated
y1 -- the y coord of the point from which distance is calculated
z1 -- the z coord of the point from which distance is calculated
Returns:
A float representing the distance from the provided coords to the
center of this sphere.
"""
return sqrt(
(self.x - x1) ** 2 + (self.y - y1) ** 2 + (self.z - z1) ** 2)
def geom_x_sec(self):
"""Return the geometric cross section of this sphere."""
return pi * self.r ** 2
class SphereGroup:
def __init__(self, sphere_list=list(), group_name=None, group_n=None,
group_k=None, group_real_chiral=None, group_imag_chiral=None,
tmatrix_file=None):
self.sphere_list = sphere_list
self.short_name = group_name
self.group_n = group_n
self.group_k = group_k
self.group_real_chiral = group_real_chiral
self.group_imag_chiral = group_imag_chiral
self.tmatrix_file = tmatrix_file
if ((self.group_n is not None)
or (self.group_k is not None)
or (self.group_real_chiral is not None)
or (self.group_imag_chiral is not None)):
self.apply_oc(group_n, group_k, group_real_chiral,
group_imag_chiral)
def add_sphere(self, a_sphere):
self.sphere_list.append(a_sphere)
def apply_oc(self, n=None, k=None, real_chiral=None, imag_chiral=None):
if n is not None:
for i in self.sphere_list:
i.n = n
if k is not None:
for i in self.sphere_list:
i.k = k
if real_chiral is not None:
for i in self.sphere_list:
i.real_chiral = real_chiral
if imag_chiral is not None:
for i in self.sphere_list:
i.imag_chiral = imag_chiral