QCoDeS 0.59.0 (2026-08-24)
Breaking Changes:
-
Legacy backwards-compatibility aliases across the
instrument_driversmodule that were
deprecated in QCoDeS 0.57.0 have been removed. This includes deprecated class aliases and
deprecated module shims for AlazarTech, Basel, Galil, HP, Ithaco, Keithley, Keysight,
Mini-Circuits, Oxford Instruments, Rigol, Rohde & Schwarz, Signal Hound,
Stanford Research Systems, Tektronix, Weinschel, and Yokogawa drivers. Users should
migrate to the canonical class names listed in the 0.57.0 changelog. #8060 -
Several module-level
TypeVardefinitions and type aliases that are no longer used
internally have been deprecated. Importing them will emit aQCoDeSDeprecationWarning.
They will be removed in a future version. #8096 -
Removed deprecated VISA-related APIs from
:class:~qcodes.instrument.visa.VisaInstrument: the_addressproperty
(useaddressinstead) and thevisalibproperty (usevisabackend
instead). The unused and deprecatedMockAMI430mocker class has also been
removed. #8103 -
Importing the short hand aliases (such as
Parameter,Measurement,
Instrument,MonitorandStation) from the top levelqcodes
namespace is now deprecated and emits aQCoDeSDeprecationWarning. Import
these names from their respective submodules (for exampleqcodes.parameters,
qcodes.datasetorqcodes.station) instead. The submodules themselves
(such asqcodes.datasetandqcodes.instrument) remain accessible from the
top levelqcodesnamespace and are not deprecated.Similarly, importing the parameter classes (such as
Parameter,ManualParameterand
DelegateParameter) fromqcodes.instrumentis now deprecated and emits a
QCoDeSDeprecationWarning. Import these names fromqcodes.parameters
instead. The names remain available fromqcodes.instrumentat runtime for
backwards compatibility but are hidden from static type checkers, so importing
them fromqcodes.instrumentis reported as an unknown attribute. #8252 -
The default format of
DataSetProtocol.run_timestamp,
DataSetProtocol.completed_timestampand
qcodes.dataset.sqlite.queries.raw_time_to_str_timechanged from
"%Y-%m-%d %H:%M:%S"to"%Y-%m-%d %H:%M:%S%z", i.e. the rendered
timestamps now include the UTC offset of the local timezone, e.g.
"2026-07-31 10:27:25+0200".Timestamps are stored in the QCoDeS database as POSIX timestamps, which do not
capture the timezone in which the measurement was performed. They are therefore
still rendered in the local timezone of the machine reading the dataset, but
the resulting string is no longer ambiguous. This also applies to the
run_timestampandcompleted_timestampattributes written when exporting
a dataset to NetCDF or xarray.Pass an explicit
fmtargument to restore the previous behaviour.Parameter cache timestamps are now timezone aware.
ParameterBase.cache.timestamp
(and thereforeParameter.get_latest.get_timestamp()) returns a
datetimewithtzinfoset to the local timezone rather than a naive
datetime. Code that compares these timestamps to naivedatetimeobjects
will raiseTypeErrorand must be updated to use timezone aware datetimes.Consequently the
"ts"field of a parameter snapshot changed from
"%Y-%m-%d %H:%M:%S"to ISO 8601 format including the UTC offset, e.g.
"2026-07-31 10:27:25+02:00". Snapshots can be parsed with
datetime.datetime.fromisoformat. #8345 -
The default value of the
updateargument ofsnapshot,snapshot_base
andprint_readable_snapshot(on every :class:.Metadatable, including
instruments, channels and parameters) is now"Only_invalid". Previously
calling e.g.instrument.snapshot()orparameter.snapshot()without an
argument effectively defaulted to the equivalent of"Never"and never
refreshed anything. As a result,snapshot()(andprint_readable_snapshot())
will now callget()on parameters whose cache is invalid, which may query the
underlying instrument. Passupdate="Never"explicitly to restore the previous
"do not update" behavior, orupdate="All"to force a full update.Relatedly, the station snapshot that :class:
.Measurementstores before a
measurement starts is now taken withupdate="Only_invalid"(previously the
equivalent of"Never"), so parameters with an invalid cache are refreshed via
a singlegetwhile parameters with a valid cache keep their cached value.The legacy
True/None/Falsevalues of theupdateargument are
now deprecated aliases for"All"/"Only_invalid"/"Never". They keep
working (no runtime warning is raised), but type checkers will flag their use;
prefer the string values instead. #8354
Improved:
- :meth:
.Instrument.close_allgained anonly_subclasseskeyword argument. When
set toTrue, only instruments that are instances of the class (or its subclasses)
on whichclose_allis called are closed, leaving other registered instruments open.
Thelog_statusandonly_subclassesarguments are now keyword-only. #8312
Improved Drivers:
-
Fixed three bugs in :class:
qcodes.instrument_drivers.QuantumDesign.DynaCoolPPMS.DynaCool.DynaCool
that prevented the driver from instantiating and from updating the
temperature_setpointcache:block_while_ramping_temperatureis now created withset_cmd=None/
get_cmd=Noneso it behaves as a settable cache-only parameter, instead of
set_cmd=False/get_cmd=Falsewhich made it read-only and rejected
the suppliedinitial_value.- Removed the duplicate
instrument=selfargument from the
blocking_t_state_check_intervalparameter creation, which is supplied
automatically byadd_parameterand was raising on construction. - Fixed an
AttributeErrorwhen setting the temperature: the cache update
in_set_temperature_and_statenow correctly references
self.temperature_setpointrather than the non-existentself.setpoint. #8097
-
Correct the lower bound of the span parameter validator of the KeysightPNABase driver to 0 Hz. #8195
-
Referring to the:
Keysight Trueform Series Operating and Service Guide_Agilent 33210A 10 MHz Function / Arbitrary Waveform Generator User's Guide_Agilent 33250A 80 MHz Function / Arbitrary Waveform Generator_
Improvements:
- Expanded the list of supported devices for the KeysightAgilent_33XXX driver
- Added implementations of SCPI commands for working with: ARB signals, edges of Pulse function, output termination, voltage autoranging
- Created tests for new commands and update sim file
.. _
Keysight Trueform Series Operating and Service Guide: https://www.keysight.com/us/en/assets/9018-03714/service-manuals/9018-03714.pdf
.. _Agilent 33210A 10 MHz Function / Arbitrary Waveform Generator User's Guide: https://www.keysight.com/us/en/support/33210A/33210a-waveform-and-function-generator.html
.. _Agilent 33250A 80 MHz Function / Arbitrary Waveform Generator: https://www.keysight.com/us/en/support/33250A/function--arbitrary-waveform-generator-80-mhz.html #8254 -
Fixed the timezone offset written into the waveform and sequence files
generated by the Tektronix AWG70000A drivers. The offset was computed manually
fromtime.timezone, which gave the offset the wrong sign and ignored
daylight saving time, so e.g. a machine in UTC+02:00 wrote-02:00. The
offset is now taken from the local timezone of the timestamp itself. #8345 -
The QDev QDac driver now honors the
"Only_invalid"snapshotupdatemode:
when snapshotting, the bulk status read that refreshes the channel
v/i/irange/vrangecaches is only performed forupdate="All",
or forupdate="Only_invalid"when one of those channel caches is actually
invalid. Previously the bulk read was performed on every snapshot that was not
"Never", which made repeated snapshots unnecessarily expensive even when the
channel caches were already valid. #8354
New:
-
Added :func:
qcodes.dataset.get_db_overview, a fast way to list the runs in a
QCoDeS database. It fetches run metadata (experiment/sample names, timestamps,
record counts and guids) via a singleJOINquery on therunsand
experimentstables, without instantiating aDataSetobject per run,
making it possible to list databases with many thousands of runs almost
instantly. The returned :class:qcodes.dataset.RunOverviewDictis also exported
on the publicqcodes.datasetnamespace. The function does not return
snapshots as they can be large and slow down building the database overview.
The number of results in each dataset is taken from shape information when
available, and otherwise falls back to a best-effort count of the rows in the
so-called results table that exists for every dataset, which may NOT be as
precise asDataSet.number_of_results. #8266 -
The
updateargument ofsnapshotandsnapshot_base(available on every
:class:.Metadatable, including instruments, channels and parameters) now accepts
the explicit string values"All","Only_invalid"and"Never":"All"forces an update of every value (callsget()on each parameter)."Only_invalid"only refreshes parameters whose cache is invalid, via a
singleget(cache.get(get_if_invalid=True)), and uses the cached value
for everything else."Never"never updates and uses the latest values already in memory.
The new public helper :func:
qcodes.metadatable.normalize_snapshot_updateand the
:data:qcodes.metadatable.SnapshotUpdatetype are exported for drivers that
overridesnapshot_baseand need to interpret theupdateargument. #8354
Under the hood:
- Importing the top level
qcodesnamespace no longer eagerly imports the
dataset,instrument,parameters,monitor,stationand
validatorssubmodules. The discouraged short hand aliases (such as
qcodes.Parameterandqcodes.Measurement) as well asqcodes.validators
are still available at runtime via a lazy module level__getattr__, but they
are intentionally hidden from static type checkers and are now reported as
unknown attributes rather than typed asAny; import the names from their
respective submodules to retain type information. This breaks a large import
cycle spanning the parameters, dataset and instrument packages that triggered an
internal error inmypy2.2. #8252