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."""fromtypingimportList,Optionalimportnumpyasnpfromqiskit_experiments.frameworkimportBaseAnalysis,AnalysisResultData,Optionsfromqiskit_experiments.framework.matplotlibimportget_non_gui_ax
[docs]classReadoutAngleAnalysis(BaseAnalysis):""" A class to analyze readout angle experiments """@classmethoddef_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=Trueoptions.ax=Nonereturnoptionsdef_run_analysis(self,experiment_data):angles=[]radii=[]centers=[]foriinrange(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])/2if(np.abs(angles[0]-angles[1]))%(2*np.pi)>np.pi:angle+=np.piextra_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)]ifself.options.plot:ax=self._format_plot(centers,ax=self.options.ax)figures=[ax.get_figure()]else:figures=Nonereturnanalysis_results,figures@staticmethoddef_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"])returnax