pymodaq 5.1.5__tar.gz → 5.1.7__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.

Potentially problematic release.


This version of pymodaq might be problematic. Click here for more details.

Files changed (154) hide show
  1. {pymodaq-5.1.5 → pymodaq-5.1.7}/PKG-INFO +1 -1
  2. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move.py +51 -7
  3. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_viewer.py +32 -17
  4. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/mocks.py +6 -0
  5. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/move_utility_classes.py +3 -1
  6. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/utils.py +1 -2
  7. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/dashboard.py +1 -1
  8. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/function_plotter.py +1 -1
  9. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_scan.py +16 -22
  10. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/pid/pid_controller.py +1 -1
  11. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/chrono_timer.py +1 -1
  12. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/gui_utils/loader_utils.py +1 -1
  13. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/h5modules/module_saving.py +7 -2
  14. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/leco_director.py +1 -1
  15. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/managers/modules_manager.py +1 -2
  16. {pymodaq-5.1.5 → pymodaq-5.1.7}/.gitignore +0 -0
  17. {pymodaq-5.1.5 → pymodaq-5.1.7}/LICENSE +0 -0
  18. {pymodaq-5.1.5 → pymodaq-5.1.7}/README.rst +0 -0
  19. {pymodaq-5.1.5 → pymodaq-5.1.7}/pyproject.toml +0 -0
  20. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/__init__.py +0 -0
  21. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/__init__.py +0 -0
  22. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/__init__.py +0 -0
  23. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/factory.py +0 -0
  24. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/ui_base.py +0 -0
  25. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/uis/__init__.py +0 -0
  26. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/uis/binary.py +0 -0
  27. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/uis/original.py +0 -0
  28. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/uis/relative.py +0 -0
  29. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_move_ui/uis/simple.py +0 -0
  30. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/daq_viewer_ui.py +0 -0
  31. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/thread_commands.py +0 -0
  32. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/ui_utils.py +0 -0
  33. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/control_modules/viewer_utility_classes.py +0 -0
  34. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/daq_utils/__init__.py +0 -0
  35. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/daq_utils/daq_utils.py +0 -0
  36. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_Client.aliases +0 -0
  37. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_Client.lvlps +0 -0
  38. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_Client.lvproj +0 -0
  39. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_Client.vi +0 -0
  40. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_Server_1Dgaussian.vi +0 -0
  41. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_Server_2Dgaussian.vi +0 -0
  42. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_read_cmd.vi +0 -0
  43. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_read_float.vi +0 -0
  44. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_read_int.vi +0 -0
  45. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_send_data.vi +0 -0
  46. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_send_int.vi +0 -0
  47. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_send_scalar.vi +0 -0
  48. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/DAQ_TCP_send_string.vi +0 -0
  49. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/client_state.ctl +0 -0
  50. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/Labview_TCP_Client/cmd_types.ctl +0 -0
  51. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/__init__.py +0 -0
  52. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/nonlinearscanner.py +0 -0
  53. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/qt_less_standalone_module.py +0 -0
  54. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/examples/tcp_client.py +0 -0
  55. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/__init__.py +0 -0
  56. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/adaptive/__init__.py +0 -0
  57. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/adaptive/adaptive_optimization.py +0 -0
  58. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/adaptive/loss_function/_1d_loss_functions.py +0 -0
  59. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/adaptive/loss_function/_2d_loss_functions.py +0 -0
  60. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/adaptive/loss_function/__init__.py +0 -0
  61. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/adaptive/loss_function/loss_factory.py +0 -0
  62. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/adaptive/utils.py +0 -0
  63. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/bayesian/__init__.py +0 -0
  64. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/bayesian/acquisition/__init__.py +0 -0
  65. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/bayesian/acquisition/acquisition_function_factory.py +0 -0
  66. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/bayesian/acquisition/base_acquisition_function.py +0 -0
  67. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/bayesian/bayesian_optimization.py +0 -0
  68. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/bayesian/utils.py +0 -0
  69. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/console.py +0 -0
  70. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_logger/__init__.py +0 -0
  71. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_logger/abstract.py +0 -0
  72. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_logger/daq_logger.py +0 -0
  73. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_logger/db/__init__.py +0 -0
  74. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_logger/db/db_logger.py +0 -0
  75. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_logger/db/db_logger_models.py +0 -0
  76. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_logger/h5logging.py +0 -0
  77. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/daq_scan_ui.py +0 -0
  78. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/__init__.py +0 -0
  79. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/daq_0Dviewer_DataMixer.py +0 -0
  80. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/data_mixer.py +0 -0
  81. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/model.py +0 -0
  82. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/models/__init__.py +0 -0
  83. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/models/equation_model.py +0 -0
  84. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/models/gaussian_fit_model.py +0 -0
  85. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/parser.py +0 -0
  86. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/data_mixer/utils.py +0 -0
  87. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/h5browser.py +0 -0
  88. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/optimizers_base/__init__.py +0 -0
  89. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/optimizers_base/optimizer.py +0 -0
  90. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/optimizers_base/thread_commands.py +0 -0
  91. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/optimizers_base/utils.py +0 -0
  92. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/pid/__init__.py +0 -0
  93. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/pid/actuator_controller.py +0 -0
  94. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/pid/daq_move_PID.py +0 -0
  95. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/pid/utils.py +0 -0
  96. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/extensions/utils.py +0 -0
  97. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/icon.ico +0 -0
  98. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/post_treatment/__init__.py +0 -0
  99. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/post_treatment/load_and_plot.py +0 -0
  100. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/resources/__init__.py +0 -0
  101. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/resources/config_template.toml +0 -0
  102. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/resources/preset_default.xml +0 -0
  103. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/resources/setup_plugin.py +0 -0
  104. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/splash.png +0 -0
  105. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/__init__.py +0 -0
  106. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/array_manipulation.py +0 -0
  107. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/calibration_camera.py +0 -0
  108. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/config.py +0 -0
  109. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/conftests.py +0 -0
  110. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/daq_utils.py +0 -0
  111. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/data.py +0 -0
  112. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/enums.py +0 -0
  113. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/exceptions.py +0 -0
  114. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/gui_utils/__init__.py +0 -0
  115. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/gui_utils/utils.py +0 -0
  116. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/gui_utils/widgets/lcd.py +0 -0
  117. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/h5modules/__init__.py +0 -0
  118. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/__init__.py +0 -0
  119. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/daq_move_LECODirector.py +0 -0
  120. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/daq_xDviewer_LECODirector.py +0 -0
  121. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/director_utils.py +0 -0
  122. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/pymodaq_listener.py +0 -0
  123. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/rpc_method_definitions.py +0 -0
  124. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/leco/utils.py +0 -0
  125. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/logger.py +0 -0
  126. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/managers/__init__.py +0 -0
  127. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/managers/batchscan_manager.py +0 -0
  128. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/managers/overshoot_manager.py +0 -0
  129. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/managers/preset_manager.py +0 -0
  130. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/managers/preset_manager_utils.py +0 -0
  131. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/managers/remote_manager.py +0 -0
  132. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/math_utils.py +0 -0
  133. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/messenger.py +0 -0
  134. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/parameter/__init__.py +0 -0
  135. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/parameter/utils.py +0 -0
  136. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/__init__.py +0 -0
  137. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scan_config.py +0 -0
  138. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scan_factory.py +0 -0
  139. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scan_selector.py +0 -0
  140. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scanner.py +0 -0
  141. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scanners/_1d_scanners.py +0 -0
  142. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scanners/_2d_scanners.py +0 -0
  143. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scanners/__init__.py +0 -0
  144. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scanners/sequential.py +0 -0
  145. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/scanners/tabular.py +0 -0
  146. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/scanner/utils.py +0 -0
  147. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/svg/__init__.py +0 -0
  148. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/svg/svg_renderer.py +0 -0
  149. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/svg/svg_view.py +0 -0
  150. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/svg/svg_viewer2D.py +0 -0
  151. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/tcp_ip/__init__.py +0 -0
  152. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/tcp_ip/mysocket.py +0 -0
  153. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/tcp_ip/serializer.py +0 -0
  154. {pymodaq-5.1.5 → pymodaq-5.1.7}/src/pymodaq/utils/tcp_ip/tcp_server_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymodaq
3
- Version: 5.1.5
3
+ Version: 5.1.7
4
4
  Summary: Modular Data Acquisition with Python
5
5
  Project-URL: Homepage, http://pymodaq.cnrs.fr
6
6
  Project-URL: Source, https://github.com/PyMoDAQ/PyMoDAQ
@@ -30,6 +30,7 @@ from pymodaq_utils.warnings import deprecation_msg
30
30
  from pymodaq.utils.data import DataToExport, DataActuator
31
31
  from pymodaq_data.h5modules.backends import Node
32
32
 
33
+ from pymodaq_gui.h5modules.saving import H5Saver
33
34
  from pymodaq_gui.parameter import ioxml, Parameter
34
35
  from pymodaq_gui.parameter import utils as putils
35
36
  from pymodaq_gui.utils.utils import mkQApp
@@ -80,8 +81,6 @@ config = ControlModulesConfig()
80
81
 
81
82
  HardwareController = TypeVar("HardwareController")
82
83
 
83
- HardwareController = TypeVar("HardwareController")
84
-
85
84
  DAQ_Move_Actuators = get_plugins("daq_move")
86
85
  ACTUATOR_TYPES = [mov["name"] for mov in DAQ_Move_Actuators]
87
86
  if len(ACTUATOR_TYPES) == 0:
@@ -117,7 +116,9 @@ class DAQ_Move(ParameterControlModule):
117
116
  current_value_signal = Signal(DataActuator)
118
117
  bounds_signal = Signal(bool)
119
118
 
120
- params = daq_move_params
119
+ params = daq_move_params + [
120
+ {'title': 'Saver Settings:', 'name': 'saver_settings', 'type': 'group',
121
+ 'visible': False, 'children': H5Saver.params}]
121
122
 
122
123
  listener_class = MoveActorListener
123
124
  ui: Optional[DAQ_Move_UI_Base]
@@ -166,7 +167,14 @@ class DAQ_Move(ParameterControlModule):
166
167
  if len(ACTUATOR_TYPES) > 0: # will be 0 if no valid plugins are installed
167
168
  self.actuator = kwargs.get("actuator", ACTUATOR_TYPES[0])
168
169
 
169
- self.module_and_data_saver = module_saving.ActuatorTimeSaver(self)
170
+ self._module_and_data_saver: module_saving.ActuatorTimeSaver = None
171
+ for hidden_param in ('custom_name',
172
+ 'current_scan_name',
173
+ 'current_scan_path',
174
+ 'current_h5_file',
175
+ 'new_file',
176
+ 'base_name'):
177
+ self.settings.child('saver_settings', hidden_param).setOpts(visible=False)
170
178
 
171
179
  self._move_done_bool = True
172
180
 
@@ -174,7 +182,7 @@ class DAQ_Move(ParameterControlModule):
174
182
  self._target_value = DataActuator(title, units=self.units)
175
183
  self._relative_value = DataActuator(title, units=self.units)
176
184
 
177
- self._refresh_timer = QTimer()
185
+ self._refresh_timer = QTimer(self)
178
186
  self._refresh_timer.timeout.connect(self.get_actuator_value)
179
187
 
180
188
  def process_ui_cmds(self, cmd: utils.ThreadCommand):
@@ -268,7 +276,7 @@ class DAQ_Move(ParameterControlModule):
268
276
  if dte is None:
269
277
  dte = DataToExport(name=self.title, data=[self._current_value])
270
278
  self._add_data_to_saver(dte, where=where)
271
- # todo: test this for logging
279
+ self.settings.child('saver_settings', 'N_saved').setValue(self.settings['saver_settings', 'N_saved'] + 1)
272
280
 
273
281
  def _add_data_to_saver(self, data: DataToExport, where=None, **kwargs):
