PyMieSim 3.5.4__cp310-cp310-win_amd64.whl → 3.5.4.3__cp310-cp310-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. PyMieSim/_version.py +2 -2
  2. PyMieSim/binary/interface_detector.cp310-win_amd64.pyd +0 -0
  3. PyMieSim/binary/interface_experiment.cp310-win_amd64.pyd +0 -0
  4. PyMieSim/binary/interface_scatterer.cp310-win_amd64.pyd +0 -0
  5. PyMieSim/binary/interface_sets.cp310-win_amd64.pyd +0 -0
  6. PyMieSim/binary/interface_source.cp310-win_amd64.pyd +0 -0
  7. PyMieSim/binary/libcpp_coordinates.a +0 -0
  8. PyMieSim/binary/libcpp_detector.a +0 -0
  9. PyMieSim/binary/libcpp_experiment.a +0 -0
  10. PyMieSim/binary/libcpp_fibonacci.a +0 -0
  11. PyMieSim/binary/libcpp_mode_field.a +0 -0
  12. PyMieSim/binary/libcpp_sets.a +0 -0
  13. PyMieSim/binary/libcpp_source.a +0 -0
  14. PyMieSim/experiment/scatterer/base.py +8 -2
  15. PyMieSim/experiment/scatterer/core_shell.py +11 -8
  16. PyMieSim/experiment/scatterer/cylinder.py +8 -7
  17. PyMieSim/experiment/scatterer/sphere.py +8 -7
  18. PyMieSim/experiment/source/gaussian.py +13 -14
  19. PyMieSim/experiment/source/planewave.py +15 -16
  20. PyMieSim/mesh.py +73 -156
  21. PyMieSim/single/detector/base.py +9 -9
  22. PyMieSim/single/detector/coherent.py +5 -6
  23. PyMieSim/single/detector/uncoherent.py +1 -2
  24. PyMieSim/single/representations.py +14 -14
  25. PyMieSim/single/source/gaussian.py +24 -6
  26. PyMieSim/special_functions.py +0 -17
  27. PyMieSim/units.py +1 -0
  28. {PyMieSim/binary → lib}/libZBessel.a +0 -0
  29. {PyMieSim/binary → lib}/lib_ZBessel.a +0 -0
  30. {PyMieSim/binary → lib}/libcpp_base_scatterer.a +0 -0
  31. lib/libcpp_coreshell.a +0 -0
  32. lib/libcpp_cylinder.a +0 -0
  33. lib/libcpp_sphere.a +0 -0
  34. {pymiesim-3.5.4.dist-info → pymiesim-3.5.4.3.dist-info}/METADATA +3 -3
  35. {pymiesim-3.5.4.dist-info → pymiesim-3.5.4.3.dist-info}/RECORD +37 -38
  36. PyMieSim/binary/interface_fibonacci.cp310-win_amd64.pyd +0 -0
  37. PyMieSim/binary/interface_mode_field.cp310-win_amd64.pyd +0 -0
  38. PyMieSim/binary/libcpp_coreshell.a +0 -0
  39. PyMieSim/binary/libcpp_cylinder.a +0 -0
  40. PyMieSim/binary/libcpp_sphere.a +0 -0
  41. {pymiesim-3.5.4.dist-info → pymiesim-3.5.4.3.dist-info}/WHEEL +0 -0
  42. {pymiesim-3.5.4.dist-info → pymiesim-3.5.4.3.dist-info}/licenses/LICENSE +0 -0
PyMieSim/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '3.5.4'
21
- __version_tuple__ = version_tuple = (3, 5, 4)
20
+ __version__ = version = '3.5.4.3'
21
+ __version_tuple__ = version_tuple = (3, 5, 4, 3)
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -62,11 +62,17 @@ class BaseScatterer():
62
62
  CPPClass = CppMediumProperties if name == 'medium' else CppScattererProperties
63
63
 
64
64
  if all(isinstance(item, Quantity) for item in properties):
65
- self.binding_kwargs[f'{name}_properties'] = CPPClass(index_properties=properties.magnitude)
65
+ instance = CPPClass(index_properties=properties.magnitude)
66
+ self.binding_kwargs[f'{name}_properties'] = instance
67
+
68
+ return instance
66
69
 
67
70
  elif all(isinstance(item, BaseMaterial) for item in properties):
68
71
  eval_index = numpy.asarray([m.compute_refractive_index(self.source.wavelength.to_base_units().magnitude) for m in properties])
69
- self.binding_kwargs[f'{name}_properties'] = CPPClass(material_properties=eval_index)
72
+ instance = CPPClass(material_properties=eval_index)
73
+ self.binding_kwargs[f'{name}_properties'] = instance
74
+
75
+ return instance
70
76
 
71
77
  else:
72
78
  raise TypeError("All elements in the list must be of type 'Quantity' or 'BaseMaterial', not a mix of both.")
@@ -66,14 +66,17 @@ class CoreShell(BaseScatterer, Sequential):
66
66
  is_sequential=self.is_sequential
67
67
  )
68
68
 
69
- self._add_properties(name='medium', properties=self.medium_property)
69
+ mediun_properties = self._add_properties(name='medium', properties=self.medium_property)
70
70
 
71
- self._add_properties(name='core', properties=self.core_property)
71
+ core_properties = self._add_properties(name='core', properties=self.core_property)
72
72
 
73
- self._add_properties(name='shell', properties=self.shell_property)
73
+ shell_properties = self._add_properties(name='shell', properties=self.shell_property)
74
74
 
75
- binding_kwargs = {
76
- k: v.to_base_units().magnitude if isinstance(v, Quantity) else v for k, v in self.binding_kwargs.items()
77
- }
78
-
79
- self.binding = CppCoreShellSet(**binding_kwargs)
75
+ self.binding = CppCoreShellSet(
76
+ core_diameter=self.core_diameter.to('meter').magnitude,
77
+ shell_thickness=self.shell_thickness.to('meter').magnitude,
78
+ core_properties=core_properties,
79
+ shell_properties=shell_properties,
80
+ medium_properties=mediun_properties,
81
+ is_sequential=self.is_sequential,
82
+ )
@@ -51,12 +51,13 @@ class Cylinder(BaseScatterer, Sequential):
51
51
 
52
52
  self.binding_kwargs = dict(diameter=self.diameter, is_sequential=self.is_sequential)
53
53
 
54
- self._add_properties(name='medium', properties=self.medium_property)
54
+ mediun_properties = self._add_properties(name='medium', properties=self.medium_property)
55
55
 
56
- self._add_properties(name='scatterer', properties=self.property)
56
+ scatterer_properties = self._add_properties(name='scatterer', properties=self.property)
57
57
 
58
- binding_kwargs = {
59
- k: v.to_base_units().magnitude if isinstance(v, Quantity) else v for k, v in self.binding_kwargs.items()
60
- }
61
-
62
- self.binding = CppCylinderSet(**binding_kwargs)
58
+ self.binding = CppCylinderSet(
59
+ diameter=self.diameter.to('meter').magnitude,
60
+ scatterer_properties=scatterer_properties,
61
+ medium_properties=mediun_properties,
62
+ is_sequential=self.is_sequential,
63
+ )
@@ -54,12 +54,13 @@ class Sphere(BaseScatterer, Sequential):
54
54
 
55
55
  self.binding_kwargs = dict(diameter=self.diameter, is_sequential=self.is_sequential)
56
56
 
57
- self._add_properties(name='medium', properties=self.medium_property)
57
+ mediun_properties = self._add_properties(name='medium', properties=self.medium_property)
58
58
 
59
- self._add_properties(name='scatterer', properties=self.property)
59
+ scatterer_properties = self._add_properties(name='scatterer', properties=self.property)
60
60
 
61
- binding_kwargs = {
62
- k: v.to_base_units().magnitude if isinstance(v, Quantity) else v for k, v in self.binding_kwargs.items()
63
- }
64
-
65
- self.binding = CppSphereSet(**binding_kwargs)
61
+ self.binding = CppSphereSet(
62
+ diameter=self.diameter.to('meter').magnitude,
63
+ scatterer_properties=scatterer_properties,
64
+ medium_properties=mediun_properties,
65
+ is_sequential=self.is_sequential,
66
+ )
@@ -32,12 +32,17 @@ class Gaussian(BaseSource, Sequential):
32
32
  wavelength: Quantity
33
33
  polarization: Union[BasePolarization, Quantity]
34
34
 
35
- def _generate_binding_kwargs(self) -> None:
35
+ def _generate_binding(self) -> None:
36
36
  """
37
37
  Prepares the keyword arguments for the C++ binding based on the scatterer's properties. This
38
38
  involves evaluating material indices and organizing them into a dictionary for the C++ interface.
39
39
 
40
40
  """
41
+ self.mapping = {}
42
+
43
+ if not isinstance(self.polarization, BasePolarization):
44
+ self.polarization = Linear(self.polarization)
45
+
41
46
  self.binding_kwargs = dict(
42
47
  wavelength=self.wavelength,
43
48
  jones_vector=self.polarization.element,
@@ -46,16 +51,10 @@ class Gaussian(BaseSource, Sequential):
46
51
  is_sequential=self.is_sequential
47
52
  )
48
53
 
49
- def _generate_binding(self):
50
- self.mapping = {}
51
-
52
- if not isinstance(self.polarization, BasePolarization):
53
- self.polarization = Linear(self.polarization)
54
-
55
- self._generate_binding_kwargs()
56
-
57
- binding_kwargs = {
58
- k: v.to_base_units().magnitude if isinstance(v, Quantity) else v for k, v in self.binding_kwargs.items()
59
- }
60
-
61
- self.binding = CppGaussianSourceSet(**binding_kwargs)
54
+ self.binding = CppGaussianSourceSet(
55
+ wavelength=self.wavelength.to('meter').magnitude,
56
+ jones_vector=self.polarization.element,
57
+ NA=self.NA.to('dimensionless').magnitude,
58
+ optical_power=self.optical_power.to('watt').magnitude,
59
+ is_sequential=self.is_sequential
60
+ )
@@ -40,14 +40,20 @@ class PlaneWave(BaseSource, Sequential):
40
40
 
41
41
  return value
42
42
 
43
- def _generate_binding_kwargs(self) -> None:
43
+ def _generate_binding(self) -> None:
44
44
  """
45
45
  Prepares the keyword arguments for the C++ binding based on the scatterer's properties. This
46
46
  involves evaluating material indices and organizing them into a dictionary for the C++ interface.
47
47
 
48
- Returns:
49
- None
48
+ Returns
49
+ -------
50
+ None
50
51
  """
52
+ self.mapping = {}
53
+
54
+ if not isinstance(self.polarization, BasePolarization):
55
+ self.polarization = Linear(self.polarization)
56
+
51
57
  self.binding_kwargs = dict(
52
58
  wavelength=self.wavelength,
53
59
  jones_vector=self.polarization.element,
@@ -55,16 +61,9 @@ class PlaneWave(BaseSource, Sequential):
55
61
  is_sequential=self.is_sequential
56
62
  )
57
63
 
58
- def _generate_binding(self):
59
- self.mapping = {}
60
-
61
- if not isinstance(self.polarization, BasePolarization):
62
- self.polarization = Linear(self.polarization)
63
-
64
- self._generate_binding_kwargs()
65
-
66
- binding_kwargs = {
67
- k: v.to_base_units().magnitude if isinstance(v, Quantity) else v for k, v in self.binding_kwargs.items()
68
- }
69
-
70
- self.binding = CppPlaneWaveSourceSet(**binding_kwargs)
64
+ self.binding = CppPlaneWaveSourceSet(
65
+ wavelength=self.wavelength.to('meter').magnitude,
66
+ jones_vector=self.polarization.element,
67
+ amplitude=self.amplitude.to('volt/meter').magnitude,
68
+ is_sequential=self.is_sequential
69
+ )
PyMieSim/mesh.py CHANGED
@@ -7,7 +7,7 @@ import numpy
7
7
  from PyMieSim.binary.interface_detector import FIBONACCIMESH
8
8
  from PyMieSim import units
9
9
 
10
- class FibonacciMesh:
10
+ class FibonacciMesh(FIBONACCIMESH):
11
11
  """
12
12
  Represents an angular mesh using a Fibonacci sphere distribution, where each point
13
13
  covers an equivalent solid angle. This type of mesh is useful for simulating angular
@@ -44,8 +44,6 @@ class FibonacciMesh:
44
44
 
45
45
  Methods
46
46
  -------
47
- initialize_properties():
48
- Initializes additional mesh properties based on the Fibonacci distribution generated by the binding.
49
47
  projection_HV_vector() -> tuple:
50
48
  Returns the parallel and perpendicular projections of the mesh on the horizontal and vertical base vectors as vectors.
51
49
  projection_HV_scalar() -> tuple:
@@ -54,14 +52,14 @@ class FibonacciMesh:
54
52
  Computes the scalar projection of a given vector onto a base vector.
55
53
  projection_on_base_vector(vector, base_vector) -> numpy.ndarray:
56
54
  Computes the vector projection of a given vector onto a base vector.
57
- get_cartesian_coordinates() -> numpy.ndarray:
58
- Returns the Cartesian coordinates of the mesh points.
59
55
  get_axis_vector() -> numpy.ndarray:
60
56
  Returns the axis vector corresponding to the phi and gamma offsets.
61
57
  rotate_around_axis(rotation_angle) -> None:
62
58
  Rotates the mesh around its principal axis by a specified angle.
63
59
 
64
60
  """
61
+
62
+ # ---------------------- Validation Methods ----------------------
65
63
  def _validate_angle_units(cls, value):
66
64
  """
67
65
  Ensures that diameter is Quantity objects with length units.
@@ -80,199 +78,134 @@ class FibonacciMesh:
80
78
 
81
79
  return value
82
80
 
83
-
84
- def __init__(self, max_angle: float, sampling: int, phi_offset: float, gamma_offset: float, rotation_angle: Optional[float] = 0.0):
81
+ # ---------------------- Initialization Methods ----------------------
82
+ def __init__(self,
83
+ max_angle: units.Quantity,
84
+ sampling: int,
85
+ phi_offset: units.Quantity,
86
+ gamma_offset: units.Quantity,
87
+ min_angle: units.Quantity = 0 * units.degree,
88
+ rotation_angle: Optional[units.Quantity] = 0.0):
85
89
  """
86
90
  Initializes the FibonacciMesh with the specified parameters.
87
91
 
88
92
  Parameters
89
93
  ----------
90
- max_angle : float
94
+ max_angle : units.Quantity
91
95
  The maximum angle in radians, typically defined by the numerical aperture of the imaging system.
92
96
  sampling : int
