source: ETALON/CLIO/control/read_plot_data.py @ 744

Last change on this file since 744 was 744, checked in by delerue, 7 years ago

CLIO control system updated

File size: 9.9 KB
Line 
1# -*- coding: utf-8 -*-
2"""
3Created on Mon Feb  6 15:47:25 2017
4
5@author: delerue
6"""
7
8
9import numpy as np
10import matplotlib.pyplot as plt
11#from time import sleep
12from shutil import copyfile,move
13import os.path
14from scipy.fftpack import fft, ifft
15from scipy import signal
16
17def 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
Note: See TracBrowser for help on using the repository browser.