laboneq_applications.experiments.echo
¶
This module defines the Hahn echo experiment.
In the Hahn echo experiment, we perform a Ramsey experiment and place one extra refocusing pulse, typically y180, between the two x90 pulses. Due to this additional pulse, the quasi-static contributions to dephasing can be “refocused” and by that the experiment is less sensitive to quasi-static noise.
The pulses are generally chosen to be resonant with the qubit transition for a Hahn echo, since any frequency detuning would be nominally refocused anyway.
The Hahn echo experiment has the following pulse sequence:
qb --- [ prep transition ] --- [ x90_transition ] --- [ delay/2 ] ---
[ refocusing pulse ] --- [ delay/2 ] --- [ x90_transition ] --- [ measure ]
If multiple qubits are passed to the experiment workflow, the above pulses are applied in parallel on all the qubits.
EchoExperimentOptions
¶
Bases: TuneupExperimentOptions
Options for the Hahn echo experiment.
Additional attributes
refocus_pulse: String to define the quantum operation in-between the x90 pulses. Default: "y180".
refocus_qop: str = workflow.option_field('y180', description='String to define the quantum operation in-between the x90 pulses')
class-attribute
instance-attribute
¶
create_experiment(qpu, qubits, delays, options=None)
¶
Creates a Hahn echo Experiment.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
qpu |
QPU
|
The qpu consisting of the original qubits and quantum operations. |
required |
qubits |
Qubits
|
The qubits on which to run the experiments. May be either a single qubit or a list of qubits. |
required |
delays |
QubitSweepPoints
|
The delays to sweep over for each qubit. The delays between the two x90
pulses and the refocusing pulse are |
required |
options |
EchoExperimentOptions | None
|
The options for building the workflow as an instance of [EchoExperimentOptions], inheriting from [TuneupExperimentOptions]. See the docstrings of these classes for more details. |
None
|
Returns:
Name | Type | Description |
---|---|---|
Experiment |
Experiment
|
The generated LabOne Q Experiment instance to be compiled and executed. |
Raises:
Type | Description |
---|---|
ValueError
|
If the conditions in validation.validate_and_convert_qubits_sweeps are not fulfilled. |
ValueError
|
If the experiment uses calibration traces and the averaging mode is sequential. |
Example
options = TuneupExperimentOptions()
options.count = 10
options.cal_traces = True
setup = DeviceSetup()
qpu = QPU(
qubits=[TunableTransmonQubit("q0"), TunableTransmonQubit("q1")],
quantum_operations=TunableTransmonOperations(),
)
temp_qubits = qpu.copy_qubits()
create_experiment(
qpu=qpu,
qubits=temp_qubits,
delays=[np.linspace(0, 30e-6, 51), np.linspace(0, 30e-6, 51)],
options=options,
)
experiment_workflow(session, qpu, qubits, delays, temporary_parameters=None, options=None)
¶
The Hahn echo experiment workflow.
The workflow consists of the following steps:
Parameters:
Name | Type | Description | Default |
---|---|---|---|
session |
Session
|
The connected session to use for running the experiment. |
required |
qpu |
QPU
|
The qpu consisting of the original qubits and quantum operations. |
required |
qubits |
Qubits
|
The qubits on which to run the experiments. May be either a single qubit or a list of qubits. |
required |
delays |
QubitSweepPoints
|
The delays to sweep over for each qubit. The delays between the two x90
pulses and the refocusing pulse are |
required |
temporary_parameters |
dict[str, dict | TransmonParameters] | None
|
The temporary parameters to update the qubits with. |
None
|
options |
TuneUpWorkflowOptions | None
|
The options for building the workflow as an instance of [TuneUpWorkflowOptions]. See the docstrings of this class for more details. |
None
|
Returns:
Name | Type | Description |
---|---|---|
WorkflowBuilder |
None
|
The builder for the experiment workflow. |
Example
options = EchoWorkflowOptions()
options.count(10)
options.transition("ge")
qpu = QPU(
qubits=[TunableTransmonQubit("q0"), TunableTransmonQubit("q1")],
quantum_operations=TunableTransmonOperations(),
)
temp_qubits = qpu.copy_qubits()
result = run(
session=session,
qpu=qpu,
qubits=temp_qubits,
delays=[np.linspace(0, 30e-6, 51), np.linspace(0, 30e-6, 51)],
options=options,
)