274
282
  """Adds DataToExport data to the current node using the declared module_and_data_saver
@@ -482,12 +490,44 @@ class DAQ_Move(ParameterControlModule):
482
490
  def value_changed(self, param: Parameter):
483
491
  """Apply changes of value in the settings"""
484
492
  super().value_changed(param=param)
493
+ path = self.settings.childPath(param)
485
494
 
486
495
  if param.name() == "refresh_timeout":
487
496
  self._refresh_timer.setInterval(param.value())
488
497
 
498
+ elif param.name() == 'continuous_saving_opt':
499
+ self.settings.child('saver_settings').setOpts(visible=param.value())
500
+
501
+ elif param.name() in putils.iter_children(self.settings.child('saver_settings'), []):
502
+ if param.name() == 'do_save':
503
+ self.setup_continuous_saving(param.value())
504
+ self.h5saver.settings.child(*path[1:]).setValue(param.value())
505
+
489
506
  self._update_settings(param=param)
490
507
 
508
+ def setup_continuous_saving(self, init: bool = True):
509
+ """Configure the objects dealing with the continuous saving mode"""
510
+ if init:
511
+ self.module_and_data_saver = module_saving.ActuatorTimeSaver(self)
512
+ self.module_and_data_saver.h5saver = self.h5saver
513
+ self.h5saver.settings.child('do_save').sigValueChanged.connect(self._init_continuous_save)
514
+ else:
515
+ self.h5saver.close_file()
516
+
517
+ def _init_continuous_save(self):
518
+ """ Initialize the continuous saving H5Saver object
519
+
520
+ Update the module_and_data_saver attribute as :class:`DetectorTimeSaver` object
521
+ """
522
+ if self.settings.child('saver_settings', 'do_save').value():
523
+
524
+ self.settings.child('saver_settings', 'base_name').setValue('Data')
525
+ self.settings.child('saver_settings', 'N_saved').show()
526
+ self.settings.child('saver_settings', 'N_saved').setValue(0)
527
+ self.h5saver.init_file(update_h5=True)
528
+ else:
529
+ self.settings.child('saver_settings', 'N_saved').hide()
530
+
491
531
  def param_deleted(self, param):
492
532
  """Apply deletion of settings"""
493
533
  if param.name() not in putils.iter_children(
@@ -564,10 +604,14 @@ class DAQ_Move(ParameterControlModule):
564
604
  "show_graph"
565
605
  ):
566
606
  self.ui.show_data(DataToExport(name=self.title, data=[data_act]))
607
+
567
608
  self._current_value = data_act
609
+ if self.settings['saver_settings', 'do_save']:
610
+ self.append_data()
611
+
568
612
  self.current_value_signal.emit(self._current_value)
569
613
  if (
570
- self.settings["main_settings", "tcpip", "tcp_connected"]
614
+ self.settings["main_settings", "tcpip", "tcp_connected"]
571
615
  and self._send_to_tcpip
572
616
  ):
573
617
  self._command_tcpip.emit(ThreadCommand("position_is", data_act))
@@ -103,7 +103,9 @@ class DAQ_Viewer(ParameterControlModule):
103
103
  data_saved = Signal()
104
104
  grab_status = Signal(bool)
105
105
 
106
- params = daq_viewer_params
106
+ params = daq_viewer_params + [
107
+ {'title': 'Saver Settings:', 'name': 'saver_settings', 'type': 'group',
108
+ 'visible': False, 'children': H5Saver.params}]
107
109
 
108
110
  listener_class = ViewerActorListener
109
111
  ui: Optional[DAQ_Viewer_UI]
@@ -162,7 +164,6 @@ class DAQ_Viewer(ParameterControlModule):
162
164
  module_saving.DetectorExtendedSaver] = None
163
165
  self._h5saver_continuous: Optional[H5Saver] = None
164
166
  self._ind_continuous_grab = 0
165
- self.setup_continuous_saving()
166
167
 
167
168
  self.settings.child('main_settings', 'DAQ_type').setValue(self.daq_type.name)
168
169
  self._detectors: List[str] = [det_dict['name'] for det_dict in DET_TYPES[self.daq_type.name]]
@@ -171,6 +172,13 @@ class DAQ_Viewer(ParameterControlModule):
171
172
  else:
172
173
  raise DetectorError('No detected Detector')
173
174
  self.settings.child('main_settings', 'detector_type').setValue(self._detector)
175
+ for hidden_param in ('custom_name',
176
+ 'current_scan_name',
177
+ 'current_scan_path',
178
+ 'current_h5_file',
179
+ 'new_file',
180
+ 'base_name'):
181
+ self.settings.child('saver_settings', hidden_param).setOpts(visible=False)
174
182
 
175
183
  self._grabing: bool = False
176
184
  self._do_bkg: bool = False
@@ -199,14 +207,15 @@ class DAQ_Viewer(ParameterControlModule):
199
207
  def __repr__(self):
200
208
  return f'{self.__class__.__name__}: {self.title} ({self.daq_type}/{self.detector}'
201
209
 
202
- def setup_continuous_saving(self):
210
+ def setup_continuous_saving(self, init: bool = True):
203
211
  """Configure the objects dealing with the continuous saving mode"""
204
- self.module_and_data_saver = module_saving.DetectorSaver(self)
205
- self._h5saver_continuous = H5Saver(save_type='detector')
206
- self._h5saver_continuous.show_settings(False)
207
- self._h5saver_continuous.settings.child('do_save').sigValueChanged.connect(self._init_continuous_save)
208
- if self.ui is not None:
209
- self.ui.add_setting_tree(self._h5saver_continuous.settings_tree)
212
+ if init:
213
+ self.module_and_data_saver = module_saving.DetectorSaver(self)
214
+ self._h5saver_continuous = H5Saver(save_type='detector')
215
+ self._h5saver_continuous.settings.child('do_save').sigValueChanged.connect(self._init_continuous_save)
216
+ else:
217
+ self._h5saver_continuous.close_file()
218
+
210
219
 
211
220
  def process_ui_cmds(self, cmd: utils.ThreadCommand):
212
221
  """Process commands sent by actions done in the ui
