Source code for qiskit_experiments.library.characterization.t1

# 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.
"""
T1 Experiment class.
"""

from typing import List, Optional, Union, Sequence

import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.providers.backend import Backend

from qiskit_experiments.framework import BackendTiming, BaseExperiment, Options
from qiskit_experiments.library.characterization.analysis.t1_analysis import T1Analysis


[docs] class T1(BaseExperiment): r"""An experiment to measure the qubit relaxation time. # section: overview This experiment estimates the :math:`T_1` relaxation time of the qubit by generating a series of circuits that excite the qubit then wait for different intervals before measurement. The resulting data of excited population versus wait time is fitted to an exponential curve to obtain an estimate for :math:`T_1`. # section: analysis_ref :class:`.T1Analysis` # section: example .. jupyter-execute:: :hide-code: # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime from qiskit_experiments.test.patching import patch_sampler_test_support patch_sampler_test_support() # backend from qiskit_ibm_runtime.fake_provider import FakeManilaV2 from qiskit_aer import AerSimulator backend = AerSimulator.from_backend(FakeManilaV2()) .. jupyter-execute:: import numpy as np from qiskit_experiments.library import T1 delays = np.arange(1.e-6, 300.e-6, 30.e-6) exp = T1(physical_qubits=(0, ), delays=delays, backend=backend) exp_data = exp.run().block_for_results() display(exp_data.figure(0)) exp_data.analysis_results(dataframe=True) # section: manual :doc:`/manuals/characterization/t1` """ @classmethod def _default_experiment_options(cls) -> Options: """Default experiment options. Experiment Options: delays (Iterable[float]): Delay times of the experiments in seconds. """ options = super()._default_experiment_options() options.delays = None return options def __init__( self, physical_qubits: Sequence[int], delays: Union[List[float], np.array], backend: Optional[Backend] = None, ): """ Initialize the T1 experiment class. Args: physical_qubits: a single-element sequence containing the qubit whose T1 is to be estimated. delays: Delay times of the experiments in seconds. backend: Optional, the backend to run the experiment on. Raises: ValueError: If the number of delays is smaller than 3 """ # Initialize base experiment super().__init__(physical_qubits, analysis=T1Analysis(), backend=backend) # Set experiment options self.set_experiment_options(delays=delays)
[docs] def circuits(self) -> List[QuantumCircuit]: """ Return a list of experiment circuits Returns: The experiment circuits """ timing = BackendTiming(self.backend) circuits = [] for delay in self.experiment_options.delays: circ = QuantumCircuit(1, 1) circ.x(0) circ.barrier(0) circ.delay(timing.round_delay(time=delay), 0, timing.delay_unit) circ.barrier(0) circ.measure(0, 0) circ.metadata = {"xval": timing.delay_time(time=delay)} circuits.append(circ) return circuits
def _metadata(self): metadata = super()._metadata() # Store measurement level and meas return if they have been # set for the experiment for run_opt in ["meas_level", "meas_return"]: if hasattr(self.run_options, run_opt): metadata[run_opt] = getattr(self.run_options, run_opt) return metadata