{ "cells": [ { "cell_type": "markdown", "id": "b93e8151", "metadata": {}, "source": [ "# Mixer correction\n", "In this tutorial we will demonstrate the ability to compensate for output mixer non-idealities and observe the changes using an oscilloscope.\n", "\n", "Mixer non-idealities can lead to unwanted spurs on the output (LO/RF/IF feedthrough and other spurious products) and they can be compensated by applying adjustments to the I/Q outputs: phase offset, gain ratio and DC offset. This solution applies to both baseband QCM/QRM products using external mixers as well as QCM-RF and QRM-RF products.\n", "\n", "The tutorial is designed for Cluster QRM/QCM baseband. We will adjust all the parameters listed above and observe the changes to the I/Q outputs directly on an oscilloscope.\n", "\n", "For QCM-RF and QRM-RF products, one can also refer to the 'mixer calibration' section of the tutorial on [RF-control](https://qblox-qblox-instruments.readthedocs-hosted.com/en/main/tutorials/q1asm_tutorials/basic/rf/rf_control.html#Mixer-calibration).\n", "\n", "To run this tutorial please make sure you have installed and enabled ipywidgets:\n", "```\n", "pip install ipywidgets\n", "jupyter nbextension enable --py widgetsnbextension\n", "```" ] }, { "cell_type": "markdown", "id": "e46e3f0e", "metadata": { "tags": [] }, "source": [ "Setup\n", "-----\n", "\n", "First, we are going to import the required packages." ] }, { "cell_type": "code", "execution_count": 1, "id": "c9d66138", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:35.358238Z", "iopub.status.busy": "2024-09-18T14:49:35.358057Z", "iopub.status.idle": "2024-09-18T14:49:35.837255Z", "shell.execute_reply": "2024-09-18T14:49:35.836242Z" } }, "outputs": [], "source": [ "from __future__ import annotations\n", "\n", "import json\n", "from typing import TYPE_CHECKING, Callable\n", "\n", "import ipywidgets as widgets\n", "from ipywidgets import interact\n", "from qcodes.instrument import find_or_create_instrument\n", "\n", "from qblox_instruments import Cluster, ClusterType\n", "\n", "if TYPE_CHECKING:\n", " from qblox_instruments.qcodes_drivers.module import Module" ] }, { "cell_type": "markdown", "id": "d06fc71d", "metadata": {}, "source": [ "### Scan For Clusters\n", "\n", "We scan for the available devices connected via ethernet using the Plug & Play functionality of the Qblox Instruments package (see [Plug & Play](https://qblox-qblox-instruments.readthedocs-hosted.com/en/main/api_reference/tools.html#api-pnp) for more info)." ] }, { "cell_type": "code", "execution_count": 2, "id": "f1449e1b", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:35.839847Z", "iopub.status.busy": "2024-09-18T14:49:35.839496Z", "iopub.status.idle": "2024-09-18T14:49:37.948545Z", "shell.execute_reply": "2024-09-18T14:49:37.947358Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No devices found\r\n" ] } ], "source": [ "!qblox-pnp list" ] }, { "cell_type": "code", "execution_count": 3, "id": "470f6a9a", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:37.952379Z", "iopub.status.busy": "2024-09-18T14:49:37.951885Z", "iopub.status.idle": "2024-09-18T14:49:37.956840Z", "shell.execute_reply": "2024-09-18T14:49:37.955917Z" } }, "outputs": [], "source": [ "cluster_ip = \"10.10.200.42\"\n", "cluster_name = \"cluster0\"" ] }, { "cell_type": "markdown", "id": "51feff20", "metadata": {}, "source": [ "### Connect to Cluster\n", "\n", "We now make a connection with the Cluster." ] }, { "cell_type": "code", "execution_count": 4, "id": "48de4fa0", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:37.961129Z", "iopub.status.busy": "2024-09-18T14:49:37.960208Z", "iopub.status.idle": "2024-09-18T14:49:39.362923Z", "shell.execute_reply": "2024-09-18T14:49:39.361620Z" }, "lines_to_next_cell": 2 }, "outputs": [], "source": [ "cluster = find_or_create_instrument(\n", " Cluster,\n", " recreate=True,\n", " name=cluster_name,\n", " identifier=cluster_ip,\n", " dummy_cfg=(\n", " {\n", " 2: ClusterType.CLUSTER_QCM,\n", " 4: ClusterType.CLUSTER_QRM,\n", " 6: ClusterType.CLUSTER_QCM_RF,\n", " 8: ClusterType.CLUSTER_QRM_RF,\n", " }\n", " if cluster_ip is None\n", " else None\n", " ),\n", ")" ] }, { "cell_type": "markdown", "id": "d1925a81", "metadata": { "lines_to_next_cell": 2 }, "source": [ "#### Get connected modules" ] }, { "cell_type": "code", "execution_count": 5, "id": "eff83de0", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:39.377737Z", "iopub.status.busy": "2024-09-18T14:49:39.376555Z", "iopub.status.idle": "2024-09-18T14:49:39.384016Z", "shell.execute_reply": "2024-09-18T14:49:39.383016Z" } }, "outputs": [], "source": [ "def get_connected_modules(cluster: Cluster, filter_fn: Callable | None = None) -> dict[int, Module]:\n", " def checked_filter_fn(mod: ClusterType) -> bool:\n", " if filter_fn is not None:\n", " return filter_fn(mod)\n", " return True\n", "\n", " return {\n", " mod.slot_idx: mod for mod in cluster.modules if mod.present() and checked_filter_fn(mod)\n", " }" ] }, { "cell_type": "code", "execution_count": 6, "id": "5de5a50e", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:39.387847Z", "iopub.status.busy": "2024-09-18T14:49:39.387317Z", "iopub.status.idle": "2024-09-18T14:49:39.419567Z", "shell.execute_reply": "2024-09-18T14:49:39.418600Z" } }, "outputs": [ { "data": { "text/plain": [ "{6: ,\n", " 8: ,\n", " 10: }" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# RF modules\n", "modules = get_connected_modules(cluster, lambda mod: mod.is_rf_type)\n", "modules" ] }, { "cell_type": "code", "execution_count": 7, "id": "c9d6a259", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:39.424142Z", "iopub.status.busy": "2024-09-18T14:49:39.423090Z", "iopub.status.idle": "2024-09-18T14:49:39.428619Z", "shell.execute_reply": "2024-09-18T14:49:39.427464Z" }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ "module = modules[8]" ] }, { "cell_type": "markdown", "id": "57a5ff86", "metadata": {}, "source": [ "### Reset the Cluster\n", "\n", "We reset the Cluster to enter a well-defined state. Note that resetting will clear all stored parameters, so resetting between experiments is usually not desirable." ] }, { "cell_type": "code", "execution_count": 8, "id": "45f3749c", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:39.432994Z", "iopub.status.busy": "2024-09-18T14:49:39.432140Z", "iopub.status.idle": "2024-09-18T14:49:41.881214Z", "shell.execute_reply": "2024-09-18T14:49:41.880090Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status: OKAY, Flags: NONE, Slot flags: NONE\n" ] } ], "source": [ "cluster.reset()\n", "print(cluster.get_system_status())" ] }, { "cell_type": "markdown", "id": "23ba8466", "metadata": {}, "source": [ "### Setup Sequencer \n", "\n", "\n", "The easiest way to view the influence of the mixer correction is to mix the NCO sin and cos with I and Q values of 1 (fullscale). The instrument output would be simple sinusoids with a 90[deg] phase offset and identical amplitude.\n", "\n", "We use sequencer 0 to set I and Q values of 1 (fullscale) using DC offset and we mix those with the NCO signals." ] }, { "cell_type": "code", "execution_count": 9, "id": "63b3a2d0", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:41.886223Z", "iopub.status.busy": "2024-09-18T14:49:41.885511Z", "iopub.status.idle": "2024-09-18T14:49:41.953981Z", "shell.execute_reply": "2024-09-18T14:49:41.952914Z" }, "lines_to_next_cell": 2 }, "outputs": [], "source": [ "# Program sequence we will not use.\n", "sequence = {\"waveforms\": {}, \"weights\": {}, \"acquisitions\": {}, \"program\": \"stop\"}\n", "with open(\"sequence.json\", \"w\", encoding=\"utf-8\") as file:\n", " json.dump(sequence, file, indent=4)\n", " file.close()\n", "module.sequencer0.sequence(sequence)\n", "\n", "# Program fullscale DC offset on I & Q, turn on NCO and enable modulation.\n", "module.sequencer0.offset_awg_path0(1.0)\n", "module.sequencer0.offset_awg_path1(1.0)\n", "module.sequencer0.nco_freq(10e6)\n", "module.sequencer0.mod_en_awg(True)" ] }, { "cell_type": "markdown", "id": "73bdd68d", "metadata": { "lines_to_next_cell": 2 }, "source": [ "Control sliders\n", "-----\n", "\n", "Create control sliders for the parameters described in the introduction. Each time the value of a parameter is updated, the sequencer is automatically stopped from the embedded firmware for safety reasons and has to be manually restarted.\n", "\n", "The sliders cover the valid parameter range. If the code below is modified to input invalid values, the firmware will not program the values.\n", "\n", "Please connect the I/Q outputs ($\\text{O}^{[1-2]}$) to an oscilloscope and set to trigger continuously on the I channel at 0V. Execute the code below, move the sliders and observe the result on the oscilloscope." ] }, { "cell_type": "code", "execution_count": 10, "id": "de3b8161", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:41.958080Z", "iopub.status.busy": "2024-09-18T14:49:41.957408Z", "iopub.status.idle": "2024-09-18T14:49:42.079811Z", "shell.execute_reply": "2024-09-18T14:49:42.078506Z" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "70c303e1ba894e1994173b3a6dcc8d4b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='Offset I:', max=73.0, min=-84.0, step=0.01), Output(…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8af9357c5e724ce29345eef899b46af2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='Offset Q:', max=73.0, min=-84.0, step=0.01), Output(…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "da2aeccf9eef4dc194e0103cef2bd461", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatLogSlider(value=1.0, base=2.0, description='Gain ratio:', max=1.0, min=-1.0), Outpu…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c140d6fb42bd46939c46213ae9bf18b5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='Phase offset:', max=45.0, min=-45.0, step=1.0), Outp…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ " 'None'>" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def set_offset_I(offset_I: float) -> None:\n", " module.out0_offset_path0(offset_I)\n", " module.arm_sequencer(0)\n", " module.start_sequencer(0)\n", "\n", "\n", "def set_offset_Q(offset_Q: float) -> None:\n", " module.out0_offset_path1(offset_Q)\n", " module.arm_sequencer(0)\n", " module.start_sequencer(0)\n", "\n", "\n", "def set_gain_ratio(gain_ratio: float) -> None:\n", " module.sequencer0.mixer_corr_gain_ratio(gain_ratio)\n", " module.arm_sequencer(0)\n", " module.start_sequencer(0)\n", "\n", "\n", "def set_phase_offset(phase_offset: float) -> None:\n", " module.sequencer0.mixer_corr_phase_offset_degree(phase_offset)\n", " module.arm_sequencer(0)\n", " module.start_sequencer(0)\n", "\n", "\n", "I_bounds = module.out0_offset_path0.vals.valid_values\n", "interact(\n", " set_offset_I,\n", " offset_I=widgets.FloatSlider(\n", " min=I_bounds[0], max=I_bounds[1], step=0.01, value=0.0, description=\"Offset I:\"\n", " ),\n", ")\n", "\n", "Q_bounds = module.out0_offset_path1.vals.valid_values\n", "interact(\n", " set_offset_Q,\n", " offset_Q=widgets.FloatSlider(\n", " min=Q_bounds[0], max=Q_bounds[1], step=0.01, value=0.0, description=\"Offset Q:\"\n", " ),\n", ")\n", "\n", "# The gain ratio correction is bounded between 1/2 and 2\n", "interact(\n", " set_gain_ratio,\n", " gain_ratio=widgets.FloatLogSlider(\n", " min=-1, max=1, step=0.1, value=1.0, base=2, description=\"Gain ratio:\"\n", " ),\n", ")\n", "\n", "ph_bounds = module.sequencer0.mixer_corr_phase_offset_degree.vals.valid_values\n", "interact(\n", " set_phase_offset,\n", " phase_offset=widgets.FloatSlider(\n", " min=ph_bounds[0], max=ph_bounds[1], step=1.0, value=0.0, description=\"Phase offset:\"\n", " ),\n", ")" ] }, { "cell_type": "markdown", "id": "76a69de4", "metadata": {}, "source": [ "When tuning the DC offset you might notice that the signal starts \"clipping\". This is caused by the fact that we are already at full-scale, thus any offset takes our signal out of its dynamic range.\n", "\n", "When this happens, the output LEDs on the module turn orange. This, and other LEDs states, are explained in the [troubleshooting](https://qblox-qblox-instruments.readthedocs-hosted.com/en/main/cluster/troubleshooting.html) guide." ] }, { "cell_type": "markdown", "id": "870dd201", "metadata": {}, "source": [ "### Reset the Cluster\n", "\n", "We reset the Cluster to enter a well-defined state. Note that resetting will clear all stored parameters, so resetting between experiments is usually not desirable." ] }, { "cell_type": "code", "execution_count": 11, "id": "bc4b1681", "metadata": { "execution": { "iopub.execute_input": "2024-09-18T14:49:42.084140Z", "iopub.status.busy": "2024-09-18T14:49:42.083287Z", "iopub.status.idle": "2024-09-18T14:49:44.549258Z", "shell.execute_reply": "2024-09-18T14:49:44.548303Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status: OKAY, Flags: NONE, Slot flags: NONE\n" ] } ], "source": [ "cluster.reset()\n", "print(cluster.get_system_status())" ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "tags,-all", "main_language": "python", "notebook_metadata_filter": "-all" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.20" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "0c6cb5836df94211b4f491612324416b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1382fb72c5684f9eae95832671fde864": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "26016b6ad45b44b2ac0140759f47ef9a": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "310d9f18af544dad8d8cbdea9bb8cb48": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_b6437e848c2342d2a64bdf40d064deac", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "40e4110350714c83a0c0fc21edc42e6b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4b7f44e250f54b4e9e75489bc6a59bb6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "SliderStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "4f7aee4386ac4adfa639fab8813e98a1": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "SliderStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "52fc8c7e7d404d5784abad39f379130b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6e95ee96c9f84d2d86af455ff4d2a4de": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "70c303e1ba894e1994173b3a6dcc8d4b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_bb3ba55052cd457cb3c624b655a4f514", "IPY_MODEL_310d9f18af544dad8d8cbdea9bb8cb48" ], "layout": "IPY_MODEL_76ae9a8f8c534810b98b74979e5871ac", "tabbable": null, "tooltip": null } }, "76ae9a8f8c534810b98b74979e5871ac": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "792ceb4ab49a41f687cc1535188e4e7b": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_26016b6ad45b44b2ac0140759f47ef9a", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "7a533e7ed1214629b9afe37fac7b9a14": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8af9357c5e724ce29345eef899b46af2": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_a610fc4b2de947ba9e13d01cf5d5fa13", "IPY_MODEL_eb3c7f909e994b17b3063021d5bc95e3" ], "layout": "IPY_MODEL_9c6d1fe9bed04e5dae0de487dc1aee9c", "tabbable": null, "tooltip": null } }, "9c6d1fe9bed04e5dae0de487dc1aee9c": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a016860fb4d04b869f4f75c74caf0cd0": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a610fc4b2de947ba9e13d01cf5d5fa13": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatSliderModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "FloatSliderView", "behavior": "drag-tap", "continuous_update": true, "description": "Offset Q:", "description_allow_html": false, "disabled": false, "layout": "IPY_MODEL_6e95ee96c9f84d2d86af455ff4d2a4de", "max": 73.0, "min": -84.0, "orientation": "horizontal", "readout": true, "readout_format": ".2f", "step": 0.01, "style": "IPY_MODEL_b8de71c4a5dd4a1ab362d5e8b467ac16", "tabbable": null, "tooltip": null, "value": 0.0 } }, "b6437e848c2342d2a64bdf40d064deac": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b6a7666a8f7b425f9390c8b42915e3fc": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "SliderStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "b7f5c121ec944ca2a3991f1beaba5b9e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatLogSliderModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatLogSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "FloatLogSliderView", "base": 2.0, "behavior": "drag-tap", "continuous_update": true, "description": "Gain ratio:", "description_allow_html": false, "disabled": false, "layout": "IPY_MODEL_1382fb72c5684f9eae95832671fde864", "max": 1.0, "min": -1.0, "orientation": "horizontal", "readout": true, "readout_format": ".3g", "step": 0.1, "style": "IPY_MODEL_4b7f44e250f54b4e9e75489bc6a59bb6", "tabbable": null, "tooltip": null, "value": 1.0 } }, "b8de71c4a5dd4a1ab362d5e8b467ac16": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "SliderStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "bb3ba55052cd457cb3c624b655a4f514": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatSliderModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "FloatSliderView", "behavior": "drag-tap", "continuous_update": true, "description": "Offset I:", "description_allow_html": false, "disabled": false, "layout": "IPY_MODEL_52fc8c7e7d404d5784abad39f379130b", "max": 73.0, "min": -84.0, "orientation": "horizontal", "readout": true, "readout_format": ".2f", "step": 0.01, "style": "IPY_MODEL_4f7aee4386ac4adfa639fab8813e98a1", "tabbable": null, "tooltip": null, "value": 0.0 } }, "bcc000448b4b44c5a33f7952b746215a": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_0c6cb5836df94211b4f491612324416b", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "be34cd625b5e4b5d9982a77338610d7b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatSliderModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "FloatSliderView", "behavior": "drag-tap", "continuous_update": true, "description": "Phase offset:", "description_allow_html": false, "disabled": false, "layout": "IPY_MODEL_40e4110350714c83a0c0fc21edc42e6b", "max": 45.0, "min": -45.0, "orientation": "horizontal", "readout": true, "readout_format": ".2f", "step": 1.0, "style": "IPY_MODEL_b6a7666a8f7b425f9390c8b42915e3fc", "tabbable": null, "tooltip": null, "value": 0.0 } }, "c140d6fb42bd46939c46213ae9bf18b5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_be34cd625b5e4b5d9982a77338610d7b", "IPY_MODEL_792ceb4ab49a41f687cc1535188e4e7b" ], "layout": "IPY_MODEL_dc5bd35ca6564ebabedb00d27412a653", "tabbable": null, "tooltip": null } }, "da2aeccf9eef4dc194e0103cef2bd461": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_b7f5c121ec944ca2a3991f1beaba5b9e", "IPY_MODEL_bcc000448b4b44c5a33f7952b746215a" ], "layout": "IPY_MODEL_7a533e7ed1214629b9afe37fac7b9a14", "tabbable": null, "tooltip": null } }, "dc5bd35ca6564ebabedb00d27412a653": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "eb3c7f909e994b17b3063021d5bc95e3": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_a016860fb4d04b869f4f75c74caf0cd0", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }