qkit 0.5.4__tar.gz → 0.7.0__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.
Files changed (454) hide show
  1. qkit-0.7.0/.github/workflows/test.yml +27 -0
  2. {qkit-0.5.4 → qkit-0.7.0}/.gitignore +1 -0
  3. {qkit-0.5.4 → qkit-0.7.0}/PKG-INFO +11 -7
  4. {qkit-0.5.4 → qkit-0.7.0}/README.md +1 -1
  5. {qkit-0.5.4 → qkit-0.7.0}/pyproject.toml +9 -7
  6. qkit-0.7.0/src/qkit/_version.py +1 -0
  7. qkit-0.7.0/src/qkit/analysis/ZIPowerFromAmplitude.py +78 -0
  8. qkit-0.7.0/src/qkit/analysis/circle_fit/circlefit_analysis.py +157 -0
  9. qkit-0.7.0/src/qkit/analysis/fit_analysis_adapter.py +70 -0
  10. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/numerical_derivative.py +0 -4
  11. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/qfit.py +16 -11
  12. qkit-0.7.0/src/qkit/analysis/rabi_peak_tracker.py +27 -0
  13. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/instrument_base.py +1 -0
  14. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/instrument_tools.py +6 -4
  15. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S70_load_visa.py +0 -1
  16. qkit-0.7.0/src/qkit/drivers/ZISetup.py +44 -0
  17. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/plot/plot.py +12 -9
  18. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/DatasetsWindow.py +78 -58
  19. qkit-0.7.0/src/qkit/measure/laboneq_measurement.py +137 -0
  20. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/spectroscopy/spectroscopy_measurement.py +8 -8
  21. qkit-0.7.0/src/qkit/measure/timedomain/zi_common_experiments.py +150 -0
  22. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/transport_measurement.py +0 -4
  23. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/unified_measurements.py +158 -157
  24. qkit-0.7.0/src/qkit/measure/utils/current_voltage_tools.py +57 -0
  25. qkit-0.7.0/src/qkit/measure/utils/email_tools.py +82 -0
  26. qkit-0.7.0/src/qkit/measure/utils/flux_tools.py +35 -0
  27. qkit-0.7.0/src/qkit/measure/utils/spectroscopy_tools.py +133 -0
  28. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/store.py +1 -1
  29. qkit-0.7.0/tests/analysis/test_resonance_tracking.py +24 -0
  30. {qkit-0.5.4 → qkit-0.7.0}/tests/measure/test_unified_syntax.py +65 -23
  31. qkit-0.5.4/.git +0 -1
  32. qkit-0.5.4/.github/workflows/test.yml +0 -23
  33. qkit-0.5.4/src/qkit/_version.py +0 -1
  34. qkit-0.5.4/src/qkit/analysis/circle_fit/another_circle_fit.py +0 -66
  35. qkit-0.5.4/src/qkit/measure/laboneq_measurement.py +0 -83
  36. qkit-0.5.4/tests/breadcrumb/.7c57581a89db.breadcrumb.lock +0 -0
  37. qkit-0.5.4/tests/core/.7c57581a89db.breadcrumb +0 -4
  38. qkit-0.5.4/tests/core/.7c57581a89db.breadcrumb.lock +0 -0
  39. qkit-0.5.4/tests/measure/test.h5 +0 -0
  40. qkit-0.5.4/tests/storage/large_file.h5 +0 -0
  41. {qkit-0.5.4 → qkit-0.7.0}/.gitattributes +0 -0
  42. {qkit-0.5.4 → qkit-0.7.0}/.github/workflows/release.yml +0 -0
  43. {qkit-0.5.4 → qkit-0.7.0}/.travis.yml +0 -0
  44. {qkit-0.5.4 → qkit-0.7.0}/AUTHORS +0 -0
  45. {qkit-0.5.4 → qkit-0.7.0}/CITATION.cff +0 -0
  46. {qkit-0.5.4 → qkit-0.7.0}/LICENSE +0 -0
  47. {qkit-0.5.4 → qkit-0.7.0}/devices.toml.example +0 -0
  48. {qkit-0.5.4 → qkit-0.7.0}/doc/.gitignore +0 -0
  49. {qkit-0.5.4 → qkit-0.7.0}/doc/Makefile +0 -0
  50. {qkit-0.5.4 → qkit-0.7.0}/doc/make.bat +0 -0
  51. {qkit-0.5.4 → qkit-0.7.0}/doc/sample_data/1Q-NIST.json +0 -0
  52. {qkit-0.5.4 → qkit-0.7.0}/doc/sample_data/P8PPH2_anticrossing_sample_data.h5 +0 -0
  53. {qkit-0.5.4 → qkit-0.7.0}/doc/sample_data/QZQ3H8.sample +0 -0
  54. {qkit-0.5.4 → qkit-0.7.0}/doc/source/conf.py +0 -0
  55. {qkit-0.5.4 → qkit-0.7.0}/doc/source/index.rst +0 -0
  56. {qkit-0.5.4 → qkit-0.7.0}/doc/source/installation.rst +0 -0
  57. {qkit-0.5.4 → qkit-0.7.0}/doc/source/modules.rst +0 -0
  58. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.analysis.circle_fit.rst +0 -0
  59. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.analysis.rst +0 -0
  60. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.config.rst +0 -0
  61. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.lib.com.rst +0 -0
  62. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.lib.devices.rst +0 -0
  63. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.lib.file_service.rst +0 -0
  64. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.lib.network.rst +0 -0
  65. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.lib.rst +0 -0
  66. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.rst +0 -0
  67. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.s_init.bkup.rst +0 -0
  68. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.core.s_init.rst +0 -0
  69. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.gui.notebook.rst +0 -0
  70. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.gui.plot.rst +0 -0
  71. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.gui.qviewkit.rst +0 -0
  72. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.gui.rst +0 -0
  73. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.instruments.rst +0 -0
  74. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.logs.rst +0 -0
  75. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.measure.rst +0 -0
  76. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.measure.spectroscopy.rst +0 -0
  77. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.measure.timedomain.awg.rst +0 -0
  78. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.measure.timedomain.rst +0 -0
  79. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.measure.transport.rst +0 -0
  80. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.rst +0 -0
  81. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.services.qplexkit.rst +0 -0
  82. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.services.qsurveilkit.rst +0 -0
  83. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.services.raspi_misc.rst +0 -0
  84. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.services.rst +0 -0
  85. {qkit-0.5.4 → qkit-0.7.0}/doc/source/qkit.storage.rst +0 -0
  86. {qkit-0.5.4 → qkit-0.7.0}/images/Qkit_Logo.png +0 -0
  87. {qkit-0.5.4 → qkit-0.7.0}/images/Qkit_Logo.svg +0 -0
  88. {qkit-0.5.4 → qkit-0.7.0}/images/Qkit_QRcode.png +0 -0
  89. {qkit-0.5.4 → qkit-0.7.0}/images/Qkit_QRcode.svg +0 -0
  90. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/__init__.py +0 -0
  91. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/CurveXtractor.py +0 -0
  92. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/IV_curve.py +0 -0
  93. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/IV_curve2.py +0 -0
  94. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/IV_curve3.py +0 -0
  95. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/Manual point picker.ipynb_template +0 -0
  96. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/__init__.py +0 -0
  97. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/avoided_crossing_fit.py +0 -0
  98. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/__init__.py +0 -0
  99. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/circle_fit_2019/__init__.py +0 -0
  100. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/circle_fit_2019/circuit.py +0 -0
  101. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/circle_fit_classic/__init__.py +0 -0
  102. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/circle_fit_classic/calibration.py +0 -0
  103. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/circle_fit_classic/circlefit.py +0 -0
  104. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/circle_fit_classic/circuit.py +0 -0
  105. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/circle_fit/circle_fit_classic/utilities.py +0 -0
  106. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/iq_cloud_analysis.ipynb_template +0 -0
  107. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/iq_cloud_analysis.py +0 -0
  108. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/manual_point_picker.py +0 -0
  109. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/pointtracker.py +0 -0
  110. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/qdata.py +0 -0
  111. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/qps_rings.py +0 -0
  112. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/resonator.py +0 -0
  113. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/sonnet_parser.py +0 -0
  114. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/spectroscopy.py +0 -0
  115. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/timedomain.py +0 -0
  116. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/analysis/uncertainties_utilities.py +0 -0
  117. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/config/.gitignore +0 -0
  118. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/config/README.md +0 -0
  119. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/config/__init__.py +0 -0
  120. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/config/config_holder.py +0 -0
  121. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/config/environment.py +0 -0
  122. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/config/local.py_template +0 -0
  123. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/config/services.py_template +0 -0
  124. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/.gitignore +0 -0
  125. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/README +0 -0
  126. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/VERSION +0 -0
  127. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/__init__.py +0 -0
  128. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/flow.py +0 -0
  129. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/instrument_basev2.py +0 -0
  130. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/__init__.py +0 -0
  131. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/com/__init__.py +0 -0
  132. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/com/info_client.py +0 -0
  133. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/com/info_service.py +0 -0
  134. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/com/ri_client.py +0 -0
  135. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/com/ri_service.py +0 -0
  136. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/com/signals.py +0 -0
  137. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/file_service/__init__.py +0 -0
  138. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/file_service/breadcrumbs.py +0 -0
  139. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/file_service/file_info_database.py +0 -0
  140. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/file_service/file_info_database_lib.py +0 -0
  141. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/list_dict_DB.py +0 -0
  142. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/misc.py +0 -0
  143. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/network/__init__.py +0 -0
  144. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/network/tcpclient.py +0 -0
  145. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/lib/temp.py +0 -0
  146. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S10_logging.py +0 -0
  147. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S14_setup_directories.py +0 -0
  148. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S16_available_modules.py +0 -0
  149. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S20_check_for_updates.py +0 -0
  150. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S25_info_service.py +0 -0
  151. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S30_qkit_start.py +0 -0
  152. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S65_load_RI_service.py +0 -0
  153. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S80_load_file_service.py +0 -0
  154. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S85_init_measurement.py +0 -0
  155. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S98_started.py +0 -0
  156. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/S99_init_user.py +0 -0
  157. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/_30_network_server.py +0 -0
  158. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/_80_create_instruments.py +0 -0
  159. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/s_init/__init__.py +0 -0
  160. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/core/startup.py +0 -0
  161. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ADwinProII_SMU.py +0 -0
  162. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/AbstractIVDevice.py +0 -0
  163. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/AbstractMicrowaveSource.py +0 -0
  164. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/AbstractThermometer.py +0 -0
  165. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/AbstractVNA.py +0 -0
  166. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Agilent_DSO.py +0 -0
  167. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Agilent_E8257D.py +0 -0
  168. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Agilent_PNAX.py +0 -0
  169. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Agilent_TwissTorr74.py +0 -0
  170. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Agilent_VNA_E5071C.py +0 -0
  171. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/AnaPico_APUASYN20.py +0 -0
  172. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Anritsu_MG37022.py +0 -0
  173. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Anritsu_MS2830A.py +0 -0
  174. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Anritsu_VNA.py +0 -0
  175. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Anritsu_VNA_MS4642B.py +0 -0
  176. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/BKPrecision_9242.py +0 -0
  177. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Bluefors_GHS.py +0 -0
  178. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Caen_FAST_PS.py +0 -0
  179. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/DC_DAC_LTC2666.py +0 -0
  180. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/DummyVNA.py +0 -0
  181. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/EA_PS9360.py +0 -0
  182. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ERASynth.py +0 -0
  183. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/EdwardsActiveDigitalController.py +0 -0
  184. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/EthernetNode.py +0 -0
  185. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/EthernetServer.py +0 -0
  186. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/EthernetServerWin.py +0 -0
  187. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/FTDI_DAQ.py +0 -0
  188. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Faulhaber_3564K024B_C.py +0 -0
  189. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/GHzDAC.py +0 -0
  190. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/HP_34401A.py +0 -0
  191. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/HP_81110A.py +0 -0
  192. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/IQ_Mixer.py +0 -0
  193. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/IVD_dummy.py +0 -0
  194. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/IVVI_BiasDAC.py +0 -0
  195. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Inficon.py +0 -0
  196. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keithley.py +0 -0
  197. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keithley_2000.py +0 -0
  198. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keithley_2450.py +0 -0
  199. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keithley_2636A.py +0 -0
  200. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_35670A.py +0 -0
  201. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_B2900.py +0 -0
  202. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_E8267D.py +0 -0
  203. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_N5173B.py +0 -0
  204. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_VNA_E5071C.py +0 -0
  205. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_VNA_E5080B.py +0 -0
  206. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_VNA_E5080B_spectrum.py +0 -0
  207. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Keysight_VNA_P9375A.py +0 -0
  208. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Lmx2595.py +0 -0
  209. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/MKS_647C.py +0 -0
  210. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/MicroMag3.py +0 -0
  211. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ModernDriverTest.py +0 -0
  212. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/NI_DAQ.py +0 -0
  213. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/NI_DAQ_IV.py +0 -0
  214. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/OxfordInstruments_Kelvinox_IGH.py +0 -0
  215. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Oxford_ITC503.py +0 -0
  216. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Oxford_Triton.py +0 -0
  217. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/RFPCB.py +0 -0
  218. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/RFPCBJ.py +0 -0
  219. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/RFPCB_V2.py +0 -0
  220. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/RS_FSUP.py +0 -0
  221. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/RS_SGMA.py +0 -0
  222. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/RS_VNA_ZNAXX.py +0 -0
  223. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/RT_MW_Switch.py +0 -0
  224. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/SR_830.py +0 -0
  225. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/SerialPortCommunication.py +0 -0
  226. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Spectrum_M2i2030.py +0 -0
  227. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Spectrum_M3i2132.py +0 -0
  228. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Spectrum_M4i2211.py +0 -0
  229. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/StepAttenuator.py +0 -0
  230. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/StepMotor.py +0 -0
  231. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Tabor_WX1284C.py +0 -0
  232. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Tektronix_AWG5014.py +0 -0
  233. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Tektronix_AWG520.py +0 -0
  234. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Tektronix_AWG7062.py +0 -0
  235. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Tektronix_PWS4205.py +0 -0
  236. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Teslameter_FM302.py +0 -0
  237. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Tunnel_DAC.py +0 -0
  238. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/VCAs_TD.py +0 -0
  239. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/VNA_dummy.py +0 -0
  240. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Virtual_Coil.py +0 -0
  241. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Virtual_Current_Source.py +0 -0
  242. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Virtual_VCA.py +0 -0
  243. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Readme.txt +0 -0
  244. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_288_ChannelA.cal +0 -0
  245. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_288_ChannelB.cal +0 -0
  246. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_289_ChannelA.cal +0 -0
  247. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_289_ChannelB.cal +0 -0
  248. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA.cal +0 -0
  249. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow +0 -0
  250. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow.npy +0 -0
  251. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow_calibration_matrix_dBm.txt +0 -0
  252. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow_frequency_Hz.txt +0 -0
  253. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelA_calibration_with_freq_and_pow_power_intrinsic_units.txt +0 -0
  254. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB.cal +0 -0
  255. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow +0 -0
  256. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow.npy +0 -0
  257. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow_calibration_matrix_dBm.txt +0 -0
  258. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow_frequency_Hz.txt +0 -0
  259. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/Windfreak_290_ChannelB_calibration_with_freq_and_pow_power_intrinsic_units.txt +0 -0
  260. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/convert_files_to_python_3.ipynb +0 -0
  261. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreak_calibration_files/test_open_file_python3.ipynb +0 -0
  262. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreaktech916.py +0 -0
  263. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreaktech_SynthHD.cal +0 -0
  264. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Windfreaktech_SynthHD.py +0 -0
  265. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Yokogawa.py +0 -0
  266. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Yokogawa_GS200.py +0 -0
  267. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Yokogawa_GS210.py +0 -0
  268. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/Yokogawa_GS820.py +0 -0
  269. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInstSHFQC.py +0 -0
  270. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Abstract.py +0 -0
  271. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Abstractv2.py +0 -0
  272. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_PQSC.py +0 -0
  273. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_SHFSG.py +0 -0
  274. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_SHFSGv2.py +0 -0
  275. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_UHFQA.py +0 -0
  276. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_UHFQAv2.py +0 -0
  277. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Virtual_VNA.py +0 -0
  278. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Virtual_VNAv2.py +0 -0
  279. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Waveforms/CPMG.json +0 -0
  280. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Waveforms/CPMG.seq +0 -0
  281. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Waveforms/rabi.json +0 -0
  282. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Waveforms/rabi.seq +0 -0
  283. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Waveforms/ramsey.json +0 -0
  284. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ZHInst_Waveforms/ramsey.seq +0 -0
  285. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/_Spectrum_M3i2132/__init__.py +0 -0
  286. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/_Spectrum_M3i2132/errors.py +0 -0
  287. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/_Spectrum_M3i2132/regs.py +0 -0
  288. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/_Spectrum_M4i2211/__init__.py +0 -0
  289. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/_Spectrum_M4i2211/errors.py +0 -0
  290. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/_Spectrum_M4i2211/h2py.py +0 -0
  291. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/_Spectrum_M4i2211/regs.py +0 -0
  292. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/__init__.py +0 -0
  293. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/agilent_33210A.py +0 -0
  294. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/dll_support_nidaq.py +0 -0
  295. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/manual_settings.py +0 -0
  296. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/mfc_dummy.py +0 -0
  297. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/nidaq_syncIV.py +0 -0
  298. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/ohmmeter_dummy.py +0 -0
  299. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/qdevil_qdacII.py +0 -0
  300. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/qplexkit_client.py +0 -0
  301. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/quartz_dummy.py +0 -0
  302. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/switch_client.py +0 -0
  303. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/te_opto_dac.py +0 -0
  304. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/tip2_client.py +0 -0
  305. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/tip_client.py +0 -0
  306. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/two_port_switch.py +0 -0
  307. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_MultiplexingReadout.py +0 -0
  308. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_VNA_quantum_machines.py +0 -0
  309. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_magnet.py +0 -0
  310. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_measure_spec.py +0 -0
  311. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_pwsMagnet.py +0 -0
  312. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_step_attenuator.py +0 -0
  313. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_temperature_UFO.py +0 -0
  314. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_tunnel_electronic.py +0 -0
  315. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/virtual_yokomagnet.py +0 -0
  316. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/drivers/visa_prologix.py +0 -0
  317. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/__init__.py +0 -0
  318. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/notebook/Progress_Bar.py +0 -0
  319. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/notebook/Stopwatch.py +0 -0
  320. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/notebook/__init__.py +0 -0
  321. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/notebook/quickplot.py +0 -0
  322. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/notebook/wf_plot.py +0 -0
  323. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/plot/__init__.py +0 -0
  324. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/plot/url_launcher.py +0 -0
  325. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/PlotWindow.py +0 -0
  326. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/PlotWindow_lib.py +0 -0
  327. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/__init__.py +0 -0
  328. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/info_subsys.py +0 -0
  329. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/main.py +0 -0
  330. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/main_view.py +0 -0
  331. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/pg_time_axis.py +0 -0
  332. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/plot_view.py +0 -0
  333. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/gui/qviewkit/qviewkit.bat +0 -0
  334. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/install/install.py +0 -0
  335. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/install/jupyter_lab_config.py-tpl +0 -0
  336. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/install/linux/qkit-jupyter-lab.desktop +0 -0
  337. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/install/linux/qkit-qviewkit-url.desktop +0 -0
  338. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/install/linux/qkit-qviewkit.desktop +0 -0
  339. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/install/qkit_local_config.py-tpl +0 -0
  340. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/__init__.py +0 -0
  341. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/json_handler.py +0 -0
  342. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/measurement_base.py +0 -0
  343. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/measurement_class.py +0 -0
  344. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/samples_class.py +0 -0
  345. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/spectroscopy/README.md +0 -0
  346. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/spectroscopy/__init__.py +0 -0
  347. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/spectroscopy/signal_spectroscopy.py +0 -0
  348. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/spectroscopy/spectroscopy.py +0 -0
  349. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/spectroscopy/spectroscopy_unified.py +0 -0
  350. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/thermometry_measurement.py +0 -0
  351. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/002_TD1_f01_rabi_t1_ramsey.ipynb +0 -0
  352. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/VirtualAWG.py +0 -0
  353. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/__init__.py +0 -0
  354. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/awg/__init__.py +0 -0
  355. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/awg/generate_waveform.py +0 -0
  356. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/awg/load_awg.py +0 -0
  357. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/awg/load_tawg.py +0 -0
  358. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/awg/tomography.py +0 -0
  359. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/gate_func.py +0 -0
  360. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/initialize.py +0 -0
  361. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/measure_ZI_td.py +0 -0
  362. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/measure_td.py +0 -0
  363. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/pulse_sequence.py +0 -0
  364. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/__init__.py +0 -0
  365. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/basic_qubit_experiments.py +0 -0
  366. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/basic_qubit_experiments_V2.py +0 -0
  367. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/pulses.py +0 -0
  368. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/qm_qkit_wrapper.py +0 -0
  369. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/qm_qubit_config.py +0 -0
  370. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/qm_qubit_config_V2.py +0 -0
  371. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/quantum_jump_monitoring.py +0 -0
  372. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/qubit_high_temp.py +0 -0
  373. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/script.py +0 -0
  374. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/quantum_machine/script_pyqt.py +0 -0
  375. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/timedomain/sequence_library.py +0 -0
  376. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/transport/__init__.py +0 -0
  377. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/transport/transport.py +0 -0
  378. {qkit-0.5.4/src/qkit/services → qkit-0.7.0/src/qkit/measure/utils}/__init__.py +0 -0
  379. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/measure/write_additional_files.py +0 -0
  380. {qkit-0.5.4/src/qkit/services/qdepokit → qkit-0.7.0/src/qkit/services}/__init__.py +0 -0
  381. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qdepokit/Deposition_template.ipynb +0 -0
  382. {qkit-0.5.4/src/qkit/services/qplexkit → qkit-0.7.0/src/qkit/services/qdepokit}/__init__.py +0 -0
  383. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qdepokit/sdi.py +0 -0
  384. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qplexkit/.gitignore +0 -0
  385. {qkit-0.5.4/src/qkit/services/qsurveilkit → qkit-0.7.0/src/qkit/services/qplexkit}/__init__.py +0 -0
  386. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qplexkit/ccr.json_template +0 -0
  387. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qplexkit/install_systemd_service.sh +0 -0
  388. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qplexkit/pcf8575.py +0 -0
  389. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qplexkit/qplexkit.py +0 -0
  390. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qplexkit/server.py +0 -0
  391. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qplexkit/test_PCF8575.py +0 -0
  392. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/README.md +0 -0
  393. {qkit-0.5.4/src/qkit/services/raspi_misc/RT_switch → qkit-0.7.0/src/qkit/services/qsurveilkit}/__init__.py +0 -0
  394. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/client_main.py +0 -0
  395. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/data_class.py +0 -0
  396. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/plasma1_gui.py +0 -0
  397. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/plasma1_gui.ui +0 -0
  398. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/server_main.py_template +0 -0
  399. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/settings.cfg_template +0 -0
  400. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/srv_thread.py +0 -0
  401. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/qsurveilkit/worker.py +0 -0
  402. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/OxfordInstruments_Kelvinox_IGH_serial.py +0 -0
  403. {qkit-0.5.4/src/qkit/services/raspi_misc → qkit-0.7.0/src/qkit/services/raspi_misc/RT_switch}/__init__.py +0 -0
  404. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/RT_switch/switchbox_server.py +0 -0
  405. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/RT_switch/two_port_switch_manual_client.py +0 -0
  406. {qkit-0.5.4/src/qkit/services/raspi_misc/dc_dac → qkit-0.7.0/src/qkit/services/raspi_misc}/__init__.py +0 -0
  407. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/dc_dac/DAC_LTC2666_communication.py +0 -0
  408. {qkit-0.5.4/src/qkit/services/raspi_misc/edwards → qkit-0.7.0/src/qkit/services/raspi_misc/dc_dac}/__init__.py +0 -0
  409. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/dc_dac/server.py +0 -0
  410. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/edwards/EdwardsActiveDigitalController.py +0 -0
  411. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/edwards/EdwardsBridgeReadout.py +0 -0
  412. {qkit-0.5.4/src/qkit/services/raspi_misc/nitrogen → qkit-0.7.0/src/qkit/services/raspi_misc/edwards}/__init__.py +0 -0
  413. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/edwards/edw_client.py +0 -0
  414. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/edwards/edw_server.py +0 -0
  415. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/erasynth_server.py +0 -0
  416. {qkit-0.5.4/src/qkit/services/raspi_misc/tip → qkit-0.7.0/src/qkit/services/raspi_misc/nitrogen}/__init__.py +0 -0
  417. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/nitrogen/nitrogen_controller.py +0 -0
  418. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/nitrogen/nitrogen_server.py +0 -0
  419. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/nitrogen/refill_manual.py +0 -0
  420. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/nitrogen/refilling_switch_off.py +0 -0
  421. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/nitrogen/refilling_switch_on.py +0 -0
  422. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/nitrogen/sendMail.py +0 -0
  423. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/step_attenuator_server.py +0 -0
  424. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/step_motor.py +0 -0
  425. {qkit-0.5.4/src/qkit/storage → qkit-0.7.0/src/qkit/services/raspi_misc/tip}/__init__.py +0 -0
  426. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/raspi_misc/tip/fridge_monitoring.py +0 -0
  427. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/switchbox/lib_oled96.py +0 -0
  428. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/switchbox/server.py +0 -0
  429. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/services/switchbox/switch.py +0 -0
  430. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/README.md +0 -0
  431. {qkit-0.5.4/tests → qkit-0.7.0/src/qkit/storage}/__init__.py +0 -0
  432. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/hdf_DateTimeGenerator.py +0 -0
  433. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/hdf_constants.py +0 -0
  434. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/hdf_dataset.py +0 -0
  435. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/hdf_file.py +0 -0
  436. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/hdf_lib.py +0 -0
  437. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/storage/hdf_view.py +0 -0
  438. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/templates/Analysis/Probestation.ipynb +0 -0
  439. {qkit-0.5.4 → qkit-0.7.0}/src/qkit/templates/Measurements/Probestation.ipynb +0 -0
  440. /qkit-0.5.4/tests/analysis/test_new_circlefit.py → /qkit-0.7.0/tests/__init__.py +0 -0
  441. {qkit-0.5.4 → qkit-0.7.0}/tests/breadcrumb/.1337deadbeef.breadcrumb +0 -0
  442. {qkit-0.5.4 → qkit-0.7.0}/tests/breadcrumb/.deadbeef1337.breadcrumb +0 -0
  443. {qkit-0.5.4 → qkit-0.7.0}/tests/breadcrumb/.gitignore +0 -0
  444. {qkit-0.5.4 → qkit-0.7.0}/tests/breadcrumb/STUVWX_dummy.h5 +0 -0
  445. {qkit-0.5.4 → qkit-0.7.0}/tests/breadcrumb/test_breadcrumbs.py +0 -0
  446. {qkit-0.5.4 → qkit-0.7.0}/tests/core/.gitignore +0 -0
  447. {qkit-0.5.4 → qkit-0.7.0}/tests/core/STUVWX_dummy.h5 +0 -0
  448. {qkit-0.5.4 → qkit-0.7.0}/tests/core/subdir/YZ0123_dummy.h5 +0 -0
  449. {qkit-0.5.4 → qkit-0.7.0}/tests/core/test_file_info_database.py +0 -0
  450. {qkit-0.5.4 → qkit-0.7.0}/tests/measure/.gitignore +0 -0
  451. {qkit-0.5.4 → qkit-0.7.0}/tests/storage/.gitignore +0 -0
  452. {qkit-0.5.4 → qkit-0.7.0}/tests/storage/test_hdf5.py +0 -0
  453. {qkit-0.5.4 → qkit-0.7.0}/tests/test_qkit_basics.py +0 -0
  454. {qkit-0.5.4 → qkit-0.7.0}/tests/url/test_url_handler.py +0 -0
