Skip to content

Commit 8f3ecc5

Browse files
authored
Merge branch 'master' into guenp/parameter_types
2 parents a1d83b8 + 3d92c9d commit 8f3ecc5

4 files changed

Lines changed: 65 additions & 26 deletions

File tree

docs_requirements.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pytz==2021.1
5454
PyVISA==1.11.3
5555
PyVISA-sim==0.4.0
5656
pywin32==300; sys_platform == 'win32'
57-
pywinpty==0.5.7; sys_platform == 'win32'
57+
pywinpty==1.1.1; sys_platform == 'win32'
5858
PyYAML==5.4.1
5959
pyzmq==22.0.3
6060
qtconsole==5.1.0
@@ -74,7 +74,7 @@ sphinxcontrib-jsmath==1.0.1
7474
sphinxcontrib-qthelp==1.0.3
7575
sphinxcontrib-serializinghtml==1.1.4
7676
stringparser==0.5
77-
terminado==0.9.5
77+
terminado==0.10.0
7878
testpath==0.5.0
7979
tornado==6.1
8080
traitlets==5.0.5
@@ -84,5 +84,5 @@ wcwidth==0.2.5
8484
webencodings==0.5.1
8585
widgetsnbextension==3.5.1
8686
wincertstore==0.2
87-
xarray==0.18.0
87+
xarray==0.18.2
8888
zipp==3.4.1

qcodes/instrument/parameter.py

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ def _from_value_to_raw_value(self, value: ParamDataType
503503
in zip(raw_value, self.scale))
504504
else:
505505
# Use single scale for all values
506-
raw_value *= self.scale
506+
raw_value = raw_value * self.scale
507507

508508
# apply offset next
509509
if self.offset is not None:
@@ -513,7 +513,7 @@ def _from_value_to_raw_value(self, value: ParamDataType
513513
in zip(raw_value, self.offset))
514514
else:
515515
# Use single offset for all values
516-
raw_value += self.offset
516+
raw_value = raw_value + self.offset
517517

518518
# parser last
519519
if self.set_parser is not None:
@@ -533,28 +533,34 @@ def _from_raw_value_to_value(self, raw_value: ParamRawDataType
533533
# apply offset first (native scale)
534534
if self.offset is not None:
535535
# offset values
536-
if isinstance(self.offset, collections.abc.Iterable):
537-
# offset contains multiple elements, one for each value
538-
value = tuple(val - offset for val, offset
539-
in zip(value, self.offset))
540-
elif isinstance(value, collections.abc.Iterable):
541-
# Use single offset for all values
542-
value = tuple(val - self.offset for val in value)
543-
else:
544-
value -= self.offset
536+
try:
537+
value = value - self.offset
538+
except TypeError:
539+
if isinstance(self.offset, collections.abc.Iterable):
540+
# offset contains multiple elements, one for each value
541+
value = tuple(val - offset for val, offset
542+
in zip(value, self.offset))
543+
elif isinstance(value, collections.abc.Iterable):
544+
# Use single offset for all values
545+
value = tuple(val - self.offset for val in value)
546+
else:
547+
raise
545548

546549
# scale second
547550
if self.scale is not None:
548551
# Scale values
549-
if isinstance(self.scale, collections.abc.Iterable):
550-
# Scale contains multiple elements, one for each value
551-
value = tuple(val / scale for val, scale
552-
in zip(value, self.scale))
553-
elif isinstance(value, collections.abc.Iterable):
554-
# Use single scale for all values
555-
value = tuple(val / self.scale for val in value)
556-
else:
557-
value /= self.scale
552+
try:
553+
value = value / self.scale
554+
except TypeError:
555+
if isinstance(self.scale, collections.abc.Iterable):
556+
# Scale contains multiple elements, one for each value
557+
value = tuple(val / scale for val, scale in zip(value,
558+
self.scale))
559+
elif isinstance(value, collections.abc.Iterable):
560+
# Use single scale for all values
561+
value = tuple(val / self.scale for val in value)
562+
else:
563+
raise
558564

559565
if self.inverse_val_mapping is not None:
560566
if value in self.inverse_val_mapping:

qcodes/tests/parameter/test_parameter_scale_offset.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,36 @@ def test_scale_and_offset_raw_value_iterable_for_set_cache(values,
172172
event('Scale is array and also offset')
173173
if isinstance(scales, Iterable) and not isinstance(offsets, Iterable):
174174
event('Scale is array but not offset')
175+
176+
177+
def test_numpy_array_valued_parameter_preserves_type_if_scale_and_offset_are_set():
178+
179+
def rands():
180+
return np.random.randn(5)
181+
182+
param = Parameter(name='test_param',
183+
set_cmd=None,
184+
get_cmd=rands)
185+
186+
param.scale = 10
187+
param.offset = 7
188+
189+
values = param()
190+
191+
assert isinstance(values, np.ndarray)
192+
193+
194+
def test_setting_numpy_array_valued_param_if_scale_and_offset_are_not_none():
195+
196+
param = Parameter(name='test_param',
197+
set_cmd=None,
198+
get_cmd=None)
199+
200+
values = np.array([1, 2, 3, 4, 5])
201+
202+
param.scale = 100
203+
param.offset = 10
204+
205+
param(values)
206+
207+
assert isinstance(param.raw_value, np.ndarray)

requirements.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ python-dateutil~=2.8.1
6464
pytz~=2021.1
6565
PyVISA~=1.11.3
6666
pywin32==300; sys_platform == 'win32'
67-
pywinpty~=0.5.7; sys_platform == 'win32'
67+
pywinpty~=1.1.1; sys_platform == 'win32'
6868
pyzmq~=22.0.3
6969
requests~=2.25.1
7070
requirements-parser~=0.2.0
@@ -76,7 +76,7 @@ Send2Trash~=1.5.0
7676
six~=1.16.0
7777
slack-sdk~=3.5.1
7878
tabulate~=0.8.9
79-
terminado~=0.9.5
79+
terminado~=0.10.0
8080
testpath~=0.5.0
8181
tornado~=6.1
8282
tqdm~=4.60.0
@@ -90,7 +90,7 @@ websockets~=9.0
9090
widgetsnbextension~=3.5.1
9191
wincertstore~=0.2
9292
wrapt~=1.12.1
93-
xarray~=0.18.0
93+
xarray~=0.18.2
9494
zipp~=3.4.1
9595
# not strict requirements but needed for the legacy pyqtgraph based plotting
9696
PyQt5<5.16

0 commit comments

Comments
 (0)