Source code for qtt.algorithms.ohmic

""" Functionality to fit scans of ohmic contacts

"""

import numpy as np
import matplotlib.pyplot as plt

import qtt
import scipy.optimize


[docs]def fitOhmic(ds, verbose=1, fig=None, gainy=1e-7, gainx=1e-6): """ Fit data to a linear function Arguments: ds (dataset): independent and dependent variable data gainy (float): conversion factor from y-data to Ampere gainx (float): conversion factor from x-data to Volt verbose (int): fig (None or int): if an integer, plot the fitted data Returns: analysis_data (dict): fitted function parameters .. seealso:: linear_function """ xdata = gainx * np.array(ds.default_parameter_array().set_arrays[0]) # [V] ydata = gainy * np.array(ds.default_parameter_array()) # [A] # initial values: offset and slope slope = (ydata[-1] - ydata[0]) / (xdata[-1] - xdata[0]) offset = np.mean(ydata) - slope * np.mean(xdata) p0 = [slope, offset] # fit cutoff = 2 # remove first data points def func(xdata, a, b): return qtt.algorithms.functions.linear_function(xdata, a, b) pp = scipy.optimize.curve_fit(func, xdata[cutoff:], ydata[cutoff:], p0=p0) fitparam = pp[0] r = 1 / fitparam[0] biascurrent = qtt.algorithms.functions.linear_function(0, *list(fitparam)) if fig is not None: plt.figure(fig) plt.clf() yf = 1e9 plt.plot(1e6 * xdata, yf * ydata, '.b') plt.xlabel('Bias [uV]') plt.ylabel('Current [nA]') y = qtt.algorithms.functions.linear_function(xdata, *list(fitparam)) plt.plot(1e6 * xdata, yf * y, 'm-', label='fitted linear function') ax = plt.gca() ax.axvline(x=0, linestyle=':') ax.axhline(y=yf * biascurrent, linestyle=':') plt.legend(numpoints=1) plt.title(('dataset: %s: resistance %.1f [kOhm]' % (ds.location, r * 1e-3))) return {'fitparam': fitparam, 'resistance': r, 'biascurrent': biascurrent, 'description': 'ohmic'}