backscattermeter_analyzer 2.2.1__tar.gz → 3.0.0__tar.gz
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.
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/PKG-INFO +1 -1
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/pyproject.toml +14 -3
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/__init__.py +30 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/beam/__init__.py +9 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/beam/beam.py +266 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/beam/gaussian_model.py +66 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/beam/waist.py +109 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/characterize/angle/result.py +34 -16
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/characterize/distance/ratio.py +6 -4
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/characterize/distance/result.py +174 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/__init__.py +17 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/acquisition.py +37 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/bench.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/photodiode.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/yes.py +46 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/yes.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/structure.py +68 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/yes.py +36 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/yes.py +32 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/camera/yes.py +59 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/laser/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/yes.py +28 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/laser/structure.py +48 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/motor_path/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/motor_path/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/motor_path/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/motor_path/yes.py +28 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/yes.py +28 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/yes.py +28 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/photodiode.py +61 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/yes.py +34 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/representation.py +27 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/rotation/yes.py +19 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/acquisition/structure.py +113 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/__init__.py +9 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/analysis.py +27 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/model.py +66 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/yes.py +299 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/builder.py +174 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/known_rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/known_rotation/known.py +147 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/known_rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/known_rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/known_rotation/yes.py +72 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/representation.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_distance/__init__.py +1 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_distance/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_distance/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_distance/yes.py +18 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_split/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_split/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_split/split.py +166 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_split/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/step_split/yes.py +70 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/structure.py +74 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/visibility/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/visibility/model.py +72 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/visibility/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/visibility/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/analysis/visibility/yes.py +467 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/__init__.py +9 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/bench.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/photodiode.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/yes.py +25 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/yes.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/structure.py +33 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/builder.py +511 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/yes.py +17 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/yes.py +17 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/camera/yes.py +55 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/laser/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/yes.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/laser/structure.py +30 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/motor_path/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/motor_path/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/motor_path/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/motor_path/yes.py +49 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/yes.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/yes.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/photodiode.py +33 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/photodiodes/yes.py +31 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/protocol.py +20 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/representation.py +27 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/rotation/yes.py +19 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/protocol/structure.py +66 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/beam_propagation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/beam_propagation/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/beam_propagation/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/beam_propagation/waist.py +15 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/beam_propagation/yes.py +24 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/known_rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/known_rotation/known.py +25 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/known_rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/known_rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/known_rotation/yes.py +64 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/representation.py +23 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/result.py +19 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/step_split/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/step_split/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/step_split/split.py +40 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/step_split/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/step_split/yes.py +63 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/structure.py +41 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/visibility/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/visibility/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/visibility/photodiode.py +27 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/visibility/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/experiment/result/visibility/yes.py +52 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/hardware/__init__.py +4 -3
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/backscattermeter.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/camera/yes.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/representation.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/backscattermeter/structure.py +23 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/camera/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/camera/camera.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/camera/representation.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/camera/structure.py +17 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/motor/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/motor/motor.py +16 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/hardware/motor/path.py +22 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/motor/representation.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/motor/structure.py +17 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/optic/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/optic/optic.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/optic/representation.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/optic/structure.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/photodiode/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/photodiode/photodiode.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/photodiode/representation.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/hardware/photodiode/structure.py +16 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/__init__.py +0 -2
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/io/hdf5/distance/angle.py +190 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/distance/main.py +31 -6
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/distance/motor.py +1 -1
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/result.py +6 -5
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/interface/unified_read_write.py +4 -3
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/__init__.py +5 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/distance/angle/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/distance/angle/no.py +16 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/distance/angle/state.py +29 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/distance/angle/yes.py +24 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/distance/connect.py +42 -1
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/distance/distance.py +114 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/distance/state.py +60 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/measurement/angle/yes.py +74 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/measurement.py +16 -6
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/measurement/motor/yes.py +63 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/state.py +1 -4
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/__init__.py +9 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/collection.py +56 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/formula/__init__.py +9 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/formula/div.py +19 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/formula/formula.py +51 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/oriented_axis/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/oriented_axis/no.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/oriented_axis/state.py +21 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/oriented_axis/yes.py +22 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/ratio.py +43 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/ratio/state.py +53 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/__init__.py +7 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/distance/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/distance/no.py +13 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/distance/state.py +20 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/distance/yes.py +21 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/ratio/__init__.py +11 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/ratio/no.py +14 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/ratio/state.py +21 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/ratio/yes.py +23 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/result.py +32 -0
- backscattermeter_analyzer-3.0.0/src/backscattermeter_analyzer/utils/result/state.py +68 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/utils.py +131 -3
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/__init__.py +0 -25
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/characterize/distance/result.py +0 -127
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/hardware/backscattermeter.py +0 -8
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/hardware/camera/__init__.py +0 -13
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/hardware/motor/__init__.py +0 -11
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/hardware/optic/__init__.py +0 -13
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/utils/distance/distance.py +0 -35
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/utils/distance/state.py +0 -31
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/utils/measurement/angle/yes.py +0 -30
- backscattermeter_analyzer-2.2.1/src/backscattermeter_analyzer/utils/measurement/motor/yes.py +0 -21
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/LICENSE +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/README.md +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/display.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/justfile +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/mise.toml +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/axis.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/characterize/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/characterize/angle/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/characterize/distance/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/characterize/distance/vector.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/direction.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/base.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/base.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/registry/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/registry/already_defined.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/registry/ambiguous_format.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/registry/base.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/registry/identification.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/exception/io/registry/not_defined.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/hardware/motor/jump.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/hardware/motor/step_numbers.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/distance/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/measurement/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/measurement/main.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/measurement/motor.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/hdf5/utils.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/default.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/interface/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/interface/unified_read_write_method.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/unified_input_registry.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/unified_io_registry.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/unified_io_registry_base.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/io/registry/unified_output_registry.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/scale.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/distance/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/distance/motor/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/distance/motor/no.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/distance/motor/state.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/distance/motor/yes.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/angle/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/angle/no.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/angle/state.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/camera/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/camera/no.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/camera/state.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/camera/yes.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/connect.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/motor/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/motor/no.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/src/backscattermeter_analyzer/utils/measurement/motor/state.py +0 -0
- {backscattermeter_analyzer-2.2.1 → backscattermeter_analyzer-3.0.0}/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: backscattermeter_analyzer
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Tool to work on the backscattermeter at LAPP
|
|
5
5
|
Project-URL: Documentation, https://git.linarphy.net/linarphy/backscattermeter_analyzer/wiki
|
|
6
6
|
Project-URL: Homepage, https://git.linarphy.net/linarphy/backscattermeter_analyzer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "backscattermeter_analyzer"
|
|
3
|
-
version = "
|
|
3
|
+
version = "3.0.0"
|
|
4
4
|
description = "Tool to work on the backscattermeter at LAPP"
|
|
5
5
|
authors = [{ name = "linarphy", email = "linarphy@linarphy.net" }]
|
|
6
6
|
readme = "README.md"
|
|
@@ -129,10 +129,21 @@ indent-style = "space"
|
|
|
129
129
|
docstring-code-format = true
|
|
130
130
|
|
|
131
131
|
[tool.ty.src]
|
|
132
|
-
exclude = [
|
|
132
|
+
exclude = [
|
|
133
|
+
"tests/**/*.py",
|
|
134
|
+
"display.py",
|
|
135
|
+
"utils.py",
|
|
136
|
+
"src/backscattermeter_analyzer/beam/**/*.py",
|
|
137
|
+
"src/backscattermeter_analyzer/characterize/**/*.py",
|
|
138
|
+
"src/backscattermeter_analyzer/utils/distance/**/*.py",
|
|
139
|
+
"src/backscattermeter_analyzer/utils/measurement/**/*.py",
|
|
140
|
+
"src/backscattermeter_analyzer/utils/ratio/**/*.py",
|
|
141
|
+
"src/backscattermeter_analyzer/utils/result/**/*.py",
|
|
142
|
+
"src/backscattermeter_analyzer/io/hdf5/**/*.py",
|
|
143
|
+
]
|
|
133
144
|
|
|
134
145
|
|
|
135
146
|
[dependency-groups]
|
|
136
|
-
dev = ["ty>=0.0.
|
|
147
|
+
dev = ["ty>=0.0.83", "ruff>=0.16.8"]
|
|
137
148
|
stubs = ["mypy<=1.20.0"]
|
|
138
149
|
test = ["coverage>=7.14", "rich"]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Entry-point package."""
|
|
2
|
+
|
|
3
|
+
from .axis import Axis # noqa: I001
|
|
4
|
+
from .direction import Direction
|
|
5
|
+
|
|
6
|
+
from .experiment import (
|
|
7
|
+
Acquisition,
|
|
8
|
+
Analysis,
|
|
9
|
+
AnalysisBuilder,
|
|
10
|
+
Protocol,
|
|
11
|
+
ProtocolBuilder,
|
|
12
|
+
Result,
|
|
13
|
+
)
|
|
14
|
+
from .hardware import Backscattermeter, Camera, Motor, Optic, Photodiode
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"Acquisition",
|
|
18
|
+
"Analysis",
|
|
19
|
+
"AnalysisBuilder",
|
|
20
|
+
"Axis",
|
|
21
|
+
"Backscattermeter",
|
|
22
|
+
"Camera",
|
|
23
|
+
"Direction",
|
|
24
|
+
"Motor",
|
|
25
|
+
"Optic",
|
|
26
|
+
"Photodiode",
|
|
27
|
+
"Protocol",
|
|
28
|
+
"ProtocolBuilder",
|
|
29
|
+
"Result",
|
|
30
|
+
]
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"""Beam class."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import TYPE_CHECKING, NamedTuple
|
|
5
|
+
|
|
6
|
+
from astropy.modeling.fitting import TRFLSQFitter
|
|
7
|
+
from astropy.uncertainty import Distribution
|
|
8
|
+
from astropy.units import Quantity
|
|
9
|
+
from numpy import argmin, pi
|
|
10
|
+
from numpy.random import default_rng
|
|
11
|
+
|
|
12
|
+
from .gaussian_model import GaussianBeam
|
|
13
|
+
from .waist import Waist
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from collections.abc import Sequence
|
|
17
|
+
|
|
18
|
+
from gwpy.timeseries import TimeSeries
|
|
19
|
+
from numpy.random import Generator
|
|
20
|
+
|
|
21
|
+
from backscattermeter_analyzer import Measurement
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class GaussianBeamModels(NamedTuple):
|
|
25
|
+
"""Utils to share x and y models."""
|
|
26
|
+
|
|
27
|
+
x: GaussianBeam
|
|
28
|
+
y: GaussianBeam
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class MeasurementData(NamedTuple):
|
|
32
|
+
"""Utils to share measurements result."""
|
|
33
|
+
|
|
34
|
+
position: Distribution
|
|
35
|
+
radius_x: TimeSeries
|
|
36
|
+
radius_y: TimeSeries
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class FitSamples(NamedTuple):
|
|
40
|
+
"""Utils to share samples that will be used in fit."""
|
|
41
|
+
|
|
42
|
+
positions: Quantity
|
|
43
|
+
radii_x: Quantity
|
|
44
|
+
radii_y: Quantity
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _extract_measurement_data(
|
|
48
|
+
measurement: Measurement,
|
|
49
|
+
) -> MeasurementData:
|
|
50
|
+
"""Convert a Measurement into a simpler object for analysis."""
|
|
51
|
+
|
|
52
|
+
position = measurement.state.backscattermeter.state.camera.position
|
|
53
|
+
beam_radius = measurement.state.camera.beam_radius
|
|
54
|
+
|
|
55
|
+
if not position.is_on_suspended_bench():
|
|
56
|
+
message = (
|
|
57
|
+
"Camera position can only be known if the camera is on "
|
|
58
|
+
"the suspended bench."
|
|
59
|
+
)
|
|
60
|
+
raise ValueError(message)
|
|
61
|
+
if not measurement.state.camera.has_beam_radius():
|
|
62
|
+
message = (
|
|
63
|
+
"Cannot compute the waist of the beam from a "
|
|
64
|
+
"Measurement that do not contain any data on the beam "
|
|
65
|
+
"radius."
|
|
66
|
+
)
|
|
67
|
+
raise ValueError(message)
|
|
68
|
+
|
|
69
|
+
return MeasurementData(
|
|
70
|
+
position=position.distance_from_entrance,
|
|
71
|
+
radius_x=beam_radius.w_x,
|
|
72
|
+
radius_y=beam_radius.w_y,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _fit_initial_model(
|
|
77
|
+
positions: Sequence[Quantity],
|
|
78
|
+
radii: Sequence[Quantity],
|
|
79
|
+
wavelength: Quantity,
|
|
80
|
+
) -> GaussianBeam:
|
|
81
|
+
"""Find approximative values for future guesses on one axis."""
|
|
82
|
+
|
|
83
|
+
waist_index = int(argmin(radii))
|
|
84
|
+
|
|
85
|
+
radius_waist = radii[waist_index]
|
|
86
|
+
position_waist = positions[waist_index]
|
|
87
|
+
rayleigh_range = pi * radius_waist**2 / wavelength
|
|
88
|
+
|
|
89
|
+
return GaussianBeam( # type: ignore[ty:invalid-argument-type,ty:missing-argument]
|
|
90
|
+
position_waist=position_waist,
|
|
91
|
+
radius_waist=radius_waist,
|
|
92
|
+
rayleigh_range=rayleigh_range,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@staticmethod
|
|
97
|
+
def _fit_initial_models(
|
|
98
|
+
data: Sequence[MeasurementData], wavelength: Quantity
|
|
99
|
+
) -> GaussianBeamModels:
|
|
100
|
+
"""Find approximative values for future guesses."""
|
|
101
|
+
|
|
102
|
+
positions = [item.position.pdf_mean() for item in data]
|
|
103
|
+
radii_x = [item.radius_x.mean() for item in data]
|
|
104
|
+
radii_y = [item.radius_y.mean() for item in data]
|
|
105
|
+
|
|
106
|
+
return GaussianBeamModels(
|
|
107
|
+
x=_fit_initial_model(positions, radii_x, wavelength),
|
|
108
|
+
y=_fit_initial_model(positions, radii_y, wavelength),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@staticmethod
|
|
113
|
+
def _samples_data(
|
|
114
|
+
data: Sequence[MeasurementData],
|
|
115
|
+
n_samples: int,
|
|
116
|
+
random_generator: Generator,
|
|
117
|
+
) -> FitSamples:
|
|
118
|
+
"""
|
|
119
|
+
Define samples of measurements value.
|
|
120
|
+
|
|
121
|
+
n_samples fits will be done, with one position per measurement
|
|
122
|
+
and one radius per measurement. This means that a fit will use
|
|
123
|
+
len(measurements) positions and radius.
|
|
124
|
+
|
|
125
|
+
It keeps a link between w_x and w_y as they are identicaly
|
|
126
|
+
sampled. Meaning that we can keep the covariance data between
|
|
127
|
+
w_x and w_y.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
positions_samples_list: list[Quantity] = []
|
|
131
|
+
radii_x_samples_list: list[Quantity] = []
|
|
132
|
+
radii_y_samples_list: list[Quantity] = []
|
|
133
|
+
|
|
134
|
+
for measurement in data:
|
|
135
|
+
positions_indexes = random_generator.integers(
|
|
136
|
+
0, measurement.position.n_samples, size=n_samples
|
|
137
|
+
)
|
|
138
|
+
radii_indexes = random_generator.integers(
|
|
139
|
+
0, len(measurement.radius_x.value), size=n_samples
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
positions_samples_list.append(
|
|
143
|
+
measurement.position.distribution[positions_indexes]
|
|
144
|
+
)
|
|
145
|
+
radii_x_samples_list.append(
|
|
146
|
+
measurement.radius_x.value[radii_indexes]
|
|
147
|
+
)
|
|
148
|
+
radii_y_samples_list.append(
|
|
149
|
+
measurement.radius_y.value[radii_indexes]
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
return FitSamples(
|
|
153
|
+
positions=Quantity(positions_samples_list),
|
|
154
|
+
radii_x=Quantity(radii_x_samples_list),
|
|
155
|
+
radii_y=Quantity(radii_y_samples_list),
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _fit_samples(
|
|
160
|
+
models: GaussianBeamModels,
|
|
161
|
+
samples: FitSamples,
|
|
162
|
+
fitter: TRFLSQFitter,
|
|
163
|
+
n_samples: int,
|
|
164
|
+
wavelength: Quantity,
|
|
165
|
+
) -> Beam:
|
|
166
|
+
"""Fit the samples to get distribution of n_samples."""
|
|
167
|
+
|
|
168
|
+
fitted_positions_x_list: list[Quantity] = []
|
|
169
|
+
fitted_positions_y_list: list[Quantity] = []
|
|
170
|
+
fitted_radii_x_list: list[Quantity] = []
|
|
171
|
+
fitted_radii_y_list: list[Quantity] = []
|
|
172
|
+
|
|
173
|
+
for i in range(n_samples):
|
|
174
|
+
positions = samples.positions[:, i]
|
|
175
|
+
fitted_x = fitter(
|
|
176
|
+
models.x.copy(),
|
|
177
|
+
positions,
|
|
178
|
+
samples.radii_x[:, i],
|
|
179
|
+
)
|
|
180
|
+
fitted_y = fitter(
|
|
181
|
+
models.y.copy(), positions, samples.radii_y[:, i]
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
fitted_positions_x_list.append(fitted_x.position_waist)
|
|
185
|
+
fitted_positions_y_list.append(fitted_y.position_waist)
|
|
186
|
+
fitted_radii_x_list.append(fitted_x.radius_waist)
|
|
187
|
+
fitted_radii_y_list.append(fitted_y.radius_waist)
|
|
188
|
+
|
|
189
|
+
return Beam(
|
|
190
|
+
waist_x=Waist(
|
|
191
|
+
position=Distribution(fitted_positions_x_list),
|
|
192
|
+
radius=Distribution(fitted_radii_x_list),
|
|
193
|
+
),
|
|
194
|
+
waist_y=Waist(
|
|
195
|
+
position=Distribution(fitted_positions_y_list),
|
|
196
|
+
radius=Distribution(fitted_radii_y_list),
|
|
197
|
+
),
|
|
198
|
+
wavelength=wavelength,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@dataclass
|
|
203
|
+
class Beam:
|
|
204
|
+
"""Parameters of a 2D beam."""
|
|
205
|
+
|
|
206
|
+
waist_x: Waist
|
|
207
|
+
waist_y: Waist
|
|
208
|
+
wavelength: Quantity
|
|
209
|
+
|
|
210
|
+
@staticmethod
|
|
211
|
+
def compute(
|
|
212
|
+
measurements: Sequence[Measurement],
|
|
213
|
+
wavelength: Quantity,
|
|
214
|
+
n_samples: int = 1000,
|
|
215
|
+
random_generator: Generator | None = None,
|
|
216
|
+
) -> Beam:
|
|
217
|
+
"""
|
|
218
|
+
Compute a beam from multiple measurements.
|
|
219
|
+
|
|
220
|
+
Conserve the covariance between measurement of the beam radius
|
|
221
|
+
on the X axis and the beam radius on the Y one.
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
if len(measurements) < 3: # noqa: PLR2004
|
|
225
|
+
message = "At least three measurements are required."
|
|
226
|
+
raise ValueError(message)
|
|
227
|
+
|
|
228
|
+
if n_samples < 1:
|
|
229
|
+
message = "`n_samples` must be positive."
|
|
230
|
+
raise ValueError(message)
|
|
231
|
+
|
|
232
|
+
if random_generator is None:
|
|
233
|
+
random_generator = default_rng()
|
|
234
|
+
|
|
235
|
+
data = [
|
|
236
|
+
_extract_measurement_data(measurement)
|
|
237
|
+
for measurement in measurements
|
|
238
|
+
]
|
|
239
|
+
initial_models = _fit_initial_models(data, wavelength)
|
|
240
|
+
|
|
241
|
+
fitter = TRFLSQFitter()
|
|
242
|
+
|
|
243
|
+
positions = [datum.position.pdf_mean() for datum in data]
|
|
244
|
+
|
|
245
|
+
models = GaussianBeamModels(
|
|
246
|
+
x=fitter(
|
|
247
|
+
initial_models.x,
|
|
248
|
+
positions,
|
|
249
|
+
[datum.radius_x.mean() for datum in data],
|
|
250
|
+
),
|
|
251
|
+
y=fitter(
|
|
252
|
+
initial_models.y,
|
|
253
|
+
positions,
|
|
254
|
+
[datum.radius_y.mean() for datum in data],
|
|
255
|
+
),
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
samples = _samples_data(data, n_samples, random_generator)
|
|
259
|
+
|
|
260
|
+
return _fit_samples(
|
|
261
|
+
models,
|
|
262
|
+
samples,
|
|
263
|
+
fitter,
|
|
264
|
+
n_samples,
|
|
265
|
+
wavelength,
|
|
266
|
+
)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""GaussianBeam class."""
|
|
2
|
+
|
|
3
|
+
from astropy.modeling import Fittable1DModel, Parameter
|
|
4
|
+
from astropy.units import Quantity, Unit, m
|
|
5
|
+
from numpy import sqrt
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class GaussianBeam(Fittable1DModel):
|
|
9
|
+
"""1D Gaussian Beam model to fit with units."""
|
|
10
|
+
|
|
11
|
+
position_waist = Parameter(
|
|
12
|
+
description="Position of the beam waist", unit=m
|
|
13
|
+
)
|
|
14
|
+
radius_waist = Parameter(
|
|
15
|
+
description="Radius of the beam waist", unit=m, bounds=(0, None)
|
|
16
|
+
)
|
|
17
|
+
rayleigh_range = Parameter(
|
|
18
|
+
description="Rayleigh range", unit=m, bounds=(0, None)
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
@staticmethod
|
|
22
|
+
def evaluate(
|
|
23
|
+
position: Quantity,
|
|
24
|
+
position_waist: Quantity,
|
|
25
|
+
radius_waist: Quantity,
|
|
26
|
+
rayleigh_range: Quantity,
|
|
27
|
+
) -> Quantity: # type: ignore[ty:invalid-method-override]
|
|
28
|
+
"""Fit function."""
|
|
29
|
+
return radius_waist * sqrt(
|
|
30
|
+
1 + ((position - position_waist) / rayleigh_range) ** 2
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def input_units(self) -> dict[str, Unit]:
|
|
35
|
+
"""
|
|
36
|
+
Check input units.
|
|
37
|
+
|
|
38
|
+
See https://docs.astropy.org/en/stable/modeling/add-units.html.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
self.inputs[0]: self.position_waist.unit,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def return_units(self) -> dict[str, Unit]:
|
|
47
|
+
"""
|
|
48
|
+
Check output units.
|
|
49
|
+
|
|
50
|
+
See https://docs.astropy.org/en/stable/modeling/add-units.html.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
self.outputs[0]: self.radius_waist.unit,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
def _parameter_units_for_data_units(
|
|
58
|
+
self,
|
|
59
|
+
inputs_unit: dict[str, Unit],
|
|
60
|
+
outputs_unit: dict[str, Unit],
|
|
61
|
+
) -> dict[str, Unit]:
|
|
62
|
+
return {
|
|
63
|
+
"position_waist": inputs_unit[self.inputs[0]],
|
|
64
|
+
"radius_waist": outputs_unit[self.outputs[0]],
|
|
65
|
+
"rayleigh_range": inputs_unit[self.inputs[0]],
|
|
66
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""Waist class."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from astropy.modeling.fitting import TRFLSQFitter
|
|
7
|
+
from astropy.uncertainty import Distribution
|
|
8
|
+
from astropy.units import Quantity
|
|
9
|
+
from numpy import argmin, pi
|
|
10
|
+
from numpy.random import default_rng
|
|
11
|
+
|
|
12
|
+
from .gaussian_model import GaussianBeam
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from collections.abc import Sequence
|
|
16
|
+
|
|
17
|
+
from gwpy.timeseries import TimeSeries
|
|
18
|
+
from numpy.random import Generator
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class Waist:
|
|
23
|
+
"""A 1D waist."""
|
|
24
|
+
|
|
25
|
+
position: Distribution
|
|
26
|
+
radius: Distribution
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def compute(
|
|
30
|
+
measurements: Sequence[tuple[Distribution, TimeSeries]],
|
|
31
|
+
wavelength: Quantity,
|
|
32
|
+
n_samples: int = 1000,
|
|
33
|
+
random_generator: Generator | None = None,
|
|
34
|
+
) -> Waist:
|
|
35
|
+
"""Compute a waist from a sequence of position and radii."""
|
|
36
|
+
|
|
37
|
+
if random_generator is None:
|
|
38
|
+
random_generator = default_rng()
|
|
39
|
+
|
|
40
|
+
if len(measurements) < 3: # noqa: PLR2004
|
|
41
|
+
message = "At least three measurements are required."
|
|
42
|
+
raise ValueError(message)
|
|
43
|
+
|
|
44
|
+
positions_means = [
|
|
45
|
+
position.pdf_mean() for position, _ in measurements
|
|
46
|
+
]
|
|
47
|
+
radii_means = [radius.mean() for _, radius in measurements]
|
|
48
|
+
|
|
49
|
+
guess_waist_index = argmin(radii_means)
|
|
50
|
+
|
|
51
|
+
position_guess = positions_means[guess_waist_index]
|
|
52
|
+
radius_guess = radii_means[guess_waist_index]
|
|
53
|
+
|
|
54
|
+
rayleigh_range_guess = pi * radius_guess**2 / wavelength
|
|
55
|
+
|
|
56
|
+
initial_model = GaussianBeam( # type: ignore[ty:invalid-argument-type,ty:missing-argument]
|
|
57
|
+
position_waist=position_guess,
|
|
58
|
+
radius_waist=radius_guess,
|
|
59
|
+
rayleigh_range=rayleigh_range_guess,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
fitter = TRFLSQFitter()
|
|
63
|
+
|
|
64
|
+
base_model = fitter(
|
|
65
|
+
initial_model,
|
|
66
|
+
positions_means,
|
|
67
|
+
radii_means,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
positions_samples = Quantity(
|
|
71
|
+
[
|
|
72
|
+
position.distribution[
|
|
73
|
+
random_generator.integers(
|
|
74
|
+
0, position.n_samples, size=n_samples
|
|
75
|
+
)
|
|
76
|
+
]
|
|
77
|
+
for position, _ in measurements
|
|
78
|
+
]
|
|
79
|
+
)
|
|
80
|
+
radii_samples = Quantity(
|
|
81
|
+
[
|
|
82
|
+
radius.value[
|
|
83
|
+
random_generator.integers(
|
|
84
|
+
0, len(radius.value), size=n_samples
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
for _, radius in measurements
|
|
88
|
+
]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
fitted_positions: list[Quantity] = []
|
|
92
|
+
fitted_radii: list[Quantity] = []
|
|
93
|
+
for i in range(n_samples):
|
|
94
|
+
position = positions_samples[:, i]
|
|
95
|
+
radius = radii_samples[:, i]
|
|
96
|
+
|
|
97
|
+
model = fitter(
|
|
98
|
+
base_model.copy(),
|
|
99
|
+
position,
|
|
100
|
+
radius,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
fitted_positions.append(model.position_waist)
|
|
104
|
+
fitted_radii.append(model.radius_waist)
|
|
105
|
+
|
|
106
|
+
return Waist(
|
|
107
|
+
position=Distribution(fitted_positions),
|
|
108
|
+
radius=Distribution(fitted_radii),
|
|
109
|
+
)
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"""Result class."""
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
from dataclasses import dataclass
|
|
4
|
+
from itertools import product
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
|
-
from backscattermeter_analyzer import Direction, Distance
|
|
7
|
+
from backscattermeter_analyzer import Axis, Direction, Distance
|
|
8
|
+
from backscattermeter_analyzer.characterize.distance import (
|
|
9
|
+
Ratio,
|
|
10
|
+
)
|
|
8
11
|
from backscattermeter_analyzer.characterize.distance import (
|
|
9
12
|
Result as DistanceResult,
|
|
10
13
|
)
|
|
@@ -16,7 +19,7 @@ from backscattermeter_analyzer.utils.measurement.motor import (
|
|
|
16
19
|
)
|
|
17
20
|
|
|
18
21
|
if TYPE_CHECKING:
|
|
19
|
-
from backscattermeter_analyzer import
|
|
22
|
+
from backscattermeter_analyzer import Measurement
|
|
20
23
|
|
|
21
24
|
|
|
22
25
|
@dataclass
|
|
@@ -35,8 +38,14 @@ class Result:
|
|
|
35
38
|
|
|
36
39
|
"""
|
|
37
40
|
|
|
38
|
-
dict_manual: dict[tuple[Axis, Direction], list[Distance]] = {
|
|
39
|
-
|
|
41
|
+
dict_manual: dict[tuple[Axis, Direction], list[Distance]] = {
|
|
42
|
+
(axis, direction): []
|
|
43
|
+
for axis, direction in product(
|
|
44
|
+
(Axis.X, Axis.Y),
|
|
45
|
+
(Direction.POSITIVE, Direction.NEGATIVE),
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
motor_results: list[DistanceResult] = []
|
|
40
49
|
|
|
41
50
|
for measurement in measurements:
|
|
42
51
|
angle_state = measurement.state.angle
|
|
@@ -49,16 +58,10 @@ class Result:
|
|
|
49
58
|
)
|
|
50
59
|
raise TypeError(message)
|
|
51
60
|
direction = Direction(angle_state.angle.pdf_mean < 0)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
distances
|
|
55
|
-
|
|
56
|
-
result.distances
|
|
57
|
-
)
|
|
58
|
-
else:
|
|
59
|
-
dict_manual[(angle_state.axis, direction)].append(
|
|
60
|
-
measurement
|
|
61
|
-
)
|
|
61
|
+
distance_result = DistanceResult.analyze(measurement)
|
|
62
|
+
dict_manual[(angle_state.axis, direction)].extend(
|
|
63
|
+
distance_result.distances
|
|
64
|
+
)
|
|
62
65
|
else:
|
|
63
66
|
if not isinstance(motor_state, WithMotorPath):
|
|
64
67
|
message = (
|
|
@@ -66,8 +69,23 @@ class Result:
|
|
|
66
69
|
"angle nor motor path."
|
|
67
70
|
)
|
|
68
71
|
raise TypeError(message)
|
|
69
|
-
|
|
72
|
+
motor_results.append(
|
|
70
73
|
DistanceResult.analyze(measurement)
|
|
71
74
|
)
|
|
75
|
+
motor_ratio = Ratio.compute( # noqa: F841
|
|
76
|
+
motor_results, (Axis.X, Direction.POSITIVE)
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
for axis, direction in product(
|
|
80
|
+
[Axis.X, Axis.Y],
|
|
81
|
+
[Direction.POSITIVE, Direction.NEGATIVE],
|
|
82
|
+
):
|
|
83
|
+
if (axis, direction) not in dict_manual:
|
|
84
|
+
message = (
|
|
85
|
+
f"No manual angle measurement on the ({axis}, "
|
|
86
|
+
f"{direction}) couple."
|
|
87
|
+
)
|
|
88
|
+
raise ValueError(message)
|
|
89
|
+
# motor_ratio.vectors
|
|
72
90
|
|
|
73
91
|
return Result()
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Ratio class."""
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
+
from itertools import product
|
|
4
5
|
from typing import TYPE_CHECKING
|
|
5
6
|
from uuid import uuid4
|
|
6
7
|
|
|
@@ -40,10 +41,11 @@ class Ratio:
|
|
|
40
41
|
) -> Ratio:
|
|
41
42
|
"""Compute the distance ratio from multiple results."""
|
|
42
43
|
distances: dict[tuple[Axis, Direction], list[Distance]] = {
|
|
43
|
-
(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
(axis, direction): []
|
|
45
|
+
for axis, direction in product(
|
|
46
|
+
(Axis.X, Axis.Y),
|
|
47
|
+
(Direction.POSITIVE, Direction.NEGATIVE),
|
|
48
|
+
)
|
|
47
49
|
}
|
|
48
50
|
for result in results:
|
|
49
51
|
for distance in result.distances:
|