qkit 0.5.2__tar.gz → 0.5.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qkit-0.5.4/.git +1 -0
- {qkit-0.5.2 → qkit-0.5.4}/PKG-INFO +4 -5
- {qkit-0.5.2 → qkit-0.5.4}/pyproject.toml +3 -2
- qkit-0.5.4/src/qkit/_version.py +1 -0
- qkit-0.5.4/src/qkit/analysis/circle_fit/another_circle_fit.py +66 -0
- qkit-0.5.4/src/qkit/analysis/numerical_derivative.py +99 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/file_service/breadcrumbs.py +3 -3
- qkit-0.5.4/src/qkit/drivers/AbstractIVDevice.py +49 -0
- qkit-0.5.4/src/qkit/drivers/AbstractThermometer.py +21 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/AbstractVNA.py +1 -1
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/IVVI_BiasDAC.py +2 -2
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/plot/url_launcher.py +1 -1
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/install/install.py +13 -13
- qkit-0.5.4/src/qkit/measure/laboneq_measurement.py +83 -0
- qkit-0.5.4/src/qkit/measure/spectroscopy/spectroscopy_measurement.py +52 -0
- qkit-0.5.4/src/qkit/measure/thermometry_measurement.py +34 -0
- qkit-0.5.4/src/qkit/measure/transport_measurement.py +164 -0
- qkit-0.5.4/src/qkit/measure/unified_measurements.py +889 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/hdf_dataset.py +4 -3
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/store.py +17 -1
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/templates/Measurements/Probestation.ipynb +18 -89
- qkit-0.5.4/tests/core/.7c57581a89db.breadcrumb +4 -0
- qkit-0.5.4/tests/core/.7c57581a89db.breadcrumb.lock +0 -0
- qkit-0.5.4/tests/core/STUVWX_dummy.h5 +0 -0
- qkit-0.5.4/tests/core/subdir/YZ0123_dummy.h5 +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/core/test_file_info_database.py +1 -0
- qkit-0.5.4/tests/measure/.gitignore +1 -0
- qkit-0.5.4/tests/measure/test.h5 +0 -0
- qkit-0.5.4/tests/measure/test_unified_syntax.py +217 -0
- qkit-0.5.4/tests/storage/.gitignore +1 -0
- qkit-0.5.4/tests/storage/large_file.h5 +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/url/test_url_handler.py +2 -0
- qkit-0.5.2/src/qkit/_version.py +0 -1
- {qkit-0.5.2 → qkit-0.5.4}/.gitattributes +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/.github/workflows/release.yml +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/.github/workflows/test.yml +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/.gitignore +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/.travis.yml +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/AUTHORS +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/CITATION.cff +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/LICENSE +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/README.md +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/devices.toml.example +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/.gitignore +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/Makefile +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/make.bat +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/sample_data/1Q-NIST.json +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/sample_data/P8PPH2_anticrossing_sample_data.h5 +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/sample_data/QZQ3H8.sample +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/conf.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/index.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/installation.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/modules.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.analysis.circle_fit.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.analysis.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.config.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.lib.com.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.lib.devices.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.lib.file_service.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.lib.network.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.lib.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.s_init.bkup.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.core.s_init.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.gui.notebook.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.gui.plot.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.gui.qviewkit.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.gui.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.instruments.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.logs.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.measure.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.measure.spectroscopy.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.measure.timedomain.awg.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.measure.timedomain.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.measure.transport.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.services.qplexkit.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.services.qsurveilkit.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.services.raspi_misc.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.services.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/doc/source/qkit.storage.rst +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/images/Qkit_Logo.png +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/images/Qkit_Logo.svg +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/images/Qkit_QRcode.png +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/images/Qkit_QRcode.svg +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/CurveXtractor.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/IV_curve.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/IV_curve2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/IV_curve3.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/Manual point picker.ipynb_template +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/avoided_crossing_fit.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/circle_fit_2019/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/circle_fit_2019/circuit.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/circle_fit_classic/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/circle_fit_classic/calibration.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/circle_fit_classic/circlefit.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/circle_fit_classic/circuit.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/circle_fit/circle_fit_classic/utilities.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/iq_cloud_analysis.ipynb_template +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/iq_cloud_analysis.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/manual_point_picker.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/pointtracker.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/qdata.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/qfit.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/qps_rings.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/resonator.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/sonnet_parser.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/spectroscopy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/timedomain.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/analysis/uncertainties_utilities.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/config/.gitignore +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/config/README.md +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/config/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/config/config_holder.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/config/environment.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/config/local.py_template +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/config/services.py_template +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/.gitignore +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/README +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/VERSION +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/flow.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/instrument_base.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/instrument_basev2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/instrument_tools.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/com/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/com/info_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/com/info_service.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/com/ri_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/com/ri_service.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/com/signals.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/file_service/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/file_service/file_info_database.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/file_service/file_info_database_lib.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/list_dict_DB.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/misc.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/network/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/network/tcpclient.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/lib/temp.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S10_logging.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S14_setup_directories.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S16_available_modules.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S20_check_for_updates.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S25_info_service.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S30_qkit_start.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S65_load_RI_service.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S70_load_visa.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S80_load_file_service.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S85_init_measurement.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S98_started.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/S99_init_user.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/_30_network_server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/_80_create_instruments.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/s_init/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/core/startup.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ADwinProII_SMU.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/AbstractMicrowaveSource.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Agilent_DSO.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Agilent_E8257D.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Agilent_PNAX.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Agilent_TwissTorr74.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Agilent_VNA_E5071C.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/AnaPico_APUASYN20.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Anritsu_MG37022.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Anritsu_MS2830A.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Anritsu_VNA.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Anritsu_VNA_MS4642B.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/BKPrecision_9242.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Bluefors_GHS.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Caen_FAST_PS.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/DC_DAC_LTC2666.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/DummyVNA.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/EA_PS9360.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ERASynth.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/EdwardsActiveDigitalController.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/EthernetNode.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/EthernetServer.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/EthernetServerWin.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/FTDI_DAQ.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Faulhaber_3564K024B_C.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/GHzDAC.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/HP_34401A.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/HP_81110A.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/IQ_Mixer.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/IVD_dummy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Inficon.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keithley.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keithley_2000.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keithley_2450.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keithley_2636A.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_35670A.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_B2900.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_E8267D.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_N5173B.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_VNA_E5071C.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_VNA_E5080B.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_VNA_E5080B_spectrum.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Keysight_VNA_P9375A.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Lmx2595.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/MKS_647C.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/MicroMag3.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ModernDriverTest.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/NI_DAQ.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/NI_DAQ_IV.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/OxfordInstruments_Kelvinox_IGH.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Oxford_ITC503.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Oxford_Triton.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/RFPCB.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/RFPCBJ.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/RFPCB_V2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/RS_FSUP.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/RS_SGMA.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/RS_VNA_ZNAXX.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/RT_MW_Switch.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/SR_830.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/SerialPortCommunication.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Spectrum_M2i2030.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Spectrum_M3i2132.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Spectrum_M4i2211.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/StepAttenuator.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/StepMotor.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Tabor_WX1284C.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Tektronix_AWG5014.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Tektronix_AWG520.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Tektronix_AWG7062.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Tektronix_PWS4205.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Teslameter_FM302.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Tunnel_DAC.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/VCAs_TD.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/VNA_dummy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Virtual_Coil.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Virtual_Current_Source.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Virtual_VCA.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Readme.txt +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_288_ChannelA.cal +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_288_ChannelB.cal +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_289_ChannelA.cal +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_289_ChannelB.cal +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA.cal +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow.npy +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow_calibration_matrix_dBm.txt +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow_frequency_Hz.txt +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow_power_intrinsic_units.txt +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB.cal +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow.npy +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow_calibration_matrix_dBm.txt +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow_frequency_Hz.txt +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow_power_intrinsic_units.txt +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/convert_files_to_python_3.ipynb +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreak_calibration_files/test_open_file_python3.ipynb +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreaktech916.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreaktech_SynthHD.cal +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Windfreaktech_SynthHD.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Yokogawa.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Yokogawa_GS200.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Yokogawa_GS210.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/Yokogawa_GS820.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInstSHFQC.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Abstract.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Abstractv2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_PQSC.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_SHFSG.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_SHFSGv2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_UHFQA.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_UHFQAv2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Virtual_VNA.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Virtual_VNAv2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Waveforms/CPMG.json +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Waveforms/CPMG.seq +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Waveforms/rabi.json +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Waveforms/rabi.seq +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Waveforms/ramsey.json +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ZHInst_Waveforms/ramsey.seq +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/_Spectrum_M3i2132/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/_Spectrum_M3i2132/errors.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/_Spectrum_M3i2132/regs.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/_Spectrum_M4i2211/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/_Spectrum_M4i2211/errors.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/_Spectrum_M4i2211/h2py.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/_Spectrum_M4i2211/regs.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/agilent_33210A.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/dll_support_nidaq.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/manual_settings.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/mfc_dummy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/nidaq_syncIV.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/ohmmeter_dummy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/qdevil_qdacII.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/qplexkit_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/quartz_dummy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/switch_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/te_opto_dac.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/tip2_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/tip_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/two_port_switch.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_MultiplexingReadout.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_VNA_quantum_machines.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_magnet.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_measure_spec.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_pwsMagnet.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_step_attenuator.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_temperature_UFO.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_tunnel_electronic.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/virtual_yokomagnet.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/drivers/visa_prologix.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/notebook/Progress_Bar.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/notebook/Stopwatch.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/notebook/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/notebook/quickplot.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/notebook/wf_plot.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/plot/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/plot/plot.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/DatasetsWindow.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/PlotWindow.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/PlotWindow_lib.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/info_subsys.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/main.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/main_view.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/pg_time_axis.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/plot_view.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/gui/qviewkit/qviewkit.bat +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/install/jupyter_lab_config.py-tpl +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/install/linux/qkit-jupyter-lab.desktop +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/install/linux/qkit-qviewkit-url.desktop +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/install/linux/qkit-qviewkit.desktop +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/install/qkit_local_config.py-tpl +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/json_handler.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/measurement_base.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/measurement_class.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/samples_class.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/spectroscopy/README.md +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/spectroscopy/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/spectroscopy/signal_spectroscopy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/spectroscopy/spectroscopy.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/spectroscopy/spectroscopy_unified.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/002_TD1_f01_rabi_t1_ramsey.ipynb +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/VirtualAWG.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/awg/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/awg/generate_waveform.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/awg/load_awg.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/awg/load_tawg.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/awg/tomography.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/gate_func.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/initialize.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/measure_ZI_td.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/measure_td.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/pulse_sequence.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/basic_qubit_experiments.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/basic_qubit_experiments_V2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/pulses.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/qm_qkit_wrapper.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/qm_qubit_config.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/qm_qubit_config_V2.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/quantum_jump_monitoring.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/qubit_high_temp.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/script.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/quantum_machine/script_pyqt.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/timedomain/sequence_library.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/transport/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/transport/transport.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/measure/write_additional_files.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qdepokit/Deposition_template.ipynb +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qdepokit/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qdepokit/sdi.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/.gitignore +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/ccr.json_template +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/install_systemd_service.sh +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/pcf8575.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/qplexkit.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qplexkit/test_PCF8575.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/README.md +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/client_main.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/data_class.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/plasma1_gui.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/plasma1_gui.ui +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/server_main.py_template +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/settings.cfg_template +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/srv_thread.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/qsurveilkit/worker.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/OxfordInstruments_Kelvinox_IGH_serial.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/RT_switch/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/RT_switch/switchbox_server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/RT_switch/two_port_switch_manual_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/dc_dac/DAC_LTC2666_communication.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/dc_dac/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/dc_dac/server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/edwards/EdwardsActiveDigitalController.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/edwards/EdwardsBridgeReadout.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/edwards/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/edwards/edw_client.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/edwards/edw_server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/erasynth_server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/nitrogen/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/nitrogen/nitrogen_controller.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/nitrogen/nitrogen_server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/nitrogen/refill_manual.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/nitrogen/refilling_switch_off.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/nitrogen/refilling_switch_on.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/nitrogen/sendMail.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/step_attenuator_server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/step_motor.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/tip/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/raspi_misc/tip/fridge_monitoring.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/switchbox/lib_oled96.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/switchbox/server.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/services/switchbox/switch.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/README.md +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/__init__.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/hdf_DateTimeGenerator.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/hdf_constants.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/hdf_file.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/hdf_lib.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/storage/hdf_view.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/src/qkit/templates/Analysis/Probestation.ipynb +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/__init__.py +0 -0
- /qkit-0.5.2/tests/breadcrumb/STUVWX_dummy.h5 → /qkit-0.5.4/tests/analysis/test_new_circlefit.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/breadcrumb/.1337deadbeef.breadcrumb +0 -0
- /qkit-0.5.2/tests/core/STUVWX_dummy.h5 → /qkit-0.5.4/tests/breadcrumb/.7c57581a89db.breadcrumb.lock +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/breadcrumb/.deadbeef1337.breadcrumb +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/breadcrumb/.gitignore +0 -0
- /qkit-0.5.2/tests/core/subdir/YZ0123_dummy.h5 → /qkit-0.5.4/tests/breadcrumb/STUVWX_dummy.h5 +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/breadcrumb/test_breadcrumbs.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/core/.gitignore +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/storage/test_hdf5.py +0 -0
- {qkit-0.5.2 → qkit-0.5.4}/tests/test_qkit_basics.py +0 -0
qkit-0.5.4/.git
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
gitdir: ../.git/modules/qkit
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: qkit
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.4
|
|
4
4
|
Summary: qKIT quantum measurement suite in python
|
|
5
5
|
Project-URL: Homepage, https://github.com/qkitgroup/qkit
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/qkitgroup/qkit/issues
|
|
@@ -345,8 +345,6 @@ License: GNU GENERAL PUBLIC LICENSE
|
|
|
345
345
|
library. If this is what you want to do, use the GNU Lesser General
|
|
346
346
|
Public License instead of this License.
|
|
347
347
|
|
|
348
|
-
License-File: AUTHORS
|
|
349
|
-
License-File: LICENSE
|
|
350
348
|
Keywords: Data Acquisition,Framework,Measurement,Quantum
|
|
351
349
|
Classifier: Framework :: Jupyter :: JupyterLab :: 3
|
|
352
350
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -365,6 +363,7 @@ Requires-Dist: pyvisa>=1.13
|
|
|
365
363
|
Requires-Dist: pyzmq>=25
|
|
366
364
|
Requires-Dist: scipy>=1.10
|
|
367
365
|
Requires-Dist: tomli>=2.0.1
|
|
366
|
+
Requires-Dist: tqdm>=4.67.0
|
|
368
367
|
Provides-Extra: analysis
|
|
369
368
|
Requires-Dist: matplotlib>=3.7; extra == 'analysis'
|
|
370
369
|
Requires-Dist: peakutils>=1.3; extra == 'analysis'
|
|
@@ -380,7 +379,7 @@ Requires-Dist: zerorpc>=0.6; extra == 'timedomain'
|
|
|
380
379
|
Provides-Extra: url
|
|
381
380
|
Requires-Dist: parsita~=2.2.2; extra == 'url'
|
|
382
381
|
Provides-Extra: zurich-instruments
|
|
383
|
-
Requires-Dist:
|
|
382
|
+
Requires-Dist: laboneq>=2.59.0; extra == 'zurich-instruments'
|
|
384
383
|
Description-Content-Type: text/markdown
|
|
385
384
|
|
|
386
385
|
<p align="center">
|
|
@@ -32,7 +32,8 @@ dependencies = [
|
|
|
32
32
|
"tomli>=2.0.1",
|
|
33
33
|
"ipython",
|
|
34
34
|
"packaging",
|
|
35
|
-
"filelock>=3.17"
|
|
35
|
+
"filelock>=3.17",
|
|
36
|
+
"tqdm>=4.67.0"
|
|
36
37
|
]
|
|
37
38
|
|
|
38
39
|
[project.scripts]
|
|
@@ -48,7 +49,7 @@ jupyter = [
|
|
|
48
49
|
"ipywidgets>=8.0"
|
|
49
50
|
]
|
|
50
51
|
zurich-instruments = [
|
|
51
|
-
"
|
|
52
|
+
"LabOneQ>=2.59.0"
|
|
52
53
|
]
|
|
53
54
|
analysis = [
|
|
54
55
|
"matplotlib>=3.7",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.5.4"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from sympy import symbols, matrices, Expr, Poly
|
|
3
|
+
from scipy import optimize, linalg
|
|
4
|
+
|
|
5
|
+
# Matrix B from eq. (7)
|
|
6
|
+
CONSTRAINT_MATRIX = np.array([
|
|
7
|
+
[0, 0, 0, -2],
|
|
8
|
+
[0, 1, 0, 0],
|
|
9
|
+
[0, 0, 1, 0],
|
|
10
|
+
[-2, 0, 0, 0]
|
|
11
|
+
])
|
|
12
|
+
|
|
13
|
+
def compute_moments(z_data: np.ndarray) -> np.ndarray:
|
|
14
|
+
"""
|
|
15
|
+
Calculate the moments as defined in eq. 6.
|
|
16
|
+
"""
|
|
17
|
+
# Split out data into x (real), y (imag), and z (x**2 + y**2)
|
|
18
|
+
x = z_data.real
|
|
19
|
+
y = z_data.imag
|
|
20
|
+
z = x*x + y*y
|
|
21
|
+
n = np.shape(z_data)[0] # Length of data.
|
|
22
|
+
|
|
23
|
+
# Calculate the sums over x,y,z
|
|
24
|
+
m_x = np.sum(x) # Simple sums
|
|
25
|
+
m_y = np.sum(y)
|
|
26
|
+
m_z = np.sum(z)
|
|
27
|
+
|
|
28
|
+
# Calculate the moments, as sum over the element-wise products
|
|
29
|
+
m_xx = np.sum(x*x)
|
|
30
|
+
m_yy = np.sum(y*y)
|
|
31
|
+
m_zz = np.sum(z*z)
|
|
32
|
+
m_xy = np.sum(x * y)
|
|
33
|
+
m_xz = np.sum(x * z)
|
|
34
|
+
m_yz = np.sum(y * z)
|
|
35
|
+
|
|
36
|
+
# Build the moment matrix
|
|
37
|
+
return np.array([
|
|
38
|
+
[m_zz, m_xz, m_yz, m_z],
|
|
39
|
+
[m_xz, m_xx, m_xy, m_x],
|
|
40
|
+
[m_yz, m_xy, m_yy, m_y],
|
|
41
|
+
[m_z, m_x, m_y, n]
|
|
42
|
+
])
|
|
43
|
+
|
|
44
|
+
def fit_circle_algebraic(z_data: np.ndarray):
|
|
45
|
+
"""
|
|
46
|
+
Fit a circle in the complex plane using a algebraic method.
|
|
47
|
+
|
|
48
|
+
Stable against noise, can be used to get very good start parameters for iterative fit.
|
|
49
|
+
"""
|
|
50
|
+
# Build the characteristic polynomial and solve it.
|
|
51
|
+
x = symbols('x')
|
|
52
|
+
M = compute_moments(z_data)
|
|
53
|
+
polynomial: Poly = matrices.det(M - x * CONSTRAINT_MATRIX).as_poly()
|
|
54
|
+
assert polynomial
|
|
55
|
+
derivative = polynomial.diff(x)
|
|
56
|
+
x0, infodict, ier, mesg = optimize.fsolve(polynomial.eval, 0., fprime=derivative.eval)
|
|
57
|
+
|
|
58
|
+
# Retrieve the corresponding EV
|
|
59
|
+
U, s, Vt = np.linalg.svd(M - x0 * CONSTRAINT_MATRIX)
|
|
60
|
+
A_vec = Vt[np.argmin(s), :]
|
|
61
|
+
|
|
62
|
+
# Calculate center position and radius
|
|
63
|
+
x_c = -A_vec[1]/(2 * A_vec[0])
|
|
64
|
+
y_c = -A_vec[2]/(2 * A_vec[0])
|
|
65
|
+
radius = np.sqrt(A_vec[1]*A_vec[1] + A_vec[2] * A_vec[2] - 4 * A_vec[0] * A_vec[3]) / 2 * np.abs(A_vec[0])
|
|
66
|
+
return x_c, y_c, radius
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import itertools
|
|
2
|
+
from typing import override
|
|
3
|
+
|
|
4
|
+
from scipy import signal
|
|
5
|
+
|
|
6
|
+
from qkit.measure.unified_measurements import AnalysisTypeAdapter, MeasurementTypeAdapter, DataView, DataViewSet, DataReference
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SavgolNumericalDerivative(AnalysisTypeAdapter):
|
|
10
|
+
"""
|
|
11
|
+
Apply a numerical derivative to the measurement data.
|
|
12
|
+
|
|
13
|
+
Performs pair-wise differentiation of the measurement data.
|
|
14
|
+
|
|
15
|
+
Assumes that measurement data comes in (I, V, I, V, ...) format or equivalent.
|
|
16
|
+
Assumes that names are in the form of '[IV]_(?:b_)?_[0-9]'
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
_window_length: int
|
|
20
|
+
_polyorder: int
|
|
21
|
+
_derivative: int
|
|
22
|
+
|
|
23
|
+
def __init__(self, window_length: int = 15, polyorder: int = 3, derivative: int = 1):
|
|
24
|
+
super().__init__()
|
|
25
|
+
self._window_length = window_length
|
|
26
|
+
self._polyorder = polyorder
|
|
27
|
+
self._derivative = derivative
|
|
28
|
+
|
|
29
|
+
@override
|
|
30
|
+
def perform_analysis(self, data: tuple['MeasurementTypeAdapter.GeneratedData', ...]) -> tuple[
|
|
31
|
+
'MeasurementTypeAdapter.GeneratedData', ...]:
|
|
32
|
+
parent_schema = tuple([element.descriptor for element in data])
|
|
33
|
+
output_schema = self.expected_structure(parent_schema)
|
|
34
|
+
out = []
|
|
35
|
+
for ((dxdy, dydx), (x, y)) in zip(itertools.batched(output_schema, 2), itertools.batched(data, 2)):
|
|
36
|
+
out.append(dxdy.with_data(
|
|
37
|
+
signal.savgol_filter(x.data, window_length=self._window_length, polyorder=self._polyorder, deriv=self._derivative)\
|
|
38
|
+
/ signal.savgol_filter(y.data, window_length=self._window_length, polyorder=self._polyorder, deriv=self._derivative)
|
|
39
|
+
))
|
|
40
|
+
out.append(dydx.with_data(
|
|
41
|
+
signal.savgol_filter(y.data, window_length=self._window_length, polyorder=self._polyorder, deriv=self._derivative)\
|
|
42
|
+
/ signal.savgol_filter(x.data, window_length=self._window_length, polyorder=self._polyorder, deriv=self._derivative)
|
|
43
|
+
))
|
|
44
|
+
return tuple(out)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@override
|
|
48
|
+
def expected_structure(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> tuple['MeasurementTypeAdapter.DataDescriptor', ...]:
|
|
49
|
+
structure = []
|
|
50
|
+
for (x, y) in itertools.batched(parent_schema, 2):
|
|
51
|
+
assert x.axes == y.axes
|
|
52
|
+
structure += [
|
|
53
|
+
MeasurementTypeAdapter.DataDescriptor(
|
|
54
|
+
name=f"d{x.name}_d{y.name}",
|
|
55
|
+
unit=f"{x.unit}_{y.unit}",
|
|
56
|
+
axes=x.axes,
|
|
57
|
+
category="analysis"
|
|
58
|
+
),
|
|
59
|
+
MeasurementTypeAdapter.DataDescriptor(
|
|
60
|
+
name=f"d{y.name}_d{x.name}",
|
|
61
|
+
unit=f"{y.unit}_{x.unit}",
|
|
62
|
+
axes=x.axes,
|
|
63
|
+
category="analysis"
|
|
64
|
+
)
|
|
65
|
+
]
|
|
66
|
+
return tuple(structure)
|
|
67
|
+
|
|
68
|
+
@override
|
|
69
|
+
def default_views(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> dict[str, DataView]:
|
|
70
|
+
schema = self.expected_structure(parent_schema)
|
|
71
|
+
variable_names = (schema[0].name.split('_')[0], schema[1].name.split('_')[0])
|
|
72
|
+
return { # dx/dy
|
|
73
|
+
f'{variable_names[0]}_{variable_names[1]}': DataView(
|
|
74
|
+
view_params={
|
|
75
|
+
"labels": (schema[0].axes[0].name, f'{variable_names[0]}_{variable_names[1]}'),
|
|
76
|
+
'plot_style': 1,
|
|
77
|
+
'markersize': 5
|
|
78
|
+
},
|
|
79
|
+
view_sets=[
|
|
80
|
+
DataViewSet(
|
|
81
|
+
x_path=DataReference(entry.axes[0].name,),
|
|
82
|
+
y_path=DataReference(entry.name, category='analysis')
|
|
83
|
+
) for entry in schema[0::2]
|
|
84
|
+
]
|
|
85
|
+
), # dy/dx
|
|
86
|
+
f'{variable_names[1]}_{variable_names[0]}': DataView(
|
|
87
|
+
view_params={
|
|
88
|
+
"labels": (schema[1].axes[0].name, f'{variable_names[1]}_{variable_names[0]}'),
|
|
89
|
+
'plot_style': 1,
|
|
90
|
+
'markersize': 5
|
|
91
|
+
},
|
|
92
|
+
view_sets=[
|
|
93
|
+
DataViewSet(
|
|
94
|
+
x_path=DataReference(entry.axes[0].name),
|
|
95
|
+
y_path=DataReference(entry.name, category='analysis')
|
|
96
|
+
) for entry in schema[1::2]
|
|
97
|
+
]
|
|
98
|
+
)
|
|
99
|
+
}
|
|
@@ -16,10 +16,10 @@ UUID=rel_path\n
|
|
|
16
16
|
|
|
17
17
|
The UUID is 6 symbols long. It is followed by an `=` symbol. The rest of the line is the relative path.
|
|
18
18
|
"""
|
|
19
|
-
|
|
19
|
+
import os
|
|
20
20
|
from pathlib import Path
|
|
21
21
|
import qkit
|
|
22
|
-
import
|
|
22
|
+
from os import PathLike
|
|
23
23
|
import itertools
|
|
24
24
|
from filelock import FileLock, Timeout
|
|
25
25
|
import logging
|
|
@@ -68,7 +68,7 @@ class BreadCrumbCreator():
|
|
|
68
68
|
log.error("Could not acquire lock file for clearing breadcrumbs.")
|
|
69
69
|
raise
|
|
70
70
|
|
|
71
|
-
def append_entry(self, uuid: str, path:
|
|
71
|
+
def append_entry(self, uuid: str, path: PathLike):
|
|
72
72
|
rel_path = Path(path).relative_to(self._breadcrumb_path.parent)
|
|
73
73
|
try:
|
|
74
74
|
with self._lock:
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Literal, Any
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AbstractIVDevice(ABC):
|
|
8
|
+
|
|
9
|
+
@abstractmethod
|
|
10
|
+
def take_IV(self, sweep: tuple[float, float, float, float]) -> tuple[np.ndarray, np.ndarray]:
|
|
11
|
+
"""
|
|
12
|
+
Perform an IV sweep. Returns (bias, sense).
|
|
13
|
+
Sweep is (start, stop, step, sleep)
|
|
14
|
+
"""
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
@abstractmethod
|
|
18
|
+
def get_sweep_mode(self) -> Literal[0, 1, 2]:
|
|
19
|
+
"""
|
|
20
|
+
Get the sweep mode: 0 (VV-mode) | 1 (IV-mode) | 2 (VI-mode)
|
|
21
|
+
"""
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def get_sweep_bias(self) -> Literal[0, 1]:
|
|
26
|
+
"""
|
|
27
|
+
Get the sweep bias: 0 (current bias) | 1 (voltage bias)
|
|
28
|
+
|
|
29
|
+
Only relevant for units.
|
|
30
|
+
"""
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def get_sweep_channels(self) -> list:
|
|
35
|
+
"""
|
|
36
|
+
Get a list of channels to sweep.
|
|
37
|
+
"""
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def set_status(self, status: bool, channel: Any):
|
|
42
|
+
"""
|
|
43
|
+
Sets the status of a channel.
|
|
44
|
+
"""
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
def set_overall_status(self, status: bool):
|
|
48
|
+
for channel in self.get_sweep_channels():
|
|
49
|
+
self.set_status(status, channel)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Any, Literal
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class AbstractThermometer(ABC):
|
|
6
|
+
"""
|
|
7
|
+
The interface for a generic multichannel thermometer.
|
|
8
|
+
|
|
9
|
+
It measures in [unit] (to be implemented). Returns measurement via get_temperature.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def unit(self) -> Literal['K', '°C']:
|
|
14
|
+
"""
|
|
15
|
+
The unit of the measurement. Override to change.
|
|
16
|
+
"""
|
|
17
|
+
return 'K'
|
|
18
|
+
|
|
19
|
+
@abstractmethod
|
|
20
|
+
def get_temperature(self, channel: Any) -> float:
|
|
21
|
+
pass
|
|
@@ -36,7 +36,7 @@ class AbstractVNA(ABC):
|
|
|
36
36
|
return freqs[-1] - freqs[0]
|
|
37
37
|
|
|
38
38
|
@abstractmethod
|
|
39
|
-
def get_tracedata(self, RealImag = None) -> tuple
|
|
39
|
+
def get_tracedata(self, RealImag = None) -> tuple[np.ndarray, np.ndarray]:
|
|
40
40
|
"""
|
|
41
41
|
When the measurement succeeded, this method returns the resulting data.
|
|
42
42
|
The behaviour depends on the [RealImag] keyword argument.
|
|
@@ -108,8 +108,8 @@ class IVVI_BiasDAC(Instrument):
|
|
|
108
108
|
self.v_div = None # for voltage bias
|
|
109
109
|
def get_sweep_mode(self):
|
|
110
110
|
# 0: V bias V measure, 1: I bias V measure, 2: V bias I measure
|
|
111
|
-
# technically mode
|
|
112
|
-
return 1
|
|
111
|
+
# technically mode 0 also possible, this class cant determine 0 vs 2 without hidden knowledge about measure function though
|
|
112
|
+
return 1 + self.pseudo_bias_mode
|
|
113
113
|
def get_sweep_bias(self):
|
|
114
114
|
return self.pseudo_bias_mode
|
|
115
115
|
def get_sweep_channels(self):
|
|
@@ -36,7 +36,7 @@ class QviewkitURLParser(ParserContext):
|
|
|
36
36
|
_kv = _argument_name << lit('=') & _argument_value
|
|
37
37
|
_arguments = (lit('?') >> rep1sep(_kv, lit('&')) << eof > dict) | (eof > constant({}))
|
|
38
38
|
_uuid = reg(r'[A-Z0-9]{6}') > str
|
|
39
|
-
url_pattern = _prefix >> _uuid & _arguments
|
|
39
|
+
url_pattern = _prefix >> _uuid << opt(lit('/')) & _arguments
|
|
40
40
|
|
|
41
41
|
@classmethod
|
|
42
42
|
def parse(cls, data) -> Tuple[str, Optional[dict]]:
|
|
@@ -2,7 +2,7 @@ import logging
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
import platform
|
|
4
4
|
from types import ModuleType
|
|
5
|
-
from typing import Callable, Literal
|
|
5
|
+
from typing import Callable, Literal, Optional
|
|
6
6
|
import shutil
|
|
7
7
|
import sys
|
|
8
8
|
|
|
@@ -55,7 +55,7 @@ def get_binary(name: str) -> str:
|
|
|
55
55
|
return str(candidate)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
def copy_named_template(source_cache: Traversable, target_path: Path, target_name: str, human_readable: str
|
|
58
|
+
def copy_named_template(source_cache: Traversable, target_path: Path, target_name: str, human_readable: Optional[str] = None):
|
|
59
59
|
package_file: Traversable = source_cache / f'{target_name}-tpl'
|
|
60
60
|
logging.debug("Got reference %s: %s", human_readable if human_readable is not None else target_name, package_file)
|
|
61
61
|
target = (target_path / target_name)
|
|
@@ -68,7 +68,7 @@ def copy_named_template(source_cache: Traversable, target_path: Path, target_nam
|
|
|
68
68
|
UNIVERSAL_SCRIPTS: list[Callable[[Path], None]] = []
|
|
69
69
|
SYSTEM_SCRIPTS: dict[str, list[Callable[[Path], None]]] = {}
|
|
70
70
|
|
|
71
|
-
def
|
|
71
|
+
def on_platform(target: Literal["Windows", "Linux", "Darwin", "All"]):
|
|
72
72
|
def decorator(f: Callable[[Path], None]):
|
|
73
73
|
if target == "All":
|
|
74
74
|
UNIVERSAL_SCRIPTS.append(f)
|
|
@@ -84,7 +84,7 @@ def platform(target: Literal["Windows", "Linux", "Darwin", "All"]):
|
|
|
84
84
|
# Define Universal Scripts Here #
|
|
85
85
|
#################################
|
|
86
86
|
|
|
87
|
-
@
|
|
87
|
+
@on_platform("All")
|
|
88
88
|
def create_base_structure(pwd: Path):
|
|
89
89
|
"""
|
|
90
90
|
Check if the PWD exists and create the folders 'notebooks', 'data' and 'logs'.
|
|
@@ -113,7 +113,7 @@ def create_base_structure(pwd: Path):
|
|
|
113
113
|
# Define System Scripts Here #
|
|
114
114
|
##############################
|
|
115
115
|
|
|
116
|
-
@
|
|
116
|
+
@on_platform("Windows")
|
|
117
117
|
def windows_install_scripts(pwd: Path):
|
|
118
118
|
with open(pwd / "launch.bat", "w") as f:
|
|
119
119
|
jupyter_path = get_binary('jupyter')
|
|
@@ -125,7 +125,7 @@ def windows_install_scripts(pwd: Path):
|
|
|
125
125
|
logging.warning("No activate.bat found, assuming no venv exists. Calling jupyter directly.")
|
|
126
126
|
f.write(f'"{jupyter_path}" lab --config=./jupyter_lab_config.py\r\n')
|
|
127
127
|
|
|
128
|
-
@
|
|
128
|
+
@on_platform("Windows")
|
|
129
129
|
@windows_admin_required
|
|
130
130
|
@optional("Install qviewkit url handler. Modifies the Registry.")
|
|
131
131
|
def windows_install_qviewkit_url_handler(pwd: Path):
|
|
@@ -151,11 +151,11 @@ def windows_install_qviewkit_url_handler(pwd: Path):
|
|
|
151
151
|
url_handler_key = winreg.CreateKeyEx(winreg.HKEY_CLASSES_ROOT, r"qviewkit")
|
|
152
152
|
winreg.SetValueEx(url_handler_key, "URL Protocol", 0, winreg.REG_SZ, "")
|
|
153
153
|
winreg.CloseKey(url_handler_key)
|
|
154
|
-
command_key = winreg.
|
|
154
|
+
command_key = winreg.CreateKeyEx(winreg.HKEY_CLASSES_ROOT, r"qviewkit\shell\open\command")
|
|
155
155
|
winreg.SetValue(command_key, None, winreg.REG_SZ, qviewkit_url_launch_command)
|
|
156
156
|
winreg.CloseKey(command_key)
|
|
157
157
|
|
|
158
|
-
@
|
|
158
|
+
@on_platform("Windows")
|
|
159
159
|
@windows_admin_required
|
|
160
160
|
@optional("Associate .h5 files with Qviewkit. Modifies the Registry.")
|
|
161
161
|
def windows_associate_h5(pwd: Path):
|
|
@@ -194,14 +194,14 @@ def windows_associate_h5(pwd: Path):
|
|
|
194
194
|
(value, type) = winreg.QueryValueEx(key, None)
|
|
195
195
|
if value != r"qviewkit.h5":
|
|
196
196
|
logging.info("Different association found. Overwriting...")
|
|
197
|
-
winreg.SetValue(key, None, winreg.REG_SZ, r"qviewkit.h5")
|
|
197
|
+
winreg.SetValue(key, None, winreg.REG_SZ, r"qviewkit.h5") #TODO: This is buggy
|
|
198
198
|
except FileNotFoundError:
|
|
199
199
|
assoc_key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, r".h5")
|
|
200
200
|
winreg.SetValue(assoc_key, None, winreg.REG_SZ, "qviewkit.h5")
|
|
201
201
|
winreg.CloseKey(assoc_key)
|
|
202
202
|
logging.info("Association created.")
|
|
203
203
|
|
|
204
|
-
@
|
|
204
|
+
@on_platform("Windows")
|
|
205
205
|
@windows_admin_required
|
|
206
206
|
@optional("Disable Smart Sorting in Windows Explorer. Edits the registry.")
|
|
207
207
|
def windows_disable_smart_sorting(pwd: Path):
|
|
@@ -209,13 +209,13 @@ def windows_disable_smart_sorting(pwd: Path):
|
|
|
209
209
|
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer")
|
|
210
210
|
winreg.SetValue(key, "NoStrCmpLogical", winreg.REG_DWORD, 1)
|
|
211
211
|
|
|
212
|
-
@
|
|
212
|
+
@on_platform("Windows")
|
|
213
213
|
def windows_set_config_path(pwd: Path):
|
|
214
214
|
import os
|
|
215
215
|
config_path = pwd / "qkit_local_config.py"
|
|
216
216
|
os.system(f'setx QKIT_LOCAL_CONFIG "{str(config_path.absolute())}"')
|
|
217
217
|
|
|
218
|
-
@
|
|
218
|
+
@on_platform("Linux")
|
|
219
219
|
def linux_set_env(pwd: Path):
|
|
220
220
|
import os
|
|
221
221
|
if 'QKIT_LOCAL_CONFIG' in os.environ or 'QKIT_VENV' in os.environ:
|
|
@@ -231,7 +231,7 @@ def linux_set_env(pwd: Path):
|
|
|
231
231
|
with open(Path.home() / ".profile", mode="a") as f:
|
|
232
232
|
f.write(var_export)
|
|
233
233
|
|
|
234
|
-
@
|
|
234
|
+
@on_platform("Linux")
|
|
235
235
|
def linux_install_desktop_files(pwd: Path):
|
|
236
236
|
def install_file(fname):
|
|
237
237
|
import os
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from laboneq.simple import *
|
|
4
|
+
|
|
5
|
+
from qkit.measure.unified_measurements import MeasurementTypeAdapter, Axis
|
|
6
|
+
|
|
7
|
+
from typing import Optional, List, Generator
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class LabOneQMeasurement(MeasurementTypeAdapter):
|
|
13
|
+
"""
|
|
14
|
+
A measurement adapter for LabOneQ experiments.
|
|
15
|
+
Allows adapting all the LabOneQ measurements to Qkit storage and measurement infrastructure.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
_session: Session
|
|
19
|
+
_experiment: Experiment
|
|
20
|
+
_structure: tuple['MeasurementTypeAdapter.DataDescriptor', ...]
|
|
21
|
+
|
|
22
|
+
@staticmethod
|
|
23
|
+
def sanitize_name(internal_name):
|
|
24
|
+
return internal_name.replace('/', '_').replace(' ', '_')
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def flatten(l: list) -> Generator:
|
|
28
|
+
"""
|
|
29
|
+
Takes a list of lists and flattens it into a list. Must handle the case where the root list entries are not lists.
|
|
30
|
+
"""
|
|
31
|
+
for element in l:
|
|
32
|
+
if isinstance(element, list):
|
|
33
|
+
yield from LabOneQMeasurement.flatten(element)
|
|
34
|
+
else:
|
|
35
|
+
yield element
|
|
36
|
+
|
|
37
|
+
def __init__(self, session: Session, experiment: Experiment, unit: str = 'a.u.', axis_units: Optional[List[str]] = None):
|
|
38
|
+
super().__init__()
|
|
39
|
+
self._session = session
|
|
40
|
+
self._experiment = experiment
|
|
41
|
+
compiled_experiment = self._session.compile(self._experiment)
|
|
42
|
+
emulated_session = Session(device_setup=compiled_experiment.device_setup, log_level=logging.WARNING)
|
|
43
|
+
emulated_session.connect(do_emulation=True)
|
|
44
|
+
emulated_result = emulated_session.run(compiled_experiment)
|
|
45
|
+
self._structure = tuple()
|
|
46
|
+
for (name, entry) in emulated_result.acquired_results.items():
|
|
47
|
+
sanitized = LabOneQMeasurement.sanitize_name(name)
|
|
48
|
+
axis_names = list(LabOneQMeasurement.flatten(entry.axis_name))
|
|
49
|
+
axes = tuple(LabOneQMeasurement.flatten(entry.axis))
|
|
50
|
+
if axis_units is None:
|
|
51
|
+
axis_units = ("a.u.",) * len(axis_names)
|
|
52
|
+
axes = tuple(Axis(name=name, range=values, unit=unit) for (name, values, unit) in zip(axis_names, axes, axis_units))
|
|
53
|
+
if np.iscomplexobj(entry.data):
|
|
54
|
+
self._structure += (
|
|
55
|
+
MeasurementTypeAdapter.DataDescriptor(name=sanitized + "_real", axes=axes, unit=unit),
|
|
56
|
+
MeasurementTypeAdapter.DataDescriptor(name=sanitized + "_imag", axes=axes, unit="i" + unit),
|
|
57
|
+
MeasurementTypeAdapter.DataDescriptor(name=sanitized + "_mag", axes=axes, unit=unit),
|
|
58
|
+
MeasurementTypeAdapter.DataDescriptor(name=sanitized + "_phase", axes=axes, unit='rad')
|
|
59
|
+
)
|
|
60
|
+
else:
|
|
61
|
+
self._structure += tuple(
|
|
62
|
+
MeasurementTypeAdapter.DataDescriptor(name=sanitized, axes=axes, unit=unit)
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def expected_structure(self) -> tuple['MeasurementTypeAdapter.DataDescriptor', ...]:
|
|
67
|
+
return self._structure
|
|
68
|
+
|
|
69
|
+
def perform_measurement(self) -> tuple['MeasurementTypeAdapter.GeneratedData', ...]:
|
|
70
|
+
compiled_experiment = self._session.compile(self._experiment)
|
|
71
|
+
result: Results = self._session.run(compiled_experiment)
|
|
72
|
+
def data_mapper(acquired_results):
|
|
73
|
+
for (name, entry) in acquired_results.items():
|
|
74
|
+
if np.iscomplexobj(entry.data):
|
|
75
|
+
yield name + "_real", np.real(entry.data)
|
|
76
|
+
yield name + "_imag", np.imag(entry.data)
|
|
77
|
+
yield name + "_mag", np.abs(entry.data)
|
|
78
|
+
yield name + "_phase", np.angle(entry.data)
|
|
79
|
+
else:
|
|
80
|
+
yield name, entry.data
|
|
81
|
+
return tuple(
|
|
82
|
+
descriptor.with_data(datum) for descriptor, (_, datum) in zip(self._structure, data_mapper(result.acquired_results))
|
|
83
|
+
)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
3
|
+
from qkit.measure.unified_measurements import MeasurementTypeAdapter, Axis
|
|
4
|
+
from qkit.drivers.AbstractVNA import AbstractVNA
|
|
5
|
+
|
|
6
|
+
class SpectroscopyMeasurement(MeasurementTypeAdapter):
|
|
7
|
+
|
|
8
|
+
_vna: AbstractVNA
|
|
9
|
+
_frequency_axis: Axis
|
|
10
|
+
|
|
11
|
+
def __init__(self, vna: AbstractVNA):
|
|
12
|
+
super().__init__()
|
|
13
|
+
self._vna = vna
|
|
14
|
+
self._frequency_axis = Axis(
|
|
15
|
+
name='frequency',
|
|
16
|
+
unit='Hz',
|
|
17
|
+
range=vna.get_freqpoints()
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
@staticmethod
|
|
21
|
+
def _phase_descriptor(frequency_axis: Axis):
|
|
22
|
+
return MeasurementTypeAdapter.DataDescriptor(
|
|
23
|
+
name="phase",
|
|
24
|
+
unit="rad",
|
|
25
|
+
axes=(frequency_axis,)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def _amplitude_descriptor(frequency_axis: Axis):
|
|
30
|
+
return MeasurementTypeAdapter.DataDescriptor(
|
|
31
|
+
name="amplitude",
|
|
32
|
+
axes=(frequency_axis,)
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def expected_structure(self) -> tuple['MeasurementTypeAdapter.DataDescriptor', ...]:
|
|
37
|
+
return (
|
|
38
|
+
self._amplitude_descriptor(self._frequency_axis),
|
|
39
|
+
self._phase_descriptor(self._frequency_axis)
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
def perform_measurement(self) -> tuple['MeasurementTypeAdapter.GeneratedData', ...]:
|
|
43
|
+
self._vna.pre_measurement()
|
|
44
|
+
self._vna.start_measurement()
|
|
45
|
+
while not self._vna.ready():
|
|
46
|
+
time.sleep(0.1)
|
|
47
|
+
amp, phase = self._vna.get_tracedata()
|
|
48
|
+
self._vna.post_measurement()
|
|
49
|
+
return (
|
|
50
|
+
self._amplitude_descriptor(self._frequency_axis).with_data(amp),
|
|
51
|
+
self._phase_descriptor(self._frequency_axis).with_data(phase)
|
|
52
|
+
)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from qkit.drivers.AbstractThermometer import AbstractThermometer
|
|
4
|
+
from qkit.measure.unified_measurements import MeasurementTypeAdapter
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ThermometryMeasurement(MeasurementTypeAdapter):
|
|
8
|
+
|
|
9
|
+
_thermometer: AbstractThermometer
|
|
10
|
+
_channel: Any
|
|
11
|
+
_descriptor: MeasurementTypeAdapter.DataDescriptor
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def __init__(self, thermometer: AbstractThermometer, channel: Any, name: str = "temperature"):
|
|
15
|
+
super().__init__()
|
|
16
|
+
self._thermometer = thermometer
|
|
17
|
+
self._channel = channel
|
|
18
|
+
self._descriptor = MeasurementTypeAdapter.DataDescriptor(
|
|
19
|
+
name=name,
|
|
20
|
+
unit=self._thermometer.unit,
|
|
21
|
+
axes=tuple()
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def expected_structure(self) -> tuple['MeasurementTypeAdapter.DataDescriptor', ...]:
|
|
27
|
+
return (
|
|
28
|
+
self._descriptor,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def perform_measurement(self) -> tuple['MeasurementTypeAdapter.GeneratedData', ...]:
|
|
32
|
+
return (
|
|
33
|
+
self._descriptor.with_data(self._thermometer.get_temperature(self._channel)),
|
|
34
|
+
)
|