Skip to content

Commit b503346

Browse files
authored
Merge pull request #8025 from qutech/enh/driver_improvements
Make several driver improvements
2 parents 36967bf + 622209a commit b503346

6 files changed

Lines changed: 428 additions & 54 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Yokogawa GS200: The `step` and `delay` arguments of `ramp_voltage` and `ramp_current` have been deprecated in favor of the `ramp_step` and `ramp_rate` instrument parameters.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Keysight 344xxA: Add SCPI mnemonics (`'MIN'`, `'MAX'`, `'DEF'`) to allowed values where allowed
2+
Oxford Mercury IPS: Allow setting current ramp rate and target
3+
Oxford Triton: Also assume magnet is not available if there is a communication timeout
4+
Yokagawa GS200 Program: Validate program times on multiples of the internal clock rate of 0.1s
5+
Yokagawa GS200 Program: Only add trigger parameter if monitor option is installed
6+
Yokagawa GS200 Program: Add get parser to `count`; allow setting to SCPI mnemonics `'MIN'`, `'MAX'`.
7+
Yokagawa GS200 Program: Add `hold()`, `pause()`, `cont()` methods.
8+
Yokagawa GS200: Add parameters reading out device registers (`status_byte`, `standard_event_register`, `extended_event_register`, `condition_register`)
9+
Yokagawa GS200: Implement hardware ramps. `ramp_mode` parameter switches the mode of output sets between `"JUMP"`, `"SOFTWARE"`, and `"HARDWARE"`. The last uses a program to ramp, software corresponds to the previous ramp implementation. `ramp_step`, `ramp_rate`, `ramp_blocking` configure the way ramps behave.

src/qcodes/instrument_drivers/Keysight/private/Keysight_344xxA_submodules.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from bisect import bisect_left
33
from contextlib import ExitStack
44
from functools import partial
5-
from typing import TYPE_CHECKING, Any
5+
from typing import TYPE_CHECKING, Any, Literal, TypeAlias, get_args
66

77
import numpy as np
88
import numpy.typing as npt
@@ -28,6 +28,8 @@
2828

2929
from typing_extensions import Unpack
3030

31+
NumericScpiMnemonic: TypeAlias = Literal["MIN", "MAX", "DEF"]
32+
3133

3234
class Keysight344xxATrigger(InstrumentChannel["Keysight344xxA"]):
3335
"""Implements triggering parameters and methods of Keysight 344xxA."""
@@ -946,7 +948,9 @@ def __init__(
946948
set_cmd=self._set_apt_time,
947949
get_cmd=self._get_with_sense_function("APERture"),
948950
get_parser=float,
949-
vals=vals.Numbers(*apt_times[self.model]),
951+
vals=vals.MultiType(
952+
vals.Numbers(*apt_times[self.model]), vals.Enum("MIN", "MAX", "DEF")
953+
),
950954
docstring=textwrap.dedent(
951955
"""\
952956
Specifies the integration time in seconds (called aperture
@@ -1240,8 +1244,11 @@ def func(value: str) -> None:
12401244

12411245
return func
12421246

1243-
def _set_apt_time(self, value: float) -> None:
1244-
self._write_with_sense_function("APERture", f"{value:f}")
1247+
def _set_apt_time(self, value: float | NumericScpiMnemonic) -> None:
1248+
if isinstance(value, float):
1249+
self._write_with_sense_function("APERture", f"{value:f}")
1250+
else:
1251+
self._write_with_sense_function("APERture", f"{value!s}")
12451252

12461253
# setting aperture time switches aperture mode ON
12471254
self.aperture_mode.get()
@@ -1262,21 +1269,25 @@ def _set_range(self, value: float) -> None:
12621269
# resolution settings change with range
12631270
self.resolution.get()
12641271

1265-
def _set_resolution(self, value: float) -> None:
1272+
def _set_resolution(self, value: float | NumericScpiMnemonic) -> None:
12661273
rang = self.range.get()
12671274

12681275
# convert both value*range and the resolution factors
12691276
# to strings with few digits, so we avoid floating point
12701277
# rounding errors.
1271-
res_fac_strs = [f"{(v * rang):.1e}" for v in self._resolution_factors]
1272-
if f"{value:.1e}" not in res_fac_strs:
1273-
raise ValueError(
1274-
f"Resolution setting {value:.1e}"
1275-
f"({value} at range {rang}) does not exist. "
1276-
f"Possible values are {res_fac_strs}"
1277-
)
1278-
1279-
self.write(f"VOLT:DC:RES {value:.1e}")
1278+
if value in get_args(NumericScpiMnemonic):
1279+
str_value = str(value) # already str, but mypy does not know this
1280+
else:
1281+
res_fac_strs = [f"{(v * rang):.1e}" for v in self._resolution_factors]
1282+
str_value = f"{value:.1e}"
1283+
if str_value not in res_fac_strs:
1284+
raise ValueError(
1285+
f"Resolution setting {str_value}"
1286+
f"({value} at range {rang}) does not exist. "
1287+
f"Possible values are {res_fac_strs}"
1288+
)
1289+
1290+
self.write(f"VOLT:DC:RES {str_value}")
12801291

12811292
# NPLC settings change with resolution
12821293
self.NPLC.get()

src/qcodes/instrument_drivers/oxford/MercuryiPS_VISA.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ def __init__(
155155
"current_target",
156156
label="Target current",
157157
get_cmd=partial(self._param_getter, "SIG:CSET"),
158+
set_cmd=partial(self._param_setter, "SIG:CSET"),
158159
unit="A",
159160
get_parser=partial(_signal_parser, 1),
160161
)
@@ -177,7 +178,9 @@ def __init__(
177178
label="Ramp rate (current)",
178179
unit="A/s",
179180
get_cmd=partial(self._param_getter, "SIG:RCST"),
181+
set_cmd=partial(self._param_setter, "SIG:RCST"),
180182
get_parser=partial(_signal_parser, 1 / 60),
183+
set_parser=lambda x: x * 60,
181184
)
182185
"""Parameter current_ramp_rate"""
183186

src/qcodes/instrument_drivers/oxford/triton.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ def __init__(
6767
self._control_channel = 5
6868
self.pump_label_dict = {"TURB1": "Turbo 1", "COMP": "Compressor"}
6969

70-
self.magnet_available: bool = self._get_control_B_param("ACTN") != "INVALID"
70+
self.magnet_available: bool = self._get_control_B_param("ACTN") not in (
71+
"INVALID",
72+
"communication timeout",
73+
)
7174
"""Indicates if a magnet is equipped *and* controlled by the Triton."""
7275

7376
self.time: Parameter = self.add_parameter(

0 commit comments

Comments
 (0)