Skip to content

Commit 7314d4a

Browse files
authored
Merge branch 'master' into sqlite_read_only_mode
2 parents c0c01d3 + c82e665 commit 7314d4a

File tree

10 files changed

+654
-2780
lines changed

10 files changed

+654
-2780
lines changed

.pre-commit-config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ repos:
1818
hooks:
1919
- id: isort
2020
- repo: https://github.com/asottile/pyupgrade
21-
rev: v3.1.0
21+
rev: v3.2.0
2222
hooks:
2323
- id: pyupgrade
2424
args: ['--py38-plus']
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
The sweeps used by doNd has gained the ability to perform a get call after setting the parameter and storing
2+
that value in the dataset rather than the value set.

docs/examples/DataSet/Using_doNd_functions_in_comparison_to_Measurement_context_manager_for_performing_measurements.ipynb

+457-2,769
Large diffs are not rendered by default.

qcodes/dataset/dond/do_nd.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class ParameterSetEvent:
6060
should_set: bool
6161
delay: float
6262
actions: ActionsT
63+
get_after_set: bool
6364

6465

6566
class _Sweeper:
@@ -228,6 +229,7 @@ def __getitem__(self, index: int) -> tuple[ParameterSetEvent, ...]:
228229
should_set=should_set,
229230
delay=sweep.delay,
230231
actions=sweep.post_actions,
232+
get_after_set=sweep.get_after_set,
231233
)
232234
parameter_set_events.append(event)
233235
return tuple(parameter_set_events)
@@ -708,7 +710,10 @@ def dond(
708710
act()
709711
time.sleep(set_event.delay)
710712

711-
results[set_event.parameter] = set_event.new_value
713+
if set_event.get_after_set:
714+
results[set_event.parameter] = set_event.parameter()
715+
else:
716+
results[set_event.parameter] = set_event.new_value
712717

713718
meas_value_pair = call_params_meas()
714719
for meas_param, value in meas_value_pair:

qcodes/dataset/dond/sweeps.py

+38-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ def post_actions(self) -> ActionsT:
5757
"""
5858
pass
5959

60+
@property
61+
def get_after_set(self) -> bool:
62+
"""
63+
Should we perform a call to get on the parameter after setting it
64+
and store that rather than the setpoint value in the dataset?
65+
66+
This defaults to False for backwards compatibility
67+
but subclasses should overwrite this to implement if correctly.
68+
"""
69+
return False
70+
6071

6172
class LinSweep(AbstractSweep[np.float64]):
6273
"""
@@ -67,7 +78,10 @@ class LinSweep(AbstractSweep[np.float64]):
6778
start: Sweep start value.
6879
stop: Sweep end value.
6980
num_points: Number of sweep points.
70-
delay: Time in seconds between two consecutive sweep points
81+
delay: Time in seconds between two consecutive sweep points.
82+
post_actions: Actions to do after each sweep point.
83+
get_after_set: Should we perform a get on the parameter after setting it
84+
and store the value returned by get rather than the set value in the dataset.
7185
"""
7286

7387
def __init__(
@@ -78,13 +92,15 @@ def __init__(
7892
num_points: int,
7993
delay: float = 0,
8094
post_actions: ActionsT = (),
95+
get_after_set: bool = False,
8196
):
8297
self._param = param
8398
self._start = start
8499
self._stop = stop
85100
self._num_points = num_points
86101
self._delay = delay
87102
self._post_actions = post_actions
103+
self._get_after_set = get_after_set
88104

89105
def get_setpoints(self) -> npt.NDArray[np.float64]:
90106
"""
@@ -109,6 +125,10 @@ def num_points(self) -> int:
109125
def post_actions(self) -> ActionsT:
110126
return self._post_actions
111127

128+
@property
129+
def get_after_set(self) -> bool:
130+
return self._get_after_set
131+
112132

113133
class LogSweep(AbstractSweep[np.float64]):
114134
"""
@@ -120,6 +140,9 @@ class LogSweep(AbstractSweep[np.float64]):
120140
stop: Sweep end value.
121141
num_points: Number of sweep points.
122142
delay: Time in seconds between two consecutive sweep points.
143+
post_actions: Actions to do after each sweep point.
144+
get_after_set: Should we perform a get on the parameter after setting it
145+
and store the value returned by get rather than the set value in the dataset.
123146
"""
124147

125148
def __init__(
@@ -130,13 +153,15 @@ def __init__(
130153
num_points: int,
131154
delay: float = 0,
132155
post_actions: ActionsT = (),
156+
get_after_set: bool = False,
133157
):
134158
self._param = param
135159
self._start = start
136160
self._stop = stop
137161
self._num_points = num_points
138162
self._delay = delay
139163
self._post_actions = post_actions
164+
self._get_after_set = get_after_set
140165

141166
def get_setpoints(self) -> npt.NDArray[np.float64]:
142167
"""
@@ -161,6 +186,10 @@ def num_points(self) -> int:
161186
def post_actions(self) -> ActionsT:
162187
return self._post_actions
163188

189+
@property
190+
def get_after_set(self) -> bool:
191+
return self._get_after_set
192+
164193

165194
class ArraySweep(AbstractSweep, Generic[T]):
166195
"""
@@ -171,6 +200,8 @@ class ArraySweep(AbstractSweep, Generic[T]):
171200
array: array with values to sweep.
172201
delay: Time in seconds between two consecutive sweep points.
173202
post_actions: Actions to do after each sweep point.
203+
get_after_set: Should we perform a get on the parameter after setting it
204+
and store the value returned by get rather than the set value in the dataset.
174205
"""
175206

176207
def __init__(
@@ -179,11 +210,13 @@ def __init__(
179210
array: Sequence[Any] | npt.NDArray[T],
180211
delay: float = 0,
181212
post_actions: ActionsT = (),
213+
get_after_set: bool = False,
182214
):
183215
self._param = param
184216
self._array = np.array(array)
185217
self._delay = delay
186218
self._post_actions = post_actions
219+
self._get_after_set = get_after_set
187220

188221
def get_setpoints(self) -> npt.NDArray[T]:
189222
return self._array
@@ -204,6 +237,10 @@ def num_points(self) -> int:
204237
def post_actions(self) -> ActionsT:
205238
return self._post_actions
206239

240+
@property
241+
def get_after_set(self) -> bool:
242+
return self._get_after_set
243+
207244

208245
class TogetherSweep:
209246
"""

qcodes/instrument/instrument_base.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
if TYPE_CHECKING:
1818
from qcodes.instrument.channel import ChannelTuple, InstrumentModule
19+
from qcodes.logger.instrument_logger import InstrumentLoggerAdapter
1920

2021
from qcodes.utils import QCoDeSDeprecationWarning
2122

@@ -82,7 +83,7 @@ def __init__(
8283
# This is needed for snapshot method to work
8384
self._meta_attrs = ["name", "label"]
8485

85-
self.log = get_instrument_logger(self, __name__)
86+
self.log: InstrumentLoggerAdapter = get_instrument_logger(self, __name__)
8687

8788
@property
8889
def label(self) -> str:

qcodes/parameters/parameter.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
if TYPE_CHECKING:
1515
from qcodes.instrument.base import InstrumentBase
16+
from qcodes.logger.instrument_logger import InstrumentLoggerAdapter
1617
from qcodes.validators import Validator
1718

1819

@@ -180,15 +181,29 @@ def __init__(
180181
**kwargs: Any,
181182
) -> None:
182183
def _get_manual_parameter() -> ParamRawDataType:
183-
log.debug(
184+
if self.root_instrument is not None:
185+
mylogger: InstrumentLoggerAdapter | logging.Logger = (
186+
self.root_instrument.log
187+
)
188+
else:
189+
mylogger = log
190+
mylogger.debug(
184191
"Getting raw value of parameter: %s as %s",
185192
self.full_name,
186193
self.cache.raw_value,
187194
)
188195
return self.cache.raw_value
189196

190197
def _set_manual_parameter(x: ParamRawDataType) -> ParamRawDataType:
191-
log.debug("Setting raw value of parameter: %s to %s", self.full_name, x)
198+
if self.root_instrument is not None:
199+
mylogger: InstrumentLoggerAdapter | logging.Logger = (
200+
self.root_instrument.log
201+
)
202+
else:
203+
mylogger = log
204+
mylogger.debug(
205+
"Setting raw value of parameter: %s to %s", self.full_name, x
206+
)
192207
return x
193208

194209
if instrument is not None and bind_to_instrument:

qcodes/tests/dataset/dond/test_doNd.py

+118
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,50 @@
3434
from qcodes.validators import Ints
3535

3636

37+
class TrackingParameter(Parameter):
38+
"""Parameter that keeps track of number of get and set operations"""
39+
40+
def __init__(self, *args, **kwargs):
41+
self.set_count = 0
42+
self.get_count = 0
43+
super().__init__(*args, **kwargs)
44+
45+
def set_raw(self, value):
46+
self.set_count += 1
47+
self.cache._set_from_raw_value(value)
48+
49+
def get_raw(self):
50+
self.get_count += 1
51+
return self.cache.raw_value
52+
53+
def reset_count(self) -> None:
54+
self.get_count = 0
55+
self.set_count = 0
56+
57+
58+
class GetReturnsCountParameter(Parameter):
59+
"""Parameter that keeps track of number of get and set operations
60+
Allows you to set a value but returns the get count rather
61+
than the value"""
62+
63+
def __init__(self, *args, **kwargs):
64+
self.set_count = 0
65+
self.get_count = 0
66+
super().__init__(*args, **kwargs)
67+
68+
def set_raw(self, value):
69+
self.set_count += 1
70+
self.cache._set_from_raw_value(value)
71+
72+
def get_raw(self):
73+
self.get_count += 1
74+
return self.get_count
75+
76+
def reset_count(self) -> None:
77+
self.get_count = 0
78+
self.set_count = 0
79+
80+
3781
def test_linear_sweep_get_setpoints(_param):
3882
start = 0
3983
stop = 1
@@ -1589,3 +1633,77 @@ def test_default_log_info(caplog):
15891633
dond(LinSweep(param_1, 0, 10, 10), param_2)
15901634

15911635
assert "Using 'qcodes.dataset.dond'" in caplog.text
1636+
1637+
1638+
def test_dond_get_after_set(_param_set, _param_set_2, _param):
1639+
1640+
n_points = 10
1641+
1642+
a = TrackingParameter("a", initial_value=0)
1643+
b = TrackingParameter("b", initial_value=0)
1644+
1645+
a.reset_count()
1646+
b.reset_count()
1647+
1648+
assert a.get_count == 0
1649+
assert a.set_count == 0
1650+
assert b.get_count == 0
1651+
assert b.set_count == 0
1652+
1653+
dond(LinSweep(a, 0, 10, n_points, get_after_set=True), b)
1654+
1655+
assert a.get_count == n_points
1656+
assert a.set_count == n_points
1657+
assert b.get_count == n_points
1658+
assert b.set_count == 0
1659+
1660+
1661+
def test_dond_no_get_after_set(_param_set, _param_set_2, _param):
1662+
1663+
n_points = 10
1664+
1665+
a = TrackingParameter("a", initial_value=0)
1666+
b = TrackingParameter("b", initial_value=0)
1667+
1668+
a.reset_count()
1669+
b.reset_count()
1670+
1671+
assert a.get_count == 0
1672+
assert a.set_count == 0
1673+
assert b.get_count == 0
1674+
assert b.set_count == 0
1675+
1676+
dond(LinSweep(a, 0, 10, n_points, get_after_set=False), b)
1677+
1678+
assert a.get_count == 0
1679+
assert a.set_count == n_points
1680+
assert b.get_count == n_points
1681+
assert b.set_count == 0
1682+
1683+
1684+
def test_dond_get_after_set_stores_get_value(_param_set, _param_set_2, _param):
1685+
1686+
n_points = 11
1687+
1688+
a = GetReturnsCountParameter("a", initial_value=0)
1689+
b = TrackingParameter("b", initial_value=0)
1690+
1691+
a.reset_count()
1692+
b.reset_count()
1693+
1694+
assert a.get_count == 0
1695+
assert a.set_count == 0
1696+
assert b.get_count == 0
1697+
assert b.set_count == 0
1698+
1699+
ds, _, _ = dond(LinSweep(a, -10, -20, n_points, get_after_set=True), b)
1700+
1701+
# since we are using the GetReturnsCountParameter the sweep should be count e.g. 0, 1, ... 11
1702+
# not the set parameters -10, .. - 20
1703+
np.testing.assert_array_equal(
1704+
ds.get_parameter_data()["b"]["a"], np.linspace(1, 11, n_points)
1705+
)
1706+
assert a.get_count == n_points
1707+
assert a.set_count == n_points
1708+
assert b.get_count == n_points
1709+
assert b.set_count == 0

qcodes/tests/instrument_mocks.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,11 @@ def get_raw(self):
209209
dac = self.root_instrument._setter_instr
210210
val = self._ed.send(dac.ch1.cache.get())
211211
next(self._ed)
212-
log.debug("Getting raw value of parameter: %s as %s", self.full_name, val)
212+
if self.root_instrument is not None:
213+
mylogger = self.root_instrument.log
214+
else:
215+
mylogger = log
216+
mylogger.debug("Getting raw value of parameter: %s as %s", self.full_name, val)
213217
return val
214218

215219
@staticmethod
@@ -241,7 +245,11 @@ def get_raw(self):
241245
dac = self.root_instrument._setter_instr
242246
val = self._gauss.send((dac.ch1.cache.get(), dac.ch2.cache.get()))
243247
next(self._gauss)
244-
log.debug("Getting raw value of parameter: %s as %s", self.full_name, val)
248+
if self.root_instrument is not None:
249+
mylogger = self.root_instrument.log
250+
else:
251+
mylogger = log
252+
mylogger.debug("Getting raw value of parameter: %s as %s", self.full_name, val)
245253
return val
246254

247255
def _gauss_model(self):

0 commit comments

Comments
 (0)