Source code for qtt.measurements.storage

# %%
from datetime import datetime
import os
import h5py
import logging
import warnings

import qcodes
import qtt.instrument_drivers.virtual_gates

try:
    import hickle
except ImportError:
    import qtt.exceptions
    warnings.warn('could not import hickle, not all functionality available',
                  qtt.exceptions.MissingOptionalPackageWarning)

# %%


[docs]def list_states(verbose=1): """ List available states of the system Args: verbose (int) Returns: states (list): List of string tags See also: load_state """ statefile = qcodes.config.get('statefile', None) if statefile is None: statefile = os.path.join(os.path.expanduser('~'), 'qtt_statefile.hdf5') if not os.path.exists(statefile): return [] with h5py.File(statefile, 'r') as h5group: tags = list(h5group.keys()) if verbose: print('states on system from file %s: ' % (statefile, ), end='') print(', '.join([str(x) for x in tags])) return tags
# %% def _get_statefile(statefile=None): if statefile is None: statefile = qcodes.config.get('statefile', None) if statefile is None: statefile = os.path.join(os.path.expanduser('~'), 'qtt_statefile.hdf5') return statefile
[docs]def load_state(tag=None, station=None, verbose=1, statefile=None): """ Load state of the system from disk Args: tag (str): identifier of state to load station (None or qcodes station): If defined apply the gatevalues loaded from disk verbose (int): verbosity level statefile (str): file with the state of the system Returns: state (dict): Dictionary with state of the system virtual_gates (None or object): reconstructed virtual gates """ statefile = _get_statefile(statefile) if verbose: print('load_state %s: reading from file %s' % (tag, statefile)) obj = {} with h5py.File(statefile, 'r') as h5group: if tag not in h5group: raise Exception('tag %s not in file' % tag) obj = hickle.load(h5group, path=tag) if station is not None: try: gv = obj.get('gatevalues') if gv is not None: if verbose >= 1: print('load_state %s: resetting gate values' % tag) station.gates.resetgates(gv, gv, verbose=verbose >= 2) except Exception as ex: logging.exception(ex) virtual_gates = obj.get('virtual_gates', None) if virtual_gates is not None and station is not None: if verbose: print('load_state %s: creating virtual gate matrix' % tag) virtual_gates = qtt.instrument_drivers.virtual_gates.VirtualGates.from_dictionary( virtual_gates, station.gates) return obj, virtual_gates
[docs]def save_state(station, tag=None, overwrite=False, virtual_gates=None, data=None, verbose=1, statefile=None): """ Save current state of the system to disk Args: station (qcodes station) tag (str or None) overwrite (bool): If True overwrite existing data, otherwise raise error virtual_gates (None or virtual_gates): virtual gates object to store data (None or object): optional extra data verbose (int): verbosity level statefile (str): file with the state of the system Example: save_state(station, tag='tripledot1') The data is written to an HDF5 file. The default location is the user home directory with name qtt_statefile.hdf5. To install hickle: pip install git+https://github.com/telegraphic/hickle.git@dev """ statefile = _get_statefile(statefile) snapshot = station.snapshot() gv = station.gates.allvalues() date_string = "{:%Y%m%d-%H%M%S}".format(datetime.now()) if verbose >= 2: print(date_string) if tag is None: tag = date_string obj = {'gatevalues': gv, 'snapshot': snapshot, 'datestring': date_string, 'data': data} if virtual_gates is not None: obj['virtual_gates'] = virtual_gates.to_dictionary() # remove the redundant information that can't be serialized obj['virtual_gates'].pop('_crosscap_map', None) obj['virtual_gates'].pop('_crosscap_map_inv', None) if verbose: print('save_state: writing to file %s, tag %s' % (statefile, tag)) with h5py.File(statefile, 'a') as h5group: # implementation using dev branch of hickle if tag in h5group: if overwrite: del h5group[tag] else: raise Exception( 'tag %s already exists in state file %s' % (tag, statefile)) hickle.dump(obj, h5group, path=tag) return tag