Commit d0c0cc957820b7887d568b55fa5f7acaf2ab64df
Committed by
GitHub
1 parent
00bf9bcbf7
Exists in
master
Add files via upload
Showing 2 changed files with 230 additions and 0 deletions Inline Diff
fit_waist.py
File was created | 1 | from scipy.optimize import curve_fit | ||
2 | import csv, numpy, glob | |||
3 | from scipy.special import erf | |||
4 | import matplotlib.pyplot as plt | |||
5 | ||||
6 | '''power function to optimize''' | |||
7 | def P(x, Po, Pmax, xo, w): | |||
8 | return Po+0.5*Pmax*(1.-erf(2.**0.5*(x-xo)/w)) | |||
9 | ||||
10 | ||||
11 | '''load and fit beam section''' | |||
12 | files = glob.glob('*.dat') | |||
13 | files.sort() | |||
14 | data_waist = [] | |||
15 | plt.close() | |||
16 | fig, p = plt.subplots(2, 1) | |||
17 | for f in files: | |||
18 | with open(f, 'r') as dest_f: | |||
19 | raw = csv.reader(dest_f, delimiter = '\t', quotechar = '"') | |||
20 | data = [value for value in raw] | |||
21 | data = numpy.asarray(data, dtype = float) | |||
22 | xmes = data[:,0] | |||
23 | Pmes = data[:,1] | |||
24 | ||||
25 | '''optimization with non-linear least squares method''' | |||
26 | Ppopt, Pcov = curve_fit(P, xmes, Pmes) | |||
27 | data_waist.append([int(f[-7:-4]), Ppopt[3]]) | |||
28 | ||||
29 | '''plot''' | |||
30 | p[0].plot(xmes, Pmes, 'o') | |||
31 | p[0].plot(numpy.linspace(xmes[0], xmes[-1], 100), P(numpy.linspace(xmes[0], xmes[-1], 100), *Ppopt)) | |||
32 | ||||
33 | p[0].grid() | |||
34 | ||||
35 | '''return waist(z) table''' | |||
36 | data_waist = numpy.asarray(data_waist, dtype = float) | |||
37 | print(data_waist) | |||
38 | ||||
39 | '''waist function to optimize''' | |||
40 | def W(z, w0, z0): | |||
41 | return w0*(1.+((z-z0)*1542e-6/(numpy.pi*w0**2))**2)**0.5 |
pm100d_waist.py
File was created | 1 | #!/usr/bin/env python | ||
2 | ||||
3 | import argparse, time, os | |||
4 | import matplotlib.pyplot as plt | |||
5 | ||||
6 | #============================================================================== | |||
7 | ||||
8 | # Path | |||
9 | PATH = os.getcwd() | |||
10 | # File footer | |||
11 | OFILENAME = '130' | |||
12 | ||||
13 | #============================================================================== | |||
14 | ||||
15 | def parse(): | |||
16 | """ | |||
17 | Specific parsing procedure for transfering data from Thorlabs PM100D. | |||
18 | :returns: populated namespace (parser) | |||
19 | """ | |||
20 | parser = argparse.ArgumentParser(description = 'Acquire data from Thorlabs PM100D', | |||
21 | epilog = 'Example: \'./pm100d.py -st 10 -o toto\' logs PM100D every 10 seconds to output file YYYYMMDD-HHMMSS-toto.dat') | |||
22 | ||||
23 | parser.add_argument('-p', | |||
24 | action='store', | |||
25 | dest='path', | |||
26 | default=PATH, | |||
27 | help='Absolute path (default '+PATH+')') | |||
28 | ||||
29 | parser.add_argument('-o', | |||
30 | action='store', | |||
31 | dest='ofile', | |||
32 | default=OFILENAME, | |||
33 | help='Output data filename (default '+OFILENAME+')') | |||
34 | ||||
35 | args = parser.parse_args() | |||
36 | return args | |||
37 | ||||
38 | #============================================================================== | |||
39 | ||||
40 | class usbtmc: | |||
41 | def __init__(self, device): | |||
42 | self.device = device | |||
43 | self.FILE = os.open(device, os.O_RDWR) | |||
44 | ||||
45 | def write(self, command): | |||
46 | os.write(self.FILE, command); | |||
47 | ||||
48 | def read(self, length = 4000): | |||
49 | return os.read(self.FILE, length) | |||
50 | ||||
51 | def getName(self): | |||
52 | self.write("*IDN?") | |||
53 | return self.read(300) | |||
54 | ||||
55 | def sendReset(self): | |||
56 | self.write("*RST") | |||
57 | ||||
58 | #============================================================================== | |||
59 | ||||
60 | class instrument: | |||
61 | """Class to control a SCPI compatible instrument""" | |||
62 | def __init__(self, device): | |||
63 | print 'Connecting to device %s...' %device | |||
64 | self.meas = usbtmc(device) | |||
65 | self.name = self.meas.getName() | |||
66 | print self.name | |||
67 | print ' --> Ok' | |||
68 | ||||
69 | def write(self, command): | |||
70 | """Send an arbitrary command directly to the scope""" | |||
71 | self.meas.write(command) | |||
72 | ||||
73 | def read(self, command): | |||
74 | """Read an arbitrary amount of data directly from the scope""" | |||
75 | return self.meas.read(command) | |||
76 | ||||
77 | def reset(self): | |||
78 | """Reset the instrument""" | |||
79 | self.meas.sendReset() | |||
80 | ||||
81 | def value(self): | |||
82 | self.write('MEAS?') | |||
83 | return self.read(300) | |||
84 | ||||
85 | #============================================================================== | |||
86 | ||||
87 | def acqu_PM100D(instrument, path, ofile): | |||
88 | ||||
89 | t0 = time.time() | |||
90 | filename = time.strftime("%Y%m%d-%H%M%S", time.gmtime(t0)) + '-' + ofile + '.dat' | |||
91 | print('Opening %s' %filename) | |||
92 | data_file = open(filename, 'wr', 0) | |||
93 | dx = 0. | |||
94 | ||||
95 | xmes = [] | |||
96 | Pmes = [] | |||
97 | plt.ion() | |||
98 | fig = plt.figure() | |||
99 | ax1 = fig.add_subplot(111) | |||
100 | line1, = ax1.plot(xmes, Pmes, 'o') | |||
101 | ||||
102 | # Infinite loop | |||
103 | while True: | |||
104 | try: | |||
105 | keypressed = raw_input("Press Enter to continue...\n") | |||
106 | ||||
107 | if keypressed=='': | |||
108 | # Power values | |||
109 | sensors_values = instrument.value() | |||
110 | sensors_values = sensors_values.replace('E', 'e') | |||
111 | string = "%f\t%s" % (dx , sensors_values) | |||
112 | data_file.write(string) # Write in a file | |||
113 | print(string) | |||
114 | ||||
115 | xmes.append(dx) | |||
116 | Pmes.append(float(sensors_values)) | |||
117 | ||||
118 | dx = dx + 0.05 | |||
119 | ||||
120 | elif keypressed.isdigit(): | |||
121 | print('Closing %s' %filename) | |||
122 | data_file.close() | |||
123 | t0 = time.time() | |||
124 | filename = time.strftime("%Y%m%d-%H%M%S", time.gmtime(t0)) + '-' + keypressed + '.dat' | |||
125 | print('Opening %s' %filename) | |||
126 | data_file = open(filename, 'wr', 0) | |||
127 | dx = 0. | |||
128 | ||||
129 | xmes = [] | |||
130 | Pmes = [] | |||
131 | line1, = ax1.plot(xmes, Pmes, 'o') | |||
132 | ||||
133 | else: | |||
134 | raise KeyboardInterrupt | |||
135 |