@@ -0,0 +1,27 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: 'master'
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix:
12
+ python-version: ["3.11", "3.12", "3.13", "3.14"]
13
+
14
+ steps:
15
+ - name: Checkout
16
+ uses: actions/checkout@v4.2.2
17
+ with:
18
+ fetch-depth: 200
19
+ fetch-tags: true
20
+ - name: Set up Python ${{ matrix.python-version }}
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: ${{ matrix.python-version }}
24
+ - name: Install build dependencies ${{ matrix.python-version }}
25
+ run: python -m pip install -U hatch hatch-vcs
26
+ - name: Run tests ${{ matrix.python-version }}
27
+ run: hatch test --cover-quiet --randomize
@@ -32,3 +32,4 @@ notebooks/
32
32
  # User install
33
33
  qkit_local_config.py
34
34
  jupyter_lab_config.py
35
+ launch.bat
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.5
2
2
  Name: qkit
3
- Version: 0.5.4
3
+ Version: 0.7.0
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,14 +345,17 @@ 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
348
350
  Keywords: Data Acquisition,Framework,Measurement,Quantum
349
351
  Classifier: Framework :: Jupyter :: JupyterLab :: 3
350
352
  Classifier: Intended Audience :: Science/Research
351
353
  Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2)
352
- Classifier: Programming Language :: Python :: 3.7
353
- Requires-Python: >=3.7
354
- Requires-Dist: filelock>=3.17
354
+ Classifier: Programming Language :: Python :: 3.11
355
+ Requires-Python: >=3.11
356
+ Requires-Dist: filelock>=3.10
355
357
  Requires-Dist: h5py>=3.8
