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] |