Fit

ODMR

ODMR fitting tools.

import nvtools as nv

fitter = nv.ODMRFitter()

# assume you have some ODMR spectrum
mw_frequency = np.array(...)
odmr = np.array(...)

# tries to automatically guess the starting parameters for the fit
fit_results = fitter.fit_odmr_full(mw_frequency, odmr)
# if that does not work, try inputting the frequencies manually:
fit_results = fitter.fit_odmr_full(mw_frequency, odmr, p0_frequency=[<list of eight values>])

# fit_results contains all kinds of useful values
print(fit_results.frequency)                                 # resonance frequency
print(fit_results.contrast)                                  # ODMR contrast
print(fit_results.linewidth)                                 # ODMR linewidth
print(fit_results.r_squared)                                 # R^2 value of the fit
print(fit_results.sensitivity(photon_rate=1e6 * unit.Hz))    # CW ODMR sensitivity

plt.figure()
plt.plot(mw_frequency, odmr)
plt.plot(mw_frequency, fit_results.fit_func)     # plot fit function
plt.show()
class nvtools.fit.odmr.ODMRFitResult(mw_frequency: list, odmr: list, popt: list, pcov: list, perr: list, model: Callable, frequency: float | list[float], contrast: float | list[float], linewidth: float | list[float])[source]

ODMR fit results.

contrast: float | list[float]
property fit_func

Fit function values.

frequency: float | list[float]
linewidth: float | list[float]
model: Callable
mw_frequency: list
odmr: list
pcov: list
perr: list
popt: list
property r_squared

R^2 value of fit.

R^2 = 1 - \frac{SS_\text{res}}{SS_\text{tot}}

sensitivity(photon_rate: float) float[source]

Calculate CW ODMR sensitivity.

Parameters:

photon_rate (float) – Photon rate I_0

\eta = \frac{1}{\text{max}\frac{\partial V(f)}{\partial f}} \frac{1}{\gamma_\text{NV}} \frac{1}{\sqrt{I_0}}

class nvtools.fit.odmr.ODMRFitter[source]

ODMR fitter.

static fit_odmr_full(mw_frequency, odmr, p0_frequency=None, units=True)[source]

Fit ODMR with eight resonances.

Parameters:
  • mw_frequency – MW frequency

  • odmr – ODMR

  • p0_frequency (list | None) – estimates for resonance frequencies

Raises:

RuntimeError when peaks can not be found

static fit_odmr_single(mw_frequency, odmr)[source]

Fit ODMR with one resonance.

Parameters:
  • mw_frequency – MW frequency

  • odmr – ODMR

ODMR Model

ODMR fit models.

class nvtools.fit.odmr_model.ModelGauss1[source]

Gauss model with 1 resonance.

G(x) = 1 - C \exp\left(4\ln\left(\frac{1}{2}\right)\frac{(x-f_{\text{res}})^2}{\alpha^2}\right)

static f(x, c, alpha, f_res)[source]

Gauss profile.

Parameters:
  • x – X data

  • c – contrast

  • alpha – FWHM linewidth

  • f_res – resonance frequency

class nvtools.fit.odmr_model.ModelLorentz1[source]

Lorentz model with 1 resonance.

L(x) = 1 - \frac{C\alpha^2}{4(x - f_{\text{res}})^2 + \alpha^2}

static f(x, c, alpha, f_res)[source]

Lorentz profile.

Parameters:
  • x – X data

  • c – contrast

  • alpha – FWHM linewidth

  • f_res – resonance frequency

class nvtools.fit.odmr_model.ModelVoigt1[source]

Voigt model with 1 resonance.

V(x) = \int G(x-\tau) L(x) \, d\tau

static f(x, a, sigma, nu, f_res, c)[source]

Voigt profile with 1 resonance.

Parameters:
  • x – X data

  • a – area

  • sigma – Gauss width

  • nu – Lorentz width

  • f_res – resonance frequency

  • c – offset

static voigt_parameters(area, sigma, nu, units=True)[source]

Calculate useful parameters from Voigt fit parameters.

\alpha_\text{L} &= 2\nu \\
\alpha_\text{G} &= 2\sigma\sqrt{2\log 2} \\
\alpha_\text{V} &= 0.5346\alpha_\text{L} + \sqrt{0.2166\alpha_\text{L}^2 + \alpha_\text{G}^2} \\
d &= \frac{\alpha_\text{L} - \alpha_\text{G}}{\alpha_\text{L} + \alpha_\text{G}} \\
C &= V(x=f_{\text{res}})

Parameters:
  • area – area under graph

  • sigma – Gauss linewidth

  • nu – Lorentz linewidth

Returns:

alpha_l, alpha_g, alpha_v, d, contrast

class nvtools.fit.odmr_model.ModelVoigt8[source]

Voigt model with 8 resonances.

V(x) = c - \sum_{i=1}^8 V_i(x)

static f(x, a1, s1, n1, f1, a2, s2, n2, f2, a3, s3, n3, f3, a4, s4, n4, f4, a5, s5, n5, f5, a6, s6, n6, f6, a7, s7, n7, f7, a8, s8, n8, f8, c)[source]

Voigt profile for eight resonances.

static voigt_parameters(area, sigma, nu, units=True)[source]

Same as ModelVoigt1.voigt_parameters.