pymodaq 4.4.6__py3-none-any.whl → 4.4.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

@@ -12,12 +12,14 @@ import xml.etree.ElementTree as ET
12
12
 
13
13
  import numpy as np
14
14
 
15
+ from pymodaq.utils.logger import set_logger, get_module_name
15
16
  from pymodaq.utils.abstract import ABCMeta, abstract_attribute, abstractmethod
16
17
  from pymodaq.utils.daq_utils import capitalize
17
18
  from pymodaq.utils.data import Axis, DataDim, DataWithAxes, DataToExport, DataDistribution
18
- from .saving import H5SaverLowLevel
19
- from .backends import GROUP, CARRAY, Node, GroupType
20
- from .data_saving import DataToExportSaver, AxisSaverLoader, DataToExportTimedSaver, DataToExportExtendedSaver
19
+ from pymodaq.utils.h5modules.saving import H5SaverLowLevel
20
+ from pymodaq.utils.h5modules.backends import GROUP, CARRAY, Node, GroupType
21
+ from pymodaq.utils.h5modules.data_saving import (DataToExportSaver, AxisSaverLoader,
22
+ DataToExportTimedSaver, DataToExportExtendedSaver)
21
23
  from pymodaq.utils.parameter import ioxml
22
24
 
23
25
  if TYPE_CHECKING:
@@ -27,6 +29,9 @@ if TYPE_CHECKING:
27
29
  from pymodaq.utils.h5modules.h5logging import H5Logger
28
30
 
29
31
 
32
+ logger = set_logger(get_module_name(__file__))
33
+
34
+
30
35
  class ModuleSaver(metaclass=ABCMeta):
31
36
  """Abstract base class to save info and data from main modules (DAQScan, DAQViewer, DAQMove, ...)"""
32
37
  group_type: GroupType = abstract_attribute()
@@ -373,7 +378,7 @@ class ScanSaver(ModuleSaver):
373
378
  try:
374
379
  detector.insert_data(indexes, where=self._module_group, distribution=distribution)
375
380
  except Exception as e:
376
- pass
381
+ logger.exception(f'Cannot insert data: {str(e)}')
377
382
 
378
383
 
379
384
  class LoggerSaver(ScanSaver):
@@ -355,12 +355,12 @@ class ModulesManager(QObject, ParameterManager):
355
355
  sig.connect(slot)
356
356
  else:
357
357
 
358
- for sig in [mod.grab_done_signal for mod in self.detectors_all]:
358
+ for sig in [mod.grab_done_signal for mod in self.detectors]:
359
359
  try:
360
360
  sig.disconnect(slot)
361
361
  except TypeError as e:
362
362
  # means the slot was not previously connected
363
- logger.info(str(e))
363
+ logger.info(f'Could not disconnect grab signal from the {slot} slot', stacklevel=2)
364
364
 
365
365
  self.detectors_connected = connect
366
366
 
@@ -17,7 +17,7 @@ logger = set_logger(get_module_name(__file__))
17
17
  remote_path = pymodaq.utils.config.get_set_remote_path()
18
18
  remote_types = ['ShortCut', 'Joystick']
19
19
 
20
- actuator_actions = ['move_Rel', 'move_Rel_p', 'move_Rel_m']
20
+ actuator_actions = ['move_rel', 'move_rel_p', 'move_rel_m']
21
21
  detector_actions = ['snap', 'grab', 'stop']
22
22
  remote_types = ['Keyboard', 'Joystick']
23
23
  try:
@@ -7,7 +7,7 @@ import numpy as np
7
7
 
8
8
  class SliderSpinBox(QtWidgets.QWidget):
9
9
 
10
- def __init__(self, *args, subtype='lin', **kwargs):
10
+ def __init__(self, *args, subtype='linear', **kwargs):
11
11
 
12
12
  super().__init__()
13
13
  self.subtype = subtype
@@ -465,6 +465,8 @@ class View2D(ActionManager, QtCore.QObject):
465
465
  tip='Flip the image left/right', checkable=True)
466
466
  self.add_action('rotate', 'Rotate', 'rotation2',
467
467
  tip='Rotate the image', checkable=True)
468
+ self.add_action('opposite', 'Opposite', 'remove',
469
+ tip='Take the opposite of the image', checkable=True)
468
470
  self.add_action('legend', 'Legend', 'RGB',
469
471
  tip='Show the legend', checkable=True)
470
472
 
@@ -877,6 +879,8 @@ class Viewer2D(ViewerBase):
877
879
  data = np.fliplr(data)
878
880
  if self.view.is_action_checked('rotate'):
879
881
  data = np.flipud(np.transpose(data))
882
+ if self.view.is_action_checked('opposite'):
883
+ data = -data
880
884
  return data
881
885
 
882
886
  def set_visible_items(self):
@@ -917,6 +921,7 @@ class Viewer2D(ViewerBase):
917
921
  self.view.connect_action('flip_ud', slot=self.update_data)
918
922
  self.view.connect_action('flip_lr', slot=self.update_data)
919
923
  self.view.connect_action('rotate', slot=self.update_data)
924
+ self.view.connect_action('opposite', slot=self.update_data)
920
925
  self.view.connect_action('autolevels', slot=self.update_data)
921
926
  self.view.connect_action('isocurve', slot=self.update_data)
922
927
  self.view.histogrammer.gradient_changed.connect(lambda: setattr(self, '_is_gradient_manually_set', True))
pymodaq/utils/slicing.py CHANGED
@@ -26,7 +26,7 @@ class SpecialSlicersData(SpecialSlicers):
26
26
  def __setitem__(self, slices, data: Union[np.ndarray, 'DataWithAxes', 'Axis']):
27
27
  """x.__setitem__(slices, data) <==> x[slices]=data
28
28
  """
29
- slices = self.obj._compute_slices(slices, self.is_navigation)
29
+ total_slices, slices_index = self.obj._compute_slices(slices, self.is_navigation)
30
30
 
31
31
  if hasattr(self.obj, 'base_type') and self.obj.base_type == 'Axis':
32
32
  if isinstance(data, np.ndarray):
@@ -35,14 +35,14 @@ class SpecialSlicersData(SpecialSlicers):
35
35
  data_to_replace = data.get_data()
36
36
  if hasattr(self.obj, 'units') and self.obj.data is None:
37
37
  self.obj.create_linear_data(len(self.obj))
