QCoDeS [UNRELEASED DRAFT] (2026-08-07)¶
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
VisaInstrument: the_addressproperty (useaddressinstead) and thevisalibproperty (usevisabackendinstead). The unused and deprecatedMockAMI430mocker class has also been removed. (#8103)Importing the short hand aliases (such as
Parameter,Measurement,Instrument,MonitorandStation) from the top levelqcodesnamespace 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,ManualParameterandDelegateParameter) fromqcodes.instrumentis now deprecated and emits aQCoDeSDeprecationWarning. Import these names fromqcodes.parametersinstead. 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_timestampandqcodes.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 adatetimewithtzinfoset to the local timezone rather than a naivedatetime. 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 withdatetime.datetime.fromisoformat. (#8345)The default value of the
updateargument ofsnapshot,snapshot_baseandprint_readable_snapshot(on everyMetadatable, 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
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:¶
Instrument.close_all()gained 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
qcodes.instrument_drivers.QuantumDesign.DynaCoolPPMS.DynaCool.DynaCoolthat prevented the driver from instantiating and from updating thetemperature_setpointcache:block_while_ramping_temperatureis now created withset_cmd=None/get_cmd=Noneso it behaves as a settable cache-only parameter, instead ofset_cmd=False/get_cmd=Falsewhich made it read-only and rejected the suppliedinitial_value.Removed the duplicate
instrument=selfargument from theblocking_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 referencesself.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:
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
Fixed the timezone offset written into the waveform and sequence files generated by the Tektronix AWG70000A drivers. The offset was computed manually from
time.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 channelv/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
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 therunsandexperimentstables, without instantiating aDataSetobject per run, making it possible to list databases with many thousands of runs almost instantly. The returnedqcodes.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 everyMetadatable, 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
qcodes.metadatable.normalize_snapshot_update()and theqcodes.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 thedataset,instrument,parameters,monitor,stationandvalidatorssubmodules. The discouraged short hand aliases (such asqcodes.Parameterandqcodes.Measurement) as well asqcodes.validatorsare 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)