lsurf 1.0.0__py3-none-any.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.
- lsurf/__init__.py +471 -0
- lsurf/analysis/__init__.py +107 -0
- lsurf/analysis/healpix_utils.py +418 -0
- lsurf/analysis/sphere_viz.py +1280 -0
- lsurf/cli/__init__.py +48 -0
- lsurf/cli/build.py +398 -0
- lsurf/cli/config_schema.py +318 -0
- lsurf/cli/gui_cmd.py +76 -0
- lsurf/cli/interactive.py +850 -0
- lsurf/cli/main.py +81 -0
- lsurf/cli/run.py +806 -0
- lsurf/detectors/__init__.py +266 -0
- lsurf/detectors/analysis.py +289 -0
- lsurf/detectors/base.py +284 -0
- lsurf/detectors/constant_size_rings.py +485 -0
- lsurf/detectors/directional.py +45 -0
- lsurf/detectors/extended/__init__.py +73 -0
- lsurf/detectors/extended/local_sphere.py +353 -0
- lsurf/detectors/extended/recording_sphere.py +368 -0
- lsurf/detectors/planar.py +45 -0
- lsurf/detectors/protocol.py +187 -0
- lsurf/detectors/recording_spheres.py +63 -0
- lsurf/detectors/results.py +1140 -0
- lsurf/detectors/small/__init__.py +79 -0
- lsurf/detectors/small/directional.py +330 -0
- lsurf/detectors/small/planar.py +401 -0
- lsurf/detectors/small/spherical.py +450 -0
- lsurf/detectors/spherical.py +45 -0
- lsurf/geometry/__init__.py +199 -0
- lsurf/geometry/builder.py +478 -0
- lsurf/geometry/cell.py +228 -0
- lsurf/geometry/cell_geometry.py +247 -0
- lsurf/geometry/detector_arrays.py +1785 -0
- lsurf/geometry/geometry.py +222 -0
- lsurf/geometry/surface_analysis.py +375 -0
- lsurf/geometry/validation.py +91 -0
- lsurf/gui/__init__.py +51 -0
- lsurf/gui/app.py +903 -0
- lsurf/gui/core/__init__.py +39 -0
- lsurf/gui/core/scene.py +343 -0
- lsurf/gui/core/simulation.py +264 -0
- lsurf/gui/renderers/__init__.py +40 -0
- lsurf/gui/renderers/ray_renderer.py +353 -0
- lsurf/gui/renderers/source_renderer.py +505 -0
- lsurf/gui/renderers/surface_renderer.py +477 -0
- lsurf/gui/views/__init__.py +48 -0
- lsurf/gui/views/config_editor.py +3199 -0
- lsurf/gui/views/properties.py +257 -0
- lsurf/gui/views/results.py +291 -0
- lsurf/gui/views/scene_tree.py +180 -0
- lsurf/gui/views/viewport_3d.py +555 -0
- lsurf/gui/views/visualizations.py +712 -0
- lsurf/materials/__init__.py +169 -0
- lsurf/materials/base/__init__.py +64 -0
- lsurf/materials/base/full_inhomogeneous.py +208 -0
- lsurf/materials/base/grid_inhomogeneous.py +319 -0
- lsurf/materials/base/homogeneous.py +342 -0
- lsurf/materials/base/material_field.py +527 -0
- lsurf/materials/base/simple_inhomogeneous.py +418 -0
- lsurf/materials/base/spectral_inhomogeneous.py +497 -0
- lsurf/materials/implementations/__init__.py +120 -0
- lsurf/materials/implementations/data/alpha_values_typical_atmosphere_updated.txt +24 -0
- lsurf/materials/implementations/duct_atmosphere.py +390 -0
- lsurf/materials/implementations/exponential_atmosphere.py +435 -0
- lsurf/materials/implementations/gaussian_lens.py +120 -0
- lsurf/materials/implementations/interpolated_data.py +123 -0
- lsurf/materials/implementations/layered_atmosphere.py +134 -0
- lsurf/materials/implementations/linear_gradient.py +109 -0
- lsurf/materials/implementations/linsley_atmosphere.py +764 -0
- lsurf/materials/implementations/standard_materials.py +126 -0
- lsurf/materials/implementations/turbulent_atmosphere.py +135 -0
- lsurf/materials/implementations/us_standard_atmosphere.py +149 -0
- lsurf/materials/utils/__init__.py +77 -0
- lsurf/materials/utils/constants.py +45 -0
- lsurf/materials/utils/device_functions.py +117 -0
- lsurf/materials/utils/dispersion.py +160 -0
- lsurf/materials/utils/factories.py +142 -0
- lsurf/propagation/__init__.py +91 -0
- lsurf/propagation/detector_gpu.py +67 -0
- lsurf/propagation/gpu_device_rays.py +294 -0
- lsurf/propagation/kernels/__init__.py +175 -0
- lsurf/propagation/kernels/absorption/__init__.py +61 -0
- lsurf/propagation/kernels/absorption/grid.py +240 -0
- lsurf/propagation/kernels/absorption/simple.py +232 -0
- lsurf/propagation/kernels/absorption/spectral.py +410 -0
- lsurf/propagation/kernels/detection/__init__.py +64 -0
- lsurf/propagation/kernels/detection/protocol.py +102 -0
- lsurf/propagation/kernels/detection/spherical.py +255 -0
- lsurf/propagation/kernels/device_functions.py +790 -0
- lsurf/propagation/kernels/fresnel/__init__.py +64 -0
- lsurf/propagation/kernels/fresnel/protocol.py +97 -0
- lsurf/propagation/kernels/fresnel/standard.py +258 -0
- lsurf/propagation/kernels/intersection/__init__.py +79 -0
- lsurf/propagation/kernels/intersection/annular_plane.py +207 -0
- lsurf/propagation/kernels/intersection/bounded_plane.py +205 -0
- lsurf/propagation/kernels/intersection/plane.py +166 -0
- lsurf/propagation/kernels/intersection/protocol.py +95 -0
- lsurf/propagation/kernels/intersection/signed_distance.py +742 -0
- lsurf/propagation/kernels/intersection/sphere.py +190 -0
- lsurf/propagation/kernels/propagation/__init__.py +85 -0
- lsurf/propagation/kernels/propagation/grid.py +527 -0
- lsurf/propagation/kernels/propagation/protocol.py +105 -0
- lsurf/propagation/kernels/propagation/simple.py +460 -0
- lsurf/propagation/kernels/propagation/spectral.py +875 -0
- lsurf/propagation/kernels/registry.py +331 -0
- lsurf/propagation/kernels/surface/__init__.py +72 -0
- lsurf/propagation/kernels/surface/bisection.py +232 -0
- lsurf/propagation/kernels/surface/detection.py +402 -0
- lsurf/propagation/kernels/surface/reduction.py +166 -0
- lsurf/propagation/propagator_protocol.py +222 -0
- lsurf/propagation/propagators/__init__.py +101 -0
- lsurf/propagation/propagators/detector_handler.py +354 -0
- lsurf/propagation/propagators/factory.py +200 -0
- lsurf/propagation/propagators/fresnel_handler.py +305 -0
- lsurf/propagation/propagators/gpu_gradient.py +566 -0
- lsurf/propagation/propagators/gpu_surface_propagator.py +707 -0
- lsurf/propagation/propagators/gradient.py +429 -0
- lsurf/propagation/propagators/intersection_handler.py +327 -0
- lsurf/propagation/propagators/material_propagator.py +398 -0
- lsurf/propagation/propagators/signed_distance_handler.py +522 -0
- lsurf/propagation/propagators/spectral_gpu_gradient.py +553 -0
- lsurf/propagation/propagators/surface_interaction.py +616 -0
- lsurf/propagation/propagators/surface_propagator.py +719 -0
- lsurf/py.typed +1 -0
- lsurf/simulation/__init__.py +70 -0
- lsurf/simulation/config.py +164 -0
- lsurf/simulation/orchestrator.py +462 -0
- lsurf/simulation/result.py +299 -0
- lsurf/simulation/simulation.py +262 -0
- lsurf/sources/__init__.py +128 -0
- lsurf/sources/base.py +264 -0
- lsurf/sources/collimated.py +252 -0
- lsurf/sources/custom.py +409 -0
- lsurf/sources/diverging.py +228 -0
- lsurf/sources/gaussian.py +272 -0
- lsurf/sources/parallel_from_positions.py +197 -0
- lsurf/sources/point.py +172 -0
- lsurf/sources/uniform_diverging.py +258 -0
- lsurf/surfaces/__init__.py +184 -0
- lsurf/surfaces/cpu/__init__.py +50 -0
- lsurf/surfaces/cpu/curved_wave.py +463 -0
- lsurf/surfaces/cpu/gerstner_wave.py +381 -0
- lsurf/surfaces/cpu/wave_params.py +118 -0
- lsurf/surfaces/gpu/__init__.py +72 -0
- lsurf/surfaces/gpu/annular_plane.py +453 -0
- lsurf/surfaces/gpu/bounded_plane.py +390 -0
- lsurf/surfaces/gpu/curved_wave.py +483 -0
- lsurf/surfaces/gpu/gerstner_wave.py +377 -0
- lsurf/surfaces/gpu/multi_curved_wave.py +520 -0
- lsurf/surfaces/gpu/plane.py +299 -0
- lsurf/surfaces/gpu/recording_sphere.py +587 -0
- lsurf/surfaces/gpu/sphere.py +311 -0
- lsurf/surfaces/protocol.py +336 -0
- lsurf/surfaces/registry.py +373 -0
- lsurf/utilities/__init__.py +175 -0
- lsurf/utilities/detector_analysis.py +814 -0
- lsurf/utilities/fresnel.py +628 -0
- lsurf/utilities/interactions.py +1215 -0
- lsurf/utilities/propagation.py +602 -0
- lsurf/utilities/ray_data.py +532 -0
- lsurf/utilities/recording_sphere.py +745 -0
- lsurf/utilities/time_spread.py +463 -0
- lsurf/visualization/__init__.py +329 -0
- lsurf/visualization/absorption_plots.py +334 -0
- lsurf/visualization/atmospheric_plots.py +754 -0
- lsurf/visualization/common.py +348 -0
- lsurf/visualization/detector_plots.py +1350 -0
- lsurf/visualization/detector_sphere_plots.py +1173 -0
- lsurf/visualization/fresnel_plots.py +1061 -0
- lsurf/visualization/ocean_simulation_plots.py +999 -0
- lsurf/visualization/polarization_plots.py +916 -0
- lsurf/visualization/raytracing_plots.py +1521 -0
- lsurf/visualization/ring_detector_plots.py +1867 -0
- lsurf/visualization/time_spread_plots.py +531 -0
- lsurf-1.0.0.dist-info/METADATA +381 -0
- lsurf-1.0.0.dist-info/RECORD +180 -0
- lsurf-1.0.0.dist-info/WHEEL +5 -0
- lsurf-1.0.0.dist-info/entry_points.txt +2 -0
- lsurf-1.0.0.dist-info/licenses/LICENSE +32 -0
- lsurf-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# The Clear BSD License
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2026 Tobias Heibges
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted (subject to the limitations in the disclaimer
|
|
8
|
+
# below) provided that the following conditions are met:
|
|
9
|
+
#
|
|
10
|
+
# * Redistributions of source code must retain the above copyright notice,
|
|
11
|
+
# this list of conditions and the following disclaimer.
|
|
12
|
+
#
|
|
13
|
+
# * Redistributions in binary form must reproduce the above copyright
|
|
14
|
+
# notice, this list of conditions and the following disclaimer in the
|
|
15
|
+
# documentation and/or other materials provided with the distribution.
|
|
16
|
+
#
|
|
17
|
+
# * Neither the name of the copyright holder nor the names of its
|
|
18
|
+
# contributors may be used to endorse or promote products derived from this
|
|
19
|
+
# software without specific prior written permission.
|
|
20
|
+
#
|
|
21
|
+
# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
|
|
22
|
+
# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
23
|
+
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
24
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
25
|
+
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
26
|
+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
27
|
+
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
28
|
+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
29
|
+
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
|
30
|
+
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
31
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
32
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
33
|
+
|
|
34
|
+
"""Scene tree panel - displays hierarchical view of scene objects.
|
|
35
|
+
|
|
36
|
+
Shows surfaces, detectors, sources, and simulation results in a tree structure
|
|
37
|
+
with visibility toggles and selection.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from typing import TYPE_CHECKING
|
|
41
|
+
|
|
42
|
+
import dearpygui.dearpygui as dpg
|
|
43
|
+
|
|
44
|
+
if TYPE_CHECKING:
|
|
45
|
+
from ..core.scene import Scene, SceneObject
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class SceneTreePanel:
|
|
49
|
+
"""Tree view panel showing scene object hierarchy."""
|
|
50
|
+
|
|
51
|
+
def __init__(self, scene: "Scene") -> None:
|
|
52
|
+
self.scene = scene
|
|
53
|
+
self._window_tag: int | None = None
|
|
54
|
+
self._tree_tag: int | None = None
|
|
55
|
+
|
|
56
|
+
def create(self, parent: int | str) -> int:
|
|
57
|
+
"""Create the scene tree panel.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
parent: Parent container tag
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
The window tag
|
|
64
|
+
"""
|
|
65
|
+
self._window_tag = parent
|
|
66
|
+
|
|
67
|
+
dpg.add_text("Scene", color=(200, 200, 200), parent=parent)
|
|
68
|
+
dpg.add_separator(parent=parent)
|
|
69
|
+
|
|
70
|
+
# Tree container
|
|
71
|
+
with dpg.group(tag="scene_tree_container", parent=parent):
|
|
72
|
+
self._rebuild_tree()
|
|
73
|
+
|
|
74
|
+
# Register scene change callback
|
|
75
|
+
self.scene.on_change(self._rebuild_tree)
|
|
76
|
+
|
|
77
|
+
return self._window_tag
|
|
78
|
+
|
|
79
|
+
def _rebuild_tree(self) -> None:
|
|
80
|
+
"""Rebuild the tree structure from scene objects."""
|
|
81
|
+
container_tag = "scene_tree_container"
|
|
82
|
+
|
|
83
|
+
if not dpg.does_item_exist(container_tag):
|
|
84
|
+
return
|
|
85
|
+
|
|
86
|
+
# Clear existing tree
|
|
87
|
+
dpg.delete_item(container_tag, children_only=True)
|
|
88
|
+
|
|
89
|
+
# Group objects by type
|
|
90
|
+
from ..core.scene import ObjectType
|
|
91
|
+
|
|
92
|
+
type_labels = {
|
|
93
|
+
ObjectType.SURFACE: "Surfaces",
|
|
94
|
+
ObjectType.DETECTOR: "Detectors",
|
|
95
|
+
ObjectType.SOURCE: "Sources",
|
|
96
|
+
ObjectType.RAY_PATHS: "Ray Paths",
|
|
97
|
+
ObjectType.DETECTIONS: "Detections",
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
type_icons = {
|
|
101
|
+
ObjectType.SURFACE: "[S]",
|
|
102
|
+
ObjectType.DETECTOR: "[D]",
|
|
103
|
+
ObjectType.SOURCE: "[*]",
|
|
104
|
+
ObjectType.RAY_PATHS: "[~]",
|
|
105
|
+
ObjectType.DETECTIONS: "[.]",
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
for obj_type, label in type_labels.items():
|
|
109
|
+
objects = self.scene.get_objects_by_type(obj_type)
|
|
110
|
+
if not objects:
|
|
111
|
+
continue
|
|
112
|
+
|
|
113
|
+
# Create collapsible header for this type
|
|
114
|
+
with dpg.tree_node(
|
|
115
|
+
label=f"{label} ({len(objects)})",
|
|
116
|
+
default_open=True,
|
|
117
|
+
parent=container_tag,
|
|
118
|
+
):
|
|
119
|
+
for obj in objects:
|
|
120
|
+
self._create_object_row(obj, type_icons[obj_type])
|
|
121
|
+
|
|
122
|
+
# Show message if empty
|
|
123
|
+
if not self.scene.objects:
|
|
124
|
+
dpg.add_text(
|
|
125
|
+
"No objects",
|
|
126
|
+
color=(128, 128, 128),
|
|
127
|
+
parent=container_tag,
|
|
128
|
+
)
|
|
129
|
+
dpg.add_text(
|
|
130
|
+
"Load a config or",
|
|
131
|
+
color=(100, 100, 100),
|
|
132
|
+
parent=container_tag,
|
|
133
|
+
)
|
|
134
|
+
dpg.add_text(
|
|
135
|
+
"run a simulation",
|
|
136
|
+
color=(100, 100, 100),
|
|
137
|
+
parent=container_tag,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def _create_object_row(self, obj: "SceneObject", icon: str) -> None:
|
|
141
|
+
"""Create a row for a single object."""
|
|
142
|
+
|
|
143
|
+
with dpg.group(horizontal=True):
|
|
144
|
+
# Visibility checkbox
|
|
145
|
+
dpg.add_checkbox(
|
|
146
|
+
default_value=obj.visible,
|
|
147
|
+
callback=lambda s, a, u: self._on_visibility_toggle(u),
|
|
148
|
+
user_data=obj.name,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# Object name (clickable for selection)
|
|
152
|
+
color = (255, 255, 100) if obj.selected else (200, 200, 200)
|
|
153
|
+
dpg.add_text(
|
|
154
|
+
f"{icon} {obj.name}",
|
|
155
|
+
color=color,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# Make the text selectable
|
|
159
|
+
if dpg.get_item_children(dpg.last_item()):
|
|
160
|
+
pass # Text items don't have click handlers directly
|
|
161
|
+
|
|
162
|
+
# Add click handler by making it a selectable
|
|
163
|
+
dpg.add_selectable(
|
|
164
|
+
label=f" {obj.name}",
|
|
165
|
+
default_value=obj.selected,
|
|
166
|
+
callback=lambda s, a, u: self._on_object_select(u),
|
|
167
|
+
user_data=obj.name,
|
|
168
|
+
indent=20,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
def _on_visibility_toggle(self, name: str) -> None:
|
|
172
|
+
"""Handle visibility checkbox toggle."""
|
|
173
|
+
self.scene.toggle_visibility(name)
|
|
174
|
+
|
|
175
|
+
def _on_object_select(self, name: str) -> None:
|
|
176
|
+
"""Handle object selection."""
|
|
177
|
+
if self.scene.selected_object == name:
|
|
178
|
+
self.scene.select_object(None) # Deselect if already selected
|
|
179
|
+
else:
|
|
180
|
+
self.scene.select_object(name)
|