diff --git a/qiskit_experiments/curve_analysis/standard_analysis/decay.py b/qiskit_experiments/curve_analysis/standard_analysis/decay.py index 589c516bf0..4a09d1eb38 100644 --- a/qiskit_experiments/curve_analysis/standard_analysis/decay.py +++ b/qiskit_experiments/curve_analysis/standard_analysis/decay.py @@ -13,6 +13,8 @@ from typing import List, Union +import numpy as np + import qiskit_experiments.curve_analysis as curve @@ -69,16 +71,28 @@ def _generate_fit_guesses( Returns: List of fit options that are passed to the fitter function. + + Raises: + AnalysisError: When the y data is likely constant. """ curve_data = self._data() user_opt.p0.set_if_empty(base=curve.guess.min_height(curve_data.y)[0]) - user_opt.p0.set_if_empty( - tau=-1 / curve.guess.exp_decay(curve_data.x, curve_data.y), - amp=curve.guess.max_height(curve_data.y)[0] - user_opt.p0["base"], - ) - + alpha = curve.guess.exp_decay(curve_data.x, curve_data.y) + + if alpha != 0.0: + user_opt.p0.set_if_empty( + tau=-1 / alpha, + amp=curve.guess.max_height(curve_data.y)[0] - user_opt.p0["base"], + ) + else: + # Likely there is no slope. Cannot fit constant line with this model. + # Set some large enough number against to the scan range. + user_opt.p0.set_if_empty( + tau=100 * np.max(curve_data.x), + amp=curve.guess.max_height(curve_data.y)[0] - user_opt.p0["base"], + ) return user_opt def _evaluate_quality(self, fit_data: curve.FitData) -> Union[str, None]: diff --git a/qiskit_experiments/curve_analysis/standard_analysis/oscillation.py b/qiskit_experiments/curve_analysis/standard_analysis/oscillation.py index b78c90eb48..282b3ac0bf 100644 --- a/qiskit_experiments/curve_analysis/standard_analysis/oscillation.py +++ b/qiskit_experiments/curve_analysis/standard_analysis/oscillation.py @@ -219,15 +219,19 @@ def _generate_fit_guesses( # Set guess for decay parameter based on estimated frequency if freq_guess > df: - user_opt.p0.set_if_empty( - tau=-1 - / curve.guess.oscillation_exp_decay( - curve_data.x, curve_data.y - user_opt.p0["base"], freq_guess=freq_guess - ) + alpha = curve.guess.oscillation_exp_decay( + curve_data.x, curve_data.y - user_opt.p0["base"], freq_guess=freq_guess ) else: # Very low frequency. Assume standard exponential decay - user_opt.p0.set_if_empty(tau=-1 / curve.guess.exp_decay(curve_data.x, curve_data.y)) + alpha = curve.guess.exp_decay(curve_data.x, curve_data.y) + + if alpha != 0.0: + user_opt.p0.set_if_empty(tau=-1 / alpha) + else: + # Likely there is no slope. Cannot fit constant line with this model. + # Set some large enough number against to the scan range. + user_opt.p0.set_if_empty(tau=100 * np.max(curve_data.x)) user_opt.bounds.set_if_empty( amp=[0, 1.5],