Skip to content

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

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 delays / 2; see the schematic of the pulse sequence at the top of the file. Note that delays must be identical for qubits that use the same measure port.

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 delays / 2; see the schematic of the pulse sequence at the top of the file. Note that delays must be identical for qubits that use the same measure port.

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,
)