AC Stark Effect¶
Caution
The experiments described in this manual are deprecated as of Qiskit Experiments 0.8 and will be removed in a future release. They rely on Qiskit Pulse, which is deprecated in Qiskit SDK, with planned removal in Qiskit 2.0.
When a qubit is driven with an off-resonant tone,
the qubit frequency
The important control parameters of the Stark effect are the amplitude
where
Stark tone implementation in Qiskit¶
Usually, we fix the Stark tone frequency
Because the Stark shift
In other words, positive (negative) Stark shift occurs when the tone frequency
To alleviate such experimental complexity, an abstracted amplitude
Stark experiments in Qiskit usually take two control parameters stark_amp
and stark_freq_offset
in the experiment options, respectively.
In this representation, the sign of the Stark shift matches the sign of
This allows an experimentalist to control both the sign and the amount of
the Stark shift with the stark_amp
experiment option.
Note that stark_freq_offset
should be set as a positive number.
Stark tone frequency¶
As you can see in the equation for
The Stark tone frequency must be sufficiently separated from all of these frequencies to avoid unwanted state transitions (frequency collisions). In reality, the choice of the frequency could be even more complicated due to the transition levels of the nearest neighbor qubits. The frequency must be carefully chosen to avoid frequency collisions [4].
Stark tone channel¶
It may be necessary to supply a pulse channel to apply the Stark tone.
In Qiskit Experiments, the Stark experiments usually have an experiment option stark_channel
to specify this.
By default, the Stark tone is applied to the same channel as the qubit drive
with a frequency shift. This frequency shift might update the channel frame,
which accumulates unwanted phase against the frequency difference between
the qubit drive
In a typical IBM device using the cross-resonance drive architecture, such channel can be identified with your backend as follows:
Note
This tutorial requires the qiskit-ibm-runtime package to model a
backend. You can install it with python -m pip install qiskit-ibm-runtime
.
from qiskit_ibm_runtime.fake_provider import FakeHanoiV2
backend = FakeHanoiV2()
qubit = 0
for qpair in backend.coupling_map:
if qpair[0] == qubit:
break
print(backend.control_channel(qpair)[0])
ControlChannel(0)
This returns a control channel for which the qubit is the control qubit. This approach may not work for other device architectures.
Characterizing the frequency shift¶
One can experimentally measure StarkRamseyXY
experiment.
The following pulse sequence illustrates how


The qubit is initialized in the
As you may notice, this sequence is interleaved with two pulses labeled
“StarkV” (Gaussian) and “StarkU” (GaussianSquare) filled in yellow, representing Stark tones.
These pulses are designed to have the same maximum amplitude
Since
The pulse sequence shown above is adopted to address such issue.
The Z rotation accumulated by the first pulse is proportional to
This technique allows you to estimate
In Qiskit Experiments, the experiment option stark_amp
usually refers to
the height of this GaussianSquare flat-top.
Workflow¶
In this example, you’ll learn how to measure a spectrum of qubit relaxation versus
frequency with fixed frequency transmons.
As you already know, we give an offset to the qubit frequency with a Stark tone,
and the workflow starts from characterizing the amount of the Stark shift against
the Stark amplitude
from qiskit_experiments.library.driven_freq_tuning import StarkRamseyXYAmpScan
exp = StarkRamseyXYAmpScan((0,), backend=backend)
exp_data = exp.run().block_for_results()
coefficients = exp_data.analysis_results("stark_coefficients").value
You first need to run the StarkRamseyXYAmpScan
experiment that scans StarkCoefficients
object that contains
all polynomial coefficients to map and reverse-map the
This object may be necessary for the following spectroscopy experiment. Since Stark coefficients are stable for a relatively long time, you may want to save the coefficient values and load them later when you run the experiment. If you have an access to the Experiment service, you can just save the experiment result.
exp_data.save()
You can view the experiment online at https://quantum.ibm.com/experiments/23095777-be28-4036-9c98-89d3a915b820
Otherwise, you can dump the coefficient object into a file with JSON format.
import json
from qiskit_experiments.framework import ExperimentEncoder
with open("coefficients.json", "w") as fp:
json.dump(ret_coeffs, fp, cls=ExperimentEncoder)
The saved object can be retrieved either from the service or file, as follows.
# When you have access to Experiment service
from qiskit_experiments.library.driven_freq_tuning import retrieve_coefficients_from_backend
coefficients = retrieve_coefficients_from_backend(backend, 0)
# Alternatively you can load from file
from qiskit_experiments.framework import ExperimentDecoder
with open("coefficients.json", "r") as fp:
coefficients = json.load(fp, cls=ExperimentDecoder)
Now you can measure the qubit relaxation spectrum.
The StarkP1Spectroscopy
experiment also scans t1_delay
in the experiment options, following the state population.
You can scan the stark_coefficients
option must be set to perform the frequency sweep.
from qiskit_experiments.library.driven_freq_tuning import StarkP1Spectroscopy
exp = StarkP1Spectroscopy((0,), backend=backend)
exp.set_experiment_options(
t1_delay=20e-6,
min_xval=-20e6,
max_xval=20e6,
xval_type="frequency",
spacing="linear",
stark_coefficients=coefficients,
)
exp_data = exp.run().block_for_results()
You may find notches in the P1 spectrum, which may indicate the existence of TLS’s in the vicinity of your qubit drive frequency.
exp_data.figure(0)

Note that this experiment doesn’t yield any analysis result because the landscape of a P1 spectrum
can not be predicted due to the random occurrences of the TLS and frequency collisions.
If you have your own protocol to extract meaningful quantities from the data,
you can write a custom analysis subclass and give it to the experiment instance before execution.
See StarkP1SpectAnalysis
for more details.
This protocol can be parallelized among many qubits unless crosstalk matters.