38
- self.obj.data[slices] = data_to_replace
38
+ self.obj.data[total_slices] = data_to_replace
39
39
  else:
40
40
  for ind in range(len(self.obj)):
41
41
  if isinstance(data, np.ndarray):
42
42
  data_to_replace = data
43
43
  else: # means it's a DataWithAxes
44
44
  data_to_replace = data[ind]
45
- self.obj[ind][slices] = data_to_replace
45
+ self.obj[ind][total_slices] = data_to_replace
46
46
 
47
47
  def __len__(self):
48
48
  return self.obj.axes_manager.sig_shape[0]
@@ -5,8 +5,9 @@ Created the 20/10/2023
5
5
  @author: Sebastien Weber
6
6
  """
7
7
  from base64 import b64encode, b64decode
8
+ from enum import Enum
8
9
  import numbers
9
- from typing import Tuple, List, Union, TYPE_CHECKING, Iterable
10
+ from typing import Optional, Tuple, List, Union, TYPE_CHECKING
10
11
 
11
12
 
12
13
  import numpy as np
@@ -20,17 +21,38 @@ if TYPE_CHECKING:
20
21
 
21
22
 
22
23
  SERIALIZABLE = Union[
23
- int,
24
+ # native
25
+ bool,
26
+ bytes,
24
27
  str,
25
- numbers.Number,
28
+ complex, # float and int are subtypes for type hinting
29
+ float,
30
+ int,
26
31
  list,
32
+ # numpy
27
33
  np.ndarray,
34
+ # pymodaq
28
35
  Axis,
29
36
  DataWithAxes,
30
37
  DataToExport,
38
+ putils.ParameterWithPath,
31
39
  ]
32
40
 
33
41
 
42
+ class SerializableTypes(Enum):
43
+ """Type names of serializable types"""
44
+ BOOL = "bool"
45
+ BYTES = "bytes"
46
+ STRING = "string"
47
+ SCALAR = "scalar"
48
+ LIST = "list"
49
+ ARRAY = "array"
50
+ AXIS = "axis"
51
+ DATA_WITH_AXES = "dwa"
52
+ DATA_TO_EXPORT = "dte"
53
+ PARAMETER = "parameter"
54
+
55
+
34
56
  class SocketString:
35
57
  """Mimic the Socket object but actually using a bytes string not a socket connection
36
58
 
@@ -86,7 +108,7 @@ class Serializer:
86
108
  """Used to Serialize to bytes python objects, numpy arrays and PyMoDAQ DataWithAxes and
87
109
  DataToExport objects"""
88
110
 
89
- def __init__(self, obj: SERIALIZABLE = None):
111
+ def __init__(self, obj: Optional[SERIALIZABLE] = None) -> None:
90
112
  self._bytes_string = b''
91
113
  self._obj = obj
92
114
 
@@ -154,7 +176,7 @@ class Serializer:
154
176
  return message.encode()
155
177
 
156
178
  @classmethod
157
- def str_len_to_bytes(cls, message: Union[str, bytes]) -> (bytes, bytes):
179
+ def str_len_to_bytes(cls, message: Union[str, bytes]) -> Tuple[bytes, bytes]:
158
180
  """ Convert a string and its length to two bytes
159
181
  Parameters
160
182
  ----------
@@ -174,7 +196,7 @@ class Serializer:
174
196
  return message, cls.int_to_bytes(len(message))
175
197
 
176
198
  def _int_serialization(self, int_obj: int) -> bytes:
177
- """serialize an unsigned integer used for getting the length of messages internaly, for outside integer
199
+ """Serialize an unsigned integer used for getting the length of messages internally, for outside integer
178
200
  serialization or deserialization use scalar_serialization"""
179
201
  int_bytes = self.int_to_bytes(int_obj)
180
202
  bytes_string = int_bytes
@@ -205,18 +227,19 @@ class Serializer:
205
227
  self._bytes_string += bytes_string
206
228
  return bytes_string
207
229
 
208
- def scalar_serialization(self, scalar: numbers.Number) -> bytes:
230
+ def scalar_serialization(self, scalar: complex) -> bytes:
209
231
  """ Convert a scalar into a bytes message together with the info to convert it back
210
232
 
211
233
  Parameters
212
234
  ----------
213
- scalar: str
235
+ scalar: A python number (complex or subtypes like float and int)
214
236
 
215
237
  Returns
216
238
  -------
217
239
  bytes: the total bytes message to serialize the scalar
218
240
  """
219
241
  if not isinstance(scalar, numbers.Number):
242
+ # type hint is complex, instance comparison Number
220
243
  raise TypeError(f'{scalar} should be an integer or a float, not a {type(scalar)}')
221
244
  scalar_array = np.array([scalar])
222
245
  data_type = scalar_array.dtype.descr[0][1]
@@ -350,49 +373,56 @@ class Serializer:
350
373
  self._bytes_string += bytes_string
351
374
  return bytes_string
352
375
 
353
- def type_and_object_serialization(self, obj):
376
+ def type_and_object_serialization(self, obj: Optional[SERIALIZABLE] = None) -> bytes:
377
+ """Serialize an object with its type, such that it can be retrieved by
378
+ `DeSerializer.type_and_object_deserialization`.
379
+ """
380
+
381
+ if obj is None and self._obj is not None:
382
+ obj = self._obj
383
+
354
384
  bytes_string = b''
355
385
  if isinstance(obj, DataWithAxes):
356
- bytes_string += self.string_serialization('dwa')
386
+ bytes_string += self.string_serialization(SerializableTypes.DATA_WITH_AXES.value)
357
387
  bytes_string += self.dwa_serialization(obj)
358
388
 
359
389
  elif isinstance(obj, Axis):
360
- bytes_string += self.string_serialization('axis')
390
+ bytes_string += self.string_serialization(SerializableTypes.AXIS.value)
361
391
  bytes_string += self.axis_serialization(obj)
362
392
 
363
393
  elif isinstance(obj, np.ndarray):
364
- bytes_string += self.string_serialization('array')
394
+ bytes_string += self.string_serialization(SerializableTypes.ARRAY.value)
365
395
  bytes_string += self.ndarray_serialization(obj)
366
396
 
367
397
  elif isinstance(obj, bytes):
368
- bytes_string += self.string_serialization('bytes')
398
+ bytes_string += self.string_serialization(SerializableTypes.BYTES.value)
369
399
  bytes_string += self.bytes_serialization(obj)
370
400
 
371
401
  elif isinstance(obj, str):
372
- bytes_string += self.string_serialization('string')
402
+ bytes_string += self.string_serialization(SerializableTypes.STRING.value)
373
403
  bytes_string += self.string_serialization(obj)
374
404
 
375
- elif isinstance(obj, numbers.Number):
376
- bytes_string += self.string_serialization('scalar')
405
+ elif isinstance(obj, bool):
406
+ bytes_string += self.string_serialization(SerializableTypes.BOOL.value)
377
407
  bytes_string += self.scalar_serialization(obj)
378
408
 
379
- elif isinstance(obj, bool):
380
- bytes_string += self.string_serialization('bool')
381
- bytes_string += self.scalar_serialization(int(obj))
409
+ elif isinstance(obj, numbers.Number):
410
+ bytes_string += self.string_serialization(SerializableTypes.SCALAR.value)
411
+ bytes_string += self.scalar_serialization(obj)
382
412
 
383
413
  elif isinstance(obj, list):
384
- bytes_string += self.string_serialization('list')
414
+ bytes_string += self.string_serialization(SerializableTypes.LIST.value)
385
415
  bytes_string += self.list_serialization(obj)
386
416
 
387
417
  elif isinstance(obj, putils.ParameterWithPath):
388
418
  path = obj.path
389
419
  param_as_xml = ioxml.parameter_to_xml_string(obj.parameter)
390
- bytes_string += self.string_serialization('parameter')
420
+ bytes_string += self.string_serialization(SerializableTypes.PARAMETER.value)
391
421
  bytes_string += self.list_serialization(path)
392
- bytes_string += self.string_serialization(param_as_xml)
422
+ bytes_string += self.bytes_serialization(param_as_xml)
393
423
 
394
424
  elif isinstance(obj, DataToExport):
395
- bytes_string += self.string_serialization('dte')
425
+ bytes_string += self.string_serialization(SerializableTypes.DATA_TO_EXPORT.value)
396
426
  bytes_string += self.dte_serialization(obj)
397
427
 
398
428
  else:
@@ -509,7 +539,7 @@ class DeSerializer:
509
539
  :py:class:`~pymodaq.utils.tcp_ip.mysocket.Socket`
510
540
  """
511
541
 
512
- def __init__(self, bytes_string: Union[bytes, 'Socket'] = None):
542
+ def __init__(self, bytes_string: Union[bytes, 'Socket'] = None) -> None:
513
543
  if isinstance(bytes_string, bytes):
514
544
  bytes_string = SocketString(bytes_string)
515
545
  self._bytes_string = bytes_string
@@ -531,7 +561,7 @@ class DeSerializer:
531
561
  return int.from_bytes(bytes_string, 'big')
532
562
 
533
563
  @staticmethod
534
- def bytes_to_scalar(data: bytes, dtype: np.dtype) -> numbers.Number:
564
+ def bytes_to_scalar(data: bytes, dtype: np.dtype) -> complex:
535
565
  """Convert bytes to a scalar given a certain numpy dtype
536
566
 
537
567
  Parameters
@@ -588,8 +618,8 @@ class DeSerializer:
588
618
  str_obj = self._bytes_string.get_first_nbytes(string_len).decode()
589
619
  return str_obj
590
620
 
591
- def scalar_deserialization(self) -> numbers.Number:
592
- """Convert bytes into a numbers.Number object
621
+ def scalar_deserialization(self) -> complex:
622
+ """Convert bytes into a python number object
593
623
 
594
624
  Get first the data type from a string deserialization, then the data length and finally convert this
595
625
  length of bytes into a number (float, int)
@@ -602,9 +632,11 @@ class DeSerializer:
602
632
  data_len = self._int_deserialization()
603
633
  number = np.frombuffer(self._bytes_string.get_first_nbytes(data_len), dtype=data_type)[0]
604
634
  if 'f' in data_type:
605
- number = float(number) # because one get numpy float type
635
+ number = float(number) # because one get numpy float type
606
636
  elif 'i' in data_type:
607
637
  number = int(number) # because one get numpy int type
638
+ elif 'c' in data_type:
639
+ number = complex(number) # because one get numpy complex type
608
640
  return number
609
641
 
610
642
  def boolean_deserialization(self) -> bool:
@@ -642,7 +674,7 @@ class DeSerializer:
642
674
  ndarray = np.atleast_1d(ndarray) # remove singleton dimensions
643
675
  return ndarray
644
676
 
645
- def type_and_object_deserialization(self):
677
+ def type_and_object_deserialization(self) -> SERIALIZABLE:
646
678
  """ Deserialize specific objects from their binary representation (inverse of `Serializer.type_and_object_serialization`).
647
679
 
648
680
  See Also
@@ -652,28 +684,29 @@ class DeSerializer:
652
684
  """
653
685
  obj_type = self.string_deserialization()
654
686
  elt = None
655
- if obj_type == 'scalar':
687
+ if obj_type == SerializableTypes.SCALAR.value:
656
688
  elt = self.scalar_deserialization()
657
- elif obj_type == 'string':
689
+ elif obj_type == SerializableTypes.STRING.value:
658
690
  elt = self.string_deserialization()
659
- elif obj_type == 'bytes':
691
+ elif obj_type == SerializableTypes.BYTES.value:
660
692
  elt = self.bytes_deserialization()
661
- elif obj_type == 'array':
693
+ elif obj_type == SerializableTypes.ARRAY.value:
662
694
  elt = self.ndarray_deserialization()
663
- elif obj_type == 'dwa':
695
+ elif obj_type == SerializableTypes.DATA_WITH_AXES.value:
664
696
  elt = self.dwa_deserialization()
665
- elif obj_type == 'dte':
697
+ elif obj_type == SerializableTypes.DATA_TO_EXPORT.value:
666
698
  elt = self.dte_deserialization()
667
- elif obj_type == 'axis':
699
+ elif obj_type == SerializableTypes.AXIS.value:
668
700
  elt = self.axis_deserialization()
669
- elif obj_type == 'bool':
701
+ elif obj_type == SerializableTypes.BOOL.value:
670
702
  elt = self.boolean_deserialization()
671
- elif obj_type == 'list':
703
+ elif obj_type == SerializableTypes.LIST.value:
672
704
  elt = self.list_deserialization()
673
- elif obj_type == 'parameter':
705
+ elif obj_type == SerializableTypes.PARAMETER.value:
674
706
  elt = self.parameter_deserialization()
675
707
  else:
676
708
  print(f'invalid object type {obj_type}')
709
+ elt = None # desired behavior?
677
710
  return elt
678
711
 
679
712
  def list_deserialization(self) -> list:
@@ -774,4 +807,4 @@ class DeSerializer:
774
807
  data=self.list_deserialization(),
775
808
  )
776
809
  dte.timestamp = timestamp
777
- return dte
810
+ return dte
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: pymodaq
3
- Version: 4.4.6
3
+ Version: 4.4.9
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
@@ -27,6 +27,7 @@ License: The MIT License (MIT)
27
27
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
28
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29
29
  THE SOFTWARE.
30
+ License-File: AUTHORS.md
30
31
  License-File: LICENSE
31
32
  Classifier: Development Status :: 5 - Production/Stable
32
33
  Classifier: Environment :: Other Environment
@@ -44,7 +45,7 @@ Classifier: Topic :: Scientific/Engineering :: Visualization
44
45
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
45
46
  Classifier: Topic :: Software Development :: User Interfaces
46
47
  Requires-Python: >=3.7
47
- Requires-Dist: bayesian-optimization
48
+ Requires-Dist: bayesian-optimization<2.0.0
48
49
  Requires-Dist: easydict
49
50
  Requires-Dist: importlib-metadata; python_version < '3.8'
50
51
  Requires-Dist: multipledispatch
@@ -62,7 +63,8 @@ Requires-Dist: qtpy
62
63
  Requires-Dist: scipy
63
64
  Requires-Dist: setuptools>=60
64
65
  Requires-Dist: simple-pid
65
- Requires-Dist: tables<3.9
66
+ Requires-Dist: tables<3.9; python_version < '3.10'
67
+ Requires-Dist: tables>=3.10; python_version >= '3.10'
66
68
  Requires-Dist: toml
67
69
  Description-Content-Type: text/x-rst
68
70
 
@@ -3,13 +3,13 @@ pymodaq/dashboard.py,sha256=4fbV92erom0yWwqPMtx3KW1q-d6QYflV-EhOZMg24a4,64476
3
3
  pymodaq/icon.ico,sha256=hOHHfNDENKphQvG1WDleSEYcHukneR2eRFJu8isIlD4,74359
4
4
  pymodaq/splash.png,sha256=ow8IECF3tPRUMA4tf2tMu1aRiMaxx91_Y2ckVxkrmF0,53114
5
5
  pymodaq/control_modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- pymodaq/control_modules/daq_move.py,sha256=0zit9shAo6HAVxkaYdhhuSN-yu8j8T_TLSF6YOaM85Y,37842
7
- pymodaq/control_modules/daq_move_ui.py,sha256=IbqNAErwXGjKUbYEptvZUz3J8MapNBFIbQnUf9nQrMw,15753
6
+ pymodaq/control_modules/daq_move.py,sha256=-bYcTAMDNliNDoQKZ9skp6RohZv_yNU3ipyoQL16i0E,37967
7
+ pymodaq/control_modules/daq_move_ui.py,sha256=qHlZW_FQUCIENBVlZ1HciPzmXTcLf1kyXi3YHWqJyV8,16447
8
8
  pymodaq/control_modules/daq_viewer.py,sha256=5CYmdWHGE7sQApeMfdWNV3zbPyoxxYtzFlQ1PaEw4fI,57883
9
9
  pymodaq/control_modules/daq_viewer_ui.py,sha256=FWP3jdIOR9vTgYqNaaodteGZ3dwgQ1GdWKrOpOAuSrs,15693
10
10
  pymodaq/control_modules/mocks.py,sha256=hh_xSWp9g1UV3NAQVD9Ft9tNWfTsSvKU0OU0trgzP2w,1956
11
- pymodaq/control_modules/move_utility_classes.py,sha256=PDiPVAfOEAhtTc6MS0oVCy3AL-6KLSxOgYg3c5jctoA,43417
12
- pymodaq/control_modules/utils.py,sha256=5YdSwq_lFJm7IalYWe_Hn1U4LUoUmo1gedvV9UguU0Y,20016
11
+ pymodaq/control_modules/move_utility_classes.py,sha256=y0gzF1DnKdh8i3b34FasJHRlFHVaYQn2rp93ntLfjf0,43465
12
+ pymodaq/control_modules/utils.py,sha256=3uJWizLRKmHvM_9sUOhChrCW31r2Q8GtyYpFw1diBKE,19985
13
13
  pymodaq/control_modules/viewer_utility_classes.py,sha256=OHxwue1t3z2AXyeqNjnwPT2pMc8yXhnqyiWc9IdCI2c,26841
14
14
  pymodaq/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  pymodaq/examples/custom_app.py,sha256=2wQR0hlPWjZrWK0abNF6ASv8iQyJqRn2CKnBa_nAgN4,10452
@@ -38,8 +38,8 @@ pymodaq/examples/Labview_TCP_Client/cmd_types.ctl,sha256=gwuDyGcte11Zqx0C-U8ljRy
38
38
  pymodaq/extensions/__init__.py,sha256=MGZb_QDwL5nlV7XLvBGW9x0GpUwPSpECyD8lCf9EN38,459
39
39
  pymodaq/extensions/console.py,sha256=_hlHupD7DeoOcvEvN_OiGDB6_no50x2J8R6pE2eACgo,2303
40
40
  pymodaq/extensions/daq_logger.py,sha256=hEAb98fv1qJxcH9NPvaiLp1SPWkBVBwpujJhuyAiVmQ,18820
41
- pymodaq/extensions/daq_scan.py,sha256=CGBPrhLRHPmFJunKQ1aK5RgToXemzNEPdYSHn7e36DE,49414
42
- pymodaq/extensions/daq_scan_ui.py,sha256=bYJaWBLQMl2Yu1PAxc-bCldh4keWXd6l12ttrHqExE0,10181
41
+ pymodaq/extensions/daq_scan.py,sha256=gZwol7p4puiLGAiUexCGYh5iWFJXHvVDgK8menFCgZk,50684
42
+ pymodaq/extensions/daq_scan_ui.py,sha256=EHIpTZIG8wTtPI9zVzUTYBgSvvYYjc4KGSNXKGR18RI,10182
43
43
  pymodaq/extensions/h5browser.py,sha256=eQZ8YhPHdiBCyHIn1JJJLn7OgZsc1XlcETgqdafofZs,1140
44
44
  pymodaq/extensions/utils.py,sha256=sh4SxJx5_lGJ6aJE8p8VJ2zrptW8pyze73aT_52xOwQ,2255
45
45
  pymodaq/extensions/bayesian/__init__.py,sha256=QMV9tq8Axi6YjoGj4UguBO8Zvuh26r5s91bm6YU7Itk,55
@@ -47,11 +47,11 @@ pymodaq/extensions/bayesian/bayesian_optimisation.py,sha256=zB6DoyHx6nsKHsl3G4T0
47
47
  pymodaq/extensions/bayesian/utils.py,sha256=1m_NpYMr-Swg2ImtMvbh-XOxutkAVwc0M2BWeK_NMIg,15544
48
48
  pymodaq/extensions/pid/__init__.py,sha256=jm4axOgTnYVPsftjcjlvC_07KsdTY1H7CnOCYhOvY-o,473
49
49
  pymodaq/extensions/pid/actuator_controller.py,sha256=SOE2GjevbqxqxXewW0DMgoqNL_0CaPdNLjyKNc6ULKI,377
50
- pymodaq/extensions/pid/daq_move_PID.py,sha256=kqWAnYbhSMtrqu4cK1AtOuBD0UjPlrAFl-uB39ToPts,2151
50
+ pymodaq/extensions/pid/daq_move_PID.py,sha256=oH-Q9QLQgxsa8J3iWPpHMAPUCfbr72NWww1CvtKDsOA,2155
51
51
  pymodaq/extensions/pid/pid_controller.py,sha256=5iTEiv69MlHW7-sUFCzvQlqZzAoXiJ_mRQtFntvFBIE,28511
52
52
  pymodaq/extensions/pid/utils.py,sha256=pxexKSg-3a1CWLQtCFZR6ZtdI8NY1Yl7J87aSBi2q2o,7984
53
53
  pymodaq/post_treatment/__init__.py,sha256=xaaLFZJ7OLqI_7yPurFk89A7m2ywSbYDXAsdE-QQ8Zg,81
54
- pymodaq/post_treatment/load_and_plot.py,sha256=UZaAMrC3b9VXcsZsjc3-7LxxUEuia_5ECUqDB7G_EoM,12140
54
+ pymodaq/post_treatment/load_and_plot.py,sha256=a-qU4TfW7htsa_4CcJy_mB8N8Fw12Je7q7syud3y7tQ,13902
55
55
  pymodaq/post_treatment/process_to_scalar.py,sha256=NHntybqpDhDjQJ224Dhf9Ij_ql-fAEMRT6egA6UEGfA,11568
56
56
  pymodaq/post_treatment/daq_analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
57
  pymodaq/post_treatment/daq_measurement/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -59,15 +59,15 @@ pymodaq/post_treatment/daq_measurement/daq_measurement_GUI.py,sha256=1u7hWDaiwsZ
59
59
  pymodaq/post_treatment/daq_measurement/daq_measurement_GUI.ui,sha256=PyzbCWPMkh5oIYYteZczXyWMeHKW9EJmM1QlzXhnyTk,7037
60
60
  pymodaq/post_treatment/daq_measurement/daq_measurement_main.py,sha256=CAKwcWMOD86aXB8mbdxOK7e8nZRos5d59FzDtqK1QoY,17093
61
61
  pymodaq/post_treatment/daq_measurement/process_from_QtDesigner_DAQ_Measurement_GUI.bat,sha256=e1tu2A67MS9fk3jhriF6saQgRxWIucIvNW92iWXFP6E,164
62
- pymodaq/resources/VERSION,sha256=WLq0vLL18vLMV1jwQsziDmyw7JVoEVuWAB0pDGzYEvM,19
62
+ pymodaq/resources/VERSION,sha256=HCHu__82Om9w1u_QhsnnzUERTkbBbAZvkhKcnN1x334,19
63
63
  pymodaq/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- pymodaq/resources/config_template.toml,sha256=d3pofgIK5FxaRMELAI1qEsRcMD3GlYd87zZjDj9G9m0,3210
64
+ pymodaq/resources/config_template.toml,sha256=twhcKsROU3fFKPQq7CcB5gXI4w6U6ZeAxaUQZcRmxZ4,3232
65
65
  pymodaq/resources/preset_default.xml,sha256=Dt8iWLwPPOPtcG00JCVP-mh-G7KC6B0YN8hd8RQdnNI,27256
66
66
  pymodaq/resources/setup_plugin.py,sha256=jvMuSp4UxGaPUe9uPUvHg9DrdwyFakG6_sFy_zXb1f8,3182
67
67
  pymodaq/resources/triangulation_data.npy,sha256=Dzq6eE8f_i7Woloy1iUn6N1OfVdBZ4WnK4J4SCoqXso,9320
68
68
  pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.bat,sha256=gqBmrc6Cfzn7wIZQtzgcglKRQ8zLXLW9Xt8LWxkJdw0,205
69
69
  pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.qrc,sha256=S99847o7hvKYOWa9lR3qErMHwcjhjYPEduoq2ylCn4I,10123
70
- pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources_rc.py,sha256=ctA38bv3tKIJVsDgqujg0uHSnByecXZPZMZSXgxogHA,8332435
70
+ pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources_rc.py,sha256=1JdB2hKdHSrBH-uIFylPcuTtTN94hhgiP0zlfWRyAfQ,8332434
71
71
  pymodaq/resources/QtDesigner_Ressources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
72
  pymodaq/resources/QtDesigner_Ressources/credit.rst,sha256=F2PpCDeMkzYWb47RwrIrwujefiiiN25gI2d3s5QqjeI,342
73
73
  pymodaq/resources/QtDesigner_Ressources/icons.svg,sha256=7leLubaJv4E_JnmTdQw00HvrmFBZ3koShefBUbZ2UkU,5703
@@ -312,7 +312,7 @@ pymodaq/utils/chrono_timer.py,sha256=rwX8apS8B-IKhA0Cp2H9tLz0BRN7G3Pg5ptozvd3MKM
312
312
  pymodaq/utils/config.py,sha256=0QqoBJC4ECuIeh1UsvUQqhxkKl7Vfgi4iERp-6qNWAc,16202
313
313
  pymodaq/utils/conftests.py,sha256=3Ak8WEpa3EhAp73Yb1LLq8YFONhPqiL7gG9eSDIoTNc,58
314
314
  pymodaq/utils/daq_utils.py,sha256=0jTrbT0aaZr3KaTgeDicmK9FbVnu3iaWBmNHnNJpr3A,28050
315
- pymodaq/utils/data.py,sha256=rasOk1-2o8fJHE_zm7ygrWXL7cBOHJOgwWMZhbVG7z0,111863
315
+ pymodaq/utils/data.py,sha256=v5ONtOH4E51ZNIIsPEtMTnHlFSrhC7t5gwno_Z3dckw,114198
316
316
  pymodaq/utils/enums.py,sha256=wpRipioUJkKcEfoaY2NrDQ2WhGxZTZiZoJty5f2Ljpc,2236
317
317
  pymodaq/utils/exceptions.py,sha256=wLO6VlofzfwWkOOWMN2B-3NEWMfpgygyeEdakIx_rAs,668
318
318
  pymodaq/utils/factory.py,sha256=QLqAPFnTZ93eUpmAAIr7kESDk2enD57RNSuFUsjxE4E,2311
@@ -320,7 +320,7 @@ pymodaq/utils/logger.py,sha256=VxymWeeS38VjNre3wjY_lBv06ynstPyI5JrFNgo4PXc,2754
320
320
  pymodaq/utils/math_utils.py,sha256=bh8pMXomoAv_Lxfq26izDacK9RByFi3QUbPd-zFVqpA,18532
321
321
  pymodaq/utils/messenger.py,sha256=N5SPc9NomIGtK0TihQ0oq9evlxyWNYELWfpr2s8PoWw,2072
322
322
  pymodaq/utils/qvariant.py,sha256=iIBp-DDk5OVBIEqX5SwqwrJyy5t2cRgFFyfgvxQOHqM,311
323
- pymodaq/utils/slicing.py,sha256=qhi70yX6HltIhPCRdz8tob34p1d0gGTa5_XZvKKl8iM,2207
323
+ pymodaq/utils/slicing.py,sha256=gvxJPe-A7pWoCSZ1U2ukOq3m6VRf981ggSmcETQ5DGI,2239
324
324
  pymodaq/utils/units.py,sha256=Tj4O5qZBMBuUbjTZSH10UzSbU5z_SHVSu2VLw82tceE,3959
325
325
  pymodaq/utils/abstract/__init__.py,sha256=m7GEoQdFlnWuhwp-qlJ5S_Il6pKDyMEX8MAPlfDSxKU,1260
326
326
  pymodaq/utils/abstract/logger.py,sha256=I-t-2nSIVHHUfHJ-3IoqsuULZiIsXRe4saotaEL3-Fk,1095
@@ -336,22 +336,22 @@ pymodaq/utils/gui_utils/layout.py,sha256=6oczLLGwwEN4EQ8yUDnz0-4Ue2wlyCRklKsVD1G
336
336
  pymodaq/utils/gui_utils/list_picker.py,sha256=ddYnRTlRlgwdJSy0Q98IzYWHzIf2GS6ABl8XSS9kVXM,1190
337
337
  pymodaq/utils/gui_utils/loader_utils.py,sha256=Gg0d31fjkqDq3l1WuRMbLzKiKPOIYdbUrcfGOgoXRk0,1298
338
338
  pymodaq/utils/gui_utils/utils.py,sha256=aPxFCnG4skDp-0UuhAudq6BPZnEXoAf6FOEJyrhUjx0,6089
339
- pymodaq/utils/gui_utils/widgets/__init__.py,sha256=LThGzmbFKbp2FtTTF_L7pHjyBzfB7F_bhMF4rPTwrUY,195
339
+ pymodaq/utils/gui_utils/widgets/__init__.py,sha256=vtDpBo8YEW6KR_Kyu85Po1hlTbyudmiRRS00jiQyst0,217
340
340
  pymodaq/utils/gui_utils/widgets/label.py,sha256=C2MU8i_Yy_oVRW7yal_ghB1Y5Bj_a9o8IFZWW3br-KM,600
341
341
  pymodaq/utils/gui_utils/widgets/lcd.py,sha256=jBleZJ-ChpbSt0iJ3T-XFwAhPUTBsofceCXJylzgA9s,3325
342
342
  pymodaq/utils/gui_utils/widgets/push.py,sha256=pS_KTG6JV4EKmaUzpX1pAX5RsXXDeRxBWOEwcY-BZKA,4748
343
343
  pymodaq/utils/gui_utils/widgets/qled.py,sha256=HuVDYApG8rwiiNhVrN-ZWZ2W8OxK7A29MX1zQAKjJqc,2096
344
- pymodaq/utils/gui_utils/widgets/spinbox.py,sha256=cgKPXDSFjy0DFQ0VCaMrGwxFAHsxu6LTSsw8_BcVmhg,742
344
+ pymodaq/utils/gui_utils/widgets/spinbox.py,sha256=0wl1IWgvxYu-qPEu3MicA6Du0wY2SpBeOeC0jMAKWdA,1408
345
345
  pymodaq/utils/gui_utils/widgets/table.py,sha256=zMvjf5-HUx_sHV3Wh99HlH4LO1GLDBnS1ONOTXfKjnc,8770
346
346
  pymodaq/utils/gui_utils/widgets/tree_layout.py,sha256=OCXj59SzVQPi1ksxxvvbr5AIZ5mXN0_JdwcNMMR5wUg,6625
347
347
  pymodaq/utils/gui_utils/widgets/tree_toml.py,sha256=0O2j_F0kzVjyG2dSwYtw4HNtmS0WJo0VWZF1rnil68A,4704
348
348
  pymodaq/utils/h5modules/__init__.py,sha256=x3_4ELvG9onTKEFgIt9xEGg_mA1bB07dvVbU9q0xQKw,104
349
349
  pymodaq/utils/h5modules/backends.py,sha256=i-3x_DtTbnYKqft9Y3V1PuinGRXZ9DVv0Mg9TNTA33Q,33269
