Stanford Research Systems Drivers¶
Classes:
|
QCoDeS driver for the Stanford Research Systems SG384 RF Signal Generator. |
|
QCoDeS driver for the Stanford Research Systems SR560 Voltage-preamplifier. |
|
QCoDeS driver for the Stanford Research Systems SR830 Lock-in Amplifier. |
|
QCoDeS driver for the Stanford Research Systems SR860 Lock-in Amplifier. |
|
QCoDeS driver for the Stanford Research Systems SR865 Lock-in Amplifier. |
|
QCoDeS driver for the Stanford Research Systems SR865A Lock-in Amplifier. |
|
Base class for Stanford SR86x Lock-in Amplifier drivers. |
|
Buffer module for the SR86x drivers. |
|
Implements a data channel of SR86x lock-in amplifier. |
- class qcodes.instrument_drivers.stanford_research.SG384(name: str, address: str, reset: bool = False, **kwargs: Unpack[VisaInstrumentKWArgs])[source]¶
Bases:
VisaInstrumentQCoDeS driver for the Stanford Research Systems SG384 RF Signal Generator.
Status: beta version Includes the essential commands from the manual
Attributes:
default_terminatorThe default terminator to use if the terminator is not specified when creating the instrument.
frequencyParameter frequency
phaseParameter phase
amplitude_LFParameter amplitude_LF
amplitude_RFParameter amplitude_RF
amplitude_HFParameter amplitude_HF
amplitude_clockParameter amplitude_clock
noise_modeParameter noise_mode
enable_RFParameter enable_RF
enable_LFParameter enable_LF
enable_HFParameter enable_HF
enable_clockParameter enable_clock
offset_clockParameter offset_clock
offset_rearDCParameter offset_rearDC
offset_bncParameter offset_bnc
modulation_couplingParameter modulation_coupling
FM_deviationParameter FM_deviation
modulation_functionParameter modulation_function
enable_modulationParameter enable_modulation
modulation_rateParameter modulation_rate
modulation_typeParameter modulation_type
- default_terminator: str | None = '\n'¶
The default terminator to use if the terminator is not specified when creating the instrument. None means use the default terminator from PyVisa.
- frequency: Parameter = self.add_parameter( name="frequency", label="Frequency", unit="Hz", get_cmd="FREQ?", set_cmd="FREQ {:.3f}", get_parser=float, vals=vals.Numbers(min_value=9.5e5, max_value=4.05e9), )¶
Parameter frequency
- phase: Parameter = self.add_parameter( name="phase", label="Carrier phase", unit="deg", get_cmd="PHAS?", set_cmd="PHAS {:.1f}", get_parser=float, vals=vals.Numbers(min_value=-360, max_value=360), )¶
Parameter phase
- amplitude_LF: Parameter = self.add_parameter( name="amplitude_LF", label="Power of BNC output", unit="dBm", get_cmd="AMPL?", set_cmd="AMPL {:.2f}", get_parser=float, vals=vals.Numbers(min_value=-47, max_value=13), )¶
Parameter amplitude_LF
- amplitude_RF: Parameter = self.add_parameter( name="amplitude_RF", label="Power of type-N RF output", unit="dBm", get_cmd="AMPR?", set_cmd="AMPR {:.2f}", get_parser=float, vals=vals.Numbers(min_value=-110, max_value=16.5), )¶
Parameter amplitude_RF
- amplitude_HF: Parameter = self.add_parameter( name="amplitude_HF", label="Power of RF doubler output", unit="dBm", get_cmd="AMPH?", set_cmd="AMPH {:.2f}", get_parser=float, vals=vals.Numbers(min_value=-10, max_value=13), )¶
Parameter amplitude_HF
- amplitude_clock: Parameter = self.add_parameter( name="amplitude_clock", label="Rear clock output", unit="Vpp", get_cmd="AMPC?", set_cmd="AMPC {:.2f}", get_parser=float, vals=vals.Numbers(min_value=0.4, max_value=1.00), )¶
Parameter amplitude_clock
- noise_mode: Parameter = self.add_parameter( name="noise_mode", label="RF PLL loop filter mode", get_cmd="NOIS?", set_cmd="NOIS {}", val_mapping={"Mode 1": 0, "Mode 2": 1}, )¶
Parameter noise_mode
- enable_RF: Parameter = self.add_parameter( name="enable_RF", label="Type-N RF output", get_cmd="ENBR?", set_cmd="ENBR {}", val_mapping={"OFF": 0, "ON": 1}, )¶
Parameter enable_RF
- enable_LF: Parameter = self.add_parameter( name="enable_LF", label="BNC output", get_cmd="ENBL?", set_cmd="ENBL {}", val_mapping={"OFF": 0, "ON": 1}, )¶
Parameter enable_LF
- enable_HF: Parameter = self.add_parameter( name="enable_HF", label="RF doubler output", get_cmd="ENBH?", set_cmd="ENBH {}", val_mapping={"OFF": 0, "ON": 1}, )¶
Parameter enable_HF
- enable_clock: Parameter = self.add_parameter( name="enable_clock", label="Rear clock output", get_cmd="ENBC?", set_cmd="ENBC {}", val_mapping={"OFF": 0, "ON": 1}, )¶
Parameter enable_clock
- visa_handle: pyvisa.resources.MessageBasedResource = visa_handle¶
The VISA resource used by this instrument.
- parameters: dict[str, ParameterBase] = {}¶
All the parameters supported by this instrument. Usually populated via
add_parameter().
- functions: dict[str, Function] = {}¶
All the functions supported by this instrument. Usually populated via
add_function().
- submodules: dict[str, InstrumentModule | ChannelTuple] = {}¶
All the submodules of this instrument such as channel lists or logical groupings of parameters. Usually populated via
add_submodule().
- instrument_modules: dict[str, InstrumentModule] = {}¶
All the
InstrumentModuleof this instrument Usually populated viaadd_submodule().
- log: InstrumentLoggerAdapter = get_instrument_logger(self, __name__)¶
- offset_clock: Parameter = self.add_parameter( name="offset_clock", label="Rear clock offset voltage", unit="V", get_cmd="OFSC?", set_cmd="OFSC {}", get_parser=float, vals=vals.Numbers(min_value=-2, max_value=2), )¶
Parameter offset_clock
- offset_rearDC: Parameter = self.add_parameter( name="offset_rearDC", label="Rear DC offset voltage", unit="V", get_cmd="OFSD?", set_cmd="OFSD {}", get_parser=float, vals=vals.Numbers(min_value=-10, max_value=10), )¶
Parameter offset_rearDC
- offset_bnc: Parameter = self.add_parameter( name="offset_bnc", label="Low frequency BNC output", unit="V", get_cmd="OFSL?", set_cmd="OFSL {}", get_parser=float, vals=vals.Numbers(min_value=-1.5, max_value=1.5), )¶
Parameter offset_bnc
- modulation_coupling: Parameter = self.add_parameter( name="modulation_coupling", label="External modulation input coupling", get_cmd="COUP?", set_cmd="COUP {}", val_mapping={"AC": 0, "DC": 1}, )¶
Parameter modulation_coupling
- FM_deviation: Parameter = self.add_parameter( name="FM_deviation", label="Frequency modulation deviation", unit="Hz", get_cmd="FDEV?", set_cmd="FDEV {:.1f}", get_parser=float, vals=vals.Numbers(min_value=0.1, max_value=32e6), )¶
Parameter FM_deviation
- modulation_function: Parameter = self.add_parameter( name="modulation_function", label="Modulation function for AM/FM/PhiM", get_cmd="MFNC?", set_cmd="MFNC {}", val_mapping={ "Sine": 0, "Ramp": 1, "Triangle": 2, "Square": 3, "Noise": 4, "External": 5, }, )¶
Parameter modulation_function
- enable_modulation: Parameter = self.add_parameter( name="enable_modulation", get_cmd="MODL?", set_cmd="MODL {}", val_mapping={"OFF": 0, "ON": 1}, )¶
Parameter enable_modulation
- class qcodes.instrument_drivers.stanford_research.SR560(name: str, **kwargs: Unpack[InstrumentBaseKWArgs])[source]¶
Bases:
InstrumentQCoDeS driver for the Stanford Research Systems SR560 Voltage-preamplifier.
This is a virtual driver only and will not talk to your instrument.
Note
The
cutoff_loandcutoff_hiparameters will interact with each other on the instrument (hi cannot be <= lo) but this is not managed here, you must ensure yourself that both are correct whenever you change one of them.gainhas a vernier setting, which does not yield a well-defined output. We restrict this driver to only the predefined gain values.
Attributes:
cutoff_loParameter cutoff_lo
cutoff_hiParameter cutoff_hi
invertParameter invert
gainParameter gain
Methods:
get_idn()Parse a standard VISA
*IDN?response into an ID dict.- cutoff_lo: Parameter = self.add_parameter( "cutoff_lo", get_cmd=None, set_cmd=None, initial_value="DC", label="High pass", unit="Hz", vals=Enum(*cutoffs), )¶
Parameter cutoff_lo
- cutoff_hi: Parameter = self.add_parameter( "cutoff_hi", get_cmd=None, set_cmd=None, initial_value=1e6, label="Low pass", unit="Hz", vals=Enum(*cutoffs), )¶
Parameter cutoff_hi
- invert: Parameter = self.add_parameter( "invert", get_cmd=None, set_cmd=None, initial_value=True, label="Inverted output", vals=Bool(), )¶
Parameter invert
- parameters: dict[str, ParameterBase] = {}¶
All the parameters supported by this instrument. Usually populated via
add_parameter().
- functions: dict[str, Function] = {}¶
All the functions supported by this instrument. Usually populated via
add_function().
- submodules: dict[str, InstrumentModule | ChannelTuple] = {}¶
All the submodules of this instrument such as channel lists or logical groupings of parameters. Usually populated via
add_submodule().
- instrument_modules: dict[str, InstrumentModule] = {}¶
All the
InstrumentModuleof this instrument Usually populated viaadd_submodule().
- log: InstrumentLoggerAdapter = get_instrument_logger(self, __name__)¶
- gain: Parameter = self.add_parameter( "gain", get_cmd=None, set_cmd=None, initial_value=10, label="Gain", unit=None, vals=Enum(*gains), )¶
Parameter gain
- get_idn() dict[str, str | None][source]¶
Parse a standard VISA
*IDN?response into an ID dict.Even though this is the VISA standard, it applies to various other types as well, such as IPInstruments, so it is included here in the Instrument base class.
Override this if your instrument does not support
*IDN?or returns a nonstandard IDN string. This string is supposed to be a comma-separated list of vendor, model, serial, and firmware, but semicolon and colon are also common separators so we accept them here as well.- Returns:
A dict containing vendor, model, serial, and firmware.
- class qcodes.instrument_drivers.stanford_research.SR830(name: str, address: str, **kwargs: Unpack[VisaInstrumentKWArgs])[source]¶
Bases:
VisaInstrumentQCoDeS driver for the Stanford Research Systems SR830 Lock-in Amplifier.
Attributes:
phaseParameter phase
reference_sourceParameter reference_source
frequencyParameter frequency
ext_triggerParameter ext_trigger
harmonicParameter harmonic
amplitudeParameter amplitude
input_configParameter input_config
input_shieldParameter input_shield
input_couplingParameter input_coupling
notch_filterParameter notch_filter
sensitivityParameter sensitivity
reserveParameter reserve
time_constantParameter time_constant
filter_slopeParameter filter_slope
sync_filterParameter sync_filter
X_offsetParameter X_offset
Y_offsetParameter Y_offset
R_offsetParameter R_offset
output_interfaceParameter output_interface
XParameter X
YParameter Y
RParameter R
PParameter P
complex_voltageComplex voltage parameter calculated from X, Y phase using Z = X +j*Y
buffer_SRParameter buffer_SR
buffer_acq_modeParameter buffer_acq_mode
buffer_trig_modeParameter buffer_trig_mode
buffer_nptsParameter buffer_npts
sweep_setpointsParameter sweep_setpoints
SNAP_PARAMETERSMethods:
snap(*parameters)Get between 2 and 6 parameters at a single instant.
increment_sensitivity()Increment the sensitivity setting of the lock-in.
decrement_sensitivity()Decrement the sensitivity setting of the lock-in.
autorange([max_changes])Automatically changes the sensitivity of the instrument according to the R value and defined max_changes.
set_sweep_parameters(sweep_param, start, stop)- phase: Parameter = self.add_parameter( "phase", label="Phase", get_cmd="PHAS?", get_parser=float, set_cmd="PHAS {:.2f}", unit="deg", vals=Numbers(min_value=-360, max_value=729.99), )¶
Parameter phase
- reference_source: Parameter = self.add_parameter( "reference_source", label="Reference source", get_cmd="FMOD?", set_cmd="FMOD {}", val_mapping={ "external": 0, "internal": 1, }, vals=Enum("external", "internal"), )¶
Parameter reference_source
- frequency: Parameter = self.add_parameter( "frequency", label="Frequency", get_cmd="FREQ?", get_parser=float, set_cmd="FREQ {:.4f}", unit="Hz", vals=Numbers(min_value=1e-3, max_value=102e3), )¶
Parameter frequency
- ext_trigger: Parameter = self.add_parameter( "ext_trigger", label="External trigger", get_cmd="RSLP?", set_cmd="RSLP {}", val_mapping={ "sine": 0, "TTL rising": 1, "TTL falling": 2, }, )¶
Parameter ext_trigger
- harmonic: Parameter = self.add_parameter( "harmonic", label="Harmonic", get_cmd="HARM?", get_parser=int, set_cmd="HARM {:d}", vals=Ints(min_value=1, max_value=19999), )¶
Parameter harmonic
- amplitude: Parameter = self.add_parameter( "amplitude", label="Amplitude", get_cmd="SLVL?", get_parser=float, set_cmd="SLVL {:.3f}", unit="V", vals=Numbers(min_value=0.004, max_value=5.000), )¶
Parameter amplitude
- input_config: Parameter = self.add_parameter( "input_config", label="Input configuration", get_cmd="ISRC?", get_parser=self._get_input_config, set_cmd="ISRC {}", set_parser=self._set_input_config, vals=Enum(*self._INPUT_CONFIG_TO_N.keys()), )¶
Parameter input_config
- input_shield: Parameter = self.add_parameter( "input_shield", label="Input shield", get_cmd="IGND?", set_cmd="IGND {}", val_mapping={ "float": 0, "ground": 1, }, )¶
Parameter input_shield
- input_coupling: Parameter = self.add_parameter( "input_coupling", label="Input coupling", get_cmd="ICPL?", set_cmd="ICPL {}", val_mapping={ "AC": 0, "DC": 1, }, )¶
Parameter input_coupling
- notch_filter: Parameter = self.add_parameter( "notch_filter", label="Notch filter", get_cmd="ILIN?", set_cmd="ILIN {}", val_mapping={ "off": 0, "line in": 1, "2x line in": 2, "both": 3, }, )¶
Parameter notch_filter
- sensitivity: Parameter = self.add_parameter( name="sensitivity", label="Sensitivity", get_cmd="SENS?", set_cmd="SENS {:d}", get_parser=self._get_sensitivity, set_parser=self._set_sensitivity, )¶
Parameter sensitivity
- reserve: Parameter = self.add_parameter( "reserve", label="Reserve", get_cmd="RMOD?", set_cmd="RMOD {}", val_mapping={ "high": 0, "normal": 1, "low noise": 2, }, )¶
Parameter reserve
- time_constant: Parameter = self.add_parameter( "time_constant", label="Time constant", get_cmd="OFLT?", set_cmd="OFLT {}", unit="s", val_mapping={ 10e-6: 0, 30e-6: 1, 100e-6: 2, 300e-6: 3, 1e-3: 4, 3e-3: 5, 10e-3: 6, 30e-3: 7, 100e-3: 8, 300e-3: 9, 1: 10, 3: 11, 10: 12, 30: 13, 100: 14, 300: 15, 1e3: 16, 3e3: 17, 10e3: 18, 30e3: 19, }, )¶
Parameter time_constant
- filter_slope: Parameter = self.add_parameter( "filter_slope", label="Filter slope", get_cmd="OFSL?", set_cmd="OFSL {}", unit="dB/oct", val_mapping={ 6: 0, 12: 1, 18: 2, 24: 3, }, )¶
Parameter filter_slope
- sync_filter: Parameter = self.add_parameter( "sync_filter", label="Sync filter", get_cmd="SYNC?", set_cmd="SYNC {}", val_mapping={ "off": 0, "on": 1, }, )¶
Parameter sync_filter
- X_offset: Parameter = self.add_parameter( "X_offset", get_cmd="OEXP? 1", get_parser=parse_offset_get )¶
Parameter X_offset
- Y_offset: Parameter = self.add_parameter( "Y_offset", get_cmd="OEXP? 2", get_parser=parse_offset_get )¶
Parameter Y_offset
- R_offset: Parameter = self.add_parameter( "R_offset", get_cmd="OEXP? 3", get_parser=parse_offset_get )¶
Parameter R_offset
- output_interface: Parameter = self.add_parameter( "output_interface", label="Output interface", get_cmd="OUTX?", set_cmd="OUTX {}", val_mapping={ "RS232": "0\n", "GPIB": "1\n", }, )¶
Parameter output_interface
- X: Parameter = self.add_parameter( "X", get_cmd="OUTP? 1", get_parser=float, unit="V" )¶
Parameter X
- Y: Parameter = self.add_parameter( "Y", get_cmd="OUTP? 2", get_parser=float, unit="V" )¶
Parameter Y
- R: Parameter = self.add_parameter( "R", get_cmd="OUTP? 3", get_parser=float, unit="V" )¶
Parameter R
- P: Parameter = self.add_parameter( "P", get_cmd="OUTP? 4", get_parser=float, unit="deg" )¶
Parameter P
- complex_voltage: Parameter = self.add_parameter( "complex_voltage", label="Voltage", get_cmd=self._get_complex_voltage, unit="V", docstring="Complex voltage parameter " "calculated from X, Y phase using " "Z = X +j*Y", vals=ComplexNumbers(), )¶
Complex voltage parameter calculated from X, Y phase using Z = X +j*Y
- buffer_SR: Parameter = self.add_parameter( "buffer_SR", label="Buffer sample rate", get_cmd="SRAT ?", set_cmd=self._set_buffer_SR, unit="Hz", val_mapping={ 62.5e-3: 0, 0.125: 1, 0.250: 2, 0.5: 3, 1: 4, 2: 5, 4: 6, 8: 7, 16: 8, 32: 9, 64: 10, 128: 11, 256: 12, 512: 13, "Trigger": 14, }, get_parser=int, )¶
Parameter buffer_SR
- buffer_acq_mode: Parameter = self.add_parameter( "buffer_acq_mode", label="Buffer acquistion mode", get_cmd="SEND ?", set_cmd="SEND {}", val_mapping={"single shot": 0, "loop": 1}, get_parser=int, )¶
Parameter buffer_acq_mode
- buffer_trig_mode: Parameter = self.add_parameter( "buffer_trig_mode", label="Buffer trigger start mode", get_cmd="TSTR ?", set_cmd="TSTR {}", val_mapping={"ON": 1, "OFF": 0}, get_parser=int, )¶
Parameter buffer_trig_mode
- buffer_npts: Parameter = self.add_parameter( "buffer_npts", label="Buffer number of stored points", get_cmd="SPTS ?", get_parser=int, )¶
Parameter buffer_npts
- visa_handle: pyvisa.resources.MessageBasedResource = visa_handle¶
The VISA resource used by this instrument.
- parameters: dict[str, ParameterBase] = {}¶
All the parameters supported by this instrument. Usually populated via
add_parameter().
- functions: dict[str, Function] = {}¶
All the functions supported by this instrument. Usually populated via
add_function().
- submodules: dict[str, InstrumentModule | ChannelTuple] = {}¶
All the submodules of this instrument such as channel lists or logical groupings of parameters. Usually populated via
add_submodule().
- instrument_modules: dict[str, InstrumentModule] = {}¶
All the
InstrumentModuleof this instrument Usually populated viaadd_submodule().
- log: InstrumentLoggerAdapter = get_instrument_logger(self, __name__)¶
- sweep_setpoints: GeneratedSetPoints = self.add_parameter( "sweep_setpoints", parameter_class=GeneratedSetPoints, vals=Arrays(shape=(self.buffer_npts.get,)), )¶
Parameter sweep_setpoints
- SNAP_PARAMETERS: ClassVar[dict[str, str]] = {'aux1': '5', 'aux2': '6', 'aux3': '7', 'aux4': '8', 'ch1': '10', 'ch2': '11', 'freq': '9', 'p': '4', 'phase': '4', 'r': '3', 'x': '1', 'y': '2', 'θ': '4'}¶
- snap(*parameters: str) tuple[float, ...][source]¶
Get between 2 and 6 parameters at a single instant. This provides a coherent snapshot of measured signals. Pick up to 6 from: X, Y, R, θ, the aux inputs 1-4, frequency, or what is currently displayed on channels 1 and 2.
Reading X and Y (or R and θ) gives a coherent snapshot of the signal. Snap is important when the time constant is very short, a time constant less than 100 ms.
- Parameters:
*parameters – From 2 to 6 strings of names of parameters for which the values are requested. including: ‘x’, ‘y’, ‘r’, ‘p’, ‘phase’ or ‘θ’, ‘aux1’, ‘aux2’, ‘aux3’, ‘aux4’, ‘freq’, ‘ch1’, and ‘ch2’.
- Returns:
A tuple of floating point values in the same order as requested.
Examples
>>> lockin.snap('x','y') -> tuple(x,y)
>>> lockin.snap('aux1','aux2','freq','phase') >>> -> tuple(aux1,aux2,freq,phase)
Note
Volts for x, y, r, and aux 1-4 Degrees for θ Hertz for freq Unknown for ch1 and ch2. It will depend on what was set.
If X,Y,R and θ are all read, then the values of X,Y are recorded approximately 10 µs apart from R,θ. Thus, the values of X and Y may not yield the exact values of R and θ from a single snap.
The values of the Aux Inputs may have an uncertainty of up to 32 µs.
The frequency is computed only every other period or 40 ms, whichever is longer.
- increment_sensitivity() bool[source]¶
Increment the sensitivity setting of the lock-in. This is equivalent to pushing the sensitivity up button on the front panel. This has no effect if the sensitivity is already at the maximum.
- Returns:
Whether or not the sensitivity was actually changed.
- decrement_sensitivity() bool[source]¶
Decrement the sensitivity setting of the lock-in. This is equivalent to pushing the sensitivity down button on the front panel. This has no effect if the sensitivity is already at the minimum.
- Returns:
Whether or not the sensitivity was actually changed.
- autorange(max_changes: int = 1) None[source]¶
Automatically changes the sensitivity of the instrument according to the R value and defined max_changes.
- Parameters:
max_changes – Maximum number of steps allowing the function to automatically change the sensitivity (default is 1). The actual number of steps needed to change to the optimal sensitivity may be more or less than this maximum.
- class qcodes.instrument_drivers.stanford_research.SR860(name: str, address: str, reset: bool = False, **kwargs: Unpack[VisaInstrumentKWArgs])[source]¶
Bases:
SR86xQCoDeS driver for the Stanford Research Systems SR860 Lock-in Amplifier.
The SR860 instrument is almost equal to the SR865, except for the max frequency
- class qcodes.instrument_drivers.stanford_research.SR865(name: str, address: str, reset: bool = False, **kwargs: Unpack[VisaInstrumentKWArgs])[source]¶
Bases:
SR86xQCoDeS driver for the Stanford Research Systems SR865 Lock-in Amplifier.
The SR865 instrument is almost equal to the SR860, except for the max frequency
- class qcodes.instrument_drivers.stanford_research.SR865A(name: str, address: str, reset: bool = False, **kwargs: Unpack[VisaInstrumentKWArgs])[source]¶
Bases:
SR86xQCoDeS driver for the Stanford Research Systems SR865A Lock-in Amplifier.
The SR865A instrument is almost equal to the SR865, except for the max frequency
- class qcodes.instrument_drivers.stanford_research.SR86x(name: str, address: str, max_frequency: float, reset: bool = False, **kwargs: Unpack[VisaInstrumentKWArgs])[source]¶
Bases:
VisaInstrumentBase class for Stanford SR86x Lock-in Amplifier drivers. This class should not be instantiated directly instead one of the model specific sub classes should be used.
Attributes:
PARAMETER_NAMESdefault_terminatorThe default terminator to use if the terminator is not specified when creating the instrument.
frequencyParameter frequency
sine_outdcParameter sine_outdc
amplitudeParameter amplitude
harmonicParameter harmonic
phaseParameter phase
sensitivityParameter sensitivity
filter_slopeParameter filter_slope
sync_filterParameter sync_filter
noise_bandwidthParameter noise_bandwidth
signal_strengthParameter signal_strength
signal_inputParameter signal_input
input_rangeParameter input_range
input_configParameter input_config
input_shieldParameter input_shield
input_gainParameter input_gain
adv_filterParameter adv_filter
input_couplingParameter input_coupling
time_constantParameter time_constant
external_reference_triggerThe triggering mode for synchronization of the internal reference signal with the externally provided one
reference_sourceThe source of the reference signal
external_reference_trigger_input_resistanceInput resistance of the input for the external reference signal
XParameter X
YParameter Y
RParameter R
PParameter P
complex_voltageParameter complex_voltage
X_offsetParameter X_offset
Y_offsetParameter Y_offset
R_offsetParameter R_offset
X_expandParameter X_expand
Y_expandParameter Y_expand
R_expandParameter R_expand
data_channelsInterface for the SR86x data channels
bufferInterface for the SR86x buffer
Methods:
get_values(*parameter_names)Get values of 2 or 3 parameters that are measured by the lock-in amplifier.
get_data_channels_values()Queries the current values of the data channels
get_data_channels_parameters([query_instrument])Convenience method to query a list of parameters which the data channels are currently assigned to.
get_data_channels_dict([requery_names])Returns a dictionary where the keys are parameter names currently assigned to the data channels, and values are the values of those parameters.
- PARAMETER_NAMES: ClassVar[dict[str, str]] = {'P': '3', 'R': '2', 'X': '0', 'Xnoise': '8', 'Y': '1', 'Ynoise': '9', 'amplitude': '13', 'aux_in1': '4', 'aux_in2': '5', 'aux_in3': '6', 'aux_in4': '7', 'aux_out1': '10', 'aux_out2': '11', 'frequency': '15', 'frequency_ext': '16', 'phase': '12', 'sine_outdc': '14'}¶
- default_terminator: str | None = '\n'¶
The default terminator to use if the terminator is not specified when creating the instrument. None means use the default terminator from PyVisa.
- frequency: Parameter = self.add_parameter( name="frequency", label="Frequency", unit="Hz", get_cmd="FREQ?", set_cmd="FREQ {}", get_parser=float, vals=Numbers(min_value=1e-3, max_value=self._max_frequency), )¶
Parameter frequency
- sine_outdc: Parameter = self.add_parameter( name="sine_outdc", label="Sine out dc level", unit="V", get_cmd="SOFF?", set_cmd="SOFF {}", get_parser=float, vals=Numbers(min_value=-5, max_value=5), )¶
Parameter sine_outdc
- amplitude: Parameter = self.add_parameter( name="amplitude", label="Amplitude", unit="V", get_cmd="SLVL?", set_cmd="SLVL {}", get_parser=float, vals=Numbers(min_value=0, max_value=2), )¶
Parameter amplitude
- harmonic: Parameter = self.add_parameter( name="harmonic", label="Harmonic", get_cmd="HARM?", get_parser=int, set_cmd="HARM {:d}", vals=Ints(min_value=1, max_value=99), )¶
Parameter harmonic
- phase: Parameter = self.add_parameter( name="phase", label="Phase", unit="deg", get_cmd="PHAS?", set_cmd="PHAS {}", get_parser=float, vals=Numbers(min_value=-3.6e5, max_value=3.6e5), )¶
Parameter phase
- sensitivity: Parameter = self.add_parameter( name="sensitivity", label="Sensitivity", get_cmd="SCAL?", set_cmd="SCAL {:d}", get_parser=self._get_sensitivity, set_parser=self._set_sensitivity, )¶
Parameter sensitivity
- filter_slope: Parameter = self.add_parameter( name="filter_slope", label="Filter slope", unit="dB/oct", get_cmd="OFSL?", set_cmd="OFSL {}", val_mapping={6: 0, 12: 1, 18: 2, 24: 3}, )¶
Parameter filter_slope
- sync_filter: Parameter = self.add_parameter( name="sync_filter", label="Sync filter", get_cmd="SYNC?", set_cmd="SYNC {}", val_mapping={"OFF": 0, "ON": 1}, )¶
Parameter sync_filter
- noise_bandwidth: Parameter = self.add_parameter( name="noise_bandwidth", label="Noise bandwidth", unit="Hz", get_cmd="ENBW?", get_parser=float, )¶
Parameter noise_bandwidth
- signal_strength: Parameter = self.add_parameter( name="signal_strength", label="Signal strength indicator", get_cmd="ILVL?", get_parser=int, )¶
Parameter signal_strength
- signal_input: Parameter = self.add_parameter( name="signal_input", label="Signal input", get_cmd="IVMD?", get_parser=self._get_input_config, set_cmd="IVMD {}", set_parser=self._set_input_config, vals=Enum(*self._INPUT_SIGNAL_TO_N.keys()), )¶
Parameter signal_input
- input_range: Parameter = self.add_parameter( name="input_range", label="Input range", unit="V", get_cmd="IRNG?", set_cmd="IRNG {}", val_mapping={1: 0, 300e-3: 1, 100e-3: 2, 30e-3: 3, 10e-3: 4}, )¶
Parameter input_range
- input_config: Parameter = self.add_parameter( name="input_config", label="Input configuration", get_cmd="ISRC?", set_cmd="ISRC {}", val_mapping={"a": 0, "a-b": 1}, )¶
Parameter input_config
- input_shield: Parameter = self.add_parameter( name="input_shield", label="Input shield", get_cmd="IGND?", set_cmd="IGND {}", val_mapping={"float": 0, "ground": 1}, )¶
Parameter input_shield
- input_gain: Parameter = self.add_parameter( name="input_gain", label="Input gain", unit="ohm", get_cmd="ICUR?", set_cmd="ICUR {}", val_mapping={1e6: 0, 100e6: 1}, )¶
Parameter input_gain
- adv_filter: Parameter = self.add_parameter( name="adv_filter", label="Advanced filter", get_cmd="ADVFILT?", set_cmd="ADVFILT {}", val_mapping={"OFF": 0, "ON": 1}, )¶
Parameter adv_filter
- visa_handle: pyvisa.resources.MessageBasedResource = visa_handle¶
The VISA resource used by this instrument.
- parameters: dict[str, ParameterBase] = {}¶
All the parameters supported by this instrument. Usually populated via
add_parameter().
- functions: dict[str, Function] = {}¶
All the functions supported by this instrument. Usually populated via
add_function().
- submodules: dict[str, InstrumentModule | ChannelTuple] = {}¶
All the submodules of this instrument such as channel lists or logical groupings of parameters. Usually populated via
add_submodule().
- instrument_modules: dict[str, InstrumentModule] = {}¶
All the
InstrumentModuleof this instrument Usually populated viaadd_submodule().
- log: InstrumentLoggerAdapter = get_instrument_logger(self, __name__)¶
- input_coupling: Parameter = self.add_parameter( name="input_coupling", label="Input coupling", get_cmd="ICPL?", set_cmd="ICPL {}", val_mapping={"ac": 0, "dc": 1}, )¶
Parameter input_coupling
- time_constant: Parameter = self.add_parameter( name="time_constant", label="Time constant", unit="s", get_cmd="OFLT?", set_cmd="OFLT {}", val_mapping={ 1e-6: 0, 3e-6: 1, 10e-6: 2, 30e-6: 3, 100e-6: 4, 300e-6: 5, 1e-3: 6, 3e-3: 7, 10e-3: 8, 30e-3: 9, 100e-3: 10, 300e-3: 11, 1: 12, 3: 13, 10: 14, 30: 15, 100: 16, 300: 17, 1e3: 18, 3e3: 19, 10e3: 20, 30e3: 21, }, )¶
Parameter time_constant
- external_reference_trigger: Parameter = self.add_parameter( name="external_reference_trigger", label="External reference trigger mode", get_cmd="RTRG?", set_cmd="RTRG {}", val_mapping={ "SIN": 0, "POS": 1, "POSTTL": 1, "NEG": 2, "NEGTTL": 2, }, docstring="The triggering mode for synchronization of the " "internal reference signal with the externally provided " "one", )¶
The triggering mode for synchronization of the internal reference signal with the externally provided one
- reference_source: Parameter = self.add_parameter( name="reference_source", label="Reference source", get_cmd="RSRC?", set_cmd="RSRC {}", val_mapping={"INT": 0, "EXT": 1, "DUAL": 2, "CHOP": 3}, docstring="The source of the reference signal", )¶
The source of the reference signal
- external_reference_trigger_input_resistance: Parameter = ( self.add_parameter( name="external_reference_trigger_input_resistance", label="External reference trigger input resistance", get_cmd="REFZ?", set_cmd="REFZ {}", val_mapping={ "50": 0, "50OHMS": 0, 0: 0, "1M": 1, "1MEG": 1, 1: 1, }, docstring="Input resistance of the input for the external " "reference signal", ) )¶
Input resistance of the input for the external reference signal
- X: Parameter = self.add_parameter( "X", label="In-phase Magnitude", get_cmd="OUTP? 0", get_parser=float, unit="V", )¶
Parameter X
- Y: Parameter = self.add_parameter( "Y", label="Out-phase Magnitude", get_cmd="OUTP? 1", get_parser=float, unit="V", )¶
Parameter Y
- R: Parameter = self.add_parameter( "R", label="Magnitude", get_cmd="OUTP? 2", get_parser=float, unit="V" )¶
Parameter R
- P: Parameter = self.add_parameter( "P", label="Phase", get_cmd="OUTP? 3", get_parser=float, unit="deg" )¶
Parameter P
- complex_voltage: Parameter = self.add_parameter( "complex_voltage", label="Voltage", get_cmd=self._get_complex_voltage, unit="V", vals=ComplexNumbers(), )¶
Parameter complex_voltage
- X_offset: Parameter = self.add_parameter( "X_offset", label="X offset ", unit="%", get_cmd="COFP? 0", set_cmd="COFP 0, {}", get_parser=float, vals=Numbers(min_value=-999.99, max_value=999.99), )¶
Parameter X_offset
- Y_offset: Parameter = self.add_parameter( "Y_offset", label="Y offset", unit="%", get_cmd="COFP? 1", set_cmd="COFP 1, {}", get_parser=float, vals=Numbers(min_value=-999.99, max_value=999.99), )¶
Parameter Y_offset
- R_offset: Parameter = self.add_parameter( "R_offset", label="R offset", unit="%", get_cmd="COFP? 2", set_cmd="COFP 2, {}", get_parser=float, vals=Numbers(min_value=-999.99, max_value=999.99), )¶
Parameter R_offset
- X_expand: Parameter = self.add_parameter( "X_expand", label="X expand multiplier", get_cmd="CEXP? 0", set_cmd="CEXP 0, {}", val_mapping={"OFF": "0", "X10": "1", "X100": "2"}, )¶
Parameter X_expand
- Y_expand: Parameter = self.add_parameter( "Y_expand", label="Y expand multiplier", get_cmd="CEXP? 1", set_cmd="CEXP 1, {}", val_mapping={"OFF": 0, "X10": 1, "X100": 2}, )¶
Parameter Y_expand
- R_expand: Parameter = self.add_parameter( "R_expand", label="R expand multiplier", get_cmd="CEXP? 2", set_cmd="CEXP 2, {}", val_mapping={"OFF": 0, "X10": 1, "X100": 2}, )¶
Parameter R_expand
- data_channels: ChannelTuple[SR86xDataChannel] = self.add_submodule( "data_channels", data_channels.to_channel_tuple() )¶
Interface for the SR86x data channels
- buffer: SR86xBuffer = self.add_submodule("buffer", buffer)¶
Interface for the SR86x buffer
- get_values(*parameter_names: str) tuple[float, ...][source]¶
Get values of 2 or 3 parameters that are measured by the lock-in amplifier. These values are guaranteed to come from the same measurement cycle as opposed to getting values of parameters one by one (for example, by calling sr.X(), and then sr.Y().
- Parameters:
*parameter_names – 2 or 3 names of parameters for which the values are requested; valid names can be found in PARAMETER_NAMES attribute of the driver class
- Returns:
a tuple of 2 or 3 floating point values
- get_data_channels_values() tuple[float, ...][source]¶
Queries the current values of the data channels
- Returns:
tuple of 4 values of the data channels
- get_data_channels_parameters(query_instrument: bool = True) tuple[str, ...][source]¶
Convenience method to query a list of parameters which the data channels are currently assigned to.
- Parameters:
query_instrument – If set to False, the internally cashed names of the parameters will be returned; if True, then the names will be queried through the instrument
- Returns:
a tuple of 4 strings of parameter names
- get_data_channels_dict(requery_names: bool = False) dict[str, float][source]¶
Returns a dictionary where the keys are parameter names currently assigned to the data channels, and values are the values of those parameters.
- Parameters:
requery_names – if False, the currently assigned parameter names will not be queries from the instrument in order to save time on communication, in this case the cached assigned parameter names will be used for the keys of the dicitonary; if True, the assigned parameter names will be queried from the instrument
- Returns:
a dictionary where keys are names of parameters assigned to the data channels, and values are the values of those parameters
- class qcodes.instrument_drivers.stanford_research.SR86xBuffer(parent: SR86x, name: str, **kwargs: Unpack[InstrumentBaseKWArgs])[source]¶
Bases:
InstrumentChannelBuffer module for the SR86x drivers.
This driver has been verified to work with the SR860 and SR865. For reference, please consult the SR860 manual: http://thinksrs.com/downloads/PDFs/Manuals/SR860m.pdf
Attributes:
Parameter capture_length_in_kb
Parameter capture_config configures which parameters we want to capture
Parameter capture_rate_max
Parameter capture_rate
Are we capturing at the moment?
Number of bytes captured so far in the buffer.
Number of kilobytes captured so far in the buffer, rounded-up to 2 kilobyte chunks.
X buffer readout.
Y buffer readout.
R buffer readout.
T buffer readout.
Methods:
snapshot_base([update, params_to_skip_update])State of the instrument as a JSON-compatible dict (everything that the custom JSON encoder class
NumpyJSONEncodersupports).Sets the capture rate to maximum.
start_capture(acquisition_mode, trigger_mode)Start an acquisition.
Stop a capture
set_capture_length_to_fit_samples(sample_count)Set the capture length of the buffer to fit the given number of samples.
wait_until_samples_captured(sample_count)Wait until the given number of samples is captured.
get_capture_data(sample_count)Read the given number of samples of the capture data from the buffer.
Capture one sample per each trigger, and return when the specified number of triggers has been received.
capture_samples_after_trigger(sample_count, ...)Capture a number of samples after a trigger has been received.
capture_samples(sample_count)Capture a number of samples at a capture rate, starting immediately.
- capture_length_in_kb: Parameter = self.add_parameter( "capture_length_in_kb", label="get/set capture length", get_cmd="CAPTURELEN?", set_cmd="CAPTURELEN {}", set_parser=self._set_capture_len_parser, get_parser=int, unit="kB", )¶
Parameter capture_length_in_kb
- capture_config: Parameter = self.add_parameter( "capture_config", label="capture configuration", get_cmd="CAPTURECFG?", set_cmd="CAPTURECFG {}", val_mapping={"X": "0", "X,Y": "1", "R,T": "2", "X,Y,R,T": "3"}, )¶
Parameter capture_config configures which parameters we want to capture
- capture_rate_max: Parameter = self.add_parameter( "capture_rate_max", label="capture rate maximum", get_cmd="CAPTURERATEMAX?", get_parser=float, )¶
Parameter capture_rate_max
- capture_rate: Parameter = self.add_parameter( "capture_rate", label="capture rate raw", get_cmd="CAPTURERATE?", set_cmd="CAPTURERATE {}", get_parser=float, set_parser=self._set_capture_rate_parser, )¶
Parameter capture_rate
- capture_status: Parameter = self.add_parameter( "capture_status", label="capture status", get_cmd="CAPTURESTAT?" )¶
Are we capturing at the moment?
- Type:
Parameter capture_status
- count_capture_bytes: Parameter = self.add_parameter( "count_capture_bytes", label="captured bytes", get_cmd="CAPTUREBYTES?", unit="B", get_parser=int, docstring="Number of bytes captured so far in the buffer. Can be " "used to track live progress.", )¶
Number of bytes captured so far in the buffer. Can be used to track live progress.
- count_capture_kilobytes: Parameter = self.add_parameter( "count_capture_kilobytes", label="captured kilobytes", get_cmd="CAPTUREPROG?", unit="kB", docstring="Number of kilobytes captured so far in the buffer, " "rounded-up to 2 kilobyte chunks. Capture must be " "stopped before requesting the value of this " "parameter. If the acquisition wrapped during operating " "in Continuous mode, then the returned value is " "simply equal to the current capture length.", )¶
Number of kilobytes captured so far in the buffer, rounded-up to 2 kilobyte chunks. Capture must be stopped before requesting the value of this parameter. If the acquisition wrapped during operating in Continuous mode, then the returned value is simply equal to the current capture length.
- X: SR86xBufferReadout = self.add_parameter( "X", parameter_class=SR86xBufferReadout )¶
X buffer readout.
- Y: SR86xBufferReadout = self.add_parameter( "Y", parameter_class=SR86xBufferReadout )¶
Y buffer readout.
- R: SR86xBufferReadout = self.add_parameter( "R", parameter_class=SR86xBufferReadout )¶
R buffer readout.
- T: SR86xBufferReadout = self.add_parameter( "T", parameter_class=SR86xBufferReadout )¶
T buffer readout.
- snapshot_base(update: bool | None = False, params_to_skip_update: Sequence[str] | None = None) dict[Any, Any][source]¶
State of the instrument as a JSON-compatible dict (everything that the custom JSON encoder class
NumpyJSONEncodersupports).- Parameters:
update – If
True, update the state by querying the instrument. If None update the state if known to be invalid. IfFalse, just use the latest values in memory and never update state.params_to_skip_update – List of parameter names that will be skipped in update even if update is True. This is useful if you have parameters that are slow to update but can be updated in a different way (as in the qdac). If you want to skip the update of certain parameters in all snapshots, use the
snapshot_getattribute of those parameters instead.
- Returns:
base snapshot
- Return type:
- set_capture_rate_to_maximum() None[source]¶
Sets the capture rate to maximum. The maximum capture rate is retrieved from the device, and depends on the current value of the time constant.
- start_capture(acquisition_mode: str, trigger_mode: str) None[source]¶
Start an acquisition. Please see page 137 of the manual for a detailed explanation.
- Parameters:
acquisition_mode – “ONE” | “CONT”
trigger_mode – “IMM” | “TRIG” | “SAMP”
- set_capture_length_to_fit_samples(sample_count: int) None[source]¶
Set the capture length of the buffer to fit the given number of samples.
- Parameters:
sample_count – Number of samples that the buffer has to fit
- wait_until_samples_captured(sample_count: int) None[source]¶
Wait until the given number of samples is captured. This function is blocking and has to be used with caution because it does not have a timeout.
- Parameters:
sample_count – Number of samples that needs to be captured
- get_capture_data(sample_count: int) dict[str, ndarray[tuple[Any, ...], dtype[_ScalarT]]][source]¶
Read the given number of samples of the capture data from the buffer.
- Parameters:
sample_count – number of samples to read from the buffer
- Returns:
The keys in the dictionary correspond to the captured variables. For instance, if before the capture, the capture config was set as ‘capture_config(“X,Y”)’, then the keys will be “X” and “Y”. The values in the dictionary are numpy arrays of numbers.
- capture_one_sample_per_trigger(trigger_count: int, start_triggers_pulsetrain: Callable[..., Any]) dict[str, npt.NDArray][source]¶
Capture one sample per each trigger, and return when the specified number of triggers has been received.
- Parameters:
trigger_count – Number of triggers to capture samples for
start_triggers_pulsetrain – By calling this non-blocking function, the train of trigger pulses should start
- Returns:
The keys in the dictionary correspond to the captured variables. For instance, if before the capture, the capture config was set as ‘capture_config(“X,Y”)’, then the keys will be “X” and “Y”. The values in the dictionary are numpy arrays of numbers.
- capture_samples_after_trigger(sample_count: int, send_trigger: Callable[..., Any]) dict[str, npt.NDArray][source]¶
Capture a number of samples after a trigger has been received. Please refer to page 135 of the manual for details.
- Parameters:
sample_count – Number of samples to capture
send_trigger – By calling this non-blocking function, one trigger should be sent that will initiate the capture
- Returns:
The keys in the dictionary correspond to the captured variables. For instance, if before the capture, the capture config was set as ‘capture_config(“X,Y”)’, then the keys will be “X” and “Y”. The values in the dictionary are numpy arrays of numbers.
- capture_samples(sample_count: int) dict[str, ndarray[tuple[Any, ...], dtype[_ScalarT]]][source]¶
Capture a number of samples at a capture rate, starting immediately. Unlike the “continuous” capture mode, here the buffer does not get overwritten with the new data once the buffer is full.
The function blocks until the required number of samples is acquired, and returns them.
- Parameters:
sample_count – Number of samples to capture
- Returns:
The keys in the dictionary correspond to the captured variables. For instance, if before the capture, the capture config was set as ‘capture_config(“X,Y”)’, then the keys will be “X” and “Y”. The values in the dictionary are numpy arrays of numbers.
- parameters: dict[str, ParameterBase] = {}¶
All the parameters supported by this instrument. Usually populated via
add_parameter().
- functions: dict[str, Function] = {}¶
All the functions supported by this instrument. Usually populated via
add_function().
- submodules: dict[str, InstrumentModule | ChannelTuple] = {}¶
All the submodules of this instrument such as channel lists or logical groupings of parameters. Usually populated via
add_submodule().
- instrument_modules: dict[str, InstrumentModule] = {}¶
All the
InstrumentModuleof this instrument Usually populated viaadd_submodule().
- log: InstrumentLoggerAdapter = get_instrument_logger(self, __name__)¶
- class qcodes.instrument_drivers.stanford_research.SR86xDataChannel(parent: SR86x, name: str, cmd_id: str, cmd_id_name: str | None = None, color: str | None = None, **kwargs: Unpack[InstrumentBaseKWArgs])[source]¶
Bases:
InstrumentChannelImplements a data channel of SR86x lock-in amplifier. Parameters that are assigned to these channels get plotted on the display of the instrument. Moreover, there are commands that allow to conveniently retrieve the values of the parameters that are currently assigned to the data channels.
This class relies on the available parameter names that should be mentioned in the lock-in amplifier class in PARAMETER_NAMES attribute.
- Parameters:
parent – an instance of SR86x driver
name – data channel name that is to be used to reference it from the parent
cmd_id – this ID is used in VISA commands to refer to this data channel, usually is an integer number
cmd_id_name – this name can also be used in VISA commands along with channel_id; it is not used in this implementation, but is added for reference
color – every data channel is also referred to by the color with which it is being plotted on the instrument’s screen; added here only for reference
Attributes:
Allows to set and get the parameter that is assigned to the channel
- assigned_parameter: Parameter = self.add_parameter( "assigned_parameter", label=f"Data channel {cmd_id} parameter", docstring=f"Allows to set and get the " f"parameter that is assigned to data " f"channel {cmd_id}", set_cmd=f"CDSP {cmd_id}, {{}}", get_cmd=f"CDSP? {cmd_id}", val_mapping=self.parent.PARAMETER_NAMES, )¶
Allows to set and get the parameter that is assigned to the channel
- parameters: dict[str, ParameterBase] = {}¶
All the parameters supported by this instrument. Usually populated via
add_parameter().
- functions: dict[str, Function] = {}¶
All the functions supported by this instrument. Usually populated via
add_function().
- submodules: dict[str, InstrumentModule | ChannelTuple] = {}¶
All the submodules of this instrument such as channel lists or logical groupings of parameters. Usually populated via
add_submodule().
- instrument_modules: dict[str, InstrumentModule] = {}¶
All the
InstrumentModuleof this instrument Usually populated viaadd_submodule().
- log: InstrumentLoggerAdapter = get_instrument_logger(self, __name__)¶