Feb-17-2021, 12:03 PM
I am trying to plot a simple curve in Python using matplotlib with a Gaussian fit which has both x and y errors. The best fit curve should take into account both errors. I have also built in a way of ignoring the baseline and to isolate the data to only a certain x range. My main issue is that I cant manage to get the Scipy ODR to work. It is reporting the wrong number of parameters (see in code comments). I know the lingress line is incorrect as this was taken from a straight line fir ODR but not sure what to put there. Any help would be appreciated. I will paste the full Python code below and see if I can upload the data file. I may have other issues once the parameters issue is solved! Thanks.
Here is the data file if it works - CSV DATA FILE
Here is the data file if it works - CSV DATA FILE
%matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import odr from scipy.stats import linregress # These two lines enable formatted printing of Pandas DataFrames from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" def GaussModelConstant(x, a, x0, sigma, const): y_gauss = a*np.exp(-(x-x0)**2/(2*sigma**2)) + const return y_gauss # change the filename below as required results = pd.read_csv('result-calibration.csv', skip_blank_lines=True, skipinitialspace = True) results.head() x = results['Channel'][260:280] y = results['Counts'][260:280] results['Counts_Error'] = np.sqrt((results['Counts'])) xerror = 0.5 yerror = results['Counts_Error'][260:280] model = odr.Model(GaussModelConstant) rdata = odr.RealData(x, y, sx = xerror, sy = yerror) # This line doesnt seem right I have tried replacing with the one below which I need to add somewhere? #p0 = [1400, 270, 10, 200] init_guess = linregress(x, y)[0:2] # Get error when I run - TypeError: GaussModelConstant() missing 3 required positional arguments: 'x0', 'sigma', and 'const' odr = odr.ODR(rdata, model, beta0 = init_guess) result_outputs = odr.run() popt = result_outputs.beta perr = np.sqrt(np.diag(result_outputs.cov_beta)) a_fit = popt[0] x0_fit = popt[1] sigma_fit = popt[2] const_fit = popt[3] perr = np.sqrt(np.diag(pcov)) a_err = perr[0] x0_err = perr[1] sigma_err = perr[2] const_err = perr[3] print('fit parameters with error estimates') print('***************************************************') print(f'A = {a_fit: .3g} +/- {a_err: .3g}') print(f'x0 = {x0_fit: .3g} +/- {x0_err: .3g}') print(f'sigma = {sigma_fit: .3g} +/- {sigma_err: .3g}') print(f'Constant \'base\' offset = {const_fit: .3g} +/- {const_err: .3g}') print('***************************************************') plt.figure(figsize=(15, 15)) plt.errorbar(x, y, yerr = yerror, xerr = xerror, fmt = 'o', ecolor = 'k', label = 'Errors') plt.plot(x, GaussModelConstant(x, *popt), color = "red")