goad-py 1.1.2__cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.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.
- goad/__init__.py +1 -0
- goad/_goad.cpython-312-s390x-linux-gnu.so +0 -0
- goad/_goad.pyi +707 -0
- goad/bar.py +64 -0
- goad/py.typed +0 -0
- goad_py-1.1.2.dist-info/METADATA +280 -0
- goad_py-1.1.2.dist-info/RECORD +9 -0
- goad_py-1.1.2.dist-info/WHEEL +5 -0
- goad_py-1.1.2.dist-info/licenses/LICENSE +674 -0
goad/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from ._goad import *
|
|
Binary file
|
goad/_goad.pyi
ADDED
|
@@ -0,0 +1,707 @@
|
|
|
1
|
+
# This file is automatically generated by pyo3_stub_gen
|
|
2
|
+
# ruff: noqa: E501, F401
|
|
3
|
+
|
|
4
|
+
import builtins
|
|
5
|
+
import enum
|
|
6
|
+
import numpy
|
|
7
|
+
import numpy.typing
|
|
8
|
+
import typing
|
|
9
|
+
|
|
10
|
+
@typing.final
|
|
11
|
+
class BinningScheme:
|
|
12
|
+
r"""
|
|
13
|
+
Angular binning scheme for scattering calculations.
|
|
14
|
+
|
|
15
|
+
Defines how to discretize the scattering sphere into angular bins
|
|
16
|
+
for Mueller matrix and amplitude computations. Supports simple
|
|
17
|
+
regular grids, custom intervals, and arbitrary bin arrangements.
|
|
18
|
+
"""
|
|
19
|
+
def __new__(cls, bins: typing.Sequence[typing.Sequence[typing.Sequence[builtins.float]]]) -> BinningScheme: ...
|
|
20
|
+
@staticmethod
|
|
21
|
+
def simple(num_theta: builtins.int, num_phi: builtins.int) -> BinningScheme:
|
|
22
|
+
r"""
|
|
23
|
+
Create a simple binning scheme with uniform theta and phi spacing
|
|
24
|
+
"""
|
|
25
|
+
@staticmethod
|
|
26
|
+
def interval(thetas: typing.Sequence[builtins.float], theta_spacings: typing.Sequence[builtins.float], phis: typing.Sequence[builtins.float], phi_spacings: typing.Sequence[builtins.float]) -> BinningScheme:
|
|
27
|
+
r"""
|
|
28
|
+
Create an interval binning scheme with variable spacing
|
|
29
|
+
"""
|
|
30
|
+
@staticmethod
|
|
31
|
+
def custom(bins: typing.Sequence[typing.Sequence[typing.Sequence[builtins.float]]]) -> BinningScheme:
|
|
32
|
+
r"""
|
|
33
|
+
Create a custom binning scheme with explicit bin edges
|
|
34
|
+
Each bin is specified as [[theta_min, theta_max], [phi_min, phi_max]]
|
|
35
|
+
"""
|
|
36
|
+
def thetas(self) -> builtins.list[builtins.float]:
|
|
37
|
+
r"""
|
|
38
|
+
Returns a list of all theta bin centre values
|
|
39
|
+
"""
|
|
40
|
+
def phis(self) -> builtins.list[builtins.float]:
|
|
41
|
+
r"""
|
|
42
|
+
Returns a list of all phi bin centre values
|
|
43
|
+
"""
|
|
44
|
+
def bins(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
45
|
+
r"""
|
|
46
|
+
Returns all 2D bins as a numpy array of shape (n_bins, 2) with columns [theta, phi]
|
|
47
|
+
"""
|
|
48
|
+
def bins_1d(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
49
|
+
r"""
|
|
50
|
+
Returns unique 1D theta bins as a numpy array
|
|
51
|
+
"""
|
|
52
|
+
def num_bins(self) -> builtins.int:
|
|
53
|
+
r"""
|
|
54
|
+
Returns the number of bins
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
@typing.final
|
|
58
|
+
class Convergence:
|
|
59
|
+
@property
|
|
60
|
+
def mean(self) -> Results:
|
|
61
|
+
r"""
|
|
62
|
+
Access the current mean results (live during solve).
|
|
63
|
+
"""
|
|
64
|
+
@property
|
|
65
|
+
def sem(self) -> Results:
|
|
66
|
+
r"""
|
|
67
|
+
Access the current standard error of the mean (live during solve).
|
|
68
|
+
"""
|
|
69
|
+
@property
|
|
70
|
+
def count(self) -> builtins.int:
|
|
71
|
+
r"""
|
|
72
|
+
Get the max orientations (safety cap).
|
|
73
|
+
"""
|
|
74
|
+
@property
|
|
75
|
+
def max_orientations(self) -> builtins.int: ...
|
|
76
|
+
@max_orientations.setter
|
|
77
|
+
def max_orientations(self, value: builtins.int) -> None:
|
|
78
|
+
r"""
|
|
79
|
+
Set the max orientations (safety cap).
|
|
80
|
+
"""
|
|
81
|
+
def __new__(cls, settings: Settings, geoms: typing.Optional[typing.Sequence[Geom]] = None) -> Convergence: ...
|
|
82
|
+
def solve(self) -> None:
|
|
83
|
+
r"""
|
|
84
|
+
Solve the multi-orientation scattering problem using work-stealing.
|
|
85
|
+
Periodically checks for Python signals (Ctrl-C) and interrupts if needed.
|
|
86
|
+
"""
|
|
87
|
+
def add_target(self, param: Param, relative_error: builtins.float) -> None:
|
|
88
|
+
r"""
|
|
89
|
+
Add a convergence target for a parameter (Python API).
|
|
90
|
+
Solver terminates when ALL targets are satisfied.
|
|
91
|
+
"""
|
|
92
|
+
def clear_targets(self) -> None:
|
|
93
|
+
r"""
|
|
94
|
+
Clear all convergence targets (Python API).
|
|
95
|
+
"""
|
|
96
|
+
def py_reset(self) -> None:
|
|
97
|
+
r"""
|
|
98
|
+
Reset the solver to initial state.
|
|
99
|
+
"""
|
|
100
|
+
def py_reset_sampler(self) -> None:
|
|
101
|
+
r"""
|
|
102
|
+
Reset the orientation sampler (for reproducibility).
|
|
103
|
+
"""
|
|
104
|
+
def save(self, directory: typing.Optional[builtins.str] = None) -> None:
|
|
105
|
+
r"""
|
|
106
|
+
Save simulation results to disk.
|
|
107
|
+
|
|
108
|
+
Writes Mueller matrices, parameters, and other output files to the
|
|
109
|
+
specified directory (or the directory configured in settings).
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
directory: Optional output directory path. If not provided, uses
|
|
113
|
+
the directory from settings.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
@typing.final
|
|
117
|
+
class Euler:
|
|
118
|
+
@property
|
|
119
|
+
def alpha(self) -> builtins.float: ...
|
|
120
|
+
@alpha.setter
|
|
121
|
+
def alpha(self, value: builtins.float) -> None: ...
|
|
122
|
+
@property
|
|
123
|
+
def beta(self) -> builtins.float: ...
|
|
124
|
+
@beta.setter
|
|
125
|
+
def beta(self, value: builtins.float) -> None: ...
|
|
126
|
+
@property
|
|
127
|
+
def gamma(self) -> builtins.float: ...
|
|
128
|
+
@gamma.setter
|
|
129
|
+
def gamma(self, value: builtins.float) -> None: ...
|
|
130
|
+
def __new__(cls, alpha: builtins.float, beta: builtins.float, gamma: builtins.float) -> Euler: ...
|
|
131
|
+
def __repr__(self) -> builtins.str: ...
|
|
132
|
+
|
|
133
|
+
@typing.final
|
|
134
|
+
class Geom:
|
|
135
|
+
@property
|
|
136
|
+
def first_shape_vertices(self) -> builtins.list[tuple[builtins.float, builtins.float, builtins.float]]:
|
|
137
|
+
r"""
|
|
138
|
+
Getter for the vertices of the first shape
|
|
139
|
+
"""
|
|
140
|
+
def __new__(cls, shapes: typing.Sequence[Shape]) -> Geom: ...
|
|
141
|
+
@staticmethod
|
|
142
|
+
def from_file(filename: builtins.str) -> builtins.list[Geom]: ...
|
|
143
|
+
|
|
144
|
+
@typing.final
|
|
145
|
+
class MultiProblem:
|
|
146
|
+
r"""
|
|
147
|
+
Multi-orientation light scattering simulation for a single geometry.
|
|
148
|
+
|
|
149
|
+
Computes orientation-averaged scattering properties by running multiple
|
|
150
|
+
single-orientation simulations and averaging the results. Supports both
|
|
151
|
+
random and systematic orientation sampling schemes. Results include
|
|
152
|
+
Mueller matrices, cross-sections, and derived optical parameters.
|
|
153
|
+
|
|
154
|
+
# Examples
|
|
155
|
+
```python
|
|
156
|
+
import goad_py as goad
|
|
157
|
+
|
|
158
|
+
# Create orientation scheme and settings
|
|
159
|
+
orientations = goad.create_uniform_orientation(100)
|
|
160
|
+
settings = goad.Settings("particle.obj", orientation=orientations)
|
|
161
|
+
|
|
162
|
+
# Run multi-orientation simulation
|
|
163
|
+
mp = goad.MultiProblem(settings)
|
|
164
|
+
mp.py_solve()
|
|
165
|
+
|
|
166
|
+
# Access averaged results
|
|
167
|
+
results = mp.results
|
|
168
|
+
print(f"Scattering cross-section: {results.scat_cross}")
|
|
169
|
+
```
|
|
170
|
+
"""
|
|
171
|
+
@property
|
|
172
|
+
def results(self) -> Results:
|
|
173
|
+
r"""
|
|
174
|
+
Access the orientation-averaged simulation results.
|
|
175
|
+
|
|
176
|
+
Returns the complete Results object containing Mueller matrices,
|
|
177
|
+
amplitude matrices, power distributions, and derived parameters
|
|
178
|
+
averaged over all orientations.
|
|
179
|
+
|
|
180
|
+
# Returns
|
|
181
|
+
Results - Complete scattering simulation results
|
|
182
|
+
"""
|
|
183
|
+
@property
|
|
184
|
+
def num_orientations(self) -> builtins.int:
|
|
185
|
+
r"""
|
|
186
|
+
Get the number of orientations
|
|
187
|
+
"""
|
|
188
|
+
def __new__(cls, settings: Settings, geoms: typing.Optional[typing.Sequence[Geom]] = None) -> MultiProblem: ...
|
|
189
|
+
def solve(self) -> None:
|
|
190
|
+
r"""
|
|
191
|
+
Solve the multi-orientation scattering problem.
|
|
192
|
+
|
|
193
|
+
Computes scattering properties averaged over all orientations using
|
|
194
|
+
parallel processing. The Global Interpreter Lock (GIL) is released
|
|
195
|
+
during computation to allow concurrent Python operations.
|
|
196
|
+
|
|
197
|
+
# Returns
|
|
198
|
+
PyResult<()> - Success or error if computation fails
|
|
199
|
+
"""
|
|
200
|
+
def save(self, directory: typing.Optional[builtins.str] = None) -> None:
|
|
201
|
+
r"""
|
|
202
|
+
Save simulation results to disk.
|
|
203
|
+
|
|
204
|
+
Writes Mueller matrices, parameters, and other output files to the
|
|
205
|
+
specified directory (or the directory configured in settings).
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
directory: Optional output directory path. If not provided, uses
|
|
209
|
+
the directory from settings.
|
|
210
|
+
"""
|
|
211
|
+
def py_reset(self) -> None:
|
|
212
|
+
r"""
|
|
213
|
+
Reset the multiproblem to initial state
|
|
214
|
+
"""
|
|
215
|
+
def py_regenerate_orientations(self) -> None:
|
|
216
|
+
r"""
|
|
217
|
+
Regenerate orientations (useful for random schemes)
|
|
218
|
+
"""
|
|
219
|
+
|
|
220
|
+
@typing.final
|
|
221
|
+
class Orientation:
|
|
222
|
+
@property
|
|
223
|
+
def scheme(self) -> Scheme: ...
|
|
224
|
+
@scheme.setter
|
|
225
|
+
def scheme(self, value: Scheme) -> None: ...
|
|
226
|
+
@property
|
|
227
|
+
def euler_convention(self) -> EulerConvention: ...
|
|
228
|
+
@euler_convention.setter
|
|
229
|
+
def euler_convention(self, value: EulerConvention) -> None: ...
|
|
230
|
+
@staticmethod
|
|
231
|
+
def uniform(num_orients: builtins.int, euler_convention: typing.Optional[EulerConvention] = None) -> Orientation: ...
|
|
232
|
+
@staticmethod
|
|
233
|
+
def discrete(eulers: typing.Sequence[Euler], euler_convention: typing.Optional[EulerConvention] = None) -> Orientation: ...
|
|
234
|
+
def __repr__(self) -> builtins.str: ...
|
|
235
|
+
|
|
236
|
+
@typing.final
|
|
237
|
+
class Problem:
|
|
238
|
+
r"""
|
|
239
|
+
A solvable physics problem.
|
|
240
|
+
"""
|
|
241
|
+
@property
|
|
242
|
+
def settings(self) -> Settings:
|
|
243
|
+
r"""
|
|
244
|
+
Getter function for the problem settings
|
|
245
|
+
"""
|
|
246
|
+
@settings.setter
|
|
247
|
+
def settings(self, value: Settings) -> None:
|
|
248
|
+
r"""
|
|
249
|
+
Setter function for the problem settings
|
|
250
|
+
"""
|
|
251
|
+
@property
|
|
252
|
+
def geom(self) -> Geom:
|
|
253
|
+
r"""
|
|
254
|
+
Getter function for the geometry
|
|
255
|
+
"""
|
|
256
|
+
@property
|
|
257
|
+
def results(self) -> Results:
|
|
258
|
+
r"""
|
|
259
|
+
Get the results object
|
|
260
|
+
"""
|
|
261
|
+
def __new__(cls, settings: typing.Optional[Settings] = None, geom: typing.Optional[Geom] = None) -> Problem: ...
|
|
262
|
+
def py_solve(self) -> None: ...
|
|
263
|
+
def py_print_stats(self) -> None: ...
|
|
264
|
+
|
|
265
|
+
@typing.final
|
|
266
|
+
class Results:
|
|
267
|
+
r"""
|
|
268
|
+
Complete results from a GOAD light scattering simulation.
|
|
269
|
+
|
|
270
|
+
Contains all computed scattering data including Mueller matrices,
|
|
271
|
+
amplitude matrices, power distributions, and derived parameters.
|
|
272
|
+
Supports both 2D angular distributions and 1D integrated results.
|
|
273
|
+
"""
|
|
274
|
+
...
|
|
275
|
+
|
|
276
|
+
@typing.final
|
|
277
|
+
class Settings:
|
|
278
|
+
r"""
|
|
279
|
+
Runtime configuration for the application.
|
|
280
|
+
"""
|
|
281
|
+
@property
|
|
282
|
+
def eulers(self) -> builtins.list[builtins.float]:
|
|
283
|
+
r"""
|
|
284
|
+
Get the euler angle, assuming the orientation scheme is discrete
|
|
285
|
+
"""
|
|
286
|
+
@eulers.setter
|
|
287
|
+
def eulers(self, value: builtins.list[builtins.float]) -> None:
|
|
288
|
+
r"""
|
|
289
|
+
Set the euler angles
|
|
290
|
+
"""
|
|
291
|
+
@property
|
|
292
|
+
def orientation(self) -> Orientation:
|
|
293
|
+
r"""
|
|
294
|
+
Get the full orientation object
|
|
295
|
+
"""
|
|
296
|
+
@orientation.setter
|
|
297
|
+
def orientation(self, value: Orientation) -> None:
|
|
298
|
+
r"""
|
|
299
|
+
Set the full orientation object
|
|
300
|
+
"""
|
|
301
|
+
@property
|
|
302
|
+
def geom_path(self) -> builtins.str:
|
|
303
|
+
r"""
|
|
304
|
+
Get the geometry file path
|
|
305
|
+
"""
|
|
306
|
+
@geom_path.setter
|
|
307
|
+
def geom_path(self, value: builtins.str) -> None:
|
|
308
|
+
r"""
|
|
309
|
+
Set the geometry file path
|
|
310
|
+
"""
|
|
311
|
+
@property
|
|
312
|
+
def wavelength(self) -> builtins.float:
|
|
313
|
+
r"""
|
|
314
|
+
Get the wavelength
|
|
315
|
+
"""
|
|
316
|
+
@wavelength.setter
|
|
317
|
+
def wavelength(self, value: builtins.float) -> None:
|
|
318
|
+
r"""
|
|
319
|
+
Set the wavelength
|
|
320
|
+
"""
|
|
321
|
+
@property
|
|
322
|
+
def particle_refr_index_re(self) -> builtins.float:
|
|
323
|
+
r"""
|
|
324
|
+
Get the particle refractive index (real part)
|
|
325
|
+
"""
|
|
326
|
+
@particle_refr_index_re.setter
|
|
327
|
+
def particle_refr_index_re(self, value: builtins.float) -> None:
|
|
328
|
+
r"""
|
|
329
|
+
Set the particle refractive index (real part)
|
|
330
|
+
"""
|
|
331
|
+
@property
|
|
332
|
+
def particle_refr_index_im(self) -> builtins.float:
|
|
333
|
+
r"""
|
|
334
|
+
Get the particle refractive index (imaginary part)
|
|
335
|
+
"""
|
|
336
|
+
@particle_refr_index_im.setter
|
|
337
|
+
def particle_refr_index_im(self, value: builtins.float) -> None:
|
|
338
|
+
r"""
|
|
339
|
+
Set the particle refractive index (imaginary part)
|
|
340
|
+
"""
|
|
341
|
+
@property
|
|
342
|
+
def medium_refr_index_re(self) -> builtins.float:
|
|
343
|
+
r"""
|
|
344
|
+
Get the medium refractive index (real part)
|
|
345
|
+
"""
|
|
346
|
+
@medium_refr_index_re.setter
|
|
347
|
+
def medium_refr_index_re(self, value: builtins.float) -> None:
|
|
348
|
+
r"""
|
|
349
|
+
Set the medium refractive index (real part)
|
|
350
|
+
"""
|
|
351
|
+
@property
|
|
352
|
+
def medium_refr_index_im(self) -> builtins.float:
|
|
353
|
+
r"""
|
|
354
|
+
Get the medium refractive index (imaginary part)
|
|
355
|
+
"""
|
|
356
|
+
@medium_refr_index_im.setter
|
|
357
|
+
def medium_refr_index_im(self, value: builtins.float) -> None:
|
|
358
|
+
r"""
|
|
359
|
+
Set the medium refractive index (imaginary part)
|
|
360
|
+
"""
|
|
361
|
+
@property
|
|
362
|
+
def beam_power_threshold(self) -> builtins.float:
|
|
363
|
+
r"""
|
|
364
|
+
Get the beam power threshold
|
|
365
|
+
"""
|
|
366
|
+
@beam_power_threshold.setter
|
|
367
|
+
def beam_power_threshold(self, value: builtins.float) -> None:
|
|
368
|
+
r"""
|
|
369
|
+
Set the beam power threshold
|
|
370
|
+
"""
|
|
371
|
+
@property
|
|
372
|
+
def cutoff(self) -> builtins.float:
|
|
373
|
+
r"""
|
|
374
|
+
Get the cutoff
|
|
375
|
+
"""
|
|
376
|
+
@cutoff.setter
|
|
377
|
+
def cutoff(self, value: builtins.float) -> None:
|
|
378
|
+
r"""
|
|
379
|
+
Set the cutoff
|
|
380
|
+
"""
|
|
381
|
+
@property
|
|
382
|
+
def max_rec(self) -> builtins.int:
|
|
383
|
+
r"""
|
|
384
|
+
Get the max recursion depth
|
|
385
|
+
"""
|
|
386
|
+
@max_rec.setter
|
|
387
|
+
def max_rec(self, value: builtins.int) -> None:
|
|
388
|
+
r"""
|
|
389
|
+
Set the max recursion depth
|
|
390
|
+
"""
|
|
391
|
+
@property
|
|
392
|
+
def max_tir(self) -> builtins.int:
|
|
393
|
+
r"""
|
|
394
|
+
Get the max TIR bounces
|
|
395
|
+
"""
|
|
396
|
+
@max_tir.setter
|
|
397
|
+
def max_tir(self, value: builtins.int) -> None:
|
|
398
|
+
r"""
|
|
399
|
+
Set the max TIR bounces
|
|
400
|
+
"""
|
|
401
|
+
@property
|
|
402
|
+
def zones(self) -> builtins.list[ZoneConfig]:
|
|
403
|
+
r"""
|
|
404
|
+
Get the zones configuration
|
|
405
|
+
"""
|
|
406
|
+
@zones.setter
|
|
407
|
+
def zones(self, value: builtins.list[ZoneConfig]) -> None:
|
|
408
|
+
r"""
|
|
409
|
+
Set the zones configuration
|
|
410
|
+
"""
|
|
411
|
+
@property
|
|
412
|
+
def geom_scale(self) -> typing.Optional[builtins.list[builtins.float]]:
|
|
413
|
+
r"""
|
|
414
|
+
Get the per-axis geometry scaling [x, y, z]
|
|
415
|
+
"""
|
|
416
|
+
@geom_scale.setter
|
|
417
|
+
def geom_scale(self, value: typing.Optional[builtins.list[builtins.float]]) -> None:
|
|
418
|
+
r"""
|
|
419
|
+
Set the per-axis geometry scaling [x, y, z]
|
|
420
|
+
"""
|
|
421
|
+
@property
|
|
422
|
+
def seed(self) -> typing.Optional[builtins.int]:
|
|
423
|
+
r"""
|
|
424
|
+
Get the seed for random number generation
|
|
425
|
+
"""
|
|
426
|
+
@seed.setter
|
|
427
|
+
def seed(self, value: typing.Optional[builtins.int]) -> None:
|
|
428
|
+
r"""
|
|
429
|
+
Set the seed for random number generation
|
|
430
|
+
"""
|
|
431
|
+
@property
|
|
432
|
+
def distortion(self) -> typing.Optional[builtins.float]:
|
|
433
|
+
r"""
|
|
434
|
+
Get the distortion factor
|
|
435
|
+
"""
|
|
436
|
+
@distortion.setter
|
|
437
|
+
def distortion(self, value: typing.Optional[builtins.float]) -> None:
|
|
438
|
+
r"""
|
|
439
|
+
Set the distortion factor
|
|
440
|
+
"""
|
|
441
|
+
@property
|
|
442
|
+
def fov_factor(self) -> typing.Optional[builtins.float]:
|
|
443
|
+
r"""
|
|
444
|
+
Get the field of view factor
|
|
445
|
+
"""
|
|
446
|
+
@fov_factor.setter
|
|
447
|
+
def fov_factor(self, value: typing.Optional[builtins.float]) -> None:
|
|
448
|
+
r"""
|
|
449
|
+
Set the field of view factor
|
|
450
|
+
"""
|
|
451
|
+
@property
|
|
452
|
+
def quiet(self) -> builtins.bool:
|
|
453
|
+
r"""
|
|
454
|
+
Get quiet mode
|
|
455
|
+
"""
|
|
456
|
+
@quiet.setter
|
|
457
|
+
def quiet(self, value: builtins.bool) -> None:
|
|
458
|
+
r"""
|
|
459
|
+
Set quiet mode (suppress progress bars)
|
|
460
|
+
"""
|
|
461
|
+
def __new__(cls, geom_path: builtins.str, wavelength: builtins.float = 0.5320000052452087, particle_refr_index_re: builtins.float = 1.309999942779541, particle_refr_index_im: builtins.float = 0.0, medium_refr_index_re: builtins.float = 1.0, medium_refr_index_im: builtins.float = 0.0, orientation: typing.Optional[Orientation] = None, zones: typing.Optional[typing.Sequence[ZoneConfig]] = None, beam_power_threshold: builtins.float = 0.004999999888241291, beam_area_threshold_fac: builtins.float = 0.10000000149011612, cutoff: builtins.float = 0.9900000095367432, max_rec: builtins.int = 10, max_tir: builtins.int = 10, scale: builtins.float = 1.0, distortion: typing.Optional[builtins.float] = None, directory: builtins.str = 'goad_run', mapping: Mapping = ..., coherence: builtins.bool = True, quiet: builtins.bool = False, seed: typing.Optional[builtins.int] = None) -> Settings: ...
|
|
462
|
+
|
|
463
|
+
@typing.final
|
|
464
|
+
class Shape:
|
|
465
|
+
r"""
|
|
466
|
+
Represents a 3D surface mesh.
|
|
467
|
+
"""
|
|
468
|
+
def __new__(cls, vertices: typing.Sequence[tuple[builtins.float, builtins.float, builtins.float]], face_indices: typing.Sequence[typing.Sequence[builtins.int]], id: builtins.int, refr_index_re: builtins.float, refr_index_im: builtins.float) -> Shape: ...
|
|
469
|
+
|
|
470
|
+
@typing.final
|
|
471
|
+
class Zone:
|
|
472
|
+
r"""
|
|
473
|
+
A zone represents a region of the scattering sphere with its own binning,
|
|
474
|
+
results, and computed parameters.
|
|
475
|
+
"""
|
|
476
|
+
@property
|
|
477
|
+
def label(self) -> typing.Optional[builtins.str]:
|
|
478
|
+
r"""
|
|
479
|
+
Get the zone label
|
|
480
|
+
"""
|
|
481
|
+
@property
|
|
482
|
+
def zone_type(self) -> ZoneType:
|
|
483
|
+
r"""
|
|
484
|
+
Get the zone type
|
|
485
|
+
"""
|
|
486
|
+
@property
|
|
487
|
+
def name(self) -> builtins.str:
|
|
488
|
+
r"""
|
|
489
|
+
Get the display name for this zone
|
|
490
|
+
"""
|
|
491
|
+
@property
|
|
492
|
+
def num_bins(self) -> builtins.int:
|
|
493
|
+
r"""
|
|
494
|
+
Get the number of bins in this zone
|
|
495
|
+
"""
|
|
496
|
+
@property
|
|
497
|
+
def bins(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
498
|
+
r"""
|
|
499
|
+
Get the bins as a numpy array of shape (n_bins, 2) with columns [theta, phi]
|
|
500
|
+
"""
|
|
501
|
+
@property
|
|
502
|
+
def mueller(self) -> numpy.typing.NDArray[numpy.float32]:
|
|
503
|
+
r"""
|
|
504
|
+
Get the Mueller matrix as a numpy array of shape (n_bins, 16)
|
|
505
|
+
"""
|
|
506
|
+
@property
|
|
507
|
+
def mueller_1d(self) -> typing.Optional[numpy.typing.NDArray[numpy.float32]]:
|
|
508
|
+
r"""
|
|
509
|
+
Get the 1D Mueller matrix as a numpy array (if available)
|
|
510
|
+
"""
|
|
511
|
+
@property
|
|
512
|
+
def bins_1d(self) -> typing.Optional[numpy.typing.NDArray[numpy.float32]]:
|
|
513
|
+
r"""
|
|
514
|
+
Get the 1D theta bins as a numpy array (if available)
|
|
515
|
+
"""
|
|
516
|
+
@property
|
|
517
|
+
def params(self) -> typing.Any:
|
|
518
|
+
r"""
|
|
519
|
+
Get zone-specific parameters as a dict
|
|
520
|
+
"""
|
|
521
|
+
def __repr__(self) -> builtins.str: ...
|
|
522
|
+
|
|
523
|
+
@typing.final
|
|
524
|
+
class ZoneConfig:
|
|
525
|
+
r"""
|
|
526
|
+
Configuration for a zone, as specified in TOML or via CLI.
|
|
527
|
+
"""
|
|
528
|
+
@property
|
|
529
|
+
def label(self) -> typing.Optional[builtins.str]:
|
|
530
|
+
r"""
|
|
531
|
+
Get the zone label
|
|
532
|
+
"""
|
|
533
|
+
@label.setter
|
|
534
|
+
def label(self, value: typing.Optional[builtins.str]) -> None:
|
|
535
|
+
r"""
|
|
536
|
+
Set the zone label
|
|
537
|
+
"""
|
|
538
|
+
@property
|
|
539
|
+
def binning(self) -> BinningScheme:
|
|
540
|
+
r"""
|
|
541
|
+
Get the binning scheme
|
|
542
|
+
"""
|
|
543
|
+
@binning.setter
|
|
544
|
+
def binning(self, value: BinningScheme) -> None:
|
|
545
|
+
r"""
|
|
546
|
+
Set the binning scheme
|
|
547
|
+
"""
|
|
548
|
+
def __new__(cls, binning: BinningScheme, label: typing.Optional[builtins.str] = None) -> ZoneConfig:
|
|
549
|
+
r"""
|
|
550
|
+
Create a new zone configuration.
|
|
551
|
+
|
|
552
|
+
Args:
|
|
553
|
+
binning: The binning scheme for this zone
|
|
554
|
+
label: Optional label for the zone
|
|
555
|
+
"""
|
|
556
|
+
def __repr__(self) -> builtins.str: ...
|
|
557
|
+
|
|
558
|
+
@typing.final
|
|
559
|
+
class Zones:
|
|
560
|
+
r"""
|
|
561
|
+
A collection of zones for a simulation.
|
|
562
|
+
"""
|
|
563
|
+
@property
|
|
564
|
+
def full(self) -> typing.Optional[Zone]:
|
|
565
|
+
r"""
|
|
566
|
+
Get the full zone (convenience method)
|
|
567
|
+
"""
|
|
568
|
+
@property
|
|
569
|
+
def forward(self) -> typing.Optional[Zone]:
|
|
570
|
+
r"""
|
|
571
|
+
Get the forward zone (convenience method)
|
|
572
|
+
"""
|
|
573
|
+
@property
|
|
574
|
+
def backward(self) -> typing.Optional[Zone]:
|
|
575
|
+
r"""
|
|
576
|
+
Get the backward zone (convenience method)
|
|
577
|
+
"""
|
|
578
|
+
@property
|
|
579
|
+
def all_zones(self) -> builtins.list[Zone]:
|
|
580
|
+
r"""
|
|
581
|
+
Get all zones as a list
|
|
582
|
+
"""
|
|
583
|
+
def __len__(self) -> builtins.int:
|
|
584
|
+
r"""
|
|
585
|
+
Get the number of zones
|
|
586
|
+
"""
|
|
587
|
+
def __getitem__(self, index: builtins.int) -> Zone:
|
|
588
|
+
r"""
|
|
589
|
+
Get a zone by index
|
|
590
|
+
"""
|
|
591
|
+
def get(self, label: builtins.str) -> typing.Optional[Zone]:
|
|
592
|
+
r"""
|
|
593
|
+
Get a zone by label
|
|
594
|
+
"""
|
|
595
|
+
def get_by_type(self, zone_type: ZoneType) -> typing.Optional[Zone]:
|
|
596
|
+
r"""
|
|
597
|
+
Get a zone by type (returns first matching zone)
|
|
598
|
+
"""
|
|
599
|
+
def __repr__(self) -> builtins.str: ...
|
|
600
|
+
def __iter__(self) -> ZonesIterator: ...
|
|
601
|
+
|
|
602
|
+
@typing.final
|
|
603
|
+
class ZonesIterator:
|
|
604
|
+
r"""
|
|
605
|
+
Iterator for Zones in Python
|
|
606
|
+
"""
|
|
607
|
+
def __iter__(self) -> ZonesIterator: ...
|
|
608
|
+
def __next__(self) -> typing.Optional[Zone]: ...
|
|
609
|
+
|
|
610
|
+
@typing.final
|
|
611
|
+
class EulerConvention(enum.Enum):
|
|
612
|
+
r"""
|
|
613
|
+
Euler angle order for the discrete orientation scheme.
|
|
614
|
+
"""
|
|
615
|
+
XZX = ...
|
|
616
|
+
XYX = ...
|
|
617
|
+
YXY = ...
|
|
618
|
+
YZY = ...
|
|
619
|
+
ZYZ = ...
|
|
620
|
+
ZXZ = ...
|
|
621
|
+
XZY = ...
|
|
622
|
+
XYZ = ...
|
|
623
|
+
YXZ = ...
|
|
624
|
+
YZX = ...
|
|
625
|
+
ZYX = ...
|
|
626
|
+
ZXY = ...
|
|
627
|
+
|
|
628
|
+
@typing.final
|
|
629
|
+
class Mapping(enum.Enum):
|
|
630
|
+
r"""
|
|
631
|
+
Enum representing different mapping methods from near to far field.
|
|
632
|
+
"""
|
|
633
|
+
GeometricOptics = ...
|
|
634
|
+
ApertureDiffraction = ...
|
|
635
|
+
|
|
636
|
+
@typing.final
|
|
637
|
+
class Param(enum.Enum):
|
|
638
|
+
Asymmetry = ...
|
|
639
|
+
Albedo = ...
|
|
640
|
+
ScatCross = ...
|
|
641
|
+
ExtCross = ...
|
|
642
|
+
BackscatterCross = ...
|
|
643
|
+
LidarRatio = ...
|
|
644
|
+
DepolarizationRatio = ...
|
|
645
|
+
BackscatterS11S22 = ...
|
|
646
|
+
ExtCrossOpticalTheorem = ...
|
|
647
|
+
|
|
648
|
+
@typing.final
|
|
649
|
+
class Scheme(enum.Enum):
|
|
650
|
+
Uniform = ...
|
|
651
|
+
r"""
|
|
652
|
+
Solve the problem by averaging over a uniform distribution of angles.
|
|
653
|
+
Example: `uniform 100`
|
|
654
|
+
"""
|
|
655
|
+
Discrete = ...
|
|
656
|
+
r"""
|
|
657
|
+
Solve the problem by averaging over a discrete set of angles (in degrees).
|
|
658
|
+
Example: `discrete 0,0,0 20,30,40`
|
|
659
|
+
"""
|
|
660
|
+
|
|
661
|
+
@typing.final
|
|
662
|
+
class ZoneType(enum.Enum):
|
|
663
|
+
r"""
|
|
664
|
+
The type of zone, which determines what parameters can be computed.
|
|
665
|
+
"""
|
|
666
|
+
Full = ...
|
|
667
|
+
r"""
|
|
668
|
+
Full 0-180 degree theta coverage. Computes: asymmetry, scattering cross-section.
|
|
669
|
+
"""
|
|
670
|
+
Forward = ...
|
|
671
|
+
r"""
|
|
672
|
+
Forward scattering zone. Computes: extinction cross-section (optical theorem).
|
|
673
|
+
"""
|
|
674
|
+
Backward = ...
|
|
675
|
+
r"""
|
|
676
|
+
Backscatter zone. Computes: lidar ratio, backscatter cross-section.
|
|
677
|
+
"""
|
|
678
|
+
Custom = ...
|
|
679
|
+
r"""
|
|
680
|
+
Custom angular range. Parameters depend on coverage.
|
|
681
|
+
"""
|
|
682
|
+
|
|
683
|
+
def create_discrete_orientation(eulers: typing.Sequence[Euler], euler_convention: typing.Optional[EulerConvention] = None) -> Orientation:
|
|
684
|
+
r"""
|
|
685
|
+
Create an Orientation with discrete scheme and default convention
|
|
686
|
+
"""
|
|
687
|
+
|
|
688
|
+
def create_uniform_orientation(num_orients: builtins.int, euler_convention: typing.Optional[EulerConvention] = None) -> Orientation:
|
|
689
|
+
r"""
|
|
690
|
+
Create an Orientation with uniform scheme and default convention
|
|
691
|
+
"""
|
|
692
|
+
|
|
693
|
+
def discrete_orientation(eulers: typing.Sequence[Euler]) -> Scheme:
|
|
694
|
+
r"""
|
|
695
|
+
Create a discrete orientation scheme from a list of Euler angles
|
|
696
|
+
"""
|
|
697
|
+
|
|
698
|
+
def sum_as_string(a: builtins.int, b: builtins.int) -> builtins.str:
|
|
699
|
+
r"""
|
|
700
|
+
Formats the sum of two numbers as string.
|
|
701
|
+
"""
|
|
702
|
+
|
|
703
|
+
def uniform_orientation(num_orients: builtins.int) -> Scheme:
|
|
704
|
+
r"""
|
|
705
|
+
Create a uniform orientation scheme with specified number of orientations
|
|
706
|
+
"""
|
|
707
|
+
|