# gaussian_pulse_stf

The Boulder Opal Toolkits are currently in beta phase of development. Breaking changes may be introduced.

gaussian_pulse_stf(amplitude, width, center_time, drag=None)

Create an Stf representing a Gaussian pulse.

Parameters:
• amplitude (float or complex or Tensor) – The amplitude of the Gaussian pulse, $$A$$. It must either be a scalar or contain a single element.

• width (float or Tensor) – The standard deviation of the Gaussian pulse, $$\sigma$$. It must either be a scalar or contain a single element.

• center_time (float or Tensor) – The center of the Gaussian pulse, $$t_0$$. It must either be a scalar or contain a single element.

• drag (float or Tensor, optional) – The DRAG parameter, $$\beta$$. If passed, it must either be a scalar or contain a single element. Defaults to no DRAG correction.

Returns:

The sampleable Gaussian pulse.

Return type:

Stf

signals.gaussian_pulse_pwc()

Corresponding operation with Pwc output.

signals.sech_pulse_stf()

Create an Stf representing a hyperbolic secant pulse.

Notes

The Gaussian pulse is defined as

$\mathop{\mathrm{Gaussian}}(t) = A \left(1-\frac{i\beta (t-t_0)}{\sigma^2}\right) \exp \left(- \frac{(t-t_0)^2}{2\sigma^2} \right) .$

Examples

Define a sampleable Gaussian pulse.

>>> gaussian = graph.signals.gaussian_pulse_stf(
...     amplitude=1.0, width=0.1, center_time=0.5
... )
>>> gaussian
<Stf: operation_name="multiply", value_shape=(), batch_shape=()>
>>> graph.sample_stf(stf=gaussian, sample_times=np.linspace(0, 1, 5), name="gaussian_samples")
<Tensor: name="gaussian_samples", operation_name="sample_stf", shape=(5,)>
>>> graph.discretize_stf(
... gaussian, duration=1, segment_count=100, name="discretized_gaussian"
... )
<Pwc: name="discretized_gaussian", operation_name="discretize_stf", value_shape=(), batch_shape=()>
>>> result = qctrl.functions.calculate_graph(
...     graph=graph, output_node_names=["gaussian_samples", "discretized_gaussian"]
... )
>>> result.output["gaussian_samples"]["value"]
array([3.727e-06, 4.394e-02, 1.000e+00, 4.394e-02, 3.727e-06])


Define a sampleable Gaussian with a DRAG correction.

>>> gaussian = graph.signals.gaussian_pulse_stf(
...     amplitude=1.0, width=0.1, center_time=0.5, drag=0.2
... )
>>> gaussian
<Stf: operation_name="multiply", value_shape=(), batch_shape=()>
>>> graph.sample_stf(
...     stf=gaussian, sample_times=np.linspace(0, 1, 5), name="drag_gaussian_samples"
... )
<Tensor: name="drag_gaussian_samples", operation_name="sample_stf", shape=(5,)>
>>> graph.discretize_stf(
...     gaussian, duration=1, segment_count=100, name="discretized_drag_gaussian"
... )
<Pwc: name="discretized_drag_gaussian", operation_name="discretize_stf", value_shape=(), batch_shape=()>
>>> result = qctrl.functions.calculate_graph(
...     graph=graph, output_node_names=["drag_gaussian_samples", "discretized_drag_gaussian"]
... )
>>> result.output["drag_gaussian_samples"]["value"]
array([
3.727e-06 + 9.317e-06j,
4.394e-02 + 5.492e-02j,
1.000e+00 + 0.000e+00j,
4.394e-02 - 5.492e-02j,
3.727e-06 - 9.317e-06j,
])


Define a sampleable Gaussian pulse with optimizable parameters.

>>> amplitude = graph.optimization_variable(
...     count=1, lower_bound=0, upper_bound=2.*np.pi, name="amplitude"
... )
>>> width = graph.optimization_variable(
...     count=1, lower_bound=0.1, upper_bound=0.5, name="width"
... )
>>> center_time = graph.optimization_variable(
...     count=1, lower_bound=0.2, upper_bound=0.8, name="center_time"
... )
>>> drag = graph.optimization_variable(
...     count=1, lower_bound=0, upper_bound=0.5, name="drag"
... )
>>> graph.signals.gaussian_pulse_stf(
...     amplitude=amplitude, width=width, center_time=center_time, drag=drag
... )
<Stf: operation_name="multiply", value_shape=(), batch_shape=()>