@@ -632,9 +641,9 @@ class DAQ_Viewer(ParameterControlModule):
632
641
  """
633
642
  if self._h5saver_continuous.settings.child('do_save').value():
634
643
 
635
- self._h5saver_continuous.settings.child('base_name').setValue('Data')
636
- self._h5saver_continuous.settings.child('N_saved').show()
637
- self._h5saver_continuous.settings.child('N_saved').setValue(0)
644
+ self.settings.child('saver_settings', 'base_name').setValue('Data')
645
+ self.settings.child('saver_settings', 'N_saved').show()
646
+ self.settings.child('saver_settings', 'N_saved').setValue(0)
638
647
  self.module_and_data_saver.h5saver = self._h5saver_continuous
639
648
  self._h5saver_continuous.init_file(update_h5=True)
640
649
 
@@ -645,7 +654,7 @@ class DAQ_Viewer(ParameterControlModule):
645
654
  self.grab_done_signal.connect(self.append_data)
646
655
  else:
647
656
  self._do_continuous_save = False
648
- self._h5saver_continuous.settings.child('N_saved').hide()
657
+ self.settings.child('saver_settings', 'N_saved').hide()
649
658
  self.grab_done_signal.disconnect(self.append_data)
650
659
 
651
660
  try:
@@ -674,13 +683,13 @@ class DAQ_Viewer(ParameterControlModule):
674
683
  dte = self._data_to_save_export
675
684
  init_step = kwargs.pop('init_step', None)
676
685
  if init_step is None:
677
- init_step = self._h5saver_continuous.settings['N_saved'] == 0
686
+ init_step = self.settings['saver_settings', 'N_saved'] == 0
678
687
  self._add_data_to_saver(dte,
679
688
  init_step=init_step,
680
689
  where=where,
681
690
  **kwargs)
682
691
 
683
- self._h5saver_continuous.settings.child('N_saved').setValue(self._h5saver_continuous.settings['N_saved'] + 1)
692
+ self.settings.child('saver_settings', 'N_saved').setValue(self.settings['saver_settings', 'N_saved'] + 1)
684
693
 
685
694
  def insert_data(self, indexes: Tuple[int], where: Union[Node, str] = None,
686
695
  distribution=DataDistribution['uniform']):
@@ -960,7 +969,7 @@ class DAQ_Viewer(ParameterControlModule):
960
969
 
961
970
  path = self.settings.childPath(param)
962
971
  if param.name() == 'DAQ_type':
963
- self._h5saver_continuous.settings.child('do_save').setValue(False)
972
+ self.settings.child('saver_settings', 'do_save').setValue(False)
964
973
  self.settings.child('main_settings', 'axes').show(param.value() == 'DAQ2D')
965
974
 
966
975
  elif param.name() == 'show_averaging':
@@ -992,12 +1001,18 @@ class DAQ_Viewer(ParameterControlModule):
992
1001
  viewer.x_axis, viewer.y_axis = self.get_scaling_options()
993
1002
 
994
1003
  elif param.name() == 'continuous_saving_opt':
995
- self._h5saver_continuous.show_settings(param.value())
1004
+ self.settings.child('saver_settings').setOpts(visible=param.value())
1005
+
996
1006
 
997
1007
  elif param.name() == 'wait_time':
998
1008
  self.command_hardware.emit(ThreadCommand(ControlToHardwareViewer.UPDATE_WAIT_TIME,
999
1009
  [param.value()]))
1000
1010
 
1011
+ elif param.name() in putils.iter_children(self.settings.child('saver_settings'), []):
1012
+ if param.name() == 'do_save':
1013
+ self.setup_continuous_saving(param.value())
1014
+ self._h5saver_continuous.settings.child(*path[1:]).setValue(param.value())
1015
+
1001
1016
  self._update_settings(param=param)
1002
1017
 
1003
1018
  def child_added(self, param, data):
@@ -17,6 +17,8 @@ class MockDAQViewer:
17
17
  self.h5saver = h5saver
18
18
  self.title = title
19
19
  self.module_and_data_saver = DetectorSaver(self)
20
+ self.module_and_data_saver.h5saver = h5saver
21
+ self._module_and_data_saver = self.module_and_data_saver
20
22
  self.ui = None
21
23
 
22
24
 
@@ -28,6 +30,8 @@ class MockDAQMove:
28
30
  self.h5saver = h5saver
29
31
  self.title = title
30
32
  self.module_and_data_saver = ActuatorTimeSaver(self)
33
+ self.module_and_data_saver.h5saver = h5saver
34
+ self._module_and_data_saver = self.module_and_data_saver
31
35
  self.ui = None
32
36
 
33
37
 
@@ -35,6 +39,8 @@ class ModulesManagerMock:
35
39
  def __init__(self, actuators, detectors):
36
40
  self.modules_all = actuators + detectors
37
41
  self.modules = actuators + detectors
42
+ self.detectors_all = detectors
43
+ self.actuators_all = actuators
38
44
 
39
45
 
40
46
  class MockScan:
@@ -194,6 +194,8 @@ params = [
194
194
 
195
195
  {'title': 'Refresh value (ms):', 'name': 'refresh_timeout', 'type': 'int',
196
196
  'value': config('actuator', 'refresh_timeout_ms')},
197
+ {'title': 'Continuous saving:', 'name': 'continuous_saving_opt', 'type': 'bool', 'default': False,
198
+ 'value': False},
197
199
  {'title': 'TCP/IP options:', 'name': 'tcpip', 'type': 'group', 'visible': True, 'expanded': False,
198
200
  'children': [
199
201
  {'title': 'Connect to server:', 'name': 'connect_server', 'type': 'bool_push', 'label': 'Connect',
@@ -337,7 +339,7 @@ class DAQ_Move_base(QObject):
337
339
  data=[np.zeros(self.data_shape, dtype=float)],
338
340
  units=self.axis_unit)
339
341
 
340
- self.poll_timer = QTimer()
342
+ self.poll_timer = QTimer(self)
341
343
  self.poll_timer.setInterval(config('actuator', 'polling_interval_ms'))
342
344
  self._poll_timeout = config('actuator', 'polling_timeout_s')
343
345
  self.poll_timer.timeout.connect(self.check_target_reached)
@@ -168,7 +168,7 @@ class ControlModule(QObject):
168
168
 
169
169
  @property
170
170
  def module_and_data_saver(self):
171
- if not self._module_and_data_saver.h5saver.isopen():
171
+ if self._module_and_data_saver.h5saver is None or not self._module_and_data_saver.h5saver.isopen():
172
172
  self._module_and_data_saver.h5saver = self.h5saver
173
173
  return self._module_and_data_saver
174
174
 
@@ -177,7 +177,6 @@ class ControlModule(QObject):
177
177
  self._module_and_data_saver = mod
178
178
  self._module_and_data_saver.h5saver = self.h5saver
179
179
 
180
-
181
180
  def custom_command(self, command: str, **kwargs):
182
181
  self.command_hardware.emit(ThreadCommand(command, kwargs))
183
182
 
@@ -233,7 +233,7 @@ class DashBoard(CustomApp):
233
233
  self.preset_manager = None
234
234
  self.roi_saver: ROISaver = None
235
235
 
236
- self.remote_timer = QtCore.QTimer()
236
+ self.remote_timer = QtCore.QTimer(self)
237
237
  self.remote_manager = None
238
238
  self.shortcuts = dict([])
239
239
  self.joysticks = dict([])
@@ -54,7 +54,7 @@ class FunctionPlotter(CustomApp):
54
54
  # self.setup_actions() # see ActionManager MixIn class
55
55
  # self.setup_menu()
56
56
  # self.connect_things()
57
- self.timer = QTimer()
57
+ self.timer = QTimer(self)
58
58
  self.timer.setInterval(self.settings['plot_refresh'])
59
59
  self.timer.timeout.connect(self.plot_timer)
60
60
 
@@ -151,24 +151,24 @@ class DAQScan(QObject, ParameterManager):
151
151
  self.plot_colors = utils.plot_colors
152
152
 
153
153
  self.runner_thread: QThread = None
154
- self._h5saver: H5Saver = None
155
- self._module_and_data_saver: module_saving.ScanSaver = None
156
154
 
157
155
  self.modules_manager = ModulesManager(self.dashboard.detector_modules, self.dashboard.actuators_modules)
158
156
  self.modules_manager.settings.child('data_dimensions').setOpts(expanded=False)
159
157
  self.modules_manager.settings.child('actuators_positions').setOpts(expanded=False)
160
158
  self.modules_manager.detectors_changed.connect(self.clear_plot_from)
161
159
 
162
- self.module_and_data_saver = module_saving.ScanSaver(self)
160
+
161
+ self._h5saver = H5Saver(backend=config_utils('general', 'hdf5_backend'))
162
+ self._h5saver.settings.child('do_save').hide()
163
+ self._h5saver.settings.child('custom_name').hide()
164
+ self._h5saver.new_file_sig.connect(self.create_new_file)
165
+
166
+ self._module_and_data_saver: module_saving.ScanSaver = module_saving.ScanSaver(self)
163
167
 
164
168
  self.extended_saver: data_saving.DataToExportExtendedSaver = None
165
169
  self.h5temp: H5Saver = None
166
170
  self.temp_path: tempfile.TemporaryDirectory = None
167
171
 
168
- self.h5saver.settings.child('do_save').hide()
169
- self.h5saver.settings.child('custom_name').hide()
170
- self.h5saver.new_file_sig.connect(self.create_new_file)
171
-
172
172
  self.scanner = Scanner(actuators=self.modules_manager.actuators) # , adaptive_losses=adaptive_losses)
173
173
  self.scan_parameters = None
174
174
 
@@ -186,7 +186,7 @@ class DAQScan(QObject, ParameterManager):
186
186
  self.set_config()
187
187
 
188
188
  self.live_plotter = LoaderPlotter(self.dockarea)
189
- self.live_timer = QtCore.QTimer()
189
+ self.live_timer = QtCore.QTimer(self)
190
190
  self.live_timer.timeout.connect(self.update_live_plots)
191
191
 
192
192
  self.ui.enable_start_stop(True)
@@ -202,7 +202,7 @@ class DAQScan(QObject, ParameterManager):
202
202
  self.settings.child('plot_options', 'plot_1d').setValue(data1D)
203
203
 
204
204
  def setup_ui(self):
205
- self.ui.populate_toolbox_widget([self.settings_tree, self.h5saver.settings_tree],
205
+ self.ui.populate_toolbox_widget([self.settings_tree, self._h5saver.settings_tree],
206
206
  ['General Settings', 'Save Settings'])
207
207
 
208
208
  self.ui.set_scanner_settings(self.scanner.parent_widget)
@@ -526,6 +526,9 @@ class DAQScan(QObject, ParameterManager):
526
526
  def h5saver(self):
527
527
  if self._h5saver is None:
528
528
  self._h5saver = H5Saver(backend=config_utils('general', 'hdf5_backend'))
529
+ self._h5saver.settings.child('do_save').hide()
530
+ self._h5saver.settings.child('custom_name').hide()
531
+ self._h5saver.new_file_sig.connect(self.create_new_file)
529
532
  if self._h5saver.h5_file is None:
530
533
  self._h5saver.init_file(update_h5=True)
531
534
  if not self._h5saver.isopen():
@@ -795,6 +798,7 @@ class DAQScan(QObject, ParameterManager):
795
798
  In case the dialog is cancelled, return False and aborts the scan
796
799
  """
