from typing import TYPE_CHECKING
from qcodes.instrument import Instrument, InstrumentBaseKWArgs
from qcodes.parameters import MultiParameter, Parameter, ParamRawDataType
from qcodes.validators import Bool, Enum
if TYPE_CHECKING:
from typing_extensions import Unpack
class CurrentParameter(MultiParameter):
"""
Voltage measurement via an Ithaco preamp and converting volt to current.
To be used when you feed a current into the Ithaco, send the Ithaco's
output voltage to a lockin or other voltage amplifier, and you have
the voltage reading from that amplifier as a qcodes parameter.
``CurrentParameter.get()`` returns ``(volt_raw, curr)``
Args:
measured_param: a gettable parameter returning the
voltage read from the Ithaco output.
c_amp_ins: an Ithaco instance where you manually
maintain the present settings of the real Ithaco amp.
Note: it should be possible to use other current preamps, if they
define parameters ``sens`` (sensitivity, in A/V), ``sens_factor``
(an additional gain) and ``invert`` (bool, output is inverted)
name: the name of the current output. Default 'curr'.
Also used as the name of the whole parameter.
"""
def __init__(
self, measured_param: Parameter, c_amp_ins: "Ithaco_1211", name: str = "curr"
):
p_name = measured_param.name
super().__init__(
name=name,
names=(p_name + "_raw", name),
shapes=((), ()),
setpoints=((), ()),
instrument=c_amp_ins,
snapshot_value=True,
)
self._measured_param = measured_param
p_label = getattr(measured_param, "label", "")
p_unit = getattr(measured_param, "unit", "")
self.labels = (p_label, "Current")
self.units = (p_unit, "A")
def get_raw(self) -> tuple[ParamRawDataType, ...]:
assert isinstance(self.instrument, Ithaco_1211)
volt = self._measured_param.get()
current = (
self.instrument.sens.get() * self.instrument.sens_factor.get()
) * volt
if self.instrument.invert.get():
current *= -1
value = (volt, current)
return value
[docs]
class Ithaco1211(Instrument):
"""
QCoDeS driver for the Ithaco 1211 Current-preamplifier.
This is a virtual driver only and will not talk to your instrument.
"""
def __init__(self, name: str, **kwargs: "Unpack[InstrumentBaseKWArgs]"):
super().__init__(name, **kwargs)
self.sens: Parameter = self.add_parameter(
"sens",
initial_value=1e-8,
label="Sensitivity",
unit="A/V",
get_cmd=None,
set_cmd=None,
vals=Enum(1e-11, 1e-10, 1e-09, 1e-08, 1e-07, 1e-06, 1e-05, 1e-4, 1e-3),
)
"""Parameter sens"""
self.invert: Parameter = self.add_parameter(
"invert",
initial_value=True,
label="Inverted output",
get_cmd=None,
set_cmd=None,
vals=Bool(),
)
"""Parameter invert"""
self.sens_factor: Parameter = self.add_parameter(
"sens_factor",
initial_value=1,
label="Sensitivity factor",
unit=None,
get_cmd=None,
set_cmd=None,
vals=Enum(0.1, 1, 10),
)
"""Parameter sens_factor"""
self.suppression: Parameter = self.add_parameter(
"suppression",
initial_value=1e-7,
label="Suppression",
unit="A",
get_cmd=None,
set_cmd=None,
vals=Enum(1e-10, 1e-09, 1e-08, 1e-07, 1e-06, 1e-05, 1e-4, 1e-3),
)
"""Parameter suppression"""
self.risetime: Parameter = self.add_parameter(
"risetime",
initial_value=0.3,
label="Rise Time",
unit="msec",
get_cmd=None,
set_cmd=None,
vals=Enum(0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100, 300, 1000),
)
"""Parameter risetime"""
[docs]
def get_idn(self) -> dict[str, str | None]:
vendor = "Ithaco (DL Instruments)"
model = "1211"
serial = None
firmware = None
return {
"vendor": vendor,
"model": model,
"serial": serial,
"firmware": firmware,
}
class Ithaco_1211(Ithaco1211):
"""
Old alias for Itaco1211. Will eventually be deprecated and removed.
"""