350
350
  pymodaq/utils/h5modules/browsing.py,sha256=B39JZFdm3WCaOTnG0tioPnp6A1zFCRWZkbcXfgI_eHE,23542
351
- pymodaq/utils/h5modules/data_saving.py,sha256=ybCDHlzNk9LCkOnRGLGdsSXk-Rjt455FCmgMxdjKM-4,42408
351
+ pymodaq/utils/h5modules/data_saving.py,sha256=rI7uxfhHEWG7Nl6lqvXwBeRpKAJEkKwBqRIT5MsL4j8,43255
352
352
  pymodaq/utils/h5modules/exporter.py,sha256=iCfUjkuGjs3-ijcUkt38NMrjO8tI9wXShvwYHJIUU70,3670
353
353
  pymodaq/utils/h5modules/h5logging.py,sha256=UhRo9YvjU5Ujw_i5aPHXOgOdw_IszxmekOa7gYUY5AQ,2492
354
- pymodaq/utils/h5modules/module_saving.py,sha256=RUhKaKakLyNaWUrXYrhkp22_nunDPegX5EQUwpsSA5Q,13997
354
+ pymodaq/utils/h5modules/module_saving.py,sha256=3x85IrN-YNK2-xySpDA7UJYgvt3fvoGcEz6_OCXxnx0,14271
355
355
  pymodaq/utils/h5modules/saving.py,sha256=Hfw8gGG7AM_ZroxIOhTvfwHr4CDW9VarWw-zMkQS5TM,34036
356
356
  pymodaq/utils/h5modules/utils.py,sha256=0isF661xthXlT3hFJvXTcgGqkZcGQmSanTNAGSInez4,3368
357
357
  pymodaq/utils/h5modules/exporters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -369,12 +369,12 @@ pymodaq/utils/leco/utils.py,sha256=jCHhco89uG9UA-t9LpaEuyZQMQW5XQP_t0URcvqLDNU,2
369
369
  pymodaq/utils/managers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
370
370
  pymodaq/utils/managers/action_manager.py,sha256=v99NuRq7uT_PNTAsqbUyoWyDGUzhlP6dYtdAO30_cbc,17756
371
371
  pymodaq/utils/managers/batchscan_manager.py,sha256=jcL08YvFafX5kiy03BV1_6obt2Xogiby5pvTKeN8_ho,13905
372
- pymodaq/utils/managers/modules_manager.py,sha256=RKpt1RU0VrELBPmTAlLB_B5k-5KX7deHnequgOFfYKk,20821
372
+ pymodaq/utils/managers/modules_manager.py,sha256=Fdp92kpHKjULAfFnCSftyIzwLL5XTjlLc3kJnFzxANw,20881
373
373
  pymodaq/utils/managers/overshoot_manager.py,sha256=fe_CR1Bkw85BER34MoVFlm-xtKl9Hr9bkf2nyaz9hXg,7158
374
374
  pymodaq/utils/managers/parameter_manager.py,sha256=hO3RXcpkYOtuqjAQaD5H3r71rVEHntYg64VHZwVCQBg,11473
375
375
  pymodaq/utils/managers/preset_manager.py,sha256=m8r_TcfFbUatddBX9SJj7XI_GZ3FhoiwzhFgocw9jZ8,9481
376
376
  pymodaq/utils/managers/preset_manager_utils.py,sha256=d148YBjeNOP9FTkFoTsfdRDxMIXOR8JJHqbOmoL2aVA,8155
377
- pymodaq/utils/managers/remote_manager.py,sha256=H6k9aiBkuJRJbZ4rpd5jfawQ-pMRFAXOE_miakvciP8,22251
377
+ pymodaq/utils/managers/remote_manager.py,sha256=SwzefJuGpgzvvjTbJSo3T3Rc2rncvHHyPYPBd8gCQX8,22251
378
378
  pymodaq/utils/managers/roi_manager.py,sha256=RRICNSLMxiUoq8tEBKihpdydIVAu78ogkYOFWWphaHE,29892
379
379
  pymodaq/utils/parameter/__init__.py,sha256=fMljZeQ9EVvh2bmss550C5BpxFeKOxT8_AVJdPxQ0kQ,433
380
380
  pymodaq/utils/parameter/ioxml.py,sha256=jduHhMrpc0lkSJlznnI-LRHUJ0Ofc4PoFfNlxLbLmw8,17091
@@ -388,7 +388,7 @@ pymodaq/utils/parameter/pymodaq_ptypes/led.py,sha256=oDKM3k4aPy_CArgQIEqjLx3KG5C
388
388
  pymodaq/utils/parameter/pymodaq_ptypes/list.py,sha256=bXGlUxKVAA5_QY41BmzG2iWWoh1Qq-w-QHgMo-_Kc7Q,5716
389
389
  pymodaq/utils/parameter/pymodaq_ptypes/numeric.py,sha256=lzklQWAnzh9LDC20hdlGbAj2NdVzNDDeJke1KnPi7GU,560
390
390
  pymodaq/utils/parameter/pymodaq_ptypes/pixmap.py,sha256=vIhWscDZRM7Bc3RRf4kBs2g0QNE3-tfp1P4T8EO7AxY,5534
391
- pymodaq/utils/parameter/pymodaq_ptypes/slide.py,sha256=RStaK9SXGEI7c2ESDX5DhZvsDhATl5I8swChsUDwHuM,5748
391
+ pymodaq/utils/parameter/pymodaq_ptypes/slide.py,sha256=1mhGLSei9DRqNKhDF5PFR7WNfBREDZ-TjPHD53ETs7g,5751
392
392
  pymodaq/utils/parameter/pymodaq_ptypes/table.py,sha256=kM6Kb_KZfJ-sA6tSgn76EDBZK_Cbpc4jfw2KEJ5E2Cg,4819
393
393
  pymodaq/utils/parameter/pymodaq_ptypes/tableview.py,sha256=EXMHEGlkL2JC7_fau2ysL3oCvq2XmeCuJNYEu-hp9iY,4866
394
394
  pymodaq/utils/parameter/pymodaq_ptypes/text.py,sha256=iPMS3dEz2evsX_1ThX-sqNzfyIL8w0D0tpM87jF8ODo,4708
@@ -404,7 +404,7 @@ pymodaq/utils/plotting/data_viewers/viewer.py,sha256=DhPa4Dw42HfOdqEGEq2KKmIXg_z
404
404
  pymodaq/utils/plotting/data_viewers/viewer0D.py,sha256=YgCNuqAW5NOURw2pqPWT4WHHaowXjySDWoYgY7lbl-s,11609
405
405
  pymodaq/utils/plotting/data_viewers/viewer1D.py,sha256=7Iz0fDIgP_IpDt2QtB3Do8nONM0eZemcHSrv3XeJn_Q,32239
406
406
  pymodaq/utils/plotting/data_viewers/viewer1Dbasic.py,sha256=u91tVhmi_WIlVa8areapb0xWu0NOr5pVRLMylY_in7g,7432
407
- pymodaq/utils/plotting/data_viewers/viewer2D.py,sha256=vjXuKjDguJLY8XLRq_BbrHWqgqE4KJIS2Cx2Qpxyj_k,46214
407
+ pymodaq/utils/plotting/data_viewers/viewer2D.py,sha256=KKWIQoFeZ21WMhByUcMC5WNQQu1Ahy_s-8vwlfc5HE4,46495
408
408
  pymodaq/utils/plotting/data_viewers/viewer2D_basic.py,sha256=aRLu8JVZZI8PH6Lxl8oITpHwUXaUY3PyLW6eHzkf76o,5588
409
409
  pymodaq/utils/plotting/data_viewers/viewerND.py,sha256=NrEPrFcE-UxuC95l5W258YqrP58-4WvTg2H80wfucaA,38531
410
410
  pymodaq/utils/plotting/items/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -437,10 +437,11 @@ pymodaq/utils/svg/svg_view.py,sha256=bmXpDqnw9S-Bp3F8Hi_oeYB5Y9gebiCNsQWVJzCq-PA
437
437
  pymodaq/utils/svg/svg_viewer2D.py,sha256=LTJ3Ulb5zWXdRPr7vqcWumbpq7ZctzrYUMtD5QV3x60,1523
438
438
  pymodaq/utils/tcp_ip/__init__.py,sha256=1e_EK0AgvdoLAD_CSGGEaITZdy6OWCO7ih9IAIp7HT4,81
439
439
  pymodaq/utils/tcp_ip/mysocket.py,sha256=StAWj8dzHeMnbLj68Sel81uWFy-YkKVNRnVf7gXrESI,3452
440
- pymodaq/utils/tcp_ip/serializer.py,sha256=htVQCE4saRBMeIcseEyxTt5G58A341m6OGkaJUA34Wk,27766
440
+ pymodaq/utils/tcp_ip/serializer.py,sha256=kXmvFLR5ZedjY2rVGUs83lsJk9Z9l_iAWR6srDxzaYQ,29262
441
441
  pymodaq/utils/tcp_ip/tcp_server_client.py,sha256=xIMTNgVW_rKK0yTi4FDNFLf85-Akb27Jz2LdrvOrP68,30660
442
- pymodaq-4.4.6.dist-info/METADATA,sha256=mJV-zKqrF_yCIPzo_-brHM2vJqBIdptzQPzVJ8qmIbM,7627
443
- pymodaq-4.4.6.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
444
- pymodaq-4.4.6.dist-info/entry_points.txt,sha256=RAzdYNjvUT28I2eiCKki_g2NzXq0woWxhev6lwzwRv8,348
445
- pymodaq-4.4.6.dist-info/licenses/LICENSE,sha256=VKOejxexXAe3XwfhAhcFGqeXQ12irxVHdeAojZwFEI8,1108
446
- pymodaq-4.4.6.dist-info/RECORD,,
442
+ pymodaq-4.4.9.dist-info/METADATA,sha256=QZsI_riuGZguU4s4L6f93v9MzJOs9GfPcectvJw26Ac,7737
443
+ pymodaq-4.4.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
444
+ pymodaq-4.4.9.dist-info/entry_points.txt,sha256=RAzdYNjvUT28I2eiCKki_g2NzXq0woWxhev6lwzwRv8,348
445
+ pymodaq-4.4.9.dist-info/licenses/AUTHORS.md,sha256=8f-B6E-I2KPlBSJIcutEZTedoYQHERaXADbx6q_9vjg,1295
446
+ pymodaq-4.4.9.dist-info/licenses/LICENSE,sha256=VKOejxexXAe3XwfhAhcFGqeXQ12irxVHdeAojZwFEI8,1108
447
+ pymodaq-4.4.9.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.25.0
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,46 @@
1
+ Here is a list of the main contributors:
2
+
3
+ ## Main modules
4
+ ***************
5
+
6
+ Functionalities
7
+ ---------------
8
+
9
+ * Sébastien Weber, Research Engineer at CEMES/CNRS
10
+ * David Bresteau, Research Engineer at Attolab facility, CEA Saclay
11
+ * Nicolas Tappy, Engineer at Attolight (https://attolight.com/)
12
+
13
+ Cleaning
14
+ --------
15
+
16
+ * Sébastien Weber, Research Engineer at CEMES/CNRS
17
+ * David Trémouilles, Researcher at LAAS/CNRS
18
+ * Loïc GUILMARD, Engineer at CETHIL/CNRS
19
+
20
+ ## Plugins
21
+ **********
22
+
23
+ * Sébastien Weber, Research Engineer at CEMES/CNRS
24
+ * Sophie Meuret, Researcher at CEMES/CNRS
25
+ * David Bresteau, Research Engineer at Attolab facility, CEA Saclay
26
+ * and many others...
27
+
28
+ ## Extensions
29
+ *************
30
+
31
+ * Sébastien Weber, Research Engineer at CEMES/CNRS
32
+ * Romain Geneaux, Researcher at CEA Saclay contributed to the PyMoDAQ-Femto extension
33
+
34
+ ## Documentation
35
+ ****************
36
+
37
+ * Sébastien Weber, Research Engineer at CEMES/CNRS
38
+ * Matthieu Cabos helped with this documentation
39
+ * David Bresteau wrote the documentation of the PID extension and the tutorial: :ref:`plugin_development`
40
+ * Loïc GUILMARD, Engineer at CETHIL/CNRS
41
+
42
+ ## Testing
43
+ **********
44
+
45
+ * Sébastien Weber, Research Engineer at CEMES/CNRS
46
+ * Pierre Jannot wrote tests with a total of 5000 lines of code tested during his internship at CEMES in 2021