797
800
  try:
801
+
798
802
  res = self.update_scan_info()
799
803
  if not res:
800
804
  return False
@@ -822,17 +826,6 @@ class DAQScan(QObject, ParameterManager):
822
826
  text="There are not enough or too much selected move modules for this scan")
823
827
  return False
824
828
 
825
- ## TODO the stuff about adaptive scans have to be moved into a dedicated extension. M
826
- ## Most similat to the Bayesian one!
827
- if self.scanner.scan_sub_type == 'Adaptive':
828
- #todo include this in scanners objects for the adaptive scanners
829
- if len(self.modules_manager.get_selected_probed_data('0D')) == 0:
830
- messagebox(
831
- text="In adaptive mode, you have to pick a 0D signal from which the "
832
- "algorithm will determine the next positions to scan, see 'probe_data'"
833
- " in the modules selector panel")
834
- return False
835
-
836
829
  self.ui.n_scan_steps = self.scanner.n_steps
837
830
 
838
831
  # check if the modules are initialized
@@ -907,6 +900,7 @@ class DAQScan(QObject, ParameterManager):
907
900
  if self.ui.is_action_checked('move_at'):
908
901
  self.ui.get_action('move_at').trigger()
909
902
 
903
+ self._module_and_data_saver.h5saver = self.h5saver
910
904
  res = self.set_scan()
