Skip to content

Commit 17768e3

Browse files
jenshnielsenWilliamHPNielsen
authored andcommitted
Add simple demodulator signals to Zi UHFLI (#870)
* remove non existing parameter from init * add option to get demod samples * use correct variable name * Update notebook to use new examples too * add unit
1 parent 27567bf commit 17768e3

File tree

2 files changed

+203
-71
lines changed

2 files changed

+203
-71
lines changed

docs/examples/driver_examples/Qcodes example with ZI UHF-LI.ipynb

Lines changed: 159 additions & 63 deletions
Large diffs are not rendered by default.

qcodes/instrument_drivers/ZI/ZIUHFLI.py

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import logging
33
import numpy as np
44
from functools import partial
5+
from typing import Union
56
try:
67
import zhinst.utils
78
except ImportError:
@@ -548,15 +549,13 @@ class ZIUHFLI(Instrument):
548549
* Add zoom-FFT
549550
"""
550551

551-
def __init__(self, name, device_ID, **kwargs):
552+
def __init__(self, name: str, device_ID: str, **kwargs) -> None:
552553
"""
553554
Create an instance of the instrument.
554555
555556
Args:
556557
name (str): The internal QCoDeS name of the instrument
557558
device_ID (str): The device name as listed in the web server.
558-
api_level (int): Compatibility mode of the API interface. Must be 5
559-
for the UHF.
560559
"""
561560

562561
super().__init__(name, **kwargs)
@@ -711,6 +710,26 @@ def __init__(self, name, device_ID, **kwargs):
711710
vals=vals.Enum(*list(dmtrigs.keys()))
712711
)
713712

713+
self.add_parameter('demod{}_sample'.format(demod),
714+
label='Demod sample',
715+
get_cmd=partial(self._getter, 'demods',
716+
demod - 1, 2, 'sample'),
717+
snapshot_value=False
718+
)
719+
720+
for demod_param in ['x', 'y', 'R', 'phi']:
721+
if demod_param in ('x', 'y', 'R'):
722+
unit = 'V'
723+
else:
724+
unit = 'deg'
725+
self.add_parameter('demod{}_{}'.format(demod, demod_param),
726+
label='Demod {} {}'.format(demod, demod_param),
727+
get_cmd=partial(self._get_demod_sample,
728+
demod - 1, demod_param),
729+
snapshot_value=False,
730+
unit=unit
731+
)
732+
714733
########################################
715734
# SIGNAL INPUTS
716735

@@ -1440,7 +1459,8 @@ def _setter(self, module, number, mode, setting, value):
14401459
if mode == 1:
14411460
self.daq.setDouble(setstr, value)
14421461

1443-
def _getter(self, module, number, mode, setting):
1462+
def _getter(self, module: str, number: int,
1463+
mode: int, setting: str) -> Union[float, int, str, dict]:
14441464
"""
14451465
General get function for generic parameters. Note that some parameters
14461466
use more specialised setter/getters.
@@ -1453,22 +1473,38 @@ def _getter(self, module, number, mode, setting):
14531473
we want to know the value of.
14541474
number (int): Module's index
14551475
mode (int): Indicating whether we are asking for an int or double.
1456-
0: Int, 1: double.
1476+
0: Int, 1: double, 2: Sample
14571477
setting (str): The module's setting to set.
14581478
returns:
14591479
inquered value
14601480
14611481
"""
14621482

14631483
querystr = '/{}/{}/{}/{}'.format(self.device, module, number, setting)
1484+
log.debug("getting %s", querystr)
14641485
if mode == 0:
14651486
value = self.daq.getInt(querystr)
1466-
if mode == 1:
1487+
elif mode == 1:
14671488
value = self.daq.getDouble(querystr)
1468-
1489+
elif mode == 2:
1490+
value = self.daq.getSample(querystr)
1491+
else:
1492+
raise RuntimeError("Invalid mode supplied")
14691493
# Weird exception, samplingrate returns a string
14701494
return value
14711495

1496+
def _get_demod_sample(self, number: int, demod_param: str) -> float:
1497+
log.debug("getting demod %s param %s", number, demod_param)
1498+
mode = 2
1499+
module = 'demods'
1500+
setting = 'sample'
1501+
if demod_param not in ['x', 'y', 'R', 'phi']:
1502+
raise RuntimeError("Invalid demodulator parameter")
1503+
datadict = self._getter(module, number, mode, setting)
1504+
datadict['R'] = np.abs(datadict['x'] + 1j * datadict['y'])
1505+
datadict['phi'] = np.angle(datadict['x'] + 1j * datadict['y'], deg=True)
1506+
return datadict[demod_param]
1507+
14721508
def _sigout_setter(self, number, mode, setting, value):
14731509
"""
14741510
Function to set signal output's settings. A specific setter function is
@@ -1787,7 +1823,7 @@ def add_signal_to_sweeper(self, demodulator, attribute):
17871823
raise ValueError('Can not select attribute:'+
17881824
'{}. Only the following attributes are' +
17891825
' available: ' +
1790-
('{}, '*len(attributes)).format(*attributes))
1826+
('{}, '*len(valid_attributes)).format(*valid_attributes))
17911827

17921828
# internally, we use strings very similar to the ones used by the
17931829
# instrument, but with the attribute added, e.g.

0 commit comments

Comments
 (0)