358
+ Requires-Dist: importlib-resources; python_version == '3.9' or python_version == '3.10'
356
359
  Requires-Dist: ipython
357
360
  Requires-Dist: numpy>=1.24
358
361
  Requires-Dist: packaging
@@ -377,8 +380,9 @@ Requires-Dist: qgrid>=1.0; extra == 'qgrid'
377
380
  Provides-Extra: timedomain
378
381
  Requires-Dist: zerorpc>=0.6; extra == 'timedomain'
379
382
  Provides-Extra: url
380
- Requires-Dist: parsita~=2.2.2; extra == 'url'
383
+ Requires-Dist: parsita>=2.0.0; extra == 'url'
381
384
  Provides-Extra: zurich-instruments
385
+ Requires-Dist: laboneq-applications>=26.1.0; extra == 'zurich-instruments'
382
386
  Requires-Dist: laboneq>=2.59.0; extra == 'zurich-instruments'
383
387
  Description-Content-Type: text/markdown
384
388
 
@@ -402,7 +406,7 @@ Description-Content-Type: text/markdown
402
406
  ### Platform:
403
407
  The qkit framework has been tested under windows and with limits under macos x and linux.
404
408
  The gui requires h5py, qt and pyqtgraph, which work fine on these platforms.
405
- The core of the framework should run with python 2.7.x/3.4+
409
+ The core of the framework should run with python 3.9+
406
410
 
407
411
  ## Configuration
408
412
  There are three sources of configuration, which are used to set up your environment
@@ -18,7 +18,7 @@
18
18
  ### Platform:
19
19
  The qkit framework has been tested under windows and with limits under macos x and linux.
20
20
  The gui requires h5py, qt and pyqtgraph, which work fine on these platforms.
21
- The core of the framework should run with python 2.7.x/3.4+
21
+ The core of the framework should run with python 3.9+
22
22
 
23
23
  ## Configuration
24
24
  There are three sources of configuration, which are used to set up your environment
@@ -12,10 +12,10 @@ authors = [
12
12
  description = "qKIT quantum measurement suite in python"
13
13
  readme = "README.md"
14
14
  license = { file = "LICENSE" }
15
- requires-python = ">=3.7"
15
+ requires-python = ">=3.11"
16
16
  classifiers = [
17
17
  "Framework :: Jupyter :: JupyterLab :: 3",
18
- "Programming Language :: Python :: 3.7",
18
+ "Programming Language :: Python :: 3.11",
19
19
  "Intended Audience :: Science/Research",
20
20
  "License :: OSI Approved :: GNU General Public License v2 (GPLv2)"
21
21
  ]
@@ -32,8 +32,9 @@ dependencies = [
32
32
  "tomli>=2.0.1",
33
33
  "ipython",
34
34
  "packaging",
35
- "filelock>=3.17",
36
- "tqdm>=4.67.0"
35
+ "filelock>=3.10",
36
+ "tqdm>=4.67.0",
37
+ "importlib_resources; python_version == '3.9' or python_version == '3.10'"
37
38
  ]
38
39
 
39
40
  [project.scripts]
@@ -49,7 +50,8 @@ jupyter = [
49
50
  "ipywidgets>=8.0"
50
51
  ]
51
52
  zurich-instruments = [
52
- "LabOneQ>=2.59.0"
53
+ "LabOneQ>=2.59.0",
54
+ "laboneq-applications>=26.1.0"
53
55
  ]
54
56
  analysis = [
55
57
  "matplotlib>=3.7",
@@ -63,7 +65,7 @@ timedomain = [
63
65
  "zerorpc>=0.6"
64
66
  ]
65
67
  url = [
66
- "parsita~=2.2.2"
68
+ "parsita>=2.0.0"
67
69
  ]
68
70
 
69
71
 
@@ -92,7 +94,7 @@ exclude = ["data/*", "notebooks/*", "logs/*", "venv/*"]
92
94
 
93
95
  [tool.hatch.envs.hatch-test]
94
96
  extra-dependencies = [
95
- "parsita~=2.2.2"
97
+ "parsita>=2.0.0"
96
98
  ]
97
99
 
98
100
  [tool.pytest.ini_options]
@@ -0,0 +1 @@
1
+ __version__ = "0.7.0"
@@ -0,0 +1,78 @@
1
+ import numpy as np
2
+
3
+ from qkit.measure.unified_measurements import AnalysisTypeAdapter, MeasurementTypeAdapter, DataView, Axis
4
+ from qkit.measure.laboneq_measurement import LabOneQMeasurement
5
+
6
+
7
+ class ZIPowerFromAmplitude(AnalysisTypeAdapter):
8
+ """
9
+ An analysis converting the amplitude measurements and axis returned by Zurich Instruments devices into powers (dBm).
10
+
11
+ Our other devices usually return power, and most people are used to seeing and working with decibels.
12
+ """
13
+
14
+ _convert_datasets: dict[str, str] = None
15
+ _convert_axes: dict[str, str] = None
16
+ _generated_datasets: dict[str, MeasurementTypeAdapter.DataDescriptor] = None
17
+
18
+ def __init__(self, output_range: float, convert_datasets: None | dict[str, str] = None, convert_axes: None | dict[str, str] = None):
19
+ self._convert_datasets = convert_datasets
20
+ self._convert_axes = convert_axes
21
+ self._output_range = output_range
22
+
23
+ def _should_convert_dataset(self, schema: 'MeasurementTypeAdapter.DataDescriptor') -> bool:
24
+ if self._convert_datasets is None:
25
+ return schema.name.endswith("_mag")
26
+ else:
27
+ return schema.name in self._convert_datasets
28
+
29
+ def _map_dataset_name(self, schema: 'MeasurementTypeAdapter.DataDescriptor') -> str:
30
+ assert self._should_convert_dataset(schema)
31
+ if self._convert_datasets is None:
32
+ return schema.name.replace("_mag", "_power")
33
+ else:
34
+ return self._convert_datasets[schema.name]
35
+
36
+ def _should_convert_axis(self, axis: Axis) -> bool:
37
+ if self._convert_axes is None:
38
+ return axis.name.startswith("amplitudes")
39
+ else:
40
+ return axis.name in self._convert_axes
41
+
42
+ def _map_axis_name(self, axis: Axis) -> str:
43
+ assert self._should_convert_axis(axis)
44
+ if self._convert_axes is None:
45
+ return axis.name.replace("amplitudes", "powers")
46
+ else:
47
+ return self._convert_axes[axis.name]
48
+
49
+ @staticmethod
50
+ def amplitude_to_power(amplitudes: np.ndarray) -> np.ndarray:
51
+ return 30 + 20 * np.log10(amplitudes) # Power at 50 Ohm impedance, amplitudes in Volts, dBm
52
+
53
+ def _map_axes(self, axes: tuple[Axis, ...]) -> tuple[Axis, ...]:
54
+ return tuple(
55
+ Axis(self._map_axis_name(a), LabOneQMeasurement.calculate_powers(a.range, self._output_range), 'dBm') if self._should_convert_axis(a) else a
56
+ for a in axes
57
+ )
58
+
59
+ def expected_structure(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> tuple[
60
+ 'MeasurementTypeAdapter.DataDescriptor', ...]:
61
+ self._generated_datasets: dict[str, MeasurementTypeAdapter.DataDescriptor] = {
62
+ schema.name: MeasurementTypeAdapter.DataDescriptor(self._map_dataset_name(schema), self._map_axes(schema.axes), "dBm?", schema.category)
63
+ for schema in parent_schema if self._should_convert_dataset(schema)
64
+ }
65
+ return tuple(self._generated_datasets.values())
66
+
67
+ def default_views(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> dict[
68
+ str, "DataView"]:
69
+ # We don't add any additional views.
70
+ return dict()
71
+
72
+ def perform_analysis(self, data: tuple['MeasurementTypeAdapter.GeneratedData', ...]) -> tuple[
73
+ 'MeasurementTypeAdapter.GeneratedData', ...]:
74
+ return tuple(
75
+ self._generated_datasets[datum.descriptor.name].with_data(self.amplitude_to_power(datum.data))
76
+ for datum in data if datum.descriptor.name in self._generated_datasets
77
+ )
78
+
@@ -0,0 +1,157 @@
1
+ import numpy as np
2
+
3
+ from qkit.analysis.circle_fit.circle_fit_2019.circuit import circuit, reflection_port, notch_port
4
+ from qkit.measure.unified_measurements import AnalysisTypeAdapter, MeasurementTypeAdapter, DataView, DataViewSet, \
5
+ DataReference
6
+
7
+
8
+ class CircleFitAnalysis(AnalysisTypeAdapter):
9
+ """
10
+ Perform circle fit analysis on a spectroscopy measurement.
11
+ """
12
+
13
+ def __init__(self, ports = 2, amplitude_tag = 'amp', phase_tag = 'phase', autocorrect = False):
14
+ self._ports = ports
15
+ self._amplitude_tag = amplitude_tag
16
+ self._phase_tag = phase_tag
17
+ self._autocorrect = autocorrect
18
+
19
+ def expected_structure(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> tuple[
20
+ 'MeasurementTypeAdapter.DataDescriptor', ...]:
21
+ """
22
+ We expect the synthesized circle (real and imag) and the fit parameters.
23
+ """
24
+ frequency_axis = parent_schema[0].axes
25
+ return (
26
+ MeasurementTypeAdapter.DataDescriptor("real", frequency_axis, "real", "data"),
27
+ MeasurementTypeAdapter.DataDescriptor("imag", frequency_axis, "imag", "data"),
28
+ MeasurementTypeAdapter.DataDescriptor("fit_real", frequency_axis, "mag", "analysis"),
29
+ MeasurementTypeAdapter.DataDescriptor("fit_imag", frequency_axis, "imag", "analysis"),
30
+ MeasurementTypeAdapter.DataDescriptor("fit_mag", frequency_axis, "mag", "analysis"),
31
+ MeasurementTypeAdapter.DataDescriptor("fit_phase", frequency_axis, "rad", "analysis"),
32
+ MeasurementTypeAdapter.DataDescriptor("q_c", (), "", "analysis"),
33
+ MeasurementTypeAdapter.DataDescriptor("q_c_abs", (), "", "analysis"),
34
+ MeasurementTypeAdapter.DataDescriptor("q_c_min", (), "", "analysis"),
35
+ MeasurementTypeAdapter.DataDescriptor("q_c_max", (), "", "analysis"),
36
+ MeasurementTypeAdapter.DataDescriptor("q_i", (), "", "analysis"),
37
+ MeasurementTypeAdapter.DataDescriptor("q_i_min", (), "", "analysis"),
38
+ MeasurementTypeAdapter.DataDescriptor("q_i_max", (), "", "analysis"),
39
+ MeasurementTypeAdapter.DataDescriptor("q_i_no_dia_corr", (), "", "analysis"),
40
+ MeasurementTypeAdapter.DataDescriptor("q_l", (), "", "analysis"),
41
+ MeasurementTypeAdapter.DataDescriptor("a", (), "mag", "analysis"),
42
+ MeasurementTypeAdapter.DataDescriptor("alpha", (), "rad", "analysis"),
43
+ MeasurementTypeAdapter.DataDescriptor("delay", (), "s", "analysis"),
44
+ MeasurementTypeAdapter.DataDescriptor("delay_remaining", (), "s", "analysis"),
45
+ MeasurementTypeAdapter.DataDescriptor("f_res", (), "Hz", "analysis"),
46
+ MeasurementTypeAdapter.DataDescriptor("phi", (), "rad", "analysis"),
47
+ MeasurementTypeAdapter.DataDescriptor("theta", (), "rad", "analysis"),
48
+ )
49
+
50
+ def default_views(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> dict[
51
+ str, "DataView"]:
52
+ frequency = parent_schema[0].axes[0]
53
+ parent_amp_name = [entry.name for entry in parent_schema if self._amplitude_tag in entry.name][0]
54
+ parent_phase_name = [entry.name for entry in parent_schema if self._phase_tag in entry.name][0]
55
+ return {
56
+ "circle_fit": DataView(
57
+ view_params={
58
+ "labels": ("real", "imag"),
59
+ "plot_style": 1,
60
+ "markersize": 5,
61
+ "aspect": 1.0
62
+ },
63
+ view_sets=[
64
+ DataViewSet( # Real data
65
+ x_path=DataReference("real", category='data'),
66
+ y_path=DataReference("imag", category='data'),
67
+ ),
68
+ DataViewSet( # Fit result
69
+ x_path=DataReference("fit_real", category='analysis'),
70
+ y_path=DataReference("fit_imag", category='analysis')
71
+ )
72
+ ]
73
+ ),
74
+ "phase_fit": DataView(
75
+ view_params={
76
+ "labels": ("frequency", "phase"),
77
+ "plot_style": 1,
78
+ "markersize": 5
79
+ },
80
+ view_sets=[
81
+ DataViewSet(
82
+ x_path=DataReference(frequency.name),
83
+ y_path=DataReference(parent_phase_name)
84
+ ),
85
+ DataViewSet(
86
+ x_path=DataReference(frequency.name),
87
+ y_path=DataReference("fit_phase", category='analysis')
88
+ )
89
+ ]
90
+ ),
91
+ "mag_fit": DataView(
92
+ view_params={
93
+ "labels": ("frequency", "mag"),
94
+ "plot_style": 1,
95
+ "markersize": 5
96
+ },
97
+ view_sets=[
98
+ DataViewSet(
99
+ x_path=DataReference(frequency.name),
100
+ y_path=DataReference(parent_amp_name)
101
+ ),
102
+ DataViewSet(
103
+ x_path=DataReference(frequency.name),
104
+ y_path=DataReference("fit_mag", category='analysis')
105
+ )
106
+ ]
107
+ )
108
+ }
109
+
110
+ def perform_analysis(self, data: tuple['MeasurementTypeAdapter.GeneratedData', ...]) -> tuple[
111
+ 'MeasurementTypeAdapter.GeneratedData', ...]:
112
+ amp_data = [datum for datum in data if self._amplitude_tag in datum.descriptor.name][0]
113
+ phase_data = [datum for datum in data if self._phase_tag in datum.descriptor.name][0]
114
+
115
+ frequencies = amp_data.descriptor.axes[0].range
116
+ amplitudes = amp_data.data
117
+ # Unwrap and linearly correct data
118
+ if self._autocorrect:
119
+ unwrapped = np.unwrap(phase_data.data)
120
+ phases = unwrapped - np.nan_to_num(np.linspace(unwrapped[0], unwrapped[-1], len(unwrapped)))
121
+ else:
122
+ phases = phase_data.data
123
+ z_data = amplitudes * np.exp(1j * phases)
124
+
125
+ # precompute for storage later.
126
+ imag = np.imag(z_data)
127
+ real = np.real(z_data)
128
+
129
+ # Perform the fit
130
+ if self._ports == 1:
131
+ fit: circuit = reflection_port(frequencies, z_data)
132
+ elif self._ports == 2:
133
+ fit: circuit = notch_port(frequencies, z_data)
134
+ else:
135
+ raise NotImplemented
136
+ fit.autofit()
137
+
138
+ results = [
139
+ real, imag, # Converted measured data
140
+ fit.z_data_sim.real, fit.z_data_sim.imag, np.abs(fit.z_data_sim), np.angle(fit.z_data_sim), # Fitted data
141
+ # The fit parameters
142
+ # Quality factors
143
+ fit.Qc, fit.absQc, fit.Qc_min, fit.Qc_max,
144
+ fit.Qi, fit.Qi_min, fit.Qi_max, fit.Qi_no_dia_corr,
145
+ fit.Ql,
146
+ # Center parameters
147
+ fit.a, fit.alpha,
148
+ # Delay
149
+ fit.delay, fit.delay_remaining,
150
+ # Misc
151
+ fit.fr,
152
+ fit.phi, fit.theta,
153
+ ]
154
+
155
+ declared_shape = self.expected_structure(tuple(datum.descriptor for datum in data))
156
+ return tuple(desc.with_data(data) for desc, data in zip(declared_shape, results))
157
+
@@ -0,0 +1,70 @@
1
+ from collections import namedtuple
2
+ from typing import Callable, Union
3
+
4
+ import numpy as np
5
+
6
+ from qkit.measure.unified_measurements import AnalysisTypeAdapter, DataGenerator, MeasurementTypeAdapter, DataView, \
7
+ DataViewSet, DataReference
8
+ from scipy.optimize import curve_fit
9
+
10
+ FitParam = namedtuple('FitParam', ['name', 'init_value', 'unit'])
11
+
12
+ class FitAnalysisAdapter(AnalysisTypeAdapter):
13
+
14
+ def __init__(self, fit_function: Callable, dataset_phrase: str,
15
+ p0: Union[tuple[FitParam, ...], Callable[[np.ndarray, np.ndarray], tuple[FitParam, ...]]],
16
+ post_hook: Union[Callable, None] = None, fit_name: str = 'fit_curve'):
17
+ self.synth_desc = None
18
+ self.fit_function = fit_function
19
+ self.dataset_phrase = dataset_phrase
20
+ self.p0 = p0
21
+ self.post_hook = post_hook
22
+ self.fit_name = fit_name
23
+ example_p0 = self.p0(np.linspace(0, 100, 100), np.ones(100)) if callable(self.p0) else self.p0
24
+ self.structure = tuple(
25
+ DataGenerator.DataDescriptor(name=param.name, unit=param.unit, axes=tuple(), category='analysis')
26
+ for param in example_p0
27
+ )
28
+
29
+ def expected_structure(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> tuple[
30
+ 'MeasurementTypeAdapter.DataDescriptor', ...]:
31
+ relevant_descriptor = [desc for desc in parent_schema if self.dataset_phrase in desc.name][0]
32
+ self.synth_desc = DataGenerator.DataDescriptor(name=self.fit_name, unit=relevant_descriptor.unit, axes=relevant_descriptor.axes, category='analysis')
33
+ return self.structure + (self.synth_desc,)
34
+
35
+ def default_views(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> dict[str, "DataView"]:
36
+ relevant_descriptor = [desc for desc in parent_schema if self.dataset_phrase in desc.name][0]
37
+ x_axis = relevant_descriptor.axes[0]
38
+ return {
39
+ 'fit': DataView(
40
+ view_params= {
41
+ "plot_style": 1,
42
+ "markersize": 5
43
+ },
44
+ view_sets=[
45
+ DataViewSet(# Real Data
46
+ x_path=DataReference(x_axis.name),
47
+ y_path=DataReference(relevant_descriptor.name),
48
+ ),
49
+ DataViewSet(# Fit Curve
50
+ x_path=DataReference(x_axis.name),
51
+ y_path=DataReference(self.fit_name, 'analysis'),
52
+ )
53
+ ]
54
+ )
55
+ }
56
+
57
+ def perform_analysis(self, data: tuple['MeasurementTypeAdapter.GeneratedData', ...]) -> tuple[
58
+ 'MeasurementTypeAdapter.GeneratedData', ...]:
59
+ relevant_data = [datum for datum in data if self.dataset_phrase in datum.descriptor.name][0]
60
+ x = relevant_data.descriptor.axes[0].range
61
+ y = relevant_data.data
62
+
63
+ start_params = self.p0(x, y) if callable(self.p0) else self.p0
64
+ popt, pcov = curve_fit(self.fit_function, x, y, p0=tuple(param.init_value for param in start_params))
65
+ self.post_hook(popt, pcov)
66
+ synthetic_data = self.fit_function(x, *popt)
67
+ return tuple(
68
+ desc.with_data(opt_param)
69
+ for (desc, opt_param) in zip(self.structure, popt)
70
+ ) + (self.synth_desc.with_data(synthetic_data),)
@@ -1,5 +1,4 @@
1
1
  import itertools
2
- from typing import override
3
2
 
4
3
  from scipy import signal
5
4
 
@@ -26,7 +25,6 @@ class SavgolNumericalDerivative(AnalysisTypeAdapter):
26
25
  self._polyorder = polyorder
27
26
  self._derivative = derivative
28
27
 
29
- @override
30
28
  def perform_analysis(self, data: tuple['MeasurementTypeAdapter.GeneratedData', ...]) -> tuple[
31
29
  'MeasurementTypeAdapter.GeneratedData', ...]:
32
30
  parent_schema = tuple([element.descriptor for element in data])
@@ -44,7 +42,6 @@ class SavgolNumericalDerivative(AnalysisTypeAdapter):
44
42
  return tuple(out)
45
43
 
46
44
 
47
- @override
48
45
  def expected_structure(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> tuple['MeasurementTypeAdapter.DataDescriptor', ...]:
49
46
  structure = []
50
47
  for (x, y) in itertools.batched(parent_schema, 2):
@@ -65,7 +62,6 @@ class SavgolNumericalDerivative(AnalysisTypeAdapter):
65
62
  ]
66
63
  return tuple(structure)
67
64
 
68
- @override
69
65
  def default_views(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> dict[str, DataView]:
70
66
  schema = self.expected_structure(parent_schema)
71
67
  variable_names = (schema[0].name.split('_')[0], schema[1].name.split('_')[0])
@@ -363,18 +363,23 @@ class QFIT(object):
363
363
  return
364
364
 
365
365
  else: #use specified entries
366
- entrytypes = self.hf['/entry/'].keys()
367
- try: entrytypes.remove('views')
368
- except (ValueError,AttributeError): pass
369
- for et in entrytypes:
370
- for e in entries:
371
- for k in self.hf['/entry/'+et].keys():
366
+ for entry in entries:
367
+ if entry.startswith('/'):
368
+ # This is an absolute path, just take it.
369
+ urls.append(entry)
370
+ else:
371
+ # This is a relative path, and likely an implicit reference to /entry/data0/...
372
+ # We need to search for it.
373
+ for category in self.hf['/entry/'].keys():
374
+ if category == 'views':
375
+ continue
376
+ path_candidate = '/entry/' + category + '/' + entry
372
377
  try:
373
- if e == et+k or (e == k and et == 'data0'):
374
- urls.append('/entry/'+et+'/'+k)
375
- except IndexError:
376
- logging.error('Entries cannot be identified. No data for >> {:s} << found. Aborting.'.format(str(e)))
377
- return
378
+ self.hf[path_candidate]
379
+ urls.append(path_candidate)
380
+ break
381
+ except KeyError:
382
+ pass
378
383
 
379
384
  self.hf.close()
380
385
  #cast to real strings in case the urls ended up to be unicode
@@ -0,0 +1,27 @@
1
+ from typing import Callable
2
+
3
+ import numpy as np
4
+
5
+ from qkit.measure.unified_measurements import AnalysisTypeAdapter, MeasurementTypeAdapter
6
+
7
+
8
+ class RabiPeakTracker(AnalysisTypeAdapter):
9
+
10
+ def __init__(self, dataset_phrase : str, post_hook: Callable[[float], None]) -> None:
11
+ self.dataset_phrase = dataset_phrase
12
+ self.post_hook = post_hook
13
+ self.result_descriptor = MeasurementTypeAdapter.DataDescriptor("rabi_peak", tuple(), unit='Hz', category='analysis')
14
+
15
+ def expected_structure(self, parent_schema: tuple['MeasurementTypeAdapter.DataDescriptor', ...]) -> tuple[
16
+ 'MeasurementTypeAdapter.DataDescriptor', ...]:
17
+ return (self.result_descriptor,)
18
+
19
+ def perform_analysis(self, data: tuple['MeasurementTypeAdapter.GeneratedData', ...]) -> tuple[
20
+ 'MeasurementTypeAdapter.GeneratedData', ...]:
21
+ data = [datum for datum in data if self.dataset_phrase in datum.descriptor.name][0]
22
+ x_axis = data.descriptor.axes[0].range
23
+ signal_strength = np.std(data.data, axis=-1)
24
+ maximum_frequency = x_axis[np.argmax(signal_strength)]
25
+ self.post_hook(maximum_frequency)
26
+ return (self.result_descriptor.with_data(maximum_frequency),)
27
+
@@ -624,6 +624,7 @@ class Instrument(object):
624
624
  bool: bool,
625
625
  tuple: tuple,
626
626
  list: list,
627
+ dict: dict,
627
628
  np.ndarray: lambda x: x.tolist(),
628
629
  }
629
630
 
@@ -70,7 +70,9 @@ class Insttools(object):
70
70
  self._user_instdir = qkit.cfg.get('user_instruments_dir')
71
71
  lookup_dict_location = qkit.cfg.get('device_lookup_config')
72
72
  if lookup_dict_location is not None:
73
- self._lookup_dict = tomli.load(lookup_dict_location)
73
+ logging.info(f"Loading devices configuration from {lookup_dict_location}")
74
+ with open(lookup_dict_location, "rb") as f:
75
+ self._lookup_dict = tomli.load(f)
74
76
  else:
75
77
  self._lookup_dict = {}
76
78
 
@@ -264,14 +266,14 @@ class Insttools(object):
264
266
  f.write(descr)
265
267
  return self.get(name)
266
268
 
267
- def create_from_config(self, name, **kwargs):
269
+ def create_from_config(self, identifier, registered_name, **kwargs):
268
270
  """
269
- Check in the local config file for the device name. If it exists, take the config from there to create the device.
271
+ Check in the local config file for the device name `registered_name`. If it exists, take the config from there to create the device.
270
272
 
271
273
  Override with values from keyword arguments.
272
274
  """
273
275
  # This merges the configuration dict with
274
- config = {**self._lookup_dict[name], **kwargs, 'name': name}
276
+ config = {**self._lookup_dict[registered_name], **kwargs, 'name': identifier}
275
277
  return self.create(**config)
276
278
 
277
279
 
@@ -4,7 +4,6 @@
4
4
  """
5
5
  import qkit
6
6
  import logging
7
- from pkgutil import find_loader
8
7
 
9
8
 
10
9
  def _load_visa():
@@ -0,0 +1,44 @@
1
+ import logging
2
+ from types import NoneType
3
+
4
+ from laboneq.dsl.device import DeviceSetup
5
+ from laboneq.dsl.quantum import QPU, QuantumParameters
6
+ from laboneq.dsl.quantum.quantum_element import AttrDict, QuantumElement
7
+ from laboneq.dsl.session import Session
8
+ from laboneq_applications.qpu_types.tunable_transmon import TunableTransmonQubit, TunableTransmonOperations
9
+
10
+ from qkit.core.instrument_base import Instrument
11
+
12
+
13
+ class ZISetup(Instrument):
14
+
15
+ def __init__(self, name: str, address: str, descriptor, **kwargs):
16
+ super().__init__(name, **kwargs)
17
+ self._setup = DeviceSetup.from_descriptor(descriptor, address)
18
+ self._session = Session(self._setup, log_level=logging.WARNING)
19
+ self._session.connect(reset_devices=True)
20
+ self._qubits = TunableTransmonQubit.from_device_setup(self._setup)
21
+
22
+ # Register parameters for each qubit.
23
+ parameters: QuantumParameters = self._qubits[0].parameters
24
+ attributes = [entry for entry in dir(parameters) if not entry.startswith('_') and not callable(getattr(parameters, entry))]
25
+ for key in attributes:
26
+ inferred_type = type(getattr(parameters, key))
27
+ if inferred_type is int:
28
+ inferred_type = float
29
+ if inferred_type is AttrDict:
30
+ inferred_type = dict
31
+ elif inferred_type is NoneType:
32
+ inferred_type = float
33
+ self.add_parameter(key, channels=(0, len(self._qubits)-1), type=inferred_type, flags=Instrument.FLAG_GETSET,
34
+ get_func=lambda channel, _key=key: getattr(self.get_qubit(channel).parameters, _key),
35
+ set_func=lambda value, channel, _key=key: setattr(self.get_qubit(channel).parameters, _key, value))
36
+
37
+ def get_qpu(self) -> QPU:
38
+ return QPU(self._qubits, quantum_operations=TunableTransmonOperations())
39
+
40
+ def get_qubit(self, index: int) -> QuantumElement:
41
+ return self._qubits[index]
42
+
43
+ def get_session(self):
44
+ return self._session