Commit b869c4f31d547466607b3f761d0f9f3d7e66742c
1 parent
c437a22764
Exists in
master
more explicit display of results
Showing 1 changed file with 10 additions and 3 deletions Inline Diff
fit_waist.py
| #!/usr/bin/python | 1 | 1 | #!/usr/bin/python | |
| 2 | 2 | |||
| from scipy.optimize import curve_fit | 3 | 3 | from scipy.optimize import curve_fit | |
| import csv, numpy, glob | 4 | 4 | import csv, numpy, glob | |
| from scipy.special import erf | 5 | 5 | from scipy.special import erf | |
| import matplotlib.pyplot as plt | 6 | 6 | import matplotlib.pyplot as plt | |
| 7 | 7 | |||
| '''power function to optimize''' | 8 | 8 | '''power function to optimize''' | |
| def P(x, Po, Pmax, xo, w): | 9 | 9 | def P(x, Po, Pmax, xo, w): | |
| return Po+0.5*Pmax*(1.-erf(2.**0.5*(x-xo)/w)) | 10 | 10 | return Po+0.5*Pmax*(1.-erf(2.**0.5*(x-xo)/w)) | |
| 11 | 11 | |||
| 12 | 12 | |||
| '''load and fit beam section''' | 13 | 13 | '''load and fit beam section''' | |
| files = glob.glob('*.dat') | 14 | 14 | files = glob.glob('*.dat') | |
| files.sort() | 15 | 15 | files.sort() | |
| data_waist = [] | 16 | 16 | data_waist = [] | |
| plt.close() | 17 | 17 | plt.close() | |
| fig, p = plt.subplots(2, 1) | 18 | 18 | fig, p = plt.subplots(2, 1) | |
| for f in files: | 19 | 19 | for f in files: | |
| with open(f, 'r') as dest_f: | 20 | 20 | with open(f, 'r') as dest_f: | |
| raw = csv.reader(dest_f, delimiter = '\t', quotechar = '"') | 21 | 21 | raw = csv.reader(dest_f, delimiter = '\t', quotechar = '"') | |
| data = [value for value in raw] | 22 | 22 | data = [value for value in raw] | |
| data = numpy.asarray(data, dtype = float) | 23 | 23 | data = numpy.asarray(data, dtype = float) | |
| xmes = data[:,0] | 24 | 24 | xmes = data[:,0] | |
| Pmes = data[:,1] | 25 | 25 | Pmes = data[:,1] | |
| 26 | 26 | |||
| '''optimization with non-linear least squares method''' | 27 | 27 | '''optimization with non-linear least squares method''' | |
| Ppopt, Pcov = curve_fit(P, xmes, Pmes, method = 'trf') | 28 | 28 | Ppopt, Pcov = curve_fit(P, xmes, Pmes, method = 'trf') | |
| data_waist.append([int(f.split('-')[-1].split('.')[0]), Ppopt[3]]) | 29 | 29 | z = int(f.split('-')[-1].split('.')[0]) | |
| 30 | w = Ppopt[3] | |||
| 31 | w_sig = numpy.sqrt(numpy.diag(Pcov))[3] | |||
| 32 | data_waist.append([z, w, w_sig]) | |||
| 33 | print('z = %.3f mm\t w = %.3f mm (+-%.3f mm)'%(z, w, 1.96*w_sig)) | |||
| 30 | 34 | |||
| '''plot''' | 31 | 35 | '''plot''' | |
| p[0].plot(xmes, Pmes, 'o') | 32 | 36 | p[0].plot(xmes, Pmes, 'o') | |
| p[0].plot(numpy.linspace(xmes[0], xmes[-1], 100), P(numpy.linspace(xmes[0], xmes[-1], 100), *Ppopt)) | 33 | 37 | p[0].plot(numpy.linspace(xmes[0], xmes[-1], 100), P(numpy.linspace(xmes[0], xmes[-1], 100), *Ppopt)) | |
| 34 | 38 | |||
| p[0].grid() | 35 | 39 | p[0].grid() | |
| 36 | 40 | |||
| '''return waist(z) table''' | 37 | 41 | '''return waist(z) table''' | |
| data_waist = numpy.asarray(data_waist, dtype = float) | 38 | 42 | data_waist = numpy.asarray(data_waist, dtype = float) | |
| print(data_waist) | 39 | |||
| 40 | 43 | |||
| '''waist function to optimize''' | 41 | 44 | '''waist function to optimize''' | |
| def W(z, w0, z0): | 42 | 45 | def W(z, w0, z0): | |
| return w0*(1.+((z-z0)*1542e-6/(numpy.pi*w0**2))**2)**0.5 | 43 | 46 | return w0*(1.+((z-z0)*1542e-6/(numpy.pi*w0**2))**2)**0.5 | |
| 44 | 47 | |||
| popt, cov = curve_fit(W, data_waist[:,0], data_waist[:,1]) | 45 | 48 | popt, cov = curve_fit(W, data_waist[:,0], data_waist[:,1]) | |
| print(popt[0], popt[1]) | 46 | 49 | w0 = popt[0] | |
| 50 | w0_sig = numpy.sqrt(numpy.diag(cov))[0] | |||
| 51 | z0 = popt[1] |