1 | # -*- coding: utf-8 -*- |
---|
2 | """ |
---|
3 | Created on Mon Feb 6 15:47:25 2017 |
---|
4 | |
---|
5 | @author: delerue |
---|
6 | """ |
---|
7 | |
---|
8 | |
---|
9 | import numpy as np |
---|
10 | import matplotlib.pyplot as plt |
---|
11 | #from time import sleep |
---|
12 | from shutil import copyfile,move |
---|
13 | import os.path |
---|
14 | from scipy.fftpack import fft, ifft |
---|
15 | from scipy import signal |
---|
16 | |
---|
17 | def read_plot_data(filename): |
---|
18 | #Definitions |
---|
19 | nchannels=32 |
---|
20 | |
---|
21 | #electron_signal |
---|
22 | electrons_channel=26 |
---|
23 | electrons_signal_scaling=0.02 |
---|
24 | electrons_threshold=-1000 |
---|
25 | electrons_threshold_peak=200. |
---|
26 | electrons_half_width=1 |
---|
27 | |
---|
28 | data_start=1 |
---|
29 | data_length=8000 |
---|
30 | electron_pretrig=5 |
---|
31 | # electron_trig_stop=500 |
---|
32 | electron_trig_stop=20 |
---|
33 | electron_post_trig_integration_start=1 |
---|
34 | electron_post_trig_integration_stop=500 |
---|
35 | |
---|
36 | #position signal |
---|
37 | position_channel=28 |
---|
38 | |
---|
39 | #channels mapping |
---|
40 | #channels_mapping=[17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] |
---|
41 | data_mapping=[ 0, 111, 83, 76, 48, |
---|
42 | 55, 104, 69, 62, 0, |
---|
43 | 97, 90, 0, 118, 0, |
---|
44 | 0, 125, 0, 0, 0, |
---|
45 | 0, 0, 0, 0, 0, |
---|
46 | 0, 0, 0, 0, 0, |
---|
47 | 0, 0 ] |
---|
48 | |
---|
49 | |
---|
50 | fft_depth=150#lower value -- lower number of freq. |
---|
51 | |
---|
52 | #figure_size (in inches, that is 100*pixels with dpi=100) |
---|
53 | figure_size=(8, 6) |
---|
54 | figure_dpi=100 |
---|
55 | |
---|
56 | #sort the angles and find corresponding channels |
---|
57 | angles_sorted=[] |
---|
58 | idx_angles_sorted=[] |
---|
59 | idx_data_mapping=np.zeros(len(data_mapping),dtype=np.int) |
---|
60 | |
---|
61 | for angle in np.sort(data_mapping): |
---|
62 | if angle>0: |
---|
63 | if len(angles_sorted)==0: |
---|
64 | angles_sorted=[angle] |
---|
65 | idx_angles_sorted=[data_mapping.index(angle)] |
---|
66 | else: |
---|
67 | angles_sorted.append(angle) |
---|
68 | idx_angles_sorted.append(data_mapping.index(angle)) |
---|
69 | idx_data_mapping[data_mapping.index(angle)]=int(len(angles_sorted)) |
---|
70 | #Check if the filename contains the path or not |
---|
71 | if (len(os.path.dirname(filename))==0): |
---|
72 | filename="./"+filename |
---|
73 | dayname=os.path.basename(filename).replace("-","").split("_")[2] |
---|
74 | target_directory=os.path.dirname(filename)+"/../"+dayname+"/" |
---|
75 | target_filename=target_directory+os.path.basename(filename) |
---|
76 | |
---|
77 | #read parameters |
---|
78 | key_values={} |
---|
79 | with open(filename,'r') as fid: |
---|
80 | fileline=fid.readline() |
---|
81 | while (len(fileline)>0)and(fileline[0]=='#'): |
---|
82 | entries=fileline.replace('#','').replace(' ','').replace('\n','').split('=') |
---|
83 | key_values[entries[0]]=entries[1] |
---|
84 | fileline=fid.readline() |
---|
85 | fid.close() |
---|
86 | |
---|
87 | for p in key_values: print p,'=', key_values[p] |
---|
88 | #read data |
---|
89 | alldata=np.loadtxt(filename, dtype='int32', comments='#', delimiter=' ', usecols=range(0,nchannels), converters={ _:lambda s: int(s , 16) for _ in range(0,nchannels) }) |
---|
90 | |
---|
91 | #converting the data in the correct format |
---|
92 | alldata=alldata%(2**16)-2**15; |
---|
93 | |
---|
94 | #Scaling |
---|
95 | #data_scaling_factor=(float(key_values['amplitude'])*5.)/(2.**15) |
---|
96 | data_scaling_factor=1; |
---|
97 | time_scaling_factor=(float(key_values['acquisition_rate'])/36.)*1.e-3 |
---|
98 | |
---|
99 | #remove constant components from electron signal |
---|
100 | FFT_spectrum=fft(alldata[1:data_length,electrons_channel]); |
---|
101 | Amplitude=abs(FFT_spectrum); |
---|
102 | Amplitude[0]=0;#remove constant component |
---|
103 | alldata[1:data_length,electrons_channel]=np.real(ifft(Amplitude*np.exp(1j*np.angle(FFT_spectrum)))); |
---|
104 | |
---|
105 | |
---|
106 | #look for the electrons |
---|
107 | elec=alldata[1:data_length,electrons_channel] |
---|
108 | pos_elec=[]; |
---|
109 | Elec_sig_val_arr=[]; |
---|
110 | step=round(data_length/(2*(data_length*time_scaling_factor/40.)))#40 ms repetition rate |
---|
111 | for c in range(1,int(round(data_length/step)+1)): |
---|
112 | llim=int((c-1)*step); |
---|
113 | hlim=int(step*c); |
---|
114 | if hlim>data_length: |
---|
115 | hlim=int(data_length) |
---|
116 | if (max(elec[llim:hlim])>electrons_threshold_peak): |
---|
117 | pos_elec.append(llim+np.argmax(elec[llim:hlim])) |
---|
118 | Elec_sig_val_arr.append(min(elec[llim:hlim])); |
---|
119 | #print Elec_sig_val_arr |
---|
120 | |
---|
121 | electrons_found=False |
---|
122 | |
---|
123 | # fft filtering |
---|
124 | for c in range(0,11): |
---|
125 | FFT_spectrum=fft(alldata[1:data_length,idx_angles_sorted[c]]); |
---|
126 | Phase=np.angle(FFT_spectrum); |
---|
127 | Amplitude=abs(FFT_spectrum); |
---|
128 | Amplitude[(1+fft_depth):(data_length-fft_depth)]=0; |
---|
129 | Amplitude[0]=0;#remove constant component |
---|
130 | Signal=ifft(Amplitude*np.exp(1j*Phase)); |
---|
131 | alldata[1:data_length,idx_angles_sorted[c]]=np.real(Signal); |
---|
132 | |
---|
133 | #Find the amplitude of the signal |
---|
134 | Sig = [0 for x in range(len(pos_elec))] |
---|
135 | Sig_mean=[0 for x in range(12)] |
---|
136 | Sig_std=[0 for x in range(12)] |
---|
137 | Elec_sig_val=0; |
---|
138 | Elec_sig_val_err=0; |
---|
139 | if (len(pos_elec)>0.): |
---|
140 | electrons_found=True |
---|
141 | if (pos_elec[0]-50)>0: |
---|
142 | electron_data_start=pos_elec[0]-50 |
---|
143 | else: |
---|
144 | electron_data_start=0 |
---|
145 | if (pos_elec[0]+50)<data_length: |
---|
146 | electron_data_stop=pos_elec[0]+50 |
---|
147 | else: |
---|
148 | electron_data_stop=(data_length-1) |
---|
149 | Elec_sig_val=np.mean(Elec_sig_val_arr); |
---|
150 | Elec_sig_val_err=np.std(Elec_sig_val_arr); |
---|
151 | print 'electrons found:', Elec_sig_val,'+/-', Elec_sig_val_err |
---|
152 | # Signal amplitude |
---|
153 | for c in range(0,12): |
---|
154 | for k in range(0,len(pos_elec)): |
---|
155 | Sig[k]=alldata[(pos_elec[k]+14),idx_angles_sorted[c]]-alldata[(pos_elec[k]-14),idx_angles_sorted[c]] |
---|
156 | Sig_mean[c]=-np.mean(Sig)#mean of signal in one file |
---|
157 | Sig_std[c]=np.std(Sig)#std in one file |
---|
158 | |
---|
159 | move(filename,target_filename) |
---|
160 | |
---|
161 | #print Sig_mean, Sig_std |
---|
162 | |
---|
163 | |
---|
164 | #prepare the figures |
---|
165 | fig=plt.figure(1,figsize=figure_size,dpi=figure_dpi) |
---|
166 | if electrons_found: |
---|
167 | figzoom=plt.figure(2,figsize=figure_size,dpi=figure_dpi) |
---|
168 | figsignal=plt.figure(3,figsize=figure_size,dpi=figure_dpi) |
---|
169 | |
---|
170 | #set channels to plot |
---|
171 | plotch=data_mapping; |
---|
172 | plotch[electrons_channel]=1; |
---|
173 | plotch[16]=0; |
---|
174 | # plotch[electrons_channel+1]=1001; |
---|
175 | |
---|
176 | for idata in range(0,nchannels-1): |
---|
177 | |
---|
178 | this_data_scaling_factor=data_scaling_factor |
---|
179 | txtline='r' |
---|
180 | linestyle='-'; |
---|
181 | if data_mapping[idata] >0: |
---|
182 | txtline='r' |
---|
183 | if data_mapping[idata] >1000: |
---|
184 | txtline='b' |
---|
185 | |
---|
186 | if idata==electrons_channel: |
---|
187 | txtline='k' |
---|
188 | this_data_scaling_factor=this_data_scaling_factor*electrons_signal_scaling |
---|
189 | plt.figure(1) |
---|
190 | plt.plot(np.arange(data_start,data_length)*time_scaling_factor,alldata[range(data_start,data_length),idata]*this_data_scaling_factor, txtline+linestyle) |
---|
191 | if (electrons_found): |
---|
192 | plt.figure(2) |
---|
193 | plt.plot(np.arange(electron_data_start,electron_data_stop)*time_scaling_factor, (alldata[range(electron_data_start,electron_data_stop),idata]-alldata[(pos_elec[0]-14),idata])*this_data_scaling_factor, txtline+linestyle) |
---|
194 | |
---|
195 | |
---|
196 | plt.figure(1) |
---|
197 | plt.title(key_values['date']+ ' --- Motor value: '+key_values['motor_value']+ ' --- Current: '+key_values['current_value']) |
---|
198 | plt.ylabel('Signal amplitude [a.u.]') |
---|
199 | plt.xlabel('Time [ms]') |
---|
200 | plt.grid(True) |
---|
201 | imagename=target_filename.replace('.txt','.png') |
---|
202 | print(imagename) |
---|
203 | fig.savefig(imagename) |
---|
204 | plt.close(fig) |
---|
205 | imagename_no_path=os.path.basename(imagename) |
---|
206 | |
---|
207 | |
---|
208 | fid=open(target_directory+'list.html','a'); |
---|
209 | fid.write("<A HREF=") |
---|
210 | fid.write(imagename_no_path) |
---|
211 | fid.write("><IMG SRC=") |
---|
212 | fid.write(imagename_no_path) |
---|
213 | fid.write(" width=600>") |
---|
214 | fid.write("</A><BR/>") |
---|
215 | fid.write(imagename_no_path) |
---|
216 | fid.write("<BR/><BR/>\n") |
---|
217 | fid.close() |
---|
218 | copyfile(imagename,os.path.dirname(imagename)+'/last.png') |
---|
219 | |
---|
220 | if (electrons_found): |
---|
221 | plt.figure(2) |
---|
222 | plt.title(key_values['date']+ ' --- Motor value: '+key_values['motor_value']+ ' --- Current: '+key_values['current_value']) |
---|
223 | plt.ylabel('Signal amplitude [a.u] - pedestal removed') |
---|
224 | plt.xlabel('Time [ms]') |
---|
225 | plt.grid(True) |
---|
226 | imagenamezoom=target_filename.replace('.txt','_zoom.png') |
---|
227 | figzoom.savefig(imagenamezoom) |
---|
228 | plt.close(figzoom) |
---|
229 | copyfile(imagenamezoom,os.path.dirname(imagename)+'/last_zoom.png') |
---|
230 | |
---|
231 | imagenamezoom_no_path=os.path.basename(imagenamezoom) |
---|
232 | fid=open('zoom_list.html','a'); |
---|
233 | fid.write("<A HREF=") |
---|
234 | fid.write(imagenamezoom_no_path) |
---|
235 | fid.write("><IMG SRC=") |
---|
236 | fid.write(imagenamezoom_no_path) |
---|
237 | fid.write(" width=600>") |
---|
238 | fid.write("</A><BR/>") |
---|
239 | fid.write(imagenamezoom_no_path) |
---|
240 | fid.write("<BR/><BR/>\n") |
---|
241 | fid.close() |
---|
242 | |
---|
243 | plt.figure(3) |
---|
244 | plt.plot(range(48,132,7), Sig_mean,'r^-') |
---|
245 | plt.title(key_values['date']+ ' --- Motor value: '+key_values['motor_value']+ ' --- Current: '+key_values['current_value']) |
---|
246 | plt.ylabel('Signal amplitude [a.u.]') |
---|
247 | plt.xlabel('Detector angle [deg.]') |
---|
248 | plt.grid(True) |
---|
249 | imagenamesignal=target_filename.replace('.txt','_signal.png') |
---|
250 | figsignal.savefig(imagenamesignal) |
---|
251 | plt.close(figsignal) |
---|
252 | copyfile(imagenamesignal,os.path.dirname(imagename)+'/last_signal.png') |
---|
253 | |
---|
254 | imagenamesignal_no_path=os.path.basename(imagenamesignal) |
---|
255 | fid=open('signal_list.html','a'); |
---|
256 | fid.write("<A HREF=") |
---|
257 | fid.write(imagenamesignal_no_path) |
---|
258 | fid.write("><IMG SRC=") |
---|
259 | fid.write(imagenamesignal_no_path) |
---|
260 | fid.write(" width=600>") |
---|
261 | fid.write("</A><BR/>") |
---|
262 | fid.write(imagenamesignal_no_path) |
---|
263 | fid.write("<BR/><BR/>\n") |
---|
264 | fid.close() |
---|
265 | |
---|
266 | filenamesig=target_filename.replace('.txt','.sig') |
---|
267 | fid=open(filenamesig,'w'); |
---|
268 | for key in key_values: |
---|
269 | fid.write("#" +key+" = "+key_values[key]+" \n"); |
---|
270 | fid.write("#electronsig = "+ str(Elec_sig_val)+" \n"); |
---|
271 | fid.write("#electronstd = "+ str(Elec_sig_val_err)+" \n"); |
---|
272 | for idata in range(0,len(Sig_mean)): |
---|
273 | fid.write(str(angles_sorted[idata])+"\t"+str(Sig_mean[idata])+"\t"+str(Sig_std[idata])+"\n") |
---|
274 | fid.write("\n") |
---|
275 | fid.close() |
---|
276 | |
---|
277 | filenamedone=filename.replace('.txt','.done') |
---|
278 | fid=open(filenamedone,'a'); |
---|
279 | fid.write("done") |
---|
280 | fid.close() |
---|
281 | |
---|
282 | return; |
---|
283 | |
---|