Source code for qiskit_experiments.library.characterization.analysis.readout_angle_analysis
# This code is part of Qiskit.
#
# (C) Copyright IBM 2021.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""
Readout Angle Analysis class.
"""
from typing import List, Optional
import numpy as np
from qiskit_experiments.framework import BaseAnalysis, AnalysisResultData, Options
from qiskit_experiments.framework.matplotlib import get_non_gui_ax
[docs]
class ReadoutAngleAnalysis(BaseAnalysis):
"""
A class to analyze readout angle experiments
"""
@classmethod
def _default_options(cls) -> Options:
"""Return default analysis options.
Analysis Options:
plot (bool): Set ``True`` to create figure for fit result.
ax (AxesSubplot): Optional. A matplotlib axis object to draw.
"""
options = super()._default_options()
options.plot = True
options.ax = None
return options
def _run_analysis(self, experiment_data):
angles = []
radii = []
centers = []
for i in range(2):
center = complex(*experiment_data.data(i)["memory"][0])
angles.append(np.angle(center))
radii.append(np.absolute(center))
centers.append(center)
angle = (angles[0] + angles[1]) / 2
if (np.abs(angles[0] - angles[1])) % (2 * np.pi) > np.pi:
angle += np.pi
extra_results = {}
extra_results["readout_angle_0"] = angles[0]
extra_results["readout_angle_1"] = angles[1]
extra_results["readout_radius_0"] = radii[0]
extra_results["readout_radius_1"] = radii[1]
analysis_results = [
AnalysisResultData(name="readout_angle", value=angle, extra=extra_results)
]
if self.options.plot:
ax = self._format_plot(centers, ax=self.options.ax)
figures = [ax.get_figure()]
else:
figures = None
return analysis_results, figures
@staticmethod
def _format_plot(centers: List[complex], ax: Optional["matplotlib.pyplot.AxesSubplot"] = None):
"""Format the readout_angle plot
Args:
centers: the two centers of the level 1 measurements for 0 and for 1.
ax: matplotlib axis to add plot to.
Returns:
AxesSubPlot: the matplotlib axes containing the plot.
"""
largest_extent = (
np.max([np.max(np.abs(np.real(centers))), np.max(np.abs(np.imag(centers)))]) * 1.1
)
ax = get_non_gui_ax()
ax.plot(np.real(centers[0]), np.imag(centers[0]), "ro", markersize=24)
ax.plot(np.real(centers[1]), np.imag(centers[1]), "bo", markersize=24)
ax.set_xlim([-largest_extent, largest_extent])
ax.set_ylim([-largest_extent, largest_extent])
ax.set_xlabel("I [arb.]")
ax.set_ylabel("Q [arb.]")
ax.set_title("Centroid Positions")
ax.legend(["0", "1"])
return ax