Source code for qiskit_experiments.library.calibration.frequency_cal
# 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."""Ramsey XY frequency calibration experiment."""fromtypingimportDict,List,Optional,Sequencefromqiskit.circuitimportQuantumCircuitfromqiskit.providers.backendimportBackendfromqiskit_experiments.frameworkimportExperimentDatafromqiskit_experiments.library.characterization.ramsey_xyimportRamseyXYfromqiskit_experiments.calibration_management.calibrationsimportCalibrationsfromqiskit_experiments.calibration_management.update_libraryimportBaseUpdaterfromqiskit_experiments.calibration_management.base_calibration_experimentimport(BaseCalibrationExperiment,)
[docs]classFrequencyCal(BaseCalibrationExperiment,RamseyXY):"""A qubit frequency calibration experiment based on the Ramsey XY experiment."""def__init__(self,physical_qubits:Sequence[int],calibrations:Calibrations,backend:Optional[Backend]=None,cal_parameter_name:Optional[str]="drive_freq",delays:Optional[List]=None,osc_freq:float=2e6,auto_update:bool=True,):""" Args: physical_qubits: Sequence containing the qubit on which to run the frequency calibration. calibrations: The calibrations instance with the schedules. backend: Optional, the backend to run the experiment on. cal_parameter_name: The name of the parameter to update in the calibrations. This defaults to `drive_freq`. delays: The list of delays that will be scanned in the experiment, in seconds. osc_freq: A frequency shift in Hz that will be applied by means of a virtual Z rotation to increase the frequency of the measured oscillation. auto_update: If set to True, which is the default, then the experiment will automatically update the frequency in the calibrations. """super().__init__(calibrations,physical_qubits,backend=backend,delays=delays,osc_freq=osc_freq,cal_parameter_name=cal_parameter_name,auto_update=auto_update,)def_metadata(self)->Dict[str,any]:"""Add the oscillation frequency of the experiment to the metadata."""metadata=super()._metadata()metadata["osc_freq"]=self.experiment_options.osc_freqmetadata["cal_param_value"]=self._cals.get_parameter_value(self._param_name,self.physical_qubits,group=self.experiment_options.group,)returnmetadatadef_attach_calibrations(self,circuit:QuantumCircuit):"""Adds the calibrations to the transpiled circuits."""schedule=self._cals.get_schedule("sx",self.physical_qubits)circuit.add_calibration("sx",self.physical_qubits,schedule)
[docs]defupdate_calibrations(self,experiment_data:ExperimentData):"""Update the frequency using the reported frequency less the imparted oscillation."""result_index=self.experiment_options.result_indexosc_freq=experiment_data.metadata["osc_freq"]group=experiment_data.metadata["cal_group"]old_freq=experiment_data.metadata["cal_param_value"]fit_freq=BaseUpdater.get_value(experiment_data,"freq",result_index)new_freq=old_freq+fit_freq-osc_freqBaseUpdater.add_parameter_value(self._cals,experiment_data,new_freq,self._param_name,group=group,)