Skip to content

Commit 76c0cae

Browse files
authored
Antoine Essig (#19)
* Save the OPX data in one recarray named "Results". The keys of Results are the name of the data saved. Add Results to the database. Using the save function with Results will create an entry in the HDF5 file for every keys in the recarray. * Keep the old individual entries in the database for all OPX saved data. This will be removed soon so please migrate to the Results recarry.
1 parent 3ee5927 commit 76c0cae

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

exopy_qm/tasks/tasks/ConfigureExecuteTask.py

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
import logging
55
from pathlib import Path
66
import shutil
7+
from numpy import zeros
78

89
import qm.qua
9-
from atom.api import List, Typed, Str, Value, Bool
10+
from atom.api import List, Typed, Str, Value, Bool, set_default
1011
from exopy.tasks.api import InstrumentTask
1112

1213
logger = logging.getLogger(__name__)
@@ -65,6 +66,9 @@ class ConfigureExecuteTask(InstrumentTask):
6566
#: Doesn't wait for the program to end if this is on
6667
pause_mode = Bool(False).tag(pref=True)
6768

69+
# : Create the entry which contains all the data return by the OPX in a recarray
70+
database_entries = set_default({'Results': {}})
71+
6872
def __init__(self, **kwargs):
6973
super().__init__(**kwargs)
7074
self._config_module = None
@@ -143,18 +147,35 @@ def perform(self):
143147
logger.warning(e)
144148

145149
for (name, handle) in results:
146-
if name.endswith('_input1') or name.endswith('_input2'):
147-
name = name[:-7]
148-
data = handle.fetch_all()
149-
# When using the old school syntax for saving, the value is returned alongside the timestamp
150-
# when this is the case, we discard the timestamp
151-
try:
152-
data = data['value']
153-
except (TypeError, IndexError):
154-
pass
155-
self.write_in_database(f"variable_{name}", data)
156-
if handle.has_dataloss():
157-
logger.warning(f"{name} might have data loss")
150+
# Create the recarray to save the data
151+
dt_array = []
152+
for (name, handle) in results:
153+
if name.endswith('_input1') or name.endswith('_input2'):
154+
name = name[:-7]
155+
data = handle.fetch_all()
156+
# When using the old school syntax for saving, the value is returned alongside the timestamp
157+
# when this is the case, we discard the timestamp
158+
try:
159+
data = data['value']
160+
except (TypeError, IndexError):
161+
pass
162+
dt_array += [(name, data.dtype, data.shape)]
163+
if handle.has_dataloss():
164+
logger.warning(f"{name} might have data loss")
165+
results_recarray = zeros(1, dtype=dt_array)
166+
167+
# Save data in the recarray
168+
for (name, handle) in results:
169+
if name.endswith('_input1') or name.endswith('_input2'):
170+
name = name[:-7]
171+
data = handle.fetch_all()
172+
try:
173+
data = data['value']
174+
except (TypeError, IndexError):
175+
pass
176+
self.write_in_database(f"variable_{name}", data)
177+
results_recarray[name] = data
178+
self.write_in_database('Results', results_recarray)
158179

159180
def refresh_config(self):
160181
self._post_setattr_path_to_config_file(self.path_to_config_file,

exopy_qm/tasks/tasks/MeasureWithPauseTask.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def perform(self):
3737
results = self.driver.get_results()
3838
one_is_none = False
3939
for (name, handle) in results:
40-
if handle.fetch_all() is None:
40+
if handle.fetch_all() is None: # check is one entry of the data is None
4141
time.sleep(0.01)
4242
one_is_none = True
4343
if not one_is_none: # wait for all entries to be not None before continuing
@@ -50,22 +50,26 @@ def perform(self):
5050
for (name, handle) in results:
5151
if name.endswith('_input1') or name.endswith('_input2'):
5252
name = name[:-7]
53-
values = handle.fetch_all()
53+
data = handle.fetch_all()
54+
# When using the old school syntax for saving, the value is returned alongside the timestamp
55+
# when this is the case, we discard the timestamp
5456
try:
55-
values = values['value']
57+
data = data['value']
5658
except (TypeError, IndexError):
5759
pass
58-
dt_array += [(name, values.dtype, values.shape)]
60+
dt_array += [(name, data.dtype, data.shape)]
61+
if handle.has_dataloss():
62+
logger.warning(f"{name} might have data loss")
5963
results_recarray = np.zeros(1, dtype=dt_array)
6064

6165
# Save data in the recarray
6266
for (name, handle) in results:
6367
if name.endswith('_input1') or name.endswith('_input2'):
6468
name = name[:-7]
65-
values = handle.fetch_all()
69+
data = handle.fetch_all()
6670
try:
67-
values = values['value']
71+
data = data['value']
6872
except (TypeError, IndexError):
6973
pass
70-
results_recarray[name] = values
74+
results_recarray[name] = data
7175
self.write_in_database('Results', results_recarray)

0 commit comments

Comments
 (0)