911
905
  if res:
912
906
  # deactivate module controls using remote_control
@@ -926,9 +920,9 @@ class DAQScan(QObject, ParameterManager):
926
920
  else:
927
921
  scan_shape = self.scanner.get_scan_shape()
928
922
  for det in self.modules_manager.detectors:
929
- det.module_and_data_saver = (
923
+ det._module_and_data_saver = (
930
924
  module_saving.DetectorExtendedSaver(det, scan_shape))
931
- self.module_and_data_saver.h5saver = self.h5saver # force the update as the h5saver ill also be set on each detectors
925
+ self._module_and_data_saver.h5saver = self.h5saver # force the update as the h5saver will also be set on each detectors
932
926
 
933
927
  # mandatory to deal with multithreads
934
928
  if self.runner_thread is not None:
@@ -848,7 +848,7 @@ class PIDRunner(QObject):
848
848
  [queue_input.append(output) for queue_input, output in zip(self.queue_inputs, self.outputs)] # Prefill queues with initial output
849
849
  self.clear_queues = True # Clear queues on first iteration
850
850
 
851
- # self.timeout_timer = QtCore.QTimer()
851
+ # self.timeout_timer = QtCore.QTimer(self)
852
852
  # self.timeout_timer.setInterval(10000)
853
853
  # self.timeout_scan_flag = False
854
854
  # self.timeout_timer.timeout.connect(self.timeout)
@@ -43,7 +43,7 @@ class ChronoTimer(QObject):
43
43
  self.duration = timedelta(**duration) # seconds
44
44
  self.displayed_time = 0 # in seconds
45
45
  self.started = False
46
- self.timer = QTimer()
46
+ self.timer = QTimer(self)
47
47
  self.timer.setInterval(100)
48
48
  self.timer.timeout.connect(self.display_time)
49
49
 
@@ -8,7 +8,7 @@ from pymodaq.utils.config import get_set_preset_path
8
8
  from pymodaq.extensions.utils import CustomExt
9
9
 
10
10
 
11
- def load_dashboard_with_preset(preset_name: str, extension_name: str) -> \
11
+ def load_dashboard_with_preset(preset_name: str, extension_name: str = None) -> \
12
12
  (DashBoard, CustomExt, QMainWindow):
13
13
 
14
14
  """ Load the Dashboard using a given preset then load an extension
@@ -377,10 +377,15 @@ class ScanSaver(ModuleSaver):
377
377
  self._module: DAQScan = module
378
378
  self._h5saver = None
379
379
 
380
+ for detector in self._module.modules_manager.detectors_all:
381
+ detector._module_and_data_saver = DetectorSaver(detector)
382
+ for actuator in self._module.modules_manager.actuators_all:
383
+ actuator._module_and_data_saver = ActuatorSaver(actuator)
384
+
380
385
  def update_after_h5changed(self):
381
386
  for module in self._module.modules_manager.modules_all:
382
- if hasattr(module, 'module_and_data_saver'):
383
- module.module_and_data_saver.h5saver = self.h5saver
387
+ if hasattr(module, '_module_and_data_saver'):
388
+ module._module_and_data_saver.h5saver = self.h5saver
384
389
 
385
390
  def forget_h5(self):
386
391
  for module in self._module.modules_manager.modules_all:
@@ -99,7 +99,7 @@ class LECODirector:
99
99
 
100
100
  def start_timer(self) -> None:
101
101
  """To be called in child classes."""
102
- self.timer = QTimer()
102
+ self.timer = QTimer(self)
103
103
  self.timer.timeout.connect(self.check_actor_connection)
104
104
  try:
105
105
  # cast is used by the type checker to infer the returned type (when many are possible)
@@ -194,7 +194,7 @@ class ModulesManager(QObject, ParameterManager):
194
194
  return self.get_mods_from_names(self.selected_detectors_name)
195
195
 
196
196
  @property
197
- def detectors_all(self):
197
+ def detectors_all(self) -> List['DAQ_Viewer']:
198
198
  """Get/Set the list of all detectors"""
199
199
  return self._detectors
200
200
 
@@ -202,7 +202,6 @@ class ModulesManager(QObject, ParameterManager):
202
202
  def detectors_all(self, detectors: List['DAQ_Viewer']):
203
203
  self._detectors = detectors
204
204
 
205
-
206
205
  @property
207
206
  def actuators(self) -> List['DAQ_Move']:
208
207
  """Get the list of selected actuators"""
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes