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.
Files changed (315) hide show
  1. backscattermeter_analyzer-3.0.1/PKG-INFO +164 -0
  2. backscattermeter_analyzer-3.0.1/README.md +139 -0
  3. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/pyproject.toml +14 -3
  4. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/__init__.py +30 -0
  5. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/__init__.py +9 -0
  6. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/beam.py +266 -0
  7. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/gaussian_model.py +66 -0
  8. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/beam/waist.py +109 -0
  9. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/angle/result.py +34 -16
  10. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/distance/ratio.py +6 -4
  11. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/characterize/distance/result.py +174 -0
  12. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/__init__.py +17 -0
  13. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/__init__.py +7 -0
  14. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/acquisition.py +37 -0
  15. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/__init__.py +7 -0
  16. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/__init__.py +11 -0
  17. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/no.py +7 -0
  18. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/__init__.py +11 -0
  19. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/bench.py +16 -0
  20. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/photodiode.py +7 -0
  21. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/position/state.py +16 -0
  22. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/state.py +16 -0
  23. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/camera/yes.py +46 -0
  24. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/__init__.py +11 -0
  25. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/no.py +7 -0
  26. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/state.py +16 -0
  27. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/sample/yes.py +16 -0
  28. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/backscattermeter/structure.py +68 -0
  29. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/__init__.py +11 -0
  30. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/__init__.py +11 -0
  31. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/no.py +7 -0
  32. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/state.py +16 -0
  33. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_position/yes.py +36 -0
  34. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/__init__.py +11 -0
  35. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/no.py +7 -0
  36. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/state.py +16 -0
  37. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/beam_radius/yes.py +32 -0
  38. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/no.py +7 -0
  39. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/state.py +16 -0
  40. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/camera/yes.py +59 -0
  41. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/__init__.py +7 -0
  42. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/__init__.py +11 -0
  43. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/no.py +7 -0
  44. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/state.py +16 -0
  45. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/frequency_scan/yes.py +28 -0
  46. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/laser/structure.py +48 -0
  47. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/__init__.py +11 -0
  48. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/no.py +7 -0
  49. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/state.py +16 -0
  50. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/motor_path/yes.py +28 -0
  51. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/__init__.py +11 -0
  52. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/__init__.py +11 -0
  53. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/no.py +7 -0
  54. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/state.py +16 -0
  55. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/audio/yes.py +28 -0
  56. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/__init__.py +11 -0
  57. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/no.py +7 -0
  58. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/state.py +16 -0
  59. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/dc/yes.py +28 -0
  60. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/no.py +7 -0
  61. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/photodiode.py +61 -0
  62. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/state.py +16 -0
  63. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/photodiodes/yes.py +34 -0
  64. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/representation.py +27 -0
  65. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/__init__.py +11 -0
  66. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/no.py +7 -0
  67. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/state.py +16 -0
  68. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/rotation/yes.py +19 -0
  69. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/acquisition/structure.py +113 -0
  70. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/__init__.py +9 -0
  71. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/analysis.py +27 -0
  72. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/__init__.py +11 -0
  73. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/model.py +66 -0
  74. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/no.py +7 -0
  75. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/state.py +16 -0
  76. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/beam_propagation/yes.py +299 -0
  77. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/builder.py +174 -0
  78. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/__init__.py +11 -0
  79. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/known.py +147 -0
  80. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/no.py +7 -0
  81. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/state.py +16 -0
  82. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/known_rotation/yes.py +72 -0
  83. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/representation.py +14 -0
  84. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/__init__.py +1 -0
  85. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/no.py +7 -0
  86. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/state.py +16 -0
  87. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_distance/yes.py +18 -0
  88. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/__init__.py +11 -0
  89. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/no.py +7 -0
  90. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/split.py +166 -0
  91. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/state.py +16 -0
  92. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/step_split/yes.py +70 -0
  93. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/structure.py +74 -0
  94. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/__init__.py +11 -0
  95. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/model.py +72 -0
  96. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/no.py +7 -0
  97. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/state.py +16 -0
  98. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/analysis/visibility/yes.py +467 -0
  99. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/__init__.py +9 -0
  100. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/__init__.py +7 -0
  101. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/__init__.py +11 -0
  102. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/no.py +7 -0
  103. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/__init__.py +11 -0
  104. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/bench.py +16 -0
  105. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/photodiode.py +7 -0
  106. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/position/state.py +16 -0
  107. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/state.py +16 -0
  108. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/camera/yes.py +25 -0
  109. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/__init__.py +11 -0
  110. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/no.py +7 -0
  111. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/state.py +16 -0
  112. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/sample/yes.py +16 -0
  113. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/backscattermeter/structure.py +33 -0
  114. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/builder.py +541 -0
  115. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/__init__.py +11 -0
  116. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/__init__.py +11 -0
  117. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/no.py +7 -0
  118. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/state.py +16 -0
  119. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_position/yes.py +17 -0
  120. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/__init__.py +11 -0
  121. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/no.py +7 -0
  122. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/state.py +16 -0
  123. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/beam_radius/yes.py +17 -0
  124. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/no.py +7 -0
  125. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/state.py +16 -0
  126. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/camera/yes.py +55 -0
  127. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/__init__.py +7 -0
  128. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/__init__.py +11 -0
  129. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/no.py +7 -0
  130. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/state.py +16 -0
  131. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/frequency_scan/yes.py +16 -0
  132. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/laser/structure.py +30 -0
  133. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/__init__.py +11 -0
  134. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/no.py +7 -0
  135. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/state.py +16 -0
  136. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/motor_path/yes.py +49 -0
  137. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/__init__.py +11 -0
  138. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/__init__.py +11 -0
  139. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/no.py +7 -0
  140. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/state.py +16 -0
  141. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/audio/yes.py +16 -0
  142. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/__init__.py +11 -0
  143. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/no.py +7 -0
  144. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/state.py +16 -0
  145. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/dc/yes.py +16 -0
  146. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/no.py +7 -0
  147. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/photodiode.py +33 -0
  148. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/state.py +16 -0
  149. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/photodiodes/yes.py +31 -0
  150. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/protocol.py +20 -0
  151. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/representation.py +27 -0
  152. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/__init__.py +11 -0
  153. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/no.py +7 -0
  154. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/state.py +16 -0
  155. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/rotation/yes.py +19 -0
  156. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/protocol/structure.py +66 -0
  157. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/__init__.py +7 -0
  158. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/__init__.py +11 -0
  159. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/no.py +7 -0
  160. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/state.py +16 -0
  161. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/waist.py +15 -0
  162. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/beam_propagation/yes.py +24 -0
  163. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/__init__.py +11 -0
  164. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/known.py +25 -0
  165. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/no.py +7 -0
  166. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/state.py +16 -0
  167. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/known_rotation/yes.py +64 -0
  168. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/representation.py +23 -0
  169. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/result.py +19 -0
  170. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/__init__.py +11 -0
  171. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/no.py +7 -0
  172. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/split.py +40 -0
  173. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/state.py +16 -0
  174. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/step_split/yes.py +63 -0
  175. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/structure.py +41 -0
  176. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/__init__.py +11 -0
  177. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/no.py +7 -0
  178. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/photodiode.py +27 -0
  179. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/state.py +16 -0
  180. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/experiment/result/visibility/yes.py +52 -0
  181. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/__init__.py +4 -3
  182. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/__init__.py +7 -0
  183. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/backscattermeter.py +14 -0
  184. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/__init__.py +11 -0
  185. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/no.py +7 -0
  186. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/state.py +16 -0
  187. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/camera/yes.py +16 -0
  188. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/representation.py +14 -0
  189. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/backscattermeter/structure.py +23 -0
  190. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/__init__.py +7 -0
  191. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/camera.py +16 -0
  192. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/representation.py +16 -0
  193. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/camera/structure.py +17 -0
  194. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/__init__.py +7 -0
  195. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/motor.py +16 -0
  196. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/motor/path.py +22 -0
  197. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/representation.py +16 -0
  198. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/motor/structure.py +17 -0
  199. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/__init__.py +7 -0
  200. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/optic.py +14 -0
  201. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/representation.py +14 -0
  202. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/optic/structure.py +16 -0
  203. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/__init__.py +7 -0
  204. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/photodiode.py +14 -0
  205. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/representation.py +14 -0
  206. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/hardware/photodiode/structure.py +16 -0
  207. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/__init__.py +0 -2
  208. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/io/hdf5/distance/angle.py +190 -0
  209. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/distance/main.py +31 -6
  210. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/distance/motor.py +1 -1
  211. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/result.py +6 -5
  212. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/interface/unified_read_write.py +4 -3
  213. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/__init__.py +1 -0
  214. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/__init__.py +11 -0
  215. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/no.py +16 -0
  216. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/state.py +29 -0
  217. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/angle/yes.py +24 -0
  218. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/connect.py +42 -1
  219. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/distance.py +114 -0
  220. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/distance/state.py +60 -0
  221. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/measurement/angle/yes.py +74 -0
  222. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/measurement.py +15 -3
  223. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/measurement/motor/yes.py +63 -0
  224. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/state.py +1 -4
  225. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/__init__.py +9 -0
  226. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/collection.py +56 -0
  227. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/formula/__init__.py +9 -0
  228. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/formula/div.py +19 -0
  229. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/formula/formula.py +51 -0
  230. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/__init__.py +11 -0
  231. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/no.py +14 -0
  232. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/state.py +21 -0
  233. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/oriented_axis/yes.py +22 -0
  234. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/ratio.py +43 -0
  235. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/ratio/state.py +53 -0
  236. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/__init__.py +7 -0
  237. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/__init__.py +11 -0
  238. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/no.py +13 -0
  239. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/state.py +20 -0
  240. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/distance/yes.py +21 -0
  241. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/__init__.py +11 -0
  242. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/no.py +14 -0
  243. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/state.py +21 -0
  244. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/ratio/yes.py +23 -0
  245. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/result.py +32 -0
  246. backscattermeter_analyzer-3.0.1/src/backscattermeter_analyzer/utils/result/state.py +68 -0
  247. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/utils.py +131 -3
  248. backscattermeter_analyzer-2.2.2/PKG-INFO +0 -26
  249. backscattermeter_analyzer-2.2.2/README.md +0 -1
  250. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/__init__.py +0 -25
  251. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/characterize/distance/result.py +0 -127
  252. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/backscattermeter.py +0 -8
  253. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/camera/__init__.py +0 -13
  254. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/motor/__init__.py +0 -11
  255. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/hardware/optic/__init__.py +0 -13
  256. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/__init__.py +0 -11
  257. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/distance/distance.py +0 -35
  258. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/distance/state.py +0 -31
  259. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/measurement/angle/yes.py +0 -30
  260. backscattermeter_analyzer-2.2.2/src/backscattermeter_analyzer/utils/measurement/motor/yes.py +0 -21
  261. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/LICENSE +0 -0
  262. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/display.py +0 -0
  263. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/justfile +0 -0
  264. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/mise.toml +0 -0
  265. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/axis.py +0 -0
  266. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/__init__.py +0 -0
  267. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/angle/__init__.py +0 -0
  268. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/distance/__init__.py +0 -0
  269. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/characterize/distance/vector.py +0 -0
  270. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/direction.py +0 -0
  271. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/__init__.py +0 -0
  272. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/base.py +0 -0
  273. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/__init__.py +0 -0
  274. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/base.py +0 -0
  275. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/__init__.py +0 -0
  276. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/already_defined.py +0 -0
  277. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/ambiguous_format.py +0 -0
  278. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/base.py +0 -0
  279. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/identification.py +0 -0
  280. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/exception/io/registry/not_defined.py +0 -0
  281. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/motor/jump.py +0 -0
  282. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/hardware/motor/step_numbers.py +0 -0
  283. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/__init__.py +0 -0
  284. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/distance/__init__.py +0 -0
  285. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/measurement/__init__.py +0 -0
  286. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/measurement/main.py +0 -0
  287. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/measurement/motor.py +0 -0
  288. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/hdf5/utils.py +0 -0
  289. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/__init__.py +0 -0
  290. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/default.py +0 -0
  291. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/interface/__init__.py +0 -0
  292. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/interface/unified_read_write_method.py +0 -0
  293. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_input_registry.py +0 -0
  294. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_io_registry.py +0 -0
  295. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_io_registry_base.py +0 -0
  296. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/io/registry/unified_output_registry.py +0 -0
  297. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/scale.py +0 -0
  298. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/__init__.py +0 -0
  299. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/__init__.py +0 -0
  300. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/no.py +0 -0
  301. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/state.py +0 -0
  302. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/distance/motor/yes.py +0 -0
  303. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/__init__.py +0 -0
  304. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/angle/__init__.py +0 -0
  305. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/angle/no.py +0 -0
  306. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/angle/state.py +0 -0
  307. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/__init__.py +0 -0
  308. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/no.py +0 -0
  309. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/state.py +0 -0
  310. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/camera/yes.py +0 -0
  311. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/connect.py +0 -0
  312. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/motor/__init__.py +0 -0
  313. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/motor/no.py +0 -0
  314. {backscattermeter_analyzer-2.2.2 → backscattermeter_analyzer-3.0.1}/src/backscattermeter_analyzer/utils/measurement/motor/state.py +0 -0
  315. {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 = "2.2.2"
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 = ["tests/**/*.py", "display.py", "utils.py"]
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.28", "ruff>=0.11.2"]
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,9 @@
1
+ """Sub-package managing object focused on beam."""
2
+
3
+ from .beam import Beam
4
+ from .waist import Waist
5
+
6
+ __all__ = [
7
+ "Beam",
8
+ "Waist",
9
+ ]
@@ -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
+ }