93
97
  The number of points distributed across the mesh. Higher values result in finer resolution.
94
- phi_offset : float
98
+ phi_offset : units.Quantity
95
99
  Angle offset in the azimuthal (parallel to incident light polarization) direction in degrees.
96
- gamma_offset : float
100
+ gamma_offset : units.Quantity
97
101
  Angle offset in the polar (perpendicular to incident light polarization) direction in degrees.
98
- rotation_angle : Optional[float], default=0.0
102
+ rotation_angle : Optional[units.Quantity], default=0.0
99
103
  Rotation of the entire mesh around its principal axis, in degrees.
100
104
  """
101
105
  self.sampling = sampling
102
106
  self.max_angle = self._validate_angle_units(max_angle)
103
- self.phi_offset = self._validate_angle_units(phi_offset)
104
- self.gamma_offset = self._validate_angle_units(gamma_offset)
105
- self.rotation_angle = self._validate_angle_units(rotation_angle)
106
-
107
- self.structured = False
108
- self._para = None
109
- self._perp = None
110
-
111
- self.vertical_vector = numpy.array([1, 0, 0])
112
- self.horizontal_vector = numpy.array([0, 1, 0])
107
+ self.min_angle = self._validate_angle_units(min_angle)
108
+ phi_offset = self._validate_angle_units(phi_offset)
109
+ gamma_offset = self._validate_angle_units(gamma_offset)
110
+ rotation = self._validate_angle_units(rotation_angle)
113
111
 
114
- self.binding = FIBONACCIMESH(
112
+ super().__init__(
115
113
  sampling=self.sampling,
116
114
  max_angle=self.max_angle,
117
- phi_offset=numpy.deg2rad(self.phi_offset),
118
- gamma_offset=numpy.deg2rad(self.gamma_offset),
119
- rotation_angle=self.rotation_angle
115
+ min_angle=self.min_angle,
116
+ rotation_angle=rotation,
117
+ phi_offset=numpy.deg2rad(phi_offset),
118
+ gamma_offset=numpy.deg2rad(gamma_offset),
120
119
  )
121
120
 
122
- self.initialize_properties()
123
- self.binding.compute_vector_field()
124
-
125
-
126
-
127
-
121
+ self.compute_vector_field()
128
122
 
123
+ # ---------------------- Property Methods ----------------------
129
124
  @property
130
- def horizontal_to_perpendicular(self):
125
+ def theta(self) -> units.Quantity:
131
126
  """
132
- Returns the projection of the horizontal base vector onto the perpendicular component.
127
+ Returns the polar angles (theta) of the mesh in radians.
133
128
 
134
129
  Returns
135
130
  -------
136
- numpy.ndarray
137
- The horizontal projection onto the perpendicular vector field.
131
+ units.Quantity
132
+ The polar angles in radians.
138
133
  """
139
- return self.binding.horizontal_to_perpendicular_vector
134
+ return self.spherical.theta * units.radian
140
135
 
141
136
  @property
142
- def horizontal_to_parallel(self):
137
+ def phi(self) -> units.Quantity:
143
138
  """
144
- Returns the projection of the horizontal base vector onto the parallel component.
139
+ Returns the azimuthal angles (phi) of the mesh in radians.
145
140
 
146
141
  Returns
147
142
  -------
148
- numpy.ndarray
149
- The horizontal projection onto the parallel vector field.
143
+ units.Quantity
144
+ The azimuthal angles in radians.
150
145
  """
151
- return self.binding.horizontal_to_parallel_vector
146
+ return self.spherical.phi * units.radian
152
147
 
153
148
  @property
154
- def vertical_to_perpendicular(self):
149
+ def d_omega(self) -> units.Quantity:
155
150
  """
156
- Returns the projection of the vertical base vector onto the perpendicular component.
151
+ Returns the solid angle (d_omega) of the mesh in steradians.
157
152
 
158
153
  Returns
159
154
  -------
160
- numpy.ndarray
161
- The vertical projection onto the perpendicular vector field.
155
+ units.Quantity
156
+ The solid angle in steradians.
162
157
  """
163
- return self.binding.perpendicular_vector
158
+ return self.spherical._cpp_d_omega * units.steradian
164
159
 
165
160
  @property
166
- def vertical_to_parallel(self):
161
+ def omega(self) -> units.Quantity:
167
162
  """
168
- Returns the projection of the vertical base vector onto the parallel component.
163
+ Returns the solid angle (omega) of the mesh in steradians.
169
164
 
170
165
  Returns
171
166
  -------
172
- numpy.ndarray
173
- The vertical projection onto the parallel vector field.
167
+ units.Quantity
168
+ The solid angle in steradians.
174
169
  """
175
- return self.binding.parallel_vector
176
-
177
- def get_phi(self, unit: str = 'radian'):
178
- """
179
- Returns the azimuthal angle (phi) of the mesh in the specified unit.
180
-
181
- Parameters
182
- ----------
183
- unit : str, optional
184
- The unit of the angle to return, either 'radian' or 'degree'. Default is 'radian'.
185
-
186
- Returns
187
- -------
188
- numpy.ndarray
189
- Array of phi values in the specified unit.
190
- """
191
- if unit.lower() in ['rad', 'radian']:
192
- return self.binding.phi
193
- elif unit.lower() in ['deg', 'degree']:
194
- return numpy.rad2deg(self.binding.phi)
195
-
196
- def get_theta(self, unit: str = 'radian'):
197
- """
198
- Returns the polar angle (theta) of the mesh in the specified unit.
199
-
200
- Parameters
201
- ----------
202
- unit : str, optional
203
- The unit of the angle to return, either 'radian' or 'degree'. Default is 'radian'.
204
-
205
- Returns
206
- -------
207
- numpy.ndarray
208
- Array of theta values in the specified unit.
209
- """
210
- if unit.lower() in ['rad', 'radian']:
211
- return self.binding.theta
212
- elif unit.lower() in ['deg', 'degree']:
213
- return numpy.rad2deg(self.binding.theta)
170
+ return self.spherical._cpp_omega * units.steradian
214
171
 
215
172
  @property
216
- def X(self) -> numpy.ndarray:
173
+ def phi_offset(self) -> units.Quantity:
217
174
  """
218
- Returns the X-coordinate of the mesh points.
175
+ Returns the azimuthal angle offset (phi_offset) in radians.
219
176
 
220
177
  Returns
221
178
  -------
222
- numpy.ndarray
223
- Array of X-coordinates.
179
+ units.Quantity
180
+ The azimuthal angle offset in radians.
224
181
  """
225
- return self.binding.x
182
+ return self._cpp_phi_offset * units.radian
226
183
 
227
184
  @property
228
- def Y(self) -> numpy.ndarray:
185
+ def gamma_offset(self) -> units.Quantity:
229
186
  """
230
- Returns the Y-coordinate of the mesh points.
187
+ Returns the polar angle offset (gamma_offset) in radians.
231
188
 
232
189
  Returns
233
190
  -------
