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 ADDED
@@ -0,0 +1 @@
1
+ from ._goad import *
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
+