backscattermeter_analyzer 2.2.2__tar.gz → 3.0.1__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-3.0.1/PKG-INFO +164 -0
- backscattermeter_analyzer-3.0.1/README.md +139 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/pyproject.toml +14 -3
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/__init__.py +30 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/__init__.py +9 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/beam.py +266 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/gaussian_model.py +66 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/waist.py +109 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/angle/result.py +34 -16
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/distance/ratio.py +6 -4
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/characterize/distance/result.py +174 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/__init__.py +17 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/acquisition.py +37 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/bench.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/photodiode.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/yes.py +46 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/yes.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/structure.py +68 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/yes.py +36 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/yes.py +32 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/yes.py +59 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/yes.py +28 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/structure.py +48 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/yes.py +28 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/yes.py +28 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/yes.py +28 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/photodiode.py +61 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/yes.py +34 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/representation.py +27 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/yes.py +19 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/structure.py +113 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/__init__.py +9 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/analysis.py +27 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/model.py +66 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/yes.py +299 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/builder.py +174 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/known.py +147 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/yes.py +72 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/representation.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/__init__.py +1 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/yes.py +18 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/split.py +166 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/yes.py +70 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/structure.py +74 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/model.py +72 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/yes.py +467 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/__init__.py +9 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/bench.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/photodiode.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/yes.py +25 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/yes.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/structure.py +33 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/builder.py +541 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/yes.py +17 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/yes.py +17 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/yes.py +55 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/yes.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/structure.py +30 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/yes.py +49 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/yes.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/yes.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/photodiode.py +33 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/yes.py +31 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/protocol.py +20 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/representation.py +27 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/yes.py +19 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/structure.py +66 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/waist.py +15 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/yes.py +24 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/known.py +25 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/yes.py +64 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/representation.py +23 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/result.py +19 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/split.py +40 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/yes.py +63 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/structure.py +41 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/photodiode.py +27 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/yes.py +52 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/__init__.py +4 -3
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/backscattermeter.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/no.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/state.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/yes.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/representation.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/structure.py +23 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/camera.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/representation.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/structure.py +17 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/motor.py +16 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/motor/path.py +22 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/representation.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/structure.py +17 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/optic.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/representation.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/structure.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/photodiode.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/representation.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/structure.py +16 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/__init__.py +0 -2
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/io/hdf5/distance/angle.py +190 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/distance/main.py +31 -6
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/distance/motor.py +1 -1
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/result.py +6 -5
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/interface/unified_read_write.py +4 -3
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/__init__.py +1 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/no.py +16 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/state.py +29 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/yes.py +24 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/connect.py +42 -1
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/distance.py +114 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/state.py +60 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/measurement/angle/yes.py +74 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/measurement.py +15 -3
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/measurement/motor/yes.py +63 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/state.py +1 -4
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/__init__.py +9 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/collection.py +56 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/formula/__init__.py +9 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/formula/div.py +19 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/formula/formula.py +51 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/no.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/state.py +21 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/yes.py +22 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/ratio.py +43 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/state.py +53 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/__init__.py +7 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/no.py +13 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/state.py +20 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/yes.py +21 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/__init__.py +11 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/no.py +14 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/state.py +21 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/yes.py +23 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/result.py +32 -0
- backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/state.py +68 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/utils.py +131 -3
- backscattermeter_analyzer-2.2.2/PKG-INFO +0 -26
- backscattermeter_analyzer-2.2.2/README.md +0 -1
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/__init__.py +0 -25
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/characterize/distance/result.py +0 -127
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/backscattermeter.py +0 -8
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/camera/__init__.py +0 -13
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/motor/__init__.py +0 -11
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/optic/__init__.py +0 -13
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/__init__.py +0 -11
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/distance/distance.py +0 -35
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/distance/state.py +0 -31
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/measurement/angle/yes.py +0 -30
- backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/measurement/motor/yes.py +0 -21
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/LICENSE +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/display.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/justfile +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/mise.toml +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/axis.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/angle/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/distance/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/distance/vector.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/direction.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/base.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/base.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/already_defined.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/ambiguous_format.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/base.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/identification.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/not_defined.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/motor/jump.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/motor/step_numbers.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/distance/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/measurement/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/measurement/main.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/measurement/motor.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/utils.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/default.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/interface/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/interface/unified_read_write_method.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_input_registry.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_io_registry.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_io_registry_base.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_output_registry.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/scale.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/no.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/state.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/yes.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/angle/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/angle/no.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/angle/state.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/no.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/state.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/yes.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/connect.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/motor/__init__.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/motor/no.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/motor/state.py +0 -0
- {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/utils.py +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: backscattermeter_analyzer
|
|
3
|
+
Version: 3.0.1
|
|
4
|
+
Summary: Tool to work on the backscattermeter at LAPP
|
|
5
|
+
Project-URL: Documentation, https://git.linarphy.net/linarphy/backscattermeter_analyzer/wiki
|
|
6
|
+
Project-URL: Homepage, https://git.linarphy.net/linarphy/backscattermeter_analyzer
|
|
7
|
+
Project-URL: Source, https://git.linarphy.net/linarphy/backscattermeter_analyzer
|
|
8
|
+
Project-URL: Issues, https://git.linarphy.net/linarphy/backscattermeter_analyzer/issues
|
|
9
|
+
Author-email: linarphy <linarphy@linarphy.net>
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: backscattered light,virgo
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering
|
|
18
|
+
Requires-Python: >=3.14.7
|
|
19
|
+
Requires-Dist: gwpy>=3.0.12
|
|
20
|
+
Requires-Dist: lalsuite>=7.26.15
|
|
21
|
+
Requires-Dist: pyqt6>=6.9.1
|
|
22
|
+
Requires-Dist: pyusb>=1.3.1
|
|
23
|
+
Requires-Dist: rich>=13.9.4
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
|
|
26
|
+
# Backscattermeter analyzer
|
|
27
|
+
|
|
28
|
+
Help working with [the backscattermeter at LAPP](https://doi.org/10.48550/arXiv.2202.07370).
|
|
29
|
+
|
|
30
|
+
This tools can characterize the experiment itself, or make
|
|
31
|
+
${ f } _ { sc }$ or *BRDF* measurement with a focus on uncertainty
|
|
32
|
+
propagation.
|
|
33
|
+
|
|
34
|
+
## Getting started
|
|
35
|
+
|
|
36
|
+
### Requirements
|
|
37
|
+
|
|
38
|
+
- Python >= 3.14
|
|
39
|
+
- GWpy >= 3.0.12 (data type, computation)
|
|
40
|
+
- pyusb >= 1.3.1 (interaction with actuator/sensor - not used yet)
|
|
41
|
+
- pyqt6 >= 6.9.1 (visualization - not used yet)
|
|
42
|
+
- rich >= 13.9.4 (console output)
|
|
43
|
+
- lalsuite >= 7.26.15 (data format - not used yet)
|
|
44
|
+
|
|
45
|
+
### Installation
|
|
46
|
+
|
|
47
|
+
To install this package in the current python environment, use
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
python -m pip install backscattermeter_analyzer
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Usage
|
|
54
|
+
|
|
55
|
+
```py
|
|
56
|
+
from backscattermeter_analyzer import (
|
|
57
|
+
Acquisition,
|
|
58
|
+
AnalysisBuilder,
|
|
59
|
+
Backscattermeter,
|
|
60
|
+
Camera,
|
|
61
|
+
ProtocolBuilder,
|
|
62
|
+
)
|
|
63
|
+
from gwpy.timeseries import TimeSeriesDict
|
|
64
|
+
|
|
65
|
+
# build a protocol with a camera that save the position of the beam and
|
|
66
|
+
# with a snail movement of the motor.
|
|
67
|
+
protocol = (
|
|
68
|
+
ProtocolBuilder(Backscattermeter())
|
|
69
|
+
.with_camera_on_suspended_bench(
|
|
70
|
+
camera=Camera(
|
|
71
|
+
id_="an nice identifier of the camera for human",
|
|
72
|
+
serial_number="1359",
|
|
73
|
+
),
|
|
74
|
+
position=3e-2, # in m
|
|
75
|
+
error=5e-3, # in m
|
|
76
|
+
)
|
|
77
|
+
.with_camera_channels( # X and Y are reversed on this camera !
|
|
78
|
+
pos_x="V1:Camera_scatter_FitPosY",
|
|
79
|
+
pos_y="V1:Camera_scatter_FitPosX",
|
|
80
|
+
)
|
|
81
|
+
.with_snail_motor_path(
|
|
82
|
+
number=3,
|
|
83
|
+
duration=10,
|
|
84
|
+
speed=50,
|
|
85
|
+
step_numbers=(100, 100, 100, 100),
|
|
86
|
+
)
|
|
87
|
+
.build()
|
|
88
|
+
)
|
|
89
|
+
# convert it to an acquisition with real data
|
|
90
|
+
acquisition = Acquisition(
|
|
91
|
+
protocol=protocol,
|
|
92
|
+
data=TimeSeriesDict.read("data.gwf"),
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# build an analysis where we will get the time interval in which the
|
|
96
|
+
# motor is moving. We don't want these data as they are noisy, so this
|
|
97
|
+
# can be used later for another analysis that needs stable segment.
|
|
98
|
+
analysis = (
|
|
99
|
+
AnalysisBuilder()
|
|
100
|
+
.with_step_split([acquisition])
|
|
101
|
+
.build()
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# run the analysis, return a result object
|
|
105
|
+
result = analysis.run()
|
|
106
|
+
|
|
107
|
+
print(result.representation.structure.with_step_split[0].start_times[0])
|
|
108
|
+
# this will print the start of the segment that contains transition data
|
|
109
|
+
# in camera position measurement.
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Documentation
|
|
113
|
+
|
|
114
|
+
A complete documentation will be available soon, in a wiki.
|
|
115
|
+
|
|
116
|
+
## Development
|
|
117
|
+
|
|
118
|
+
### Development Requirements
|
|
119
|
+
|
|
120
|
+
This project use [mise](https://mise.jdx.dev) to manage development
|
|
121
|
+
tools.
|
|
122
|
+
|
|
123
|
+
> [!TIP]
|
|
124
|
+
> If [mise](https://mise.jdx.dev) is installed, and
|
|
125
|
+
> [mise.toml](mise.toml) is trusted with `mise trust`, all tools can be
|
|
126
|
+
> installed automatically with `mise install`
|
|
127
|
+
|
|
128
|
+
This project use the following tools:
|
|
129
|
+
|
|
130
|
+
- [just](https://just.systems): command runner
|
|
131
|
+
- [hatch](https://hatch.pypa.io): project manager and package builder
|
|
132
|
+
- [uv](https://docs.astral.sh/uv): package installer
|
|
133
|
+
- [ruff](https://docs.astral.sh/ruff): python linter and formatter
|
|
134
|
+
- [ty](https://docs.astra.sh/ty): python type checker
|
|
135
|
+
- [jujutsu](https://jj-vcs.dev): version control
|
|
136
|
+
|
|
137
|
+
> [!NOTE]
|
|
138
|
+
> Tools used in the project consume and produce interoperable format to
|
|
139
|
+
> avoid vendor lock-in. This is the toolchain of the current maintener.
|
|
140
|
+
|
|
141
|
+
### Development Usage
|
|
142
|
+
|
|
143
|
+
[just](https://just.system) can be used to speed up development for an
|
|
144
|
+
identical toolchain.
|
|
145
|
+
|
|
146
|
+
Before making a commit, `just fix` will run all tests, format the code,
|
|
147
|
+
lint and type check. If you don’t want to modify the code, `just check`
|
|
148
|
+
will run all tests, lint and type check without any attempt to fix any
|
|
149
|
+
issue.
|
|
150
|
+
|
|
151
|
+
Before a version change, `just release` will push all local commits to
|
|
152
|
+
repository and publish the new package version.
|
|
153
|
+
|
|
154
|
+
All available commands can be listed with `just -l`.
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
This project is licensed under the GNU GPL v3+.
|
|
159
|
+
See [license file](LICENSE) for more information.
|
|
160
|
+
|
|
161
|
+
## Acknowledgement
|
|
162
|
+
|
|
163
|
+
Thanks to all the people that worked on the tools used, like python,
|
|
164
|
+
neovim and mise.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Backscattermeter analyzer
|
|
2
|
+
|
|
3
|
+
Help working with [the backscattermeter at LAPP](https://doi.org/10.48550/arXiv.2202.07370).
|
|
4
|
+
|
|
5
|
+
This tools can characterize the experiment itself, or make
|
|
6
|
+
${ f } _ { sc }$ or *BRDF* measurement with a focus on uncertainty
|
|
7
|
+
propagation.
|
|
8
|
+
|
|
9
|
+
## Getting started
|
|
10
|
+
|
|
11
|
+
### Requirements
|
|
12
|
+
|
|
13
|
+
- Python >= 3.14
|
|
14
|
+
- GWpy >= 3.0.12 (data type, computation)
|
|
15
|
+
- pyusb >= 1.3.1 (interaction with actuator/sensor - not used yet)
|
|
16
|
+
- pyqt6 >= 6.9.1 (visualization - not used yet)
|
|
17
|
+
- rich >= 13.9.4 (console output)
|
|
18
|
+
- lalsuite >= 7.26.15 (data format - not used yet)
|
|
19
|
+
|
|
20
|
+
### Installation
|
|
21
|
+
|
|
22
|
+
To install this package in the current python environment, use
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
python -m pip install backscattermeter_analyzer
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Usage
|
|
29
|
+
|
|
30
|
+
```py
|
|
31
|
+
from backscattermeter_analyzer import (
|
|
32
|
+
Acquisition,
|
|
33
|
+
AnalysisBuilder,
|
|
34
|
+
Backscattermeter,
|
|
35
|
+
Camera,
|
|
36
|
+
ProtocolBuilder,
|
|
37
|
+
)
|
|
38
|
+
from gwpy.timeseries import TimeSeriesDict
|
|
39
|
+
|
|
40
|
+
# build a protocol with a camera that save the position of the beam and
|
|
41
|
+
# with a snail movement of the motor.
|
|
42
|
+
protocol = (
|
|
43
|
+
ProtocolBuilder(Backscattermeter())
|
|
44
|
+
.with_camera_on_suspended_bench(
|
|
45
|
+
camera=Camera(
|
|
46
|
+
id_="an nice identifier of the camera for human",
|
|
47
|
+
serial_number="1359",
|
|
48
|
+
),
|
|
49
|
+
position=3e-2, # in m
|
|
50
|
+
error=5e-3, # in m
|
|
51
|
+
)
|
|
52
|
+
.with_camera_channels( # X and Y are reversed on this camera !
|
|
53
|
+
pos_x="V1:Camera_scatter_FitPosY",
|
|
54
|
+
pos_y="V1:Camera_scatter_FitPosX",
|
|
55
|
+
)
|
|
56
|
+
.with_snail_motor_path(
|
|
57
|
+
number=3,
|
|
58
|
+
duration=10,
|
|
59
|
+
speed=50,
|
|
60
|
+
step_numbers=(100, 100, 100, 100),
|
|
61
|
+
)
|
|
62
|
+
.build()
|
|
63
|
+
)
|
|
64
|
+
# convert it to an acquisition with real data
|
|
65
|
+
acquisition = Acquisition(
|
|
66
|
+
protocol=protocol,
|
|
67
|
+
data=TimeSeriesDict.read("data.gwf"),
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# build an analysis where we will get the time interval in which the
|
|
71
|
+
# motor is moving. We don't want these data as they are noisy, so this
|
|
72
|
+
# can be used later for another analysis that needs stable segment.
|
|
73
|
+
analysis = (
|
|
74
|
+
AnalysisBuilder()
|
|
75
|
+
.with_step_split([acquisition])
|
|
76
|
+
.build()
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# run the analysis, return a result object
|
|
80
|
+
result = analysis.run()
|
|
81
|
+
|
|
82
|
+
print(result.representation.structure.with_step_split[0].start_times[0])
|
|
83
|
+
# this will print the start of the segment that contains transition data
|
|
84
|
+
# in camera position measurement.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Documentation
|
|
88
|
+
|
|
89
|
+
A complete documentation will be available soon, in a wiki.
|
|
90
|
+
|
|
91
|
+
## Development
|
|
92
|
+
|
|
93
|
+
### Development Requirements
|
|
94
|
+
|
|
95
|
+
This project use [mise](https://mise.jdx.dev) to manage development
|
|
96
|
+
tools.
|
|
97
|
+
|
|
98
|
+
> [!TIP]
|
|
99
|
+
> If [mise](https://mise.jdx.dev) is installed, and
|
|
100
|
+
> [mise.toml](mise.toml) is trusted with `mise trust`, all tools can be
|
|
101
|
+
> installed automatically with `mise install`
|
|
102
|
+
|
|
103
|
+
This project use the following tools:
|
|
104
|
+
|
|
105
|
+
- [just](https://just.systems): command runner
|
|
106
|
+
- [hatch](https://hatch.pypa.io): project manager and package builder
|
|
107
|
+
- [uv](https://docs.astral.sh/uv): package installer
|
|
108
|
+
- [ruff](https://docs.astral.sh/ruff): python linter and formatter
|
|
109
|
+
- [ty](https://docs.astra.sh/ty): python type checker
|
|
110
|
+
- [jujutsu](https://jj-vcs.dev): version control
|
|
111
|
+
|
|
112
|
+
> [!NOTE]
|
|
113
|
+
> Tools used in the project consume and produce interoperable format to
|
|
114
|
+
> avoid vendor lock-in. This is the toolchain of the current maintener.
|
|
115
|
+
|
|
116
|
+
### Development Usage
|
|
117
|
+
|
|
118
|
+
[just](https://just.system) can be used to speed up development for an
|
|
119
|
+
identical toolchain.
|
|
120
|
+
|
|
121
|
+
Before making a commit, `just fix` will run all tests, format the code,
|
|
122
|
+
lint and type check. If you don’t want to modify the code, `just check`
|
|
123
|
+
will run all tests, lint and type check without any attempt to fix any
|
|
124
|
+
issue.
|
|
125
|
+
|
|
126
|
+
Before a version change, `just release` will push all local commits to
|
|
127
|
+
repository and publish the new package version.
|
|
128
|
+
|
|
129
|
+
All available commands can be listed with `just -l`.
|
|
130
|
+
|
|
131
|
+
## License
|
|
132
|
+
|
|
133
|
+
This project is licensed under the GNU GPL v3+.
|
|
134
|
+
See [license file](LICENSE) for more information.
|
|
135
|
+
|
|
136
|
+
## Acknowledgement
|
|
137
|
+
|
|
138
|
+
Thanks to all the people that worked on the tools used, like python,
|
|
139
|
+
neovim and mise.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "backscattermeter_analyzer"
|
|
3
|
-
version = "
|
|
3
|
+
version = "3.0.1"
|
|
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
|
+
}
|