234
- numpy.ndarray
235
- Array of Y-coordinates.
191
+ units.Quantity
192
+ The polar angle offset in radians.
236
193
  """
237
- return self.binding.y
194
+ return self._cpp_gamma_offset * units.radian
238
195
 
239
196
  @property
240
- def Z(self) -> numpy.ndarray:
241
- """
242
- Returns the Z-coordinate of the mesh points.
243
-
244
- Returns
245
- -------
246
- numpy.ndarray
247
- Array of Z-coordinates.
248
- """
249
- return self.binding.z
250
-
251
- def initialize_properties(self):
252
- """
253
- Initializes additional properties of the Fibonacci mesh based on the underlying
254
- C++ implementation.
255
-
256
- This includes calculating Cartesian coordinates and solid angles for each point on the mesh.
197
+ def rotation(self) -> units.Quantity:
257
198
  """
258
- self.cartesian_coordinates = numpy.column_stack((self.binding.x, self.binding.y, self.binding.z))
259
- self.d_omega_radian = self.binding.d_omega
260
- self.d_omega_degree = self.binding.d_omega * (180 / numpy.pi) ** 2
261
- self.omega_radian = self.binding.omega
262
- self.omega_degree = self.binding.omega * (180 / numpy.pi) ** 2
263
-
264
-
265
- def get_cartesian_coordinates(self) -> numpy.ndarray:
266
- """
267
- Returns the Cartesian coordinates of the mesh points.
199
+ Returns the rotation angle of the mesh around its principal axis in radians.
268
200
 
269
201
  Returns
270
202
  -------
271
- numpy.ndarray
272
- Array of Cartesian coordinates (X, Y, Z) for the mesh points.
203
+ units.Quantity
204
+ The rotation angle in radians.
273
205
  """
274
- return numpy.c_[self.X, self.Y, self.Z].T
206
+ return self._cpp_rotation * units.radian
275
207
 
208
+ # ---------------------- Additional Methods ----------------------
276
209
  def get_axis_vector(self) -> numpy.ndarray:
277
210
  """
278
211
  Returns the axis vector corresponding to the phi and gamma offsets.
@@ -282,28 +215,12 @@ class FibonacciMesh:
282
215
  numpy.ndarray
283
216
  The axis vector normalized to unit length.
284
217
  """
285
- x, y, z = self.get_cartesian_coordinates()
286
- axis_vector = numpy.array([x[0], y[0], z[0]])
218
+ axis_vector = numpy.array([self.cartesian.x[0], self.cartesian.y[0], self.cartesian.z[0]])
287
219
 
288
220
  norm = numpy.sqrt(numpy.square(axis_vector).sum())
289
221
 
290
222
  return axis_vector / norm
291
223
 
292
- def rotate_around_axis(self, rotation_angle: float) -> None:
293
- """
294
- Rotates the mesh around its principal axis by a specified angle.
295
-
296
- Parameters
297
- ----------
298
- rotation_angle : float
299
- The angle in degrees by which to rotate the mesh.
300
-
301
- Returns
302
- -------
303
- None
304
- """
305
- self.binding.rotate_around_axis(rotation_angle)
306
-
307
224
  def projection_HV_vector(self) -> tuple:
308
225
  """
309
226
  Projects the vertical and horizontal base vectors onto the parallel and perpendicular components
@@ -324,16 +241,16 @@ class FibonacciMesh:
324
241
  """
325
242
  parallel_projection = [
326
243
  self.projection_on_base_vector(
327
- vector=self.vertical_to_parallel,
244
+ vector=self.parallel,
328
245
  base_vector=X
329
- ) for X in [self.vertical_vector, self.horizontal_vector]
246
+ ) for X in [self._cpp_vertical_base, self._cpp_horizontal_base]
330
247
  ]
331
248
 
332
249
  perpendicular_projection = [
333
250
  self.projection_on_base_vector(
334
- vector=self.vertical_to_perpendicular,
251
+ vector=self.perpendicular,
335
252
  base_vector=X
336
- ) for X in [self.vertical_vector, self.horizontal_vector]
253
+ ) for X in [self._cpp_vertical_base, self._cpp_horizontal_base]
337
254
  ]
338
255
 
339
256
  return numpy.array(parallel_projection), numpy.array(perpendicular_projection)
@@ -359,16 +276,16 @@ class FibonacciMesh:
359
276
  """
360
277
  parallel_projection = [
361
278
  self.projection_on_base_scalar(
362
- vector=self.vertical_to_parallel,
279
+ vector=self.parallel,
363
280
  base_vector=X
364
- ) for X in [self.vertical_vector, self.horizontal_vector]
281
+ ) for X in [self._cpp_vertical_base, self._cpp_horizontal_base]
365
282
  ]
366
283
 
367
284
  perpendicular_projection = [
368
285
  self.projection_on_base_scalar(
369
- vector=self.vertical_to_perpendicular,
286
+ vector=self.perpendicular,
370
287
  base_vector=X
371
- ) for X in [self.vertical_vector, self.horizontal_vector]
288
+ ) for X in [self._cpp_vertical_base, self._cpp_horizontal_base]
372
289
  ]
373
290
 
374
291
  return numpy.array(parallel_projection), numpy.array(perpendicular_projection)
@@ -406,7 +323,7 @@ class FibonacciMesh:
406
323
 
407
324
  where :math:`\vec{v}` is the input vector and :math:`\vec{b}` is the base vector.
408
325
  """
409
- return vector.dot(base_vector)
326
+ return vector._cpp_get_scalar_product(base_vector)
410
327
 
411
328
  def projection_on_base_vector(self, vector: numpy.ndarray, base_vector: numpy.ndarray) -> numpy.ndarray:
412
329
  r"""
@@ -446,6 +363,6 @@ class FibonacciMesh:
446
363
  then scales `base_vector` by this scalar to produce the projected vector.
447
364
  """
448
365
  projection = self.projection_on_base_scalar(vector, base_vector)
449
- base_projection = numpy.outer(projection, base_vector)
366
+ base_projection = numpy.outer(projection, base_vector.data)
450
367
 
451
368
  return base_projection
@@ -6,7 +6,7 @@ from typing import Optional
6
6
 
7
7
  from PyMieSim.single.representations import Footprint
8
8
  from MPSPlots.colormaps import blue_black_red
9
- from PyMieSim.units import Quantity, degree, watt, meter, second, farad, volt
9
+ from PyMieSim.units import Quantity, watt, meter, second, farad, volt
10
10
  from PyMieSim import units
11
11
  from PyMieSim.single.scatterer.base import BaseScatterer
12
12
  import pyvista
@@ -124,10 +124,10 @@ class BaseDetector(units.UnitsValidation):
124
124
  None: This method does not return a value. It modifies the provided scene.
125
125
  """
126
126
  # Stack the mesh coordinates into a single array
127
- coordinates = numpy.row_stack((
128
- self._cpp_mesh.x,
129
- self._cpp_mesh.y,
130
- self._cpp_mesh.z
127
+ coordinates = numpy.vstack((
128
+ self._cpp_mesh.cartesian.x,
129
+ self._cpp_mesh.cartesian.y,
130
+ self._cpp_mesh.cartesian.z
131
131
  ))
132
132
 
133
133
  # Wrap the coordinates for PyVista visualization
@@ -206,8 +206,8 @@ class BaseDetector(units.UnitsValidation):
206
206
 
207
207
  """
208
208
  Ephi, Etheta = scatterer.get_farfields_array(
209
- phi=self._cpp_mesh.phi,
210
- theta=self._cpp_mesh.theta,
209
+ phi=self._cpp_mesh.spherical.phi,
210
+ theta=self._cpp_mesh.spherical.theta,
211
211
  r=distance
212
212
  )
213
213
 
@@ -263,9 +263,9 @@ class BaseDetector(units.UnitsValidation):
263
263
  """
264
264
  poynting_vector = self.get_poynting_vector(scatterer=scatterer, distance=distance)
265
265
 
266
- dA = self._cpp_mesh.d_omega * distance ** 2
266
+ dA = self._cpp_mesh._cpp_d_omega * distance ** 2
267
267
 
268
- total_power = 0.5 * numpy.trapz(y=poynting_vector, dx=dA)
268
+ total_power = 0.5 * numpy.trapezoid(y=poynting_vector, dx=dA)
269
269
 
270
270
  return total_power
271
271
 
@@ -83,18 +83,17 @@ class CoherentMode(DETECTOR, BaseDetector):
83
83
  self.polarization_filter = self._validate_detector_polarization_units(polarization_filter)
84
84
 
85
85
  super().__init__(
86
- coherent=False,
87
86
  mode_number=self.mode_number,
87
+ sampling=self.sampling,
88
88
  NA=self.NA.to(units.AU).magnitude,
89
89
  cache_NA=self.cache_NA.to(units.AU).magnitude,
90
- sampling=self.sampling,
91
- mean_coupling=self.mean_coupling,
92
- gamma_offset=self.gamma_offset.to(units.radian).magnitude,
93
90
  phi_offset=self.phi_offset.to(units.radian).magnitude,
91
+ gamma_offset=self.gamma_offset.to(units.radian).magnitude,
94
92
  polarization_filter=self.polarization_filter.to(units.radian).magnitude,
95
93
  rotation=self.rotation.to(units.radian).magnitude,
96
- medium_refractive_index=self.medium_refractive_index.to(units.RIU).magnitude
94
+ coherent=False,
95
+ mean_coupling=self.mean_coupling,
96
+ medium_refractive_index=self.medium_refractive_index.to(units.RIU).magnitude,
97
97
  )
98
98
 
99
-
100
99
  # -
@@ -21,8 +21,7 @@ class Photodiode(DETECTOR, BaseDetector):
21
21
  polarization_filter: Optional[units.Quantity] = None,
22
22
  cache_NA: Optional[units.Quantity] = 0 * units.AU,
23
23
  mean_coupling: bool = False,
24
- medium_refractive_index: units.Quantity = 1.0 * units.RIU
25
- ):
24
+ medium_refractive_index: units.Quantity = 1.0 * units.RIU):
26
25
  """
27
26
  Initialize the Photodiode detector with its parameters.
28
27
 
@@ -110,12 +110,12 @@ class BaseRepresentation():
110
110
  scene.add_mesh(glyphs, color=color, opacity=opacity)
111
111
 
112
112
  def add_phi_vector_to_3d_plot(
113
- self,
114
- scene: pyvista.Plotter,
115
- n_points: int = 20,
116
- opacity: float = 1.0,
117
- radius: float = 1.0,
118
- color: str = 'black') -> None:
113
+ self,
114
+ scene: pyvista.Plotter,
115
+ n_points: int = 20,
116
+ opacity: float = 1.0,
117
+ radius: float = 1.0,
118
+ color: str = 'black') -> None:
119
119
  """
120
120
  Adds a vector field to the 3D plot, representing vectors in the phi direction.
121
121
 
@@ -213,14 +213,14 @@ class Stokes(BaseRepresentation):
213
213
  self.V = (-2 * numpy.imag(self.E_phi * self.E_theta.conjugate())) / intensity
214
214
 
215
215
  def plot(
216
- self,
217
- unit_size: List[float] = (400, 400),
218
- background_color: str = 'white',
219
- show_edges: bool = False,
220
- colormap: str = blue_black_red,
221
- opacity: float = 1.0,
222
- symmetric_colormap: bool = False,
223
- show_axis_label: bool = False) -> None:
216
+ self,
217
+ unit_size: List[float] = (400, 400),
218
+ background_color: str = 'white',
219
+ show_edges: bool = False,
220
+ colormap: str = blue_black_red,
221
+ opacity: float = 1.0,
222
+ symmetric_colormap: bool = False,
223
+ show_axis_label: bool = False) -> None:
224
224
  """
225
225
  Visualizes the Stokes parameters (I, Q, U, V) on a 3D plot.
226
226
 
@@ -5,7 +5,6 @@ import numpy
5
5
  import pyvista
6
6
  from PyMieSim import units
7
7
  from PyMieSim.polarization import BasePolarization
8
- from PyMieSim.special_functions import NA_to_angle
9
8
  from PyMieSim.binary.interface_source import GAUSSIAN
10
9
  from PyMieSim.single.source.base import BaseSource
11
10
 
@@ -14,10 +13,10 @@ class Gaussian(GAUSSIAN, BaseSource):
14
13
  amplitude: units.Quantity
15
14
 
16
15
  def __init__(self,
17
- wavelength: units.Quantity,
18
- polarization: units.Quantity | BasePolarization,
19
- optical_power: units.Quantity,
20
- NA: units.Quantity) -> None:
16
+ wavelength: units.Quantity,
17
+ polarization: units.Quantity | BasePolarization,
18
+ optical_power: units.Quantity,
19
+ NA: units.Quantity) -> None:
21
20
  """
22
21
  Initializes a Gaussian light source for light scattering simulations, characterized by its optical power and numerical aperture.
23
22
 
@@ -50,6 +49,21 @@ class Gaussian(GAUSSIAN, BaseSource):
50
49
  NA=self.NA.to(units.AU).magnitude,
51
50
  )
52
51
 
52
+ def numerical_aperture_to_angle(self, numerical_aperture: float) -> float:
53
+ """
54
+ Convert numerical aperture (NA) to angle in radians.
55
+
56
+ Parameters
57
+ ----------
58
+ NA : float
59
+ The numerical aperture.
60
+
61
+ Returns
62
+ -------
63
+ float
64
+ The angle in radians.
65
+ """
66
+ return numpy.arcsin(numerical_aperture) if numerical_aperture <= 1.0 else numpy.arcsin(numerical_aperture - 1) + numpy.pi / 2
53
67
 
54
68
  def plot(self, color: str = 'red', opacity: float = 0.8, show_axis_label: bool = False) -> None:
55
69
  """
@@ -103,7 +117,11 @@ class Gaussian(GAUSSIAN, BaseSource):
103
117
  """
104
118
  # Calculate the maximum angle from the numerical aperture (NA)
105
119
 
106
- max_angle = numpy.rad2deg(NA_to_angle(NA=self.NA.magnitude))
120
+ numerical_aperture = self.NA.magnitude
121
+
122
+ angle = self.numerical_aperture_to_angle(numerical_aperture)
123
+
124
+ max_angle = numpy.rad2deg(angle)
107
125
 
108
126
  # Create the cone mesh
109
127
  cone_mesh = pyvista.Cone(
@@ -4,23 +4,6 @@
4
4
  import numpy
5
5
 
6
6
 
7
- def NA_to_angle(NA: float) -> float:
8
- """
9
- Convert numerical aperture (NA) to angle in radians.
10
-
11
- Parameters
12
- ----------
13
- NA : float
14
- The numerical aperture.
15
-
16
- Returns
17
- -------
18
- float
19
- The angle in radians.
20
- """
21
- return numpy.arcsin(NA) if NA <= 1.0 else numpy.arcsin(NA - 1) + numpy.pi / 2
22
-
23
-
24
7
  def cartesian_to_spherical(x: numpy.ndarray, y: numpy.ndarray, z: numpy.ndarray) -> tuple:
25
8
  """
26
9
  Convert Cartesian coordinates to spherical coordinates.
PyMieSim/units.py CHANGED
@@ -53,6 +53,7 @@ def initialize_registry(ureg: Optional[object] = None):
53
53
  'refractive_index_unit': ureg.refractive_index_unit,
54
54
  'degree': ureg.degree,
55
55
  'radian': ureg.radian,
56
+ 'steradian': ureg.steradian,
56
57
  'AU': ureg.dimensionless,
57
58
  'distance': ureg.meter.dimensionality,
58
59
  'time': ureg.second.dimensionality,
Binary file
Binary file
lib/libcpp_coreshell.a ADDED
Binary file
lib/libcpp_cylinder.a ADDED
Binary file
lib/libcpp_sphere.a ADDED
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PyMieSim
3
- Version: 3.5.4
3
+ Version: 3.5.4.3
4
4
  Summary: A package for light scattering computation.
5
5
  Keywords: mie,scattering,backscatter,sphere,cylinder,nanoparticle,phase function,efficiency,rayleigh,backscattering
6
6
  Author-Email: Martin Poinsinet de Sivry-Houle <martin.poinsinet.de.sivry@gmail.com>
@@ -54,14 +54,14 @@ Requires-Dist: MPSPlots==1.6.4
54
54
  Requires-Dist: pydantic<2.12.0,>=2.9.2
55
55
  Requires-Dist: pint-pandas~=0.6
56
56
  Requires-Dist: pandas~=2.3.0
57
- Requires-Dist: PyOptik==1.10.6
57
+ Requires-Dist: PyOptik==1.10.8
58
58
  Requires-Dist: tabulate~=0.9
59
59
  Requires-Dist: pyvista==0.45.2
60
60
  Provides-Extra: testing
61
61
  Requires-Dist: pytest>=0.6; extra == "testing"
62
62
  Requires-Dist: pytest-cov>=2.0; extra == "testing"
63
63
  Requires-Dist: pytest-json-report==1.5.0; extra == "testing"
64
- Requires-Dist: coverage==7.8.2; extra == "testing"
64
+ Requires-Dist: coverage==7.9.1; extra == "testing"
65
65
  Provides-Extra: documentation
66
66
  Requires-Dist: numpydoc==1.8.0; extra == "documentation"
67
67
  Requires-Dist: sphinx>=5.1.1; extra == "documentation"
@@ -1,26 +1,25 @@
1
+ lib/lib_ZBessel.a,sha256=VnqIXli9K9pfkldxnep2bB897rSdeh9BdJc2mgmzAIw,10676
2
+ lib/libcpp_base_scatterer.a,sha256=YobPrrig-o6FKlB0C2mOtJZ1f_umNUASo7z-RySBBKg,275118
3
+ lib/libcpp_coreshell.a,sha256=yg9hVrqxIzaaqUfgO1Ls4oHhBWVPRMpW9b-BYkqFnOY,278146
4
+ lib/libcpp_cylinder.a,sha256=DIt2Tf5ZQ1PQ5Xe_FzZ3fHrCuyq739UaBwjoXTYFas4,259476
5
+ lib/libcpp_sphere.a,sha256=st6T-gs_-S1sG5kHRO_ORK8it5YboCoNfut9Xvg5tB4,272358
6
+ lib/libZBessel.a,sha256=5xbNMpsEK0WE1Pt_hruOuoAtcQoGmkmc0XvXIHwTSBw,133174
1
7
  PyMieSim/__init__.py,sha256=ATPcasYo6e8DbNhyXGPN8lRhB_mcOGvNV-kO82U9Z5k,260
2
8
  PyMieSim/__main__.py,sha256=ZSJaGgDhOSzpwPZLLrqyzu6JH5nO7KPHblCD8OMuF4A,180
3
- PyMieSim/_version.py,sha256=1u0Voot6NhBTgzWhywtXiRExifGg3U1S-2F5WPsUOcw,532
9
+ PyMieSim/_version.py,sha256=SPA2ARbwEu3rmTOQ07I3xcu74m_6fSX88nf8mSfbM_U,537
4
10
  PyMieSim/binary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- PyMieSim/binary/interface_detector.cp310-win_amd64.pyd,sha256=hdtlmpNpogsjoeBJ3egPuLzp12zYH13bVK5au7mGO1U,1495040
6
- PyMieSim/binary/interface_experiment.cp310-win_amd64.pyd,sha256=d4JWd1xOFRF0BmR3rmp6YFv362E9VmOr-IbL-xYOUAk,1572352
7
- PyMieSim/binary/interface_fibonacci.cp310-win_amd64.pyd,sha256=adIR3eAr4erhy_uODm_lzCgFXLp9Uk9t9kxtB4s5E7s,482304
8
- PyMieSim/binary/interface_mode_field.cp310-win_amd64.pyd,sha256=3HnimpuhJMAb4rL_HcTAym1ey7mmF36hEb3vJgUx_vk,482304
9
- PyMieSim/binary/interface_scatterer.cp310-win_amd64.pyd,sha256=Mr7EusBszygS_R8bYOtyWq1ijyaGeMrEXS835NdhP1Q,1183744
10
- PyMieSim/binary/interface_sets.cp310-win_amd64.pyd,sha256=CBH6oF3HAE2qLI-hZNjgzEX-eU1-W63egnokT6_T9lE,1916416
11
- PyMieSim/binary/interface_source.cp310-win_amd64.pyd,sha256=OgvehrRBAVCn6uk5Xq568rQaF_OPvsFbW0NuOPxVICM,538112
12
- PyMieSim/binary/lib_ZBessel.a,sha256=-QOPkUsiB9PwEnpPOaYbqxPsNsZmkHT0UrBPA_KtZc4,10676
13
- PyMieSim/binary/libcpp_base_scatterer.a,sha256=Pq6zjt01Kq96jN-m5yViZD8MAF7v1CM9axI7Xy9nZfs,274972
14
- PyMieSim/binary/libcpp_coreshell.a,sha256=9s3AIwKgHXzQmHPVvUwqHaJKeNaP9oxnx7LeB32u4qs,277006
15
- PyMieSim/binary/libcpp_cylinder.a,sha256=PlP7Is41TazIRk6KkCHphNkH-h4N57rOfyoX6Pf1glk,258428
16
- PyMieSim/binary/libcpp_detector.a,sha256=Uyie0fRKrpODjshS6x9qWBmRNQlGNQo-FHYZFjy_93Y,278260
17
- PyMieSim/binary/libcpp_experiment.a,sha256=Gjn0xAWmTJsOR6x0ebF3S4Afb75eN1DKpL3wUYJ7biQ,239272
18
- PyMieSim/binary/libcpp_fibonacci.a,sha256=1B2tFOjPjmTNMI3LCqKMvkVWzANcyMxYvWKWNLexauU,239758
19
- PyMieSim/binary/libcpp_mode_field.a,sha256=VGYo6dyuKJQ7bGNpoUHu2F_S1qW7S3gnndcbxNqNRnk,222224
20
- PyMieSim/binary/libcpp_sets.a,sha256=QSUKEGG7_PqqiihQ3DJqrAJqTk_zcMGObaKHZJw1gRM,239186
21
- PyMieSim/binary/libcpp_source.a,sha256=H9zJ7YUbsDCy7LyQYmx8egso3vJfJN5zBugtbBBVGds,1172
22
- PyMieSim/binary/libcpp_sphere.a,sha256=hstOnDx7CwkmhcyJ9cBiwRpBzoEbin17HVxpvUU8oQE,270590
23
- PyMieSim/binary/libZBessel.a,sha256=F1Dm3OX5mjDIXOEHgJ43v1tqgyftM6GUBPin7iK9WBg,133174
11
+ PyMieSim/binary/interface_detector.cp310-win_amd64.pyd,sha256=k_eFMo3StUEQDOdeIacs0DbZG4vwoZaxk-8RPsCyEVI,755712
12
+ PyMieSim/binary/interface_experiment.cp310-win_amd64.pyd,sha256=XKfGab5bUHMZPVK_c5qNsVtRE9uE4NIArcCBFpZbLk0,797696
13
+ PyMieSim/binary/interface_scatterer.cp310-win_amd64.pyd,sha256=4Ot0KbxHCfRgTJKOJfPxWzpsM6FWdKyB5Vig0i6-2YE,1171968
14
+ PyMieSim/binary/interface_sets.cp310-win_amd64.pyd,sha256=_WVxNPVZkRnlhk_7LSaweouzs-giwNglHL42l-kGYBs,1178624
15
+ PyMieSim/binary/interface_source.cp310-win_amd64.pyd,sha256=yOLgbVBPeOKYZrENJDeUlEPnolzflrjjJgYLlGVAwgs,539648
16
+ PyMieSim/binary/libcpp_coordinates.a,sha256=G0ePnS04Tb3zN1VZyiR2WMyOqMy22B8b7hj3aAml7Jw,23506
17
+ PyMieSim/binary/libcpp_detector.a,sha256=QvZPm8DgpGhDvUngUB8_yzU0EC9jQqAU_iPJ9GaOWvc,280582
18
+ PyMieSim/binary/libcpp_experiment.a,sha256=VjJuxgXS7SRllm3PzVson0EhFf7xh6H6VsbsTBL0hK0,238940
19
+ PyMieSim/binary/libcpp_fibonacci.a,sha256=xKmzrTtK6JGHhYzW_doMkEK_C8D2lkQe5uqzvFOpbsE,16808
20
+ PyMieSim/binary/libcpp_mode_field.a,sha256=XlEJisgBBb-Olg3kO0VuomVnFqu_WwH6IQZNahRiiCE,13388
21
+ PyMieSim/binary/libcpp_sets.a,sha256=97idX2JTjxrP8jEXqTNxc0YTNOzNrb4gWdfo2XM1olI,238854
22
+ PyMieSim/binary/libcpp_source.a,sha256=Tr3taFsPqyD7_pd02H075fIfzJJqaUkLn2_qrSMrSYg,4070
24
23
  PyMieSim/directories.py,sha256=x8nf0HACHDuny0YQ3sPnktY8aCKOA1RDvbDTSrerGN0,679
25
24
  PyMieSim/experiment/__init__.py,sha256=3W7RgRQ2wspQyhAsUUfd5oYx199lQbYv90Lf0A5Ypf4,46
26
25
  PyMieSim/experiment/dataframe_subclass.py,sha256=WVVbvLmdPaqgFU48f8Ua0-WOlNj-CDpK_tFNCDC5ixU,7394
@@ -29,28 +28,28 @@ PyMieSim/experiment/detector/base.py,sha256=R2kObUqhY1FicedybH7xn4DJu50-SdAWtHc2
29
28
  PyMieSim/experiment/detector/coherent_mode.py,sha256=5bnQ0j22R5-6ALR9_3wseF01JOiSk9iii2opvcsaQpc,1855
30
29
  PyMieSim/experiment/detector/photodiode.py,sha256=Hpw9Nxo19QUV-r31LCuEl2-EOgUPDEbkbOVB0zPyw8s,1902
31
30
  PyMieSim/experiment/scatterer/__init__.py,sha256=Daf3HTH5jA5Br5R3hb0NQSVZAz5NpaiedGUQG1bYtkU,128
32
- PyMieSim/experiment/scatterer/base.py,sha256=8ZInPzjBpwOsC13L7oAZ6dD9ISHcWLRSzAbX3gKCxfY,3849
33
- PyMieSim/experiment/scatterer/core_shell.py,sha256=OO5-Rg5WKmsFCi1JoMR134WO-bHXQLz8nVRa11TT3YA,3327
34
- PyMieSim/experiment/scatterer/cylinder.py,sha256=FiPeZROIiDmLgGekLK5y0kTHvTnxh6oGJ1m59NA-Kmc,2511
35
- PyMieSim/experiment/scatterer/sphere.py,sha256=rM0miEr8qIht8HO3zSvh3a8pvCyjIn8QghlF82DpVYo,2821
31
+ PyMieSim/experiment/scatterer/base.py,sha256=3wKHLeOnXIXNK9ZE8-q0vNVjeYP2pJV4191DuGSfRuQ,3977
32
+ PyMieSim/experiment/scatterer/core_shell.py,sha256=2HQI285zd63hY0DaDNUwyeOEaDaE5DX3dF9WG9SyhRU,3552
33
+ PyMieSim/experiment/scatterer/cylinder.py,sha256=bpypSsx23WAOx9FEdnkepJI0tfIKBbUndXR7DDjktHw,2601
34
+ PyMieSim/experiment/scatterer/sphere.py,sha256=hiv8rXTm-7BEhE0d48jX9KvSoaxiD1KkmNaC7O9J5sM,2911
36
35
  PyMieSim/experiment/setup.py,sha256=bNbiKh77TX94qKBhDP9PBjE5WZ6b_uQXMK-7R5CrrBI,13649
37
36
  PyMieSim/experiment/source/__init__.py,sha256=QOwlP9wBNAlQA3dmH-g8mNpb2qu5hFdlD_zkmw88Q8w,66
38
37
  PyMieSim/experiment/source/base.py,sha256=bkIM2UDO8APBi6MPWWGrapkSqddQBmiCScJ3Y2Q741c,3189
39
- PyMieSim/experiment/source/gaussian.py,sha256=glmSVMXMJqZ4VDWGjp31wpmTX0eXx_p4MrqWjUEAWxE,2354
40
- PyMieSim/experiment/source/planewave.py,sha256=qMr3T-RBWjmLJD4ep6ofPwHa9YurOm65Ja85tSopb4Q,2557
38
+ PyMieSim/experiment/source/gaussian.py,sha256=00FAe2dHDefDNFr-nh3yA9P4dvtoVfdQmDI36G6wdLI,2390
39
+ PyMieSim/experiment/source/planewave.py,sha256=rZtCS_fOk--WzUg8tz7e5QwHZy_3N9KS-QP4jgo6gXI,2548
41
40
  PyMieSim/experiment/utils.py,sha256=pVdLsLYACnOt1aKPmLO9qLC9I2a9paN4ypMF3TIaaGA,5512
42
41
  PyMieSim/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
42
  PyMieSim/gui/helper.py,sha256=GWrG91CBVgMruvwvQbhfU_07ZhbIBkgAs3FwOvCPhe8,2605
44
43
  PyMieSim/gui/interface.py,sha256=MLE1_6VXdNxAsQlEh0LzKs3o6U7jT5im8QuSGOpiXcA,4948
45
44
  PyMieSim/gui/section.py,sha256=Ro7lbaUJhtvtZEAhzYn5Fbl8BSdQGjAImYESNmYmis4,21701
46
- PyMieSim/mesh.py,sha256=_EsKj9gOAkwmOKl-7AxFgbIN-cwORhBr_e1tY-5XXrg,17577
45
+ PyMieSim/mesh.py,sha256=6ZwIv79eQY7bOl4NRTK1oOSV8X6aMG8BOUC0UTmbU0Q,14934
47
46
  PyMieSim/polarization.py,sha256=l94om78Sku0BjDjzZfBqJ9zW06EghHLs6wKKv-lZRDU,5661
48
47
  PyMieSim/single/__init__.py,sha256=uE3Ctqg90vm4CWTn9uHdnENSOAg7dgHZwwjbrEGWBd8,2255
49
48
  PyMieSim/single/detector/__init__.py,sha256=5w47VDcm6L5VVNz019syCYtM84k1BIHbJll5UktDNjk,91
50
- PyMieSim/single/detector/base.py,sha256=28duZ-ijW1usnB_HKcLRPnaHhgMCkWG9AImBCec5Hwg,11542
51
- PyMieSim/single/detector/coherent.py,sha256=W1qF5HX1nwOW_BYh2e28W50JlaUVLCt2dlZKnKOiK2g,5406
52
- PyMieSim/single/detector/uncoherent.py,sha256=YNLFQkC51TGr08mVcIdbgdc_2mB22139Tt6C8Cxmpgg,4963
53
- PyMieSim/single/representations.py,sha256=4-tBMtoUCOwNXbG0VEj37mq02Ya-I242Oh-qlYx9udY,29939
49
+ PyMieSim/single/detector/base.py,sha256=ex-TMwiv5kI3QJnkSyNgf7oMz22508v_51PE8orqUnU,11590
50
+ PyMieSim/single/detector/coherent.py,sha256=tvJJG41iSFHbFbWg1FB_Frxu1k5s6V8OMZBFU3-meag,5405
51
+ PyMieSim/single/detector/uncoherent.py,sha256=CKR_Iqcx2UjD8ospj9H4rMFNbbM_jLXZgL_PLj2BGWw,4953
52
+ PyMieSim/single/representations.py,sha256=vOznCZL-8KrErz-4m4-9w7g433rmUCfVmWFObLONd_Q,29883
54
53
  PyMieSim/single/scatterer/__init__.py,sha256=CN5D1UTvtIWMrlYvN4YqA3_DAp0jOPlPKl8ZCKUUU-4,128
55
54
  PyMieSim/single/scatterer/base.py,sha256=bRNhLsvu9t8SVROdpnXnpklR_9UNKhw69YmBo6PIjG8,20106
56
55
  PyMieSim/single/scatterer/core_shell.py,sha256=5u5kJpNf3m-E6hU6E4vhALYZitJ0BwlhnYrD1Ek6cIM,4785
@@ -58,10 +57,10 @@ PyMieSim/single/scatterer/cylinder.py,sha256=uKnpNQ1gq-Mb2bOXIlWpohpd4xIdriT85LF
58
57
  PyMieSim/single/scatterer/sphere.py,sha256=UBdfnOSVA9Ep4Xz4ASgXmLKUOCtFoFqJgRTlMCk66Q4,3581
59
58
  PyMieSim/single/source/__init__.py,sha256=UTGc7nja-s3Cfx9tbscY-OOpku8td8eTyRkruUNfN00,96
60
59
  PyMieSim/single/source/base.py,sha256=T7Wx-4JYsG7-OOuZAga7XrzQiYo1jzB2AHLWTxr71Uw,130
61
- PyMieSim/single/source/gaussian.py,sha256=SP1xCOaDCDLgXrJp6T5YbmJ-AT7G1q0YNrjWV-n7H_g,4472
60
+ PyMieSim/single/source/gaussian.py,sha256=LY7ShqlnpefXdHaEz5oQZBVhjxBQWcLhNjgGVzfOSxc,4986
62
61
  PyMieSim/single/source/planewave.py,sha256=Wr5vnege_0yyogG4oVDnJgGOnTfBcI0Delw61M_iTn8,3683
63
- PyMieSim/special_functions.py,sha256=wcdUDTw74cpypRgTco6O4Wage77RBizqS40yNrbbHA4,2518
64
- PyMieSim/units.py,sha256=ONJVF21F0uc6eCWY1YdHzaIFfbG8_mO8OqnVjq7XNC8,4315
62
+ PyMieSim/special_functions.py,sha256=Dwdt3civrBFckhw3Tj0bQvJ2m124B70dqXXQX5VQmcQ,2164
63
+ PyMieSim/units.py,sha256=b6TscVsAkKOiJfqs28gRLI4z_0g1tMS9lzelO623OjQ,4353
65
64
  PyMieSim/validation_data/bohren_huffman/figure_810.csv,sha256=a16WSB7y7_TuGcboXUINj7y-mX0mkG_Vo0CFtE-pfF8,10073
66
65
  PyMieSim/validation_data/bohren_huffman/figure_87.csv,sha256=6vf5uPxzYP7N1rD8GgQJxi4-Yme8Q3ycPpsavXlQQZY,40002
67
66
  PyMieSim/validation_data/bohren_huffman/figure_88.csv,sha256=c30NQRjxlPz6plBcuG3kMVdTYQ0sHmRXRnzS67gyFnQ,40002
@@ -81,7 +80,7 @@ PyMieSim/validation_data/pymiescatt/validation_Qsca_coreshell_1.csv,sha256=fW1pa
81
80
  PyMieSim/validation_data/pymiescatt/validation_Qsca_coreshell_2.csv,sha256=khOJo3N54CqvrG9sxpuvvv5mZlcF3awOk738WHLougI,10400
82
81
  PyMieSim/validation_data/pymiescatt/validation_Qsca_medium.csv,sha256=7PE_F3sLIKmKPhcoMUxeByZHw3lzDfc3TH9g9bh3Noo,20800
83
82
  PyMieSim/validation_data/pymiescatt/validation_sphere.csv,sha256=0VCbInLU-PcTMa8IOsGL9vBWYJ9tQ6FpMv3ApV8fQVY,143548
84
- pymiesim-3.5.4.dist-info/METADATA,sha256=OAX_CRIIu9LL_bphPnMINPvy2qsHwlNMaHrhnzuTTAk,13470
85
- pymiesim-3.5.4.dist-info/WHEEL,sha256=Bg3xfVZCdvCQkqUyMs2y8LOfK6ua4a-d4Njc-PtQZvk,106
86
- pymiesim-3.5.4.dist-info/licenses/LICENSE,sha256=Iiz1zBIAocPfqqVpPTakp8OKXY9K5j4bIRbgaXy2iAE,1109
87
- pymiesim-3.5.4.dist-info/RECORD,,
83
+ pymiesim-3.5.4.3.dist-info/METADATA,sha256=3QF4Pz6lqkM-onxvKsHs4zMk7yLajZ-4mZx9uSpp8dM,13472
84
+ pymiesim-3.5.4.3.dist-info/WHEEL,sha256=Bg3xfVZCdvCQkqUyMs2y8LOfK6ua4a-d4Njc-PtQZvk,106
85
+ pymiesim-3.5.4.3.dist-info/licenses/LICENSE,sha256=Iiz1zBIAocPfqqVpPTakp8OKXY9K5j4bIRbgaXy2iAE,1109
86
+ pymiesim-3.5.4.3.dist-info/RECORD,,
Binary file
Binary file
Binary file