##// END OF EJS Templates
update extrapoints spectraplot
avaldez -
r1786:ad62c3fdbfa5
parent child
Show More
@@ -1,1350 +1,1351
1 # Copyright (c) 2012-2021 Jicamarca Radio Observatory
1 # Copyright (c) 2012-2021 Jicamarca Radio Observatory
2 # All rights reserved.
2 # All rights reserved.
3 #
3 #
4 # Distributed under the terms of the BSD 3-clause license.
4 # Distributed under the terms of the BSD 3-clause license.
5 """Classes to plot Spectra data
5 """Classes to plot Spectra data
6
6
7 """
7 """
8
8
9 import os
9 import os
10 import numpy
10 import numpy
11 #import collections.abc
11 #import collections.abc
12
12
13 from schainpy.model.graphics.jroplot_base import Plot, plt, log
13 from schainpy.model.graphics.jroplot_base import Plot, plt, log
14
14
15 class SpectraPlot(Plot):
15 class SpectraPlot(Plot):
16 '''
16 '''
17 Plot for Spectra data
17 Plot for Spectra data
18 '''
18 '''
19
19
20 CODE = 'spc'
20 CODE = 'spc'
21 colormap = 'jet'
21 colormap = 'jet'
22 plot_type = 'pcolor'
22 plot_type = 'pcolor'
23 buffering = False
23 buffering = False
24
24
25 def setup(self):
25 def setup(self):
26
26
27 self.nplots = len(self.data.channels)
27 self.nplots = len(self.data.channels)
28 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
28 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
29 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
29 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
30 self.height = 2.6 * self.nrows
30 self.height = 2.6 * self.nrows
31 self.cb_label = 'dB'
31 self.cb_label = 'dB'
32 if self.showprofile:
32 if self.showprofile:
33 self.width = 4 * self.ncols
33 self.width = 4 * self.ncols
34 else:
34 else:
35 self.width = 3.5 * self.ncols
35 self.width = 3.5 * self.ncols
36 self.plots_adjust.update({'wspace': 0.8, 'hspace':0.2, 'left': 0.2, 'right': 0.9, 'bottom': 0.18})
36 self.plots_adjust.update({'wspace': 0.8, 'hspace':0.2, 'left': 0.2, 'right': 0.9, 'bottom': 0.18})
37 self.ylabel = 'Range [km]'
37 self.ylabel = 'Range [km]'
38
38
39 def update(self, dataOut):
39 def update(self, dataOut):
40
40
41 data = {}
41 data = {}
42 meta = {}
42 meta = {}
43
43
44 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
44 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
45 #print("dataOut.normFactor: ", dataOut.normFactor)
45 #print("dataOut.normFactor: ", dataOut.normFactor)
46 #print("spc: ", dataOut.data_spc[0,0,0])
46 #print("spc: ", dataOut.data_spc[0,0,0])
47 #spc = 10*numpy.log10(dataOut.data_spc)
47 #spc = 10*numpy.log10(dataOut.data_spc)
48 #print("Spc: ",spc[0])
48 #print("Spc: ",spc[0])
49 #exit(1)
49 #exit(1)
50 data['spc'] = spc
50 data['spc'] = spc
51 data['rti'] = dataOut.getPower()
51 data['rti'] = dataOut.getPower()
52 #print(data['rti'][0])
52 #print(data['rti'][0])
53 #exit(1)
53 #exit(1)
54 #print("NormFactor: ",dataOut.normFactor)
54 #print("NormFactor: ",dataOut.normFactor)
55 #data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
55 #data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
56 if hasattr(dataOut, 'LagPlot'): #Double Pulse
56 if hasattr(dataOut, 'LagPlot'): #Double Pulse
57 max_hei_id = dataOut.nHeights - 2*dataOut.LagPlot
57 max_hei_id = dataOut.nHeights - 2*dataOut.LagPlot
58 #data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=46,ymax_index=max_hei_id)/dataOut.normFactor)
58 #data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=46,ymax_index=max_hei_id)/dataOut.normFactor)
59 #data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=40,ymax_index=max_hei_id)/dataOut.normFactor)
59 #data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=40,ymax_index=max_hei_id)/dataOut.normFactor)
60 data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=53,ymax_index=max_hei_id)/dataOut.normFactor)
60 data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=53,ymax_index=max_hei_id)/dataOut.normFactor)
61 data['noise'][0] = 10*numpy.log10(dataOut.getNoise(ymin_index=53)[0]/dataOut.normFactor)
61 data['noise'][0] = 10*numpy.log10(dataOut.getNoise(ymin_index=53)[0]/dataOut.normFactor)
62 #data['noise'][1] = 22.035507
62 #data['noise'][1] = 22.035507
63 else:
63 else:
64 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
64 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
65 #data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=26,ymax_index=44)/dataOut.normFactor)
65 #data['noise'] = 10*numpy.log10(dataOut.getNoise(ymin_index=26,ymax_index=44)/dataOut.normFactor)
66 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
66 extrapoints = spc.shape[1] % dataOut.nFFTPoints
67 meta['xrange'] = (dataOut.getFreqRange(extrapoints))/1000., dataOut.getAcfRange(extrapoints)), dataOut.getVelRange(extrapoints)))
67
68
68 if self.CODE == 'spc_moments':
69 if self.CODE == 'spc_moments':
69 data['moments'] = dataOut.moments
70 data['moments'] = dataOut.moments
70 if self.CODE == 'gaussian_fit':
71 if self.CODE == 'gaussian_fit':
71 data['gaussfit'] = dataOut.DGauFitParams
72 data['gaussfit'] = dataOut.DGauFitParams
72
73
73 return data, meta
74 return data, meta
74
75
75 def plot(self):
76 def plot(self):
76
77
77 if self.xaxis == "frequency":
78 if self.xaxis == "frequency":
78 x = self.data.xrange[0]
79 x = self.data.xrange[0]
79 self.xlabel = "Frequency (kHz)"
80 self.xlabel = "Frequency (kHz)"
80 elif self.xaxis == "time":
81 elif self.xaxis == "time":
81 x = self.data.xrange[1]
82 x = self.data.xrange[1]
82 self.xlabel = "Time (ms)"
83 self.xlabel = "Time (ms)"
83 else:
84 else:
84 x = self.data.xrange[2]
85 x = self.data.xrange[2]
85 self.xlabel = "Velocity (m/s)"
86 self.xlabel = "Velocity (m/s)"
86
87
87 if (self.CODE == 'spc_moments') | (self.CODE == 'gaussian_fit'):
88 if (self.CODE == 'spc_moments') | (self.CODE == 'gaussian_fit'):
88 x = self.data.xrange[2]
89 x = self.data.xrange[2]
89 self.xlabel = "Velocity (m/s)"
90 self.xlabel = "Velocity (m/s)"
90
91
91 self.titles = []
92 self.titles = []
92
93
93 y = self.data.yrange
94 y = self.data.yrange
94 self.y = y
95 self.y = y
95
96
96 data = self.data[-1]
97 data = self.data[-1]
97 z = data['spc']
98 z = data['spc']
98
99
99 self.CODE2 = 'spc_oblique'
100 self.CODE2 = 'spc_oblique'
100
101
101 for n, ax in enumerate(self.axes):
102 for n, ax in enumerate(self.axes):
102 noise = data['noise'][n]
103 noise = data['noise'][n]
103 if self.CODE == 'spc_moments':
104 if self.CODE == 'spc_moments':
104 mean = data['moments'][n, 1]
105 mean = data['moments'][n, 1]
105 if self.CODE == 'gaussian_fit':
106 if self.CODE == 'gaussian_fit':
106 gau0 = data['gaussfit'][n][2,:,0]
107 gau0 = data['gaussfit'][n][2,:,0]
107 gau1 = data['gaussfit'][n][2,:,1]
108 gau1 = data['gaussfit'][n][2,:,1]
108 if ax.firsttime:
109 if ax.firsttime:
109 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
110 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
110 self.xmin = self.xmin if self.xmin else numpy.nanmin(x)#-self.xmax
111 self.xmin = self.xmin if self.xmin else numpy.nanmin(x)#-self.xmax
111 #self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
112 #self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
112 #self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
113 #self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
113 if self.zlimits is not None:
114 if self.zlimits is not None:
114 self.zmin, self.zmax = self.zlimits[n]
115 self.zmin, self.zmax = self.zlimits[n]
115
116
116 ax.plt = ax.pcolormesh(x, y, z[n].T,
117 ax.plt = ax.pcolormesh(x, y, z[n].T,
117 vmin=self.zmin,
118 vmin=self.zmin,
118 vmax=self.zmax,
119 vmax=self.zmax,
119 cmap=plt.get_cmap(self.colormap),
120 cmap=plt.get_cmap(self.colormap),
120 )
121 )
121
122
122 if self.showprofile:
123 if self.showprofile:
123 ax.plt_profile = self.pf_axes[n].plot(
124 ax.plt_profile = self.pf_axes[n].plot(
124 data['rti'][n], y)[0]
125 data['rti'][n], y)[0]
125 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
126 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
126 color="k", linestyle="dashed", lw=1)[0]
127 color="k", linestyle="dashed", lw=1)[0]
127 if self.CODE == 'spc_moments':
128 if self.CODE == 'spc_moments':
128 ax.plt_mean = ax.plot(mean, y, color='k', lw=1)[0]
129 ax.plt_mean = ax.plot(mean, y, color='k', lw=1)[0]
129 if self.CODE == 'gaussian_fit':
130 if self.CODE == 'gaussian_fit':
130 ax.plt_gau0 = ax.plot(gau0, y, color='r', lw=1)[0]
131 ax.plt_gau0 = ax.plot(gau0, y, color='r', lw=1)[0]
131 ax.plt_gau1 = ax.plot(gau1, y, color='y', lw=1)[0]
132 ax.plt_gau1 = ax.plot(gau1, y, color='y', lw=1)[0]
132 else:
133 else:
133 if self.zlimits is not None:
134 if self.zlimits is not None:
134 self.zmin, self.zmax = self.zlimits[n]
135 self.zmin, self.zmax = self.zlimits[n]
135 ax.plt.set_array(z[n].T.ravel())
136 ax.plt.set_array(z[n].T.ravel())
136 if self.showprofile:
137 if self.showprofile:
137 ax.plt_profile.set_data(data['rti'][n], y)
138 ax.plt_profile.set_data(data['rti'][n], y)
138 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
139 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
139 if self.CODE == 'spc_moments':
140 if self.CODE == 'spc_moments':
140 ax.plt_mean.set_data(mean, y)
141 ax.plt_mean.set_data(mean, y)
141 if self.CODE == 'gaussian_fit':
142 if self.CODE == 'gaussian_fit':
142 ax.plt_gau0.set_data(gau0, y)
143 ax.plt_gau0.set_data(gau0, y)
143 ax.plt_gau1.set_data(gau1, y)
144 ax.plt_gau1.set_data(gau1, y)
144 self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
145 self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
145
146
146 class SpectraObliquePlot(Plot):
147 class SpectraObliquePlot(Plot):
147 '''
148 '''
148 Plot for Spectra data
149 Plot for Spectra data
149 '''
150 '''
150
151
151 CODE = 'spc_oblique'
152 CODE = 'spc_oblique'
152 colormap = 'jet'
153 colormap = 'jet'
153 plot_type = 'pcolor'
154 plot_type = 'pcolor'
154
155
155 def setup(self):
156 def setup(self):
156 self.xaxis = "oblique"
157 self.xaxis = "oblique"
157 self.nplots = len(self.data.channels)
158 self.nplots = len(self.data.channels)
158 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
159 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
159 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
160 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
160 self.height = 2.6 * self.nrows
161 self.height = 2.6 * self.nrows
161 self.cb_label = 'dB'
162 self.cb_label = 'dB'
162 if self.showprofile:
163 if self.showprofile:
163 self.width = 4 * self.ncols
164 self.width = 4 * self.ncols
164 else:
165 else:
165 self.width = 3.5 * self.ncols
166 self.width = 3.5 * self.ncols
166 self.plots_adjust.update({'wspace': 0.8, 'hspace':0.2, 'left': 0.2, 'right': 0.9, 'bottom': 0.18})
167 self.plots_adjust.update({'wspace': 0.8, 'hspace':0.2, 'left': 0.2, 'right': 0.9, 'bottom': 0.18})
167 self.ylabel = 'Range [km]'
168 self.ylabel = 'Range [km]'
168
169
169 def update(self, dataOut):
170 def update(self, dataOut):
170
171
171 data = {}
172 data = {}
172 meta = {}
173 meta = {}
173
174
174 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
175 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
175 data['spc'] = spc
176 data['spc'] = spc
176 data['rti'] = dataOut.getPower()
177 data['rti'] = dataOut.getPower()
177 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
178 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
178 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
179 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
179 '''
180 '''
180 data['shift1'] = dataOut.Oblique_params[0,-2,:]
181 data['shift1'] = dataOut.Oblique_params[0,-2,:]
181 data['shift2'] = dataOut.Oblique_params[0,-1,:]
182 data['shift2'] = dataOut.Oblique_params[0,-1,:]
182 data['shift1_error'] = dataOut.Oblique_param_errors[0,-2,:]
183 data['shift1_error'] = dataOut.Oblique_param_errors[0,-2,:]
183 data['shift2_error'] = dataOut.Oblique_param_errors[0,-1,:]
184 data['shift2_error'] = dataOut.Oblique_param_errors[0,-1,:]
184 '''
185 '''
185 '''
186 '''
186 data['shift1'] = dataOut.Oblique_params[0,1,:]
187 data['shift1'] = dataOut.Oblique_params[0,1,:]
187 data['shift2'] = dataOut.Oblique_params[0,4,:]
188 data['shift2'] = dataOut.Oblique_params[0,4,:]
188 data['shift1_error'] = dataOut.Oblique_param_errors[0,1,:]
189 data['shift1_error'] = dataOut.Oblique_param_errors[0,1,:]
189 data['shift2_error'] = dataOut.Oblique_param_errors[0,4,:]
190 data['shift2_error'] = dataOut.Oblique_param_errors[0,4,:]
190 '''
191 '''
191 data['shift1'] = dataOut.Dop_EEJ_T1[0]
192 data['shift1'] = dataOut.Dop_EEJ_T1[0]
192 data['shift2'] = dataOut.Dop_EEJ_T2[0]
193 data['shift2'] = dataOut.Dop_EEJ_T2[0]
193 data['max_val_2'] = dataOut.Oblique_params[0,-1,:]
194 data['max_val_2'] = dataOut.Oblique_params[0,-1,:]
194 data['shift1_error'] = dataOut.Err_Dop_EEJ_T1[0]
195 data['shift1_error'] = dataOut.Err_Dop_EEJ_T1[0]
195 data['shift2_error'] = dataOut.Err_Dop_EEJ_T2[0]
196 data['shift2_error'] = dataOut.Err_Dop_EEJ_T2[0]
196
197
197 return data, meta
198 return data, meta
198
199
199 def plot(self):
200 def plot(self):
200
201
201 if self.xaxis == "frequency":
202 if self.xaxis == "frequency":
202 x = self.data.xrange[0]
203 x = self.data.xrange[0]
203 self.xlabel = "Frequency (kHz)"
204 self.xlabel = "Frequency (kHz)"
204 elif self.xaxis == "time":
205 elif self.xaxis == "time":
205 x = self.data.xrange[1]
206 x = self.data.xrange[1]
206 self.xlabel = "Time (ms)"
207 self.xlabel = "Time (ms)"
207 else:
208 else:
208 x = self.data.xrange[2]
209 x = self.data.xrange[2]
209 self.xlabel = "Velocity (m/s)"
210 self.xlabel = "Velocity (m/s)"
210
211
211 self.titles = []
212 self.titles = []
212
213
213 y = self.data.yrange
214 y = self.data.yrange
214 self.y = y
215 self.y = y
215
216
216 data = self.data[-1]
217 data = self.data[-1]
217 z = data['spc']
218 z = data['spc']
218
219
219 for n, ax in enumerate(self.axes):
220 for n, ax in enumerate(self.axes):
220 noise = self.data['noise'][n][-1]
221 noise = self.data['noise'][n][-1]
221 shift1 = data['shift1']
222 shift1 = data['shift1']
222 #print(shift1)
223 #print(shift1)
223 shift2 = data['shift2']
224 shift2 = data['shift2']
224 max_val_2 = data['max_val_2']
225 max_val_2 = data['max_val_2']
225 err1 = data['shift1_error']
226 err1 = data['shift1_error']
226 err2 = data['shift2_error']
227 err2 = data['shift2_error']
227 if ax.firsttime:
228 if ax.firsttime:
228
229
229 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
230 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
230 self.xmin = self.xmin if self.xmin else -self.xmax
231 self.xmin = self.xmin if self.xmin else -self.xmax
231 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
232 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
232 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
233 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
233 ax.plt = ax.pcolormesh(x, y, z[n].T,
234 ax.plt = ax.pcolormesh(x, y, z[n].T,
234 vmin=self.zmin,
235 vmin=self.zmin,
235 vmax=self.zmax,
236 vmax=self.zmax,
236 cmap=plt.get_cmap(self.colormap)
237 cmap=plt.get_cmap(self.colormap)
237 )
238 )
238
239
239 if self.showprofile:
240 if self.showprofile:
240 ax.plt_profile = self.pf_axes[n].plot(
241 ax.plt_profile = self.pf_axes[n].plot(
241 self.data['rti'][n][-1], y)[0]
242 self.data['rti'][n][-1], y)[0]
242 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
243 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
243 color="k", linestyle="dashed", lw=1)[0]
244 color="k", linestyle="dashed", lw=1)[0]
244
245
245 self.ploterr1 = ax.errorbar(shift1, y, xerr=err1, fmt='k^', elinewidth=2.2, marker='o', linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
246 self.ploterr1 = ax.errorbar(shift1, y, xerr=err1, fmt='k^', elinewidth=2.2, marker='o', linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
246 self.ploterr2 = ax.errorbar(shift2, y, xerr=err2, fmt='m^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
247 self.ploterr2 = ax.errorbar(shift2, y, xerr=err2, fmt='m^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
247 self.ploterr3 = ax.errorbar(max_val_2, y, xerr=0, fmt='g^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
248 self.ploterr3 = ax.errorbar(max_val_2, y, xerr=0, fmt='g^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
248
249
249 #print("plotter1: ", self.ploterr1,shift1)
250 #print("plotter1: ", self.ploterr1,shift1)
250
251
251 else:
252 else:
252 #print("else plotter1: ", self.ploterr1,shift1)
253 #print("else plotter1: ", self.ploterr1,shift1)
253 self.ploterr1.remove()
254 self.ploterr1.remove()
254 self.ploterr2.remove()
255 self.ploterr2.remove()
255 self.ploterr3.remove()
256 self.ploterr3.remove()
256 ax.plt.set_array(z[n].T.ravel())
257 ax.plt.set_array(z[n].T.ravel())
257 if self.showprofile:
258 if self.showprofile:
258 ax.plt_profile.set_data(self.data['rti'][n][-1], y)
259 ax.plt_profile.set_data(self.data['rti'][n][-1], y)
259 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
260 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
260 self.ploterr1 = ax.errorbar(shift1, y, xerr=err1, fmt='k^', elinewidth=2.2, marker='o', linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
261 self.ploterr1 = ax.errorbar(shift1, y, xerr=err1, fmt='k^', elinewidth=2.2, marker='o', linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
261 self.ploterr2 = ax.errorbar(shift2, y, xerr=err2, fmt='m^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
262 self.ploterr2 = ax.errorbar(shift2, y, xerr=err2, fmt='m^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
262 self.ploterr3 = ax.errorbar(max_val_2, y, xerr=0, fmt='g^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
263 self.ploterr3 = ax.errorbar(max_val_2, y, xerr=0, fmt='g^',elinewidth=2.2,marker='o',linestyle='None',markersize=2.5,capsize=0.3,markeredgewidth=0.2)
263
264
264 self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
265 self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
265
266
266
267
267 class CrossSpectraPlot(Plot):
268 class CrossSpectraPlot(Plot):
268
269
269 CODE = 'cspc'
270 CODE = 'cspc'
270 colormap = 'jet'
271 colormap = 'jet'
271 plot_type = 'pcolor'
272 plot_type = 'pcolor'
272 zmin_coh = None
273 zmin_coh = None
273 zmax_coh = None
274 zmax_coh = None
274 zmin_phase = None
275 zmin_phase = None
275 zmax_phase = None
276 zmax_phase = None
276
277
277 def setup(self):
278 def setup(self):
278
279
279 self.ncols = 4
280 self.ncols = 4
280 self.nplots = len(self.data.pairs) * 2
281 self.nplots = len(self.data.pairs) * 2
281 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
282 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
282 self.width = 3.1 * self.ncols
283 self.width = 3.1 * self.ncols
283 self.height = 5 * self.nrows
284 self.height = 5 * self.nrows
284 self.ylabel = 'Range [km]'
285 self.ylabel = 'Range [km]'
285 self.showprofile = False
286 self.showprofile = False
286 self.plots_adjust.update({'left': 0.08, 'right': 0.92, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
287 self.plots_adjust.update({'left': 0.08, 'right': 0.92, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
287
288
288 def update(self, dataOut):
289 def update(self, dataOut):
289
290
290 data = {}
291 data = {}
291 meta = {}
292 meta = {}
292
293
293 spc = dataOut.data_spc
294 spc = dataOut.data_spc
294 cspc = dataOut.data_cspc
295 cspc = dataOut.data_cspc
295 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
296 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
296 meta['pairs'] = dataOut.pairsList
297 meta['pairs'] = dataOut.pairsList
297
298
298 tmp = []
299 tmp = []
299
300
300 for n, pair in enumerate(meta['pairs']):
301 for n, pair in enumerate(meta['pairs']):
301 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
302 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
302 coh = numpy.abs(out)
303 coh = numpy.abs(out)
303 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
304 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
304 tmp.append(coh)
305 tmp.append(coh)
305 tmp.append(phase)
306 tmp.append(phase)
306
307
307 data['cspc'] = numpy.array(tmp)
308 data['cspc'] = numpy.array(tmp)
308
309
309 return data, meta
310 return data, meta
310
311
311 def plot(self):
312 def plot(self):
312
313
313 if self.xaxis == "frequency":
314 if self.xaxis == "frequency":
314 x = self.data.xrange[0]
315 x = self.data.xrange[0]
315 self.xlabel = "Frequency (kHz)"
316 self.xlabel = "Frequency (kHz)"
316 elif self.xaxis == "time":
317 elif self.xaxis == "time":
317 x = self.data.xrange[1]
318 x = self.data.xrange[1]
318 self.xlabel = "Time (ms)"
319 self.xlabel = "Time (ms)"
319 else:
320 else:
320 x = self.data.xrange[2]
321 x = self.data.xrange[2]
321 self.xlabel = "Velocity (m/s)"
322 self.xlabel = "Velocity (m/s)"
322
323
323 self.titles = []
324 self.titles = []
324
325
325 y = self.data.yrange
326 y = self.data.yrange
326 self.y = y
327 self.y = y
327
328
328 data = self.data[-1]
329 data = self.data[-1]
329 cspc = data['cspc']
330 cspc = data['cspc']
330
331
331 for n in range(len(self.data.pairs)):
332 for n in range(len(self.data.pairs)):
332 pair = self.data.pairs[n]
333 pair = self.data.pairs[n]
333 coh = cspc[n*2]
334 coh = cspc[n*2]
334 phase = cspc[n*2+1]
335 phase = cspc[n*2+1]
335 ax = self.axes[2 * n]
336 ax = self.axes[2 * n]
336 if ax.firsttime:
337 if ax.firsttime:
337 ax.plt = ax.pcolormesh(x, y, coh.T,
338 ax.plt = ax.pcolormesh(x, y, coh.T,
338 vmin=0,
339 vmin=0,
339 vmax=1,
340 vmax=1,
340 cmap=plt.get_cmap(self.colormap_coh)
341 cmap=plt.get_cmap(self.colormap_coh)
341 )
342 )
342 else:
343 else:
343 ax.plt.set_array(coh.T.ravel())
344 ax.plt.set_array(coh.T.ravel())
344 self.titles.append(
345 self.titles.append(
345 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
346 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
346
347
347 ax = self.axes[2 * n + 1]
348 ax = self.axes[2 * n + 1]
348 if ax.firsttime:
349 if ax.firsttime:
349 ax.plt = ax.pcolormesh(x, y, phase.T,
350 ax.plt = ax.pcolormesh(x, y, phase.T,
350 vmin=-180,
351 vmin=-180,
351 vmax=180,
352 vmax=180,
352 cmap=plt.get_cmap(self.colormap_phase)
353 cmap=plt.get_cmap(self.colormap_phase)
353 )
354 )
354 else:
355 else:
355 ax.plt.set_array(phase.T.ravel())
356 ax.plt.set_array(phase.T.ravel())
356 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
357 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
357
358
358
359
359 class CrossSpectra4Plot(Plot):
360 class CrossSpectra4Plot(Plot):
360
361
361 CODE = 'cspc'
362 CODE = 'cspc'
362 colormap = 'jet'
363 colormap = 'jet'
363 plot_type = 'pcolor'
364 plot_type = 'pcolor'
364 zmin_coh = None
365 zmin_coh = None
365 zmax_coh = None
366 zmax_coh = None
366 zmin_phase = None
367 zmin_phase = None
367 zmax_phase = None
368 zmax_phase = None
368
369
369 def setup(self):
370 def setup(self):
370
371
371 self.ncols = 4
372 self.ncols = 4
372 self.nrows = len(self.data.pairs)
373 self.nrows = len(self.data.pairs)
373 self.nplots = self.nrows * 4
374 self.nplots = self.nrows * 4
374 self.width = 3.1 * self.ncols
375 self.width = 3.1 * self.ncols
375 self.height = 5 * self.nrows
376 self.height = 5 * self.nrows
376 self.ylabel = 'Range [km]'
377 self.ylabel = 'Range [km]'
377 self.showprofile = False
378 self.showprofile = False
378 self.plots_adjust.update({'left': 0.08, 'right': 0.92, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
379 self.plots_adjust.update({'left': 0.08, 'right': 0.92, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
379
380
380 def plot(self):
381 def plot(self):
381
382
382 if self.xaxis == "frequency":
383 if self.xaxis == "frequency":
383 x = self.data.xrange[0]
384 x = self.data.xrange[0]
384 self.xlabel = "Frequency (kHz)"
385 self.xlabel = "Frequency (kHz)"
385 elif self.xaxis == "time":
386 elif self.xaxis == "time":
386 x = self.data.xrange[1]
387 x = self.data.xrange[1]
387 self.xlabel = "Time (ms)"
388 self.xlabel = "Time (ms)"
388 else:
389 else:
389 x = self.data.xrange[2]
390 x = self.data.xrange[2]
390 self.xlabel = "Velocity (m/s)"
391 self.xlabel = "Velocity (m/s)"
391
392
392 self.titles = []
393 self.titles = []
393
394
394
395
395 y = self.data.heights
396 y = self.data.heights
396 self.y = y
397 self.y = y
397 nspc = self.data['spc']
398 nspc = self.data['spc']
398 #print(numpy.shape(self.data['spc']))
399 #print(numpy.shape(self.data['spc']))
399 spc = self.data['cspc'][0]
400 spc = self.data['cspc'][0]
400 #print(numpy.shape(nspc))
401 #print(numpy.shape(nspc))
401 #exit()
402 #exit()
402 #nspc[1,:,:] = numpy.flip(nspc[1,:,:],axis=0)
403 #nspc[1,:,:] = numpy.flip(nspc[1,:,:],axis=0)
403 #print(numpy.shape(spc))
404 #print(numpy.shape(spc))
404 #exit()
405 #exit()
405 cspc = self.data['cspc'][1]
406 cspc = self.data['cspc'][1]
406
407
407 #xflip=numpy.flip(x)
408 #xflip=numpy.flip(x)
408 #print(numpy.shape(cspc))
409 #print(numpy.shape(cspc))
409 #exit()
410 #exit()
410
411
411 for n in range(self.nrows):
412 for n in range(self.nrows):
412 noise = self.data['noise'][:,-1]
413 noise = self.data['noise'][:,-1]
413 pair = self.data.pairs[n]
414 pair = self.data.pairs[n]
414 #print(pair)
415 #print(pair)
415 #exit()
416 #exit()
416 ax = self.axes[4 * n]
417 ax = self.axes[4 * n]
417 if ax.firsttime:
418 if ax.firsttime:
418 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
419 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
419 self.xmin = self.xmin if self.xmin else -self.xmax
420 self.xmin = self.xmin if self.xmin else -self.xmax
420 self.zmin = self.zmin if self.zmin else numpy.nanmin(nspc)
421 self.zmin = self.zmin if self.zmin else numpy.nanmin(nspc)
421 self.zmax = self.zmax if self.zmax else numpy.nanmax(nspc)
422 self.zmax = self.zmax if self.zmax else numpy.nanmax(nspc)
422 ax.plt = ax.pcolormesh(x , y , nspc[pair[0]].T,
423 ax.plt = ax.pcolormesh(x , y , nspc[pair[0]].T,
423 vmin=self.zmin,
424 vmin=self.zmin,
424 vmax=self.zmax,
425 vmax=self.zmax,
425 cmap=plt.get_cmap(self.colormap)
426 cmap=plt.get_cmap(self.colormap)
426 )
427 )
427 else:
428 else:
428 #print(numpy.shape(nspc[pair[0]].T))
429 #print(numpy.shape(nspc[pair[0]].T))
429 #exit()
430 #exit()
430 ax.plt.set_array(nspc[pair[0]].T.ravel())
431 ax.plt.set_array(nspc[pair[0]].T.ravel())
431 self.titles.append('CH {}: {:3.2f}dB'.format(pair[0], noise[pair[0]]))
432 self.titles.append('CH {}: {:3.2f}dB'.format(pair[0], noise[pair[0]]))
432
433
433 ax = self.axes[4 * n + 1]
434 ax = self.axes[4 * n + 1]
434
435
435 if ax.firsttime:
436 if ax.firsttime:
436 ax.plt = ax.pcolormesh(x , y, numpy.flip(nspc[pair[1]],axis=0).T,
437 ax.plt = ax.pcolormesh(x , y, numpy.flip(nspc[pair[1]],axis=0).T,
437 vmin=self.zmin,
438 vmin=self.zmin,
438 vmax=self.zmax,
439 vmax=self.zmax,
439 cmap=plt.get_cmap(self.colormap)
440 cmap=plt.get_cmap(self.colormap)
440 )
441 )
441 else:
442 else:
442
443
443 ax.plt.set_array(numpy.flip(nspc[pair[1]],axis=0).T.ravel())
444 ax.plt.set_array(numpy.flip(nspc[pair[1]],axis=0).T.ravel())
444 self.titles.append('CH {}: {:3.2f}dB'.format(pair[1], noise[pair[1]]))
445 self.titles.append('CH {}: {:3.2f}dB'.format(pair[1], noise[pair[1]]))
445
446
446 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
447 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
447 coh = numpy.abs(out)
448 coh = numpy.abs(out)
448 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
449 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
449
450
450 ax = self.axes[4 * n + 2]
451 ax = self.axes[4 * n + 2]
451 if ax.firsttime:
452 if ax.firsttime:
452 ax.plt = ax.pcolormesh(x, y, numpy.flip(coh,axis=0).T,
453 ax.plt = ax.pcolormesh(x, y, numpy.flip(coh,axis=0).T,
453 vmin=0,
454 vmin=0,
454 vmax=1,
455 vmax=1,
455 cmap=plt.get_cmap(self.colormap_coh)
456 cmap=plt.get_cmap(self.colormap_coh)
456 )
457 )
457 else:
458 else:
458 ax.plt.set_array(numpy.flip(coh,axis=0).T.ravel())
459 ax.plt.set_array(numpy.flip(coh,axis=0).T.ravel())
459 self.titles.append(
460 self.titles.append(
460 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
461 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
461
462
462 ax = self.axes[4 * n + 3]
463 ax = self.axes[4 * n + 3]
463 if ax.firsttime:
464 if ax.firsttime:
464 ax.plt = ax.pcolormesh(x, y, numpy.flip(phase,axis=0).T,
465 ax.plt = ax.pcolormesh(x, y, numpy.flip(phase,axis=0).T,
465 vmin=-180,
466 vmin=-180,
466 vmax=180,
467 vmax=180,
467 cmap=plt.get_cmap(self.colormap_phase)
468 cmap=plt.get_cmap(self.colormap_phase)
468 )
469 )
469 else:
470 else:
470 ax.plt.set_array(numpy.flip(phase,axis=0).T.ravel())
471 ax.plt.set_array(numpy.flip(phase,axis=0).T.ravel())
471 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
472 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
472
473
473
474
474 class CrossSpectra2Plot(Plot):
475 class CrossSpectra2Plot(Plot):
475
476
476 CODE = 'cspc'
477 CODE = 'cspc'
477 colormap = 'jet'
478 colormap = 'jet'
478 plot_type = 'pcolor'
479 plot_type = 'pcolor'
479 zmin_coh = None
480 zmin_coh = None
480 zmax_coh = None
481 zmax_coh = None
481 zmin_phase = None
482 zmin_phase = None
482 zmax_phase = None
483 zmax_phase = None
483
484
484 def setup(self):
485 def setup(self):
485
486
486 self.ncols = 1
487 self.ncols = 1
487 self.nrows = len(self.data.pairs)
488 self.nrows = len(self.data.pairs)
488 self.nplots = self.nrows * 1
489 self.nplots = self.nrows * 1
489 self.width = 3.1 * self.ncols
490 self.width = 3.1 * self.ncols
490 self.height = 5 * self.nrows
491 self.height = 5 * self.nrows
491 self.ylabel = 'Range [km]'
492 self.ylabel = 'Range [km]'
492 self.showprofile = False
493 self.showprofile = False
493 self.plots_adjust.update({'left': 0.22, 'right': .90, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
494 self.plots_adjust.update({'left': 0.22, 'right': .90, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
494
495
495 def plot(self):
496 def plot(self):
496
497
497 if self.xaxis == "frequency":
498 if self.xaxis == "frequency":
498 x = self.data.xrange[0]
499 x = self.data.xrange[0]
499 self.xlabel = "Frequency (kHz)"
500 self.xlabel = "Frequency (kHz)"
500 elif self.xaxis == "time":
501 elif self.xaxis == "time":
501 x = self.data.xrange[1]
502 x = self.data.xrange[1]
502 self.xlabel = "Time (ms)"
503 self.xlabel = "Time (ms)"
503 else:
504 else:
504 x = self.data.xrange[2]
505 x = self.data.xrange[2]
505 self.xlabel = "Velocity (m/s)"
506 self.xlabel = "Velocity (m/s)"
506
507
507 self.titles = []
508 self.titles = []
508
509
509
510
510 y = self.data.heights
511 y = self.data.heights
511 self.y = y
512 self.y = y
512 #nspc = self.data['spc']
513 #nspc = self.data['spc']
513 #print(numpy.shape(self.data['spc']))
514 #print(numpy.shape(self.data['spc']))
514 #spc = self.data['cspc'][0]
515 #spc = self.data['cspc'][0]
515 #print(numpy.shape(spc))
516 #print(numpy.shape(spc))
516 #exit()
517 #exit()
517 cspc = self.data['cspc'][1]
518 cspc = self.data['cspc'][1]
518 #print(numpy.shape(cspc))
519 #print(numpy.shape(cspc))
519 #exit()
520 #exit()
520
521
521 for n in range(self.nrows):
522 for n in range(self.nrows):
522 noise = self.data['noise'][:,-1]
523 noise = self.data['noise'][:,-1]
523 pair = self.data.pairs[n]
524 pair = self.data.pairs[n]
524 #print(pair) #exit()
525 #print(pair) #exit()
525
526
526
527
527
528
528 out = cspc[n]# / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
529 out = cspc[n]# / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
529
530
530 #print(out[:,53])
531 #print(out[:,53])
531 #exit()
532 #exit()
532 cross = numpy.abs(out)
533 cross = numpy.abs(out)
533 z = cross/self.data.nFactor
534 z = cross/self.data.nFactor
534 #print("here")
535 #print("here")
535 #print(dataOut.data_spc[0,0,0])
536 #print(dataOut.data_spc[0,0,0])
536 #exit()
537 #exit()
537
538
538 cross = 10*numpy.log10(z)
539 cross = 10*numpy.log10(z)
539 #print(numpy.shape(cross))
540 #print(numpy.shape(cross))
540 #print(cross[0,:])
541 #print(cross[0,:])
541 #print(self.data.nFactor)
542 #print(self.data.nFactor)
542 #exit()
543 #exit()
543 #phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
544 #phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
544
545
545 ax = self.axes[1 * n]
546 ax = self.axes[1 * n]
546 if ax.firsttime:
547 if ax.firsttime:
547 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
548 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
548 self.xmin = self.xmin if self.xmin else -self.xmax
549 self.xmin = self.xmin if self.xmin else -self.xmax
549 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
550 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
550 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
551 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
551 ax.plt = ax.pcolormesh(x, y, cross.T,
552 ax.plt = ax.pcolormesh(x, y, cross.T,
552 vmin=self.zmin,
553 vmin=self.zmin,
553 vmax=self.zmax,
554 vmax=self.zmax,
554 cmap=plt.get_cmap(self.colormap)
555 cmap=plt.get_cmap(self.colormap)
555 )
556 )
556 else:
557 else:
557 ax.plt.set_array(cross.T.ravel())
558 ax.plt.set_array(cross.T.ravel())
558 self.titles.append(
559 self.titles.append(
559 'Cross Spectra Power Ch{} * Ch{}'.format(pair[0], pair[1]))
560 'Cross Spectra Power Ch{} * Ch{}'.format(pair[0], pair[1]))
560
561
561
562
562 class CrossSpectra3Plot(Plot):
563 class CrossSpectra3Plot(Plot):
563
564
564 CODE = 'cspc'
565 CODE = 'cspc'
565 colormap = 'jet'
566 colormap = 'jet'
566 plot_type = 'pcolor'
567 plot_type = 'pcolor'
567 zmin_coh = None
568 zmin_coh = None
568 zmax_coh = None
569 zmax_coh = None
569 zmin_phase = None
570 zmin_phase = None
570 zmax_phase = None
571 zmax_phase = None
571
572
572 def setup(self):
573 def setup(self):
573
574
574 self.ncols = 3
575 self.ncols = 3
575 self.nrows = len(self.data.pairs)
576 self.nrows = len(self.data.pairs)
576 self.nplots = self.nrows * 3
577 self.nplots = self.nrows * 3
577 self.width = 3.1 * self.ncols
578 self.width = 3.1 * self.ncols
578 self.height = 5 * self.nrows
579 self.height = 5 * self.nrows
579 self.ylabel = 'Range [km]'
580 self.ylabel = 'Range [km]'
580 self.showprofile = False
581 self.showprofile = False
581 self.plots_adjust.update({'left': 0.22, 'right': .90, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
582 self.plots_adjust.update({'left': 0.22, 'right': .90, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
582
583
583 def plot(self):
584 def plot(self):
584
585
585 if self.xaxis == "frequency":
586 if self.xaxis == "frequency":
586 x = self.data.xrange[0]
587 x = self.data.xrange[0]
587 self.xlabel = "Frequency (kHz)"
588 self.xlabel = "Frequency (kHz)"
588 elif self.xaxis == "time":
589 elif self.xaxis == "time":
589 x = self.data.xrange[1]
590 x = self.data.xrange[1]
590 self.xlabel = "Time (ms)"
591 self.xlabel = "Time (ms)"
591 else:
592 else:
592 x = self.data.xrange[2]
593 x = self.data.xrange[2]
593 self.xlabel = "Velocity (m/s)"
594 self.xlabel = "Velocity (m/s)"
594
595
595 self.titles = []
596 self.titles = []
596
597
597
598
598 y = self.data.heights
599 y = self.data.heights
599 self.y = y
600 self.y = y
600 #nspc = self.data['spc']
601 #nspc = self.data['spc']
601 #print(numpy.shape(self.data['spc']))
602 #print(numpy.shape(self.data['spc']))
602 #spc = self.data['cspc'][0]
603 #spc = self.data['cspc'][0]
603 #print(numpy.shape(spc))
604 #print(numpy.shape(spc))
604 #exit()
605 #exit()
605 cspc = self.data['cspc'][1]
606 cspc = self.data['cspc'][1]
606 #print(numpy.shape(cspc))
607 #print(numpy.shape(cspc))
607 #exit()
608 #exit()
608
609
609 for n in range(self.nrows):
610 for n in range(self.nrows):
610 noise = self.data['noise'][:,-1]
611 noise = self.data['noise'][:,-1]
611 pair = self.data.pairs[n]
612 pair = self.data.pairs[n]
612 #print(pair) #exit()
613 #print(pair) #exit()
613
614
614
615
615
616
616 out = cspc[n]# / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
617 out = cspc[n]# / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
617
618
618 #print(out[:,53])
619 #print(out[:,53])
619 #exit()
620 #exit()
620 cross = numpy.abs(out)
621 cross = numpy.abs(out)
621 z = cross/self.data.nFactor
622 z = cross/self.data.nFactor
622 cross = 10*numpy.log10(z)
623 cross = 10*numpy.log10(z)
623
624
624 out_r= out.real/self.data.nFactor
625 out_r= out.real/self.data.nFactor
625 #out_r = 10*numpy.log10(out_r)
626 #out_r = 10*numpy.log10(out_r)
626
627
627 out_i= out.imag/self.data.nFactor
628 out_i= out.imag/self.data.nFactor
628 #out_i = 10*numpy.log10(out_i)
629 #out_i = 10*numpy.log10(out_i)
629 #print(numpy.shape(cross))
630 #print(numpy.shape(cross))
630 #print(cross[0,:])
631 #print(cross[0,:])
631 #print(self.data.nFactor)
632 #print(self.data.nFactor)
632 #exit()
633 #exit()
633 #phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
634 #phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
634
635
635 ax = self.axes[3 * n]
636 ax = self.axes[3 * n]
636 if ax.firsttime:
637 if ax.firsttime:
637 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
638 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
638 self.xmin = self.xmin if self.xmin else -self.xmax
639 self.xmin = self.xmin if self.xmin else -self.xmax
639 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
640 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
640 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
641 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
641 ax.plt = ax.pcolormesh(x, y, cross.T,
642 ax.plt = ax.pcolormesh(x, y, cross.T,
642 vmin=self.zmin,
643 vmin=self.zmin,
643 vmax=self.zmax,
644 vmax=self.zmax,
644 cmap=plt.get_cmap(self.colormap)
645 cmap=plt.get_cmap(self.colormap)
645 )
646 )
646 else:
647 else:
647 ax.plt.set_array(cross.T.ravel())
648 ax.plt.set_array(cross.T.ravel())
648 self.titles.append(
649 self.titles.append(
649 'Cross Spectra Power Ch{} * Ch{}'.format(pair[0], pair[1]))
650 'Cross Spectra Power Ch{} * Ch{}'.format(pair[0], pair[1]))
650
651
651 ax = self.axes[3 * n + 1]
652 ax = self.axes[3 * n + 1]
652 if ax.firsttime:
653 if ax.firsttime:
653 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
654 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
654 self.xmin = self.xmin if self.xmin else -self.xmax
655 self.xmin = self.xmin if self.xmin else -self.xmax
655 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
656 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
656 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
657 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
657 ax.plt = ax.pcolormesh(x, y, out_r.T,
658 ax.plt = ax.pcolormesh(x, y, out_r.T,
658 vmin=-1.e6,
659 vmin=-1.e6,
659 vmax=0,
660 vmax=0,
660 cmap=plt.get_cmap(self.colormap)
661 cmap=plt.get_cmap(self.colormap)
661 )
662 )
662 else:
663 else:
663 ax.plt.set_array(out_r.T.ravel())
664 ax.plt.set_array(out_r.T.ravel())
664 self.titles.append(
665 self.titles.append(
665 'Cross Spectra Real Ch{} * Ch{}'.format(pair[0], pair[1]))
666 'Cross Spectra Real Ch{} * Ch{}'.format(pair[0], pair[1]))
666
667
667 ax = self.axes[3 * n + 2]
668 ax = self.axes[3 * n + 2]
668
669
669
670
670 if ax.firsttime:
671 if ax.firsttime:
671 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
672 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
672 self.xmin = self.xmin if self.xmin else -self.xmax
673 self.xmin = self.xmin if self.xmin else -self.xmax
673 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
674 self.zmin = self.zmin if self.zmin else numpy.nanmin(cross)
674 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
675 self.zmax = self.zmax if self.zmax else numpy.nanmax(cross)
675 ax.plt = ax.pcolormesh(x, y, out_i.T,
676 ax.plt = ax.pcolormesh(x, y, out_i.T,
676 vmin=-1.e6,
677 vmin=-1.e6,
677 vmax=1.e6,
678 vmax=1.e6,
678 cmap=plt.get_cmap(self.colormap)
679 cmap=plt.get_cmap(self.colormap)
679 )
680 )
680 else:
681 else:
681 ax.plt.set_array(out_i.T.ravel())
682 ax.plt.set_array(out_i.T.ravel())
682 self.titles.append(
683 self.titles.append(
683 'Cross Spectra Imag Ch{} * Ch{}'.format(pair[0], pair[1]))
684 'Cross Spectra Imag Ch{} * Ch{}'.format(pair[0], pair[1]))
684
685
685 class RTIPlot(Plot):
686 class RTIPlot(Plot):
686 '''
687 '''
687 Plot for RTI data
688 Plot for RTI data
688 '''
689 '''
689
690
690 CODE = 'rti'
691 CODE = 'rti'
691 colormap = 'jet'
692 colormap = 'jet'
692 plot_type = 'pcolorbuffer'
693 plot_type = 'pcolorbuffer'
693
694
694 def setup(self):
695 def setup(self):
695 self.xaxis = 'time'
696 self.xaxis = 'time'
696 self.ncols = 1
697 self.ncols = 1
697 self.nrows = len(self.data.channels)
698 self.nrows = len(self.data.channels)
698 self.nplots = len(self.data.channels)
699 self.nplots = len(self.data.channels)
699 self.ylabel = 'Range [km]'
700 self.ylabel = 'Range [km]'
700 self.xlabel = 'Time'
701 self.xlabel = 'Time'
701 self.cb_label = 'dB'
702 self.cb_label = 'dB'
702 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.1, 'right':0.95})
703 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.1, 'right':0.95})
703 self.titles = ['{} Channel {}'.format(
704 self.titles = ['{} Channel {}'.format(
704 self.CODE.upper(), x) for x in range(self.nrows)]
705 self.CODE.upper(), x) for x in range(self.nrows)]
705
706
706 def update(self, dataOut):
707 def update(self, dataOut):
707
708
708 data = {}
709 data = {}
709 meta = {}
710 meta = {}
710 data['rti'] = dataOut.getPower()
711 data['rti'] = dataOut.getPower()
711 #print(numpy.shape(data['rti']))
712 #print(numpy.shape(data['rti']))
712
713
713 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
714 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
714
715
715 return data, meta
716 return data, meta
716
717
717 def plot(self):
718 def plot(self):
718
719
719 self.x = self.data.times
720 self.x = self.data.times
720 self.y = self.data.yrange
721 self.y = self.data.yrange
721 self.z = self.data[self.CODE]
722 self.z = self.data[self.CODE]
722 #print("Inside RTI: ", self.z)
723 #print("Inside RTI: ", self.z)
723 self.z = numpy.ma.masked_invalid(self.z)
724 self.z = numpy.ma.masked_invalid(self.z)
724
725
725 if self.decimation is None:
726 if self.decimation is None:
726 x, y, z = self.fill_gaps(self.x, self.y, self.z)
727 x, y, z = self.fill_gaps(self.x, self.y, self.z)
727 else:
728 else:
728 x, y, z = self.fill_gaps(*self.decimate())
729 x, y, z = self.fill_gaps(*self.decimate())
729 #print("self.z: ", self.z)
730 #print("self.z: ", self.z)
730 #exit(1)
731 #exit(1)
731 '''
732 '''
732 if not isinstance(self.zmin, collections.abc.Sequence):
733 if not isinstance(self.zmin, collections.abc.Sequence):
733 if not self.zmin:
734 if not self.zmin:
734 self.zmin = [numpy.min(self.z)]*len(self.axes)
735 self.zmin = [numpy.min(self.z)]*len(self.axes)
735 else:
736 else:
736 self.zmin = [self.zmin]*len(self.axes)
737 self.zmin = [self.zmin]*len(self.axes)
737
738
738 if not isinstance(self.zmax, collections.abc.Sequence):
739 if not isinstance(self.zmax, collections.abc.Sequence):
739 if not self.zmax:
740 if not self.zmax:
740 self.zmax = [numpy.max(self.z)]*len(self.axes)
741 self.zmax = [numpy.max(self.z)]*len(self.axes)
741 else:
742 else:
742 self.zmax = [self.zmax]*len(self.axes)
743 self.zmax = [self.zmax]*len(self.axes)
743 '''
744 '''
744 for n, ax in enumerate(self.axes):
745 for n, ax in enumerate(self.axes):
745
746
746 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
747 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
747 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
748 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
748
749
749 if ax.firsttime:
750 if ax.firsttime:
750 if self.zlimits is not None:
751 if self.zlimits is not None:
751 self.zmin, self.zmax = self.zlimits[n]
752 self.zmin, self.zmax = self.zlimits[n]
752 ax.plt = ax.pcolormesh(x, y, z[n].T,
753 ax.plt = ax.pcolormesh(x, y, z[n].T,
753 vmin=self.zmin,
754 vmin=self.zmin,
754 vmax=self.zmax,
755 vmax=self.zmax,
755 cmap=plt.get_cmap(self.colormap)
756 cmap=plt.get_cmap(self.colormap)
756 )
757 )
757 if self.showprofile:
758 if self.showprofile:
758 ax.plot_profile = self.pf_axes[n].plot(
759 ax.plot_profile = self.pf_axes[n].plot(
759 self.data['rti'][n][-1], self.y)[0]
760 self.data['rti'][n][-1], self.y)[0]
760 ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(self.data['noise'][n][-1], len(self.y)), self.y,
761 ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(self.data['noise'][n][-1], len(self.y)), self.y,
761 color="k", linestyle="dashed", lw=1)[0]
762 color="k", linestyle="dashed", lw=1)[0]
762 else:
763 else:
763 if self.zlimits is not None:
764 if self.zlimits is not None:
764 self.zmin, self.zmax = self.zlimits[n]
765 self.zmin, self.zmax = self.zlimits[n]
765 ax.plt.remove()
766 ax.plt.remove()
766 ax.plt = ax.pcolormesh(x, y, z[n].T,
767 ax.plt = ax.pcolormesh(x, y, z[n].T,
767 vmin=self.zmin,
768 vmin=self.zmin,
768 vmax=self.zmax,
769 vmax=self.zmax,
769 cmap=plt.get_cmap(self.colormap)
770 cmap=plt.get_cmap(self.colormap)
770 )
771 )
771 if self.showprofile:
772 if self.showprofile:
772 ax.plot_profile.set_data(self.data['rti'][n][-1], self.y)
773 ax.plot_profile.set_data(self.data['rti'][n][-1], self.y)
773 ax.plot_noise.set_data(numpy.repeat(
774 ax.plot_noise.set_data(numpy.repeat(
774 self.data['noise'][n][-1], len(self.y)), self.y)
775 self.data['noise'][n][-1], len(self.y)), self.y)
775
776
776
777
777 class SpectrogramPlot(Plot):
778 class SpectrogramPlot(Plot):
778 '''
779 '''
779 Plot for Spectrogram data
780 Plot for Spectrogram data
780 '''
781 '''
781
782
782 CODE = 'Spectrogram_Profile'
783 CODE = 'Spectrogram_Profile'
783 colormap = 'binary'
784 colormap = 'binary'
784 plot_type = 'pcolorbuffer'
785 plot_type = 'pcolorbuffer'
785
786
786 def setup(self):
787 def setup(self):
787 self.xaxis = 'time'
788 self.xaxis = 'time'
788 self.ncols = 1
789 self.ncols = 1
789 self.nrows = len(self.data.channels)
790 self.nrows = len(self.data.channels)
790 self.nplots = len(self.data.channels)
791 self.nplots = len(self.data.channels)
791 self.xlabel = 'Time'
792 self.xlabel = 'Time'
792 #self.cb_label = 'dB'
793 #self.cb_label = 'dB'
793 self.plots_adjust.update({'hspace':1.2, 'left': 0.1, 'bottom': 0.12, 'right':0.95})
794 self.plots_adjust.update({'hspace':1.2, 'left': 0.1, 'bottom': 0.12, 'right':0.95})
794 self.titles = []
795 self.titles = []
795
796
796 #self.titles = ['{} Channel {} \n H = {} km ({} - {})'.format(
797 #self.titles = ['{} Channel {} \n H = {} km ({} - {})'.format(
797 #self.CODE.upper(), x, self.data.heightList[self.data.hei], self.data.heightList[self.data.hei],self.data.heightList[self.data.hei]+(self.data.DH*self.data.nProfiles)) for x in range(self.nrows)]
798 #self.CODE.upper(), x, self.data.heightList[self.data.hei], self.data.heightList[self.data.hei],self.data.heightList[self.data.hei]+(self.data.DH*self.data.nProfiles)) for x in range(self.nrows)]
798
799
799 self.titles = ['{} Channel {}'.format(
800 self.titles = ['{} Channel {}'.format(
800 self.CODE.upper(), x) for x in range(self.nrows)]
801 self.CODE.upper(), x) for x in range(self.nrows)]
801
802
802
803
803 def update(self, dataOut):
804 def update(self, dataOut):
804 data = {}
805 data = {}
805 meta = {}
806 meta = {}
806
807
807 maxHei = 1620#+12000
808 maxHei = 1620#+12000
808 maxHei = 1180
809 maxHei = 1180
809 maxHei = 500
810 maxHei = 500
810 indb = numpy.where(dataOut.heightList <= maxHei)
811 indb = numpy.where(dataOut.heightList <= maxHei)
811 hei = indb[0][-1]
812 hei = indb[0][-1]
812 #print(dataOut.heightList)
813 #print(dataOut.heightList)
813
814
814 factor = dataOut.nIncohInt
815 factor = dataOut.nIncohInt
815 z = dataOut.data_spc[:,:,hei] / factor
816 z = dataOut.data_spc[:,:,hei] / factor
816 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
817 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
817 #buffer = 10 * numpy.log10(z)
818 #buffer = 10 * numpy.log10(z)
818
819
819 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
820 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
820
821
821
822
822 #self.hei = hei
823 #self.hei = hei
823 #self.heightList = dataOut.heightList
824 #self.heightList = dataOut.heightList
824 #self.DH = (dataOut.heightList[1] - dataOut.heightList[0])/dataOut.step
825 #self.DH = (dataOut.heightList[1] - dataOut.heightList[0])/dataOut.step
825 #self.nProfiles = dataOut.nProfiles
826 #self.nProfiles = dataOut.nProfiles
826
827
827 data['Spectrogram_Profile'] = 10 * numpy.log10(z)
828 data['Spectrogram_Profile'] = 10 * numpy.log10(z)
828
829
829 data['hei'] = hei
830 data['hei'] = hei
830 data['DH'] = (dataOut.heightList[1] - dataOut.heightList[0])/dataOut.step
831 data['DH'] = (dataOut.heightList[1] - dataOut.heightList[0])/dataOut.step
831 data['nProfiles'] = dataOut.nProfiles
832 data['nProfiles'] = dataOut.nProfiles
832 #meta['yrange'] = dataOut.heightList[0:dataOut.NSHTS]
833 #meta['yrange'] = dataOut.heightList[0:dataOut.NSHTS]
833 '''
834 '''
834 import matplotlib.pyplot as plt
835 import matplotlib.pyplot as plt
835 plt.plot(10 * numpy.log10(z[0,:]))
836 plt.plot(10 * numpy.log10(z[0,:]))
836 plt.show()
837 plt.show()
837
838
838 from time import sleep
839 from time import sleep
839 sleep(10)
840 sleep(10)
840 '''
841 '''
841 return data, meta
842 return data, meta
842
843
843 def plot(self):
844 def plot(self):
844
845
845 self.x = self.data.times
846 self.x = self.data.times
846 self.z = self.data[self.CODE]
847 self.z = self.data[self.CODE]
847 self.y = self.data.xrange[0]
848 self.y = self.data.xrange[0]
848
849
849 hei = self.data['hei'][-1]
850 hei = self.data['hei'][-1]
850 DH = self.data['DH'][-1]
851 DH = self.data['DH'][-1]
851 nProfiles = self.data['nProfiles'][-1]
852 nProfiles = self.data['nProfiles'][-1]
852
853
853 self.ylabel = "Frequency (kHz)"
854 self.ylabel = "Frequency (kHz)"
854
855
855 self.z = numpy.ma.masked_invalid(self.z)
856 self.z = numpy.ma.masked_invalid(self.z)
856
857
857 if self.decimation is None:
858 if self.decimation is None:
858 x, y, z = self.fill_gaps(self.x, self.y, self.z)
859 x, y, z = self.fill_gaps(self.x, self.y, self.z)
859 else:
860 else:
860 x, y, z = self.fill_gaps(*self.decimate())
861 x, y, z = self.fill_gaps(*self.decimate())
861
862
862 for n, ax in enumerate(self.axes):
863 for n, ax in enumerate(self.axes):
863 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
864 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
864 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
865 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
865 data = self.data[-1]
866 data = self.data[-1]
866 if ax.firsttime:
867 if ax.firsttime:
867 ax.plt = ax.pcolormesh(x, y, z[n].T,
868 ax.plt = ax.pcolormesh(x, y, z[n].T,
868 vmin=self.zmin,
869 vmin=self.zmin,
869 vmax=self.zmax,
870 vmax=self.zmax,
870 cmap=plt.get_cmap(self.colormap)
871 cmap=plt.get_cmap(self.colormap)
871 )
872 )
872 else:
873 else:
873 ax.plt.remove()
874 ax.plt.remove()
874 ax.plt = ax.pcolormesh(x, y, z[n].T,
875 ax.plt = ax.pcolormesh(x, y, z[n].T,
875 vmin=self.zmin,
876 vmin=self.zmin,
876 vmax=self.zmax,
877 vmax=self.zmax,
877 cmap=plt.get_cmap(self.colormap)
878 cmap=plt.get_cmap(self.colormap)
878 )
879 )
879
880
880 #self.titles.append('Spectrogram')
881 #self.titles.append('Spectrogram')
881
882
882 #self.titles.append('{} Channel {} \n H = {} km ({} - {})'.format(
883 #self.titles.append('{} Channel {} \n H = {} km ({} - {})'.format(
883 #self.CODE.upper(), x, y[hei], y[hei],y[hei]+(DH*nProfiles)))
884 #self.CODE.upper(), x, y[hei], y[hei],y[hei]+(DH*nProfiles)))
884
885
885
886
886
887
887
888
888 class CoherencePlot(RTIPlot):
889 class CoherencePlot(RTIPlot):
889 '''
890 '''
890 Plot for Coherence data
891 Plot for Coherence data
891 '''
892 '''
892
893
893 CODE = 'coh'
894 CODE = 'coh'
894
895
895 def setup(self):
896 def setup(self):
896 self.xaxis = 'time'
897 self.xaxis = 'time'
897 self.ncols = 1
898 self.ncols = 1
898 self.nrows = len(self.data.pairs)
899 self.nrows = len(self.data.pairs)
899 self.nplots = len(self.data.pairs)
900 self.nplots = len(self.data.pairs)
900 self.ylabel = 'Range [km]'
901 self.ylabel = 'Range [km]'
901 self.xlabel = 'Time'
902 self.xlabel = 'Time'
902 self.plots_adjust.update({'hspace':0.6, 'left': 0.1, 'bottom': 0.1,'right':0.95})
903 self.plots_adjust.update({'hspace':0.6, 'left': 0.1, 'bottom': 0.1,'right':0.95})
903 if self.CODE == 'coh':
904 if self.CODE == 'coh':
904 self.cb_label = ''
905 self.cb_label = ''
905 self.titles = [
906 self.titles = [
906 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
907 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
907 else:
908 else:
908 self.cb_label = 'Degrees'
909 self.cb_label = 'Degrees'
909 self.titles = [
910 self.titles = [
910 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
911 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
911
912
912 def update(self, dataOut):
913 def update(self, dataOut):
913
914
914 data = {}
915 data = {}
915 meta = {}
916 meta = {}
916 data['coh'] = dataOut.getCoherence()
917 data['coh'] = dataOut.getCoherence()
917 meta['pairs'] = dataOut.pairsList
918 meta['pairs'] = dataOut.pairsList
918
919
919 return data, meta
920 return data, meta
920
921
921 class PhasePlot(CoherencePlot):
922 class PhasePlot(CoherencePlot):
922 '''
923 '''
923 Plot for Phase map data
924 Plot for Phase map data
924 '''
925 '''
925
926
926 CODE = 'phase'
927 CODE = 'phase'
927 colormap = 'seismic'
928 colormap = 'seismic'
928
929
929 def update(self, dataOut):
930 def update(self, dataOut):
930
931
931 data = {}
932 data = {}
932 meta = {}
933 meta = {}
933 data['phase'] = dataOut.getCoherence(phase=True)
934 data['phase'] = dataOut.getCoherence(phase=True)
934 meta['pairs'] = dataOut.pairsList
935 meta['pairs'] = dataOut.pairsList
935
936
936 return data, meta
937 return data, meta
937
938
938 class NoisePlot(Plot):
939 class NoisePlot(Plot):
939 '''
940 '''
940 Plot for noise
941 Plot for noise
941 '''
942 '''
942
943
943 CODE = 'noise'
944 CODE = 'noise'
944 plot_type = 'scatterbuffer'
945 plot_type = 'scatterbuffer'
945
946
946 def setup(self):
947 def setup(self):
947 self.xaxis = 'time'
948 self.xaxis = 'time'
948 self.ncols = 1
949 self.ncols = 1
949 self.nrows = 1
950 self.nrows = 1
950 self.nplots = 1
951 self.nplots = 1
951 self.ylabel = 'Intensity [dB]'
952 self.ylabel = 'Intensity [dB]'
952 self.xlabel = 'Time'
953 self.xlabel = 'Time'
953 self.titles = ['Noise']
954 self.titles = ['Noise']
954 self.colorbar = False
955 self.colorbar = False
955 self.plots_adjust.update({'right': 0.85 })
956 self.plots_adjust.update({'right': 0.85 })
956
957
957 def update(self, dataOut):
958 def update(self, dataOut):
958
959
959 data = {}
960 data = {}
960 meta = {}
961 meta = {}
961 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor).reshape(dataOut.nChannels, 1)
962 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor).reshape(dataOut.nChannels, 1)
962 meta['yrange'] = numpy.array([])
963 meta['yrange'] = numpy.array([])
963
964
964 return data, meta
965 return data, meta
965
966
966 def plot(self):
967 def plot(self):
967
968
968 x = self.data.times
969 x = self.data.times
969 xmin = self.data.min_time
970 xmin = self.data.min_time
970 xmax = xmin + self.xrange * 60 * 60
971 xmax = xmin + self.xrange * 60 * 60
971 Y = self.data['noise']
972 Y = self.data['noise']
972
973
973 if self.axes[0].firsttime:
974 if self.axes[0].firsttime:
974 self.ymin = numpy.nanmin(Y) - 5
975 self.ymin = numpy.nanmin(Y) - 5
975 self.ymax = numpy.nanmax(Y) + 5
976 self.ymax = numpy.nanmax(Y) + 5
976 for ch in self.data.channels:
977 for ch in self.data.channels:
977 y = Y[ch]
978 y = Y[ch]
978 self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch))
979 self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch))
979 plt.legend(bbox_to_anchor=(1.18, 1.0))
980 plt.legend(bbox_to_anchor=(1.18, 1.0))
980 else:
981 else:
981 for ch in self.data.channels:
982 for ch in self.data.channels:
982 y = Y[ch]
983 y = Y[ch]
983 self.axes[0].lines[ch].set_data(x, y)
984 self.axes[0].lines[ch].set_data(x, y)
984
985
985 self.ymin = numpy.nanmin(Y) - 5
986 self.ymin = numpy.nanmin(Y) - 5
986 self.ymax = numpy.nanmax(Y) + 10
987 self.ymax = numpy.nanmax(Y) + 10
987
988
988
989
989 class PowerProfilePlot(Plot):
990 class PowerProfilePlot(Plot):
990
991
991 CODE = 'pow_profile'
992 CODE = 'pow_profile'
992 plot_type = 'scatter'
993 plot_type = 'scatter'
993
994
994 def setup(self):
995 def setup(self):
995
996
996 self.ncols = 1
997 self.ncols = 1
997 self.nrows = 1
998 self.nrows = 1
998 self.nplots = 1
999 self.nplots = 1
999 self.height = 4
1000 self.height = 4
1000 self.width = 3
1001 self.width = 3
1001 self.ylabel = 'Range [km]'
1002 self.ylabel = 'Range [km]'
1002 self.xlabel = 'Intensity [dB]'
1003 self.xlabel = 'Intensity [dB]'
1003 self.titles = ['Power Profile']
1004 self.titles = ['Power Profile']
1004 self.colorbar = False
1005 self.colorbar = False
1005
1006
1006 def update(self, dataOut):
1007 def update(self, dataOut):
1007
1008
1008 data = {}
1009 data = {}
1009 meta = {}
1010 meta = {}
1010 data[self.CODE] = dataOut.getPower()
1011 data[self.CODE] = dataOut.getPower()
1011
1012
1012 return data, meta
1013 return data, meta
1013
1014
1014 def plot(self):
1015 def plot(self):
1015
1016
1016 y = self.data.yrange
1017 y = self.data.yrange
1017 self.y = y
1018 self.y = y
1018
1019
1019 x = self.data[-1][self.CODE]
1020 x = self.data[-1][self.CODE]
1020
1021
1021 if self.xmin is None: self.xmin = numpy.nanmin(x)*0.9
1022 if self.xmin is None: self.xmin = numpy.nanmin(x)*0.9
1022 if self.xmax is None: self.xmax = numpy.nanmax(x)*1.1
1023 if self.xmax is None: self.xmax = numpy.nanmax(x)*1.1
1023
1024
1024 if self.axes[0].firsttime:
1025 if self.axes[0].firsttime:
1025 for ch in self.data.channels:
1026 for ch in self.data.channels:
1026 self.axes[0].plot(x[ch], y, lw=1, label='Ch{}'.format(ch))
1027 self.axes[0].plot(x[ch], y, lw=1, label='Ch{}'.format(ch))
1027 plt.legend()
1028 plt.legend()
1028 else:
1029 else:
1029 for ch in self.data.channels:
1030 for ch in self.data.channels:
1030 self.axes[0].lines[ch].set_data(x[ch], y)
1031 self.axes[0].lines[ch].set_data(x[ch], y)
1031
1032
1032
1033
1033 class SpectraCutPlot(Plot):
1034 class SpectraCutPlot(Plot):
1034
1035
1035 CODE = 'spc_cut'
1036 CODE = 'spc_cut'
1036 plot_type = 'scatter'
1037 plot_type = 'scatter'
1037 buffering = False
1038 buffering = False
1038
1039
1039 def setup(self):
1040 def setup(self):
1040
1041
1041 self.nplots = len(self.data.channels)
1042 self.nplots = len(self.data.channels)
1042 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
1043 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
1043 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
1044 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
1044 self.width = 3.4 * self.ncols + 1.5
1045 self.width = 3.4 * self.ncols + 1.5
1045 self.height = 3 * self.nrows
1046 self.height = 3 * self.nrows
1046 self.ylabel = 'Power [dB]'
1047 self.ylabel = 'Power [dB]'
1047 self.colorbar = False
1048 self.colorbar = False
1048 self.plots_adjust.update({'left':0.1, 'hspace':0.3, 'right': 0.75, 'bottom':0.08})
1049 self.plots_adjust.update({'left':0.1, 'hspace':0.3, 'right': 0.75, 'bottom':0.08})
1049
1050
1050 def update(self, dataOut):
1051 def update(self, dataOut):
1051
1052
1052 data = {}
1053 data = {}
1053 meta = {}
1054 meta = {}
1054 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
1055 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
1055 data['spc'] = spc
1056 data['spc'] = spc
1056 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
1057 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
1057 if self.CODE == 'cut_gaussian_fit':
1058 if self.CODE == 'cut_gaussian_fit':
1058 data['gauss_fit0'] = 10*numpy.log10(dataOut.GaussFit0/dataOut.normFactor)
1059 data['gauss_fit0'] = 10*numpy.log10(dataOut.GaussFit0/dataOut.normFactor)
1059 data['gauss_fit1'] = 10*numpy.log10(dataOut.GaussFit1/dataOut.normFactor)
1060 data['gauss_fit1'] = 10*numpy.log10(dataOut.GaussFit1/dataOut.normFactor)
1060 return data, meta
1061 return data, meta
1061
1062
1062 def plot(self):
1063 def plot(self):
1063 if self.xaxis == "frequency":
1064 if self.xaxis == "frequency":
1064 x = self.data.xrange[0][1:]
1065 x = self.data.xrange[0][1:]
1065 self.xlabel = "Frequency (kHz)"
1066 self.xlabel = "Frequency (kHz)"
1066 elif self.xaxis == "time":
1067 elif self.xaxis == "time":
1067 x = self.data.xrange[1]
1068 x = self.data.xrange[1]
1068 self.xlabel = "Time (ms)"
1069 self.xlabel = "Time (ms)"
1069 else:
1070 else:
1070 x = self.data.xrange[2][:-1]
1071 x = self.data.xrange[2][:-1]
1071 self.xlabel = "Velocity (m/s)"
1072 self.xlabel = "Velocity (m/s)"
1072
1073
1073 if self.CODE == 'cut_gaussian_fit':
1074 if self.CODE == 'cut_gaussian_fit':
1074 x = self.data.xrange[2][:-1]
1075 x = self.data.xrange[2][:-1]
1075 self.xlabel = "Velocity (m/s)"
1076 self.xlabel = "Velocity (m/s)"
1076
1077
1077 self.titles = []
1078 self.titles = []
1078
1079
1079 y = self.data.yrange
1080 y = self.data.yrange
1080 data = self.data[-1]
1081 data = self.data[-1]
1081 z = data['spc']
1082 z = data['spc']
1082
1083
1083 if self.height_index:
1084 if self.height_index:
1084 index = numpy.array(self.height_index)
1085 index = numpy.array(self.height_index)
1085 else:
1086 else:
1086 index = numpy.arange(0, len(y), int((len(y))/9))
1087 index = numpy.arange(0, len(y), int((len(y))/9))
1087
1088
1088 for n, ax in enumerate(self.axes):
1089 for n, ax in enumerate(self.axes):
1089 if self.CODE == 'cut_gaussian_fit':
1090 if self.CODE == 'cut_gaussian_fit':
1090 gau0 = data['gauss_fit0']
1091 gau0 = data['gauss_fit0']
1091 gau1 = data['gauss_fit1']
1092 gau1 = data['gauss_fit1']
1092 if ax.firsttime:
1093 if ax.firsttime:
1093 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
1094 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
1094 self.xmin = self.xmin if self.xmin else -self.xmax
1095 self.xmin = self.xmin if self.xmin else -self.xmax
1095 self.ymin = self.ymin if self.ymin else numpy.nanmin(z[:,:,index])
1096 self.ymin = self.ymin if self.ymin else numpy.nanmin(z[:,:,index])
1096 self.ymax = self.ymax if self.ymax else numpy.nanmax(z[:,:,index])
1097 self.ymax = self.ymax if self.ymax else numpy.nanmax(z[:,:,index])
1097 #print(self.ymax)
1098 #print(self.ymax)
1098 #print(z[n, :, index])
1099 #print(z[n, :, index])
1099 ax.plt = ax.plot(x, z[n, :, index].T, lw=0.25)
1100 ax.plt = ax.plot(x, z[n, :, index].T, lw=0.25)
1100 if self.CODE == 'cut_gaussian_fit':
1101 if self.CODE == 'cut_gaussian_fit':
1101 ax.plt_gau0 = ax.plot(x, gau0[n, :, index].T, lw=1, linestyle='-.')
1102 ax.plt_gau0 = ax.plot(x, gau0[n, :, index].T, lw=1, linestyle='-.')
1102 for i, line in enumerate(ax.plt_gau0):
1103 for i, line in enumerate(ax.plt_gau0):
1103 line.set_color(ax.plt[i].get_color())
1104 line.set_color(ax.plt[i].get_color())
1104 ax.plt_gau1 = ax.plot(x, gau1[n, :, index].T, lw=1, linestyle='--')
1105 ax.plt_gau1 = ax.plot(x, gau1[n, :, index].T, lw=1, linestyle='--')
1105 for i, line in enumerate(ax.plt_gau1):
1106 for i, line in enumerate(ax.plt_gau1):
1106 line.set_color(ax.plt[i].get_color())
1107 line.set_color(ax.plt[i].get_color())
1107 labels = ['Range = {:2.1f}km'.format(y[i]) for i in index]
1108 labels = ['Range = {:2.1f}km'.format(y[i]) for i in index]
1108 self.figures[0].legend(ax.plt, labels, loc='center right')
1109 self.figures[0].legend(ax.plt, labels, loc='center right')
1109 else:
1110 else:
1110 for i, line in enumerate(ax.plt):
1111 for i, line in enumerate(ax.plt):
1111 line.set_data(x, z[n, :, index[i]].T)
1112 line.set_data(x, z[n, :, index[i]].T)
1112 for i, line in enumerate(ax.plt_gau0):
1113 for i, line in enumerate(ax.plt_gau0):
1113 line.set_data(x, gau0[n, :, index[i]].T)
1114 line.set_data(x, gau0[n, :, index[i]].T)
1114 line.set_color(ax.plt[i].get_color())
1115 line.set_color(ax.plt[i].get_color())
1115 for i, line in enumerate(ax.plt_gau1):
1116 for i, line in enumerate(ax.plt_gau1):
1116 line.set_data(x, gau1[n, :, index[i]].T)
1117 line.set_data(x, gau1[n, :, index[i]].T)
1117 line.set_color(ax.plt[i].get_color())
1118 line.set_color(ax.plt[i].get_color())
1118 self.titles.append('CH {}'.format(n))
1119 self.titles.append('CH {}'.format(n))
1119
1120
1120
1121
1121 class BeaconPhase(Plot):
1122 class BeaconPhase(Plot):
1122
1123
1123 __isConfig = None
1124 __isConfig = None
1124 __nsubplots = None
1125 __nsubplots = None
1125
1126
1126 PREFIX = 'beacon_phase'
1127 PREFIX = 'beacon_phase'
1127
1128
1128 def __init__(self):
1129 def __init__(self):
1129 Plot.__init__(self)
1130 Plot.__init__(self)
1130 self.timerange = 24*60*60
1131 self.timerange = 24*60*60
1131 self.isConfig = False
1132 self.isConfig = False
1132 self.__nsubplots = 1
1133 self.__nsubplots = 1
1133 self.counter_imagwr = 0
1134 self.counter_imagwr = 0
1134 self.WIDTH = 800
1135 self.WIDTH = 800
1135 self.HEIGHT = 400
1136 self.HEIGHT = 400
1136 self.WIDTHPROF = 120
1137 self.WIDTHPROF = 120
1137 self.HEIGHTPROF = 0
1138 self.HEIGHTPROF = 0
1138 self.xdata = None
1139 self.xdata = None
1139 self.ydata = None
1140 self.ydata = None
1140
1141
1141 self.PLOT_CODE = BEACON_CODE
1142 self.PLOT_CODE = BEACON_CODE
1142
1143
1143 self.FTP_WEI = None
1144 self.FTP_WEI = None
1144 self.EXP_CODE = None
1145 self.EXP_CODE = None
1145 self.SUB_EXP_CODE = None
1146 self.SUB_EXP_CODE = None
1146 self.PLOT_POS = None
1147 self.PLOT_POS = None
1147
1148
1148 self.filename_phase = None
1149 self.filename_phase = None
1149
1150
1150 self.figfile = None
1151 self.figfile = None
1151
1152
1152 self.xmin = None
1153 self.xmin = None
1153 self.xmax = None
1154 self.xmax = None
1154
1155
1155 def getSubplots(self):
1156 def getSubplots(self):
1156
1157
1157 ncol = 1
1158 ncol = 1
1158 nrow = 1
1159 nrow = 1
1159
1160
1160 return nrow, ncol
1161 return nrow, ncol
1161
1162
1162 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1163 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
1163
1164
1164 self.__showprofile = showprofile
1165 self.__showprofile = showprofile
1165 self.nplots = nplots
1166 self.nplots = nplots
1166
1167
1167 ncolspan = 7
1168 ncolspan = 7
1168 colspan = 6
1169 colspan = 6
1169 self.__nsubplots = 2
1170 self.__nsubplots = 2
1170
1171
1171 self.createFigure(id = id,
1172 self.createFigure(id = id,
1172 wintitle = wintitle,
1173 wintitle = wintitle,
1173 widthplot = self.WIDTH+self.WIDTHPROF,
1174 widthplot = self.WIDTH+self.WIDTHPROF,
1174 heightplot = self.HEIGHT+self.HEIGHTPROF,
1175 heightplot = self.HEIGHT+self.HEIGHTPROF,
1175 show=show)
1176 show=show)
1176
1177
1177 nrow, ncol = self.getSubplots()
1178 nrow, ncol = self.getSubplots()
1178
1179
1179 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1180 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
1180
1181
1181 def save_phase(self, filename_phase):
1182 def save_phase(self, filename_phase):
1182 f = open(filename_phase,'w+')
1183 f = open(filename_phase,'w+')
1183 f.write('\n\n')
1184 f.write('\n\n')
1184 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1185 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
1185 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1186 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
1186 f.close()
1187 f.close()
1187
1188
1188 def save_data(self, filename_phase, data, data_datetime):
1189 def save_data(self, filename_phase, data, data_datetime):
1189 f=open(filename_phase,'a')
1190 f=open(filename_phase,'a')
1190 timetuple_data = data_datetime.timetuple()
1191 timetuple_data = data_datetime.timetuple()
1191 day = str(timetuple_data.tm_mday)
1192 day = str(timetuple_data.tm_mday)
1192 month = str(timetuple_data.tm_mon)
1193 month = str(timetuple_data.tm_mon)
1193 year = str(timetuple_data.tm_year)
1194 year = str(timetuple_data.tm_year)
1194 hour = str(timetuple_data.tm_hour)
1195 hour = str(timetuple_data.tm_hour)
1195 minute = str(timetuple_data.tm_min)
1196 minute = str(timetuple_data.tm_min)
1196 second = str(timetuple_data.tm_sec)
1197 second = str(timetuple_data.tm_sec)
1197 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1198 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
1198 f.close()
1199 f.close()
1199
1200
1200 def plot(self):
1201 def plot(self):
1201 log.warning('TODO: Not yet implemented...')
1202 log.warning('TODO: Not yet implemented...')
1202
1203
1203 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1204 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
1204 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
1205 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
1205 timerange=None,
1206 timerange=None,
1206 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1207 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
1207 server=None, folder=None, username=None, password=None,
1208 server=None, folder=None, username=None, password=None,
1208 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1209 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
1209
1210
1210 if dataOut.flagNoData:
1211 if dataOut.flagNoData:
1211 return dataOut
1212 return dataOut
1212
1213
1213 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1214 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
1214 return
1215 return
1215
1216
1216 if pairsList == None:
1217 if pairsList == None:
1217 pairsIndexList = dataOut.pairsIndexList[:10]
1218 pairsIndexList = dataOut.pairsIndexList[:10]
1218 else:
1219 else:
1219 pairsIndexList = []
1220 pairsIndexList = []
1220 for pair in pairsList:
1221 for pair in pairsList:
1221 if pair not in dataOut.pairsList:
1222 if pair not in dataOut.pairsList:
1222 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
1223 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
1223 pairsIndexList.append(dataOut.pairsList.index(pair))
1224 pairsIndexList.append(dataOut.pairsList.index(pair))
1224
1225
1225 if pairsIndexList == []:
1226 if pairsIndexList == []:
1226 return
1227 return
1227
1228
1228 # if len(pairsIndexList) > 4:
1229 # if len(pairsIndexList) > 4:
1229 # pairsIndexList = pairsIndexList[0:4]
1230 # pairsIndexList = pairsIndexList[0:4]
1230
1231
1231 hmin_index = None
1232 hmin_index = None
1232 hmax_index = None
1233 hmax_index = None
1233
1234
1234 if hmin != None and hmax != None:
1235 if hmin != None and hmax != None:
1235 indexes = numpy.arange(dataOut.nHeights)
1236 indexes = numpy.arange(dataOut.nHeights)
1236 hmin_list = indexes[dataOut.heightList >= hmin]
1237 hmin_list = indexes[dataOut.heightList >= hmin]
1237 hmax_list = indexes[dataOut.heightList <= hmax]
1238 hmax_list = indexes[dataOut.heightList <= hmax]
1238
1239
1239 if hmin_list.any():
1240 if hmin_list.any():
1240 hmin_index = hmin_list[0]
1241 hmin_index = hmin_list[0]
1241
1242
1242 if hmax_list.any():
1243 if hmax_list.any():
1243 hmax_index = hmax_list[-1]+1
1244 hmax_index = hmax_list[-1]+1
1244
1245
1245 x = dataOut.getTimeRange()
1246 x = dataOut.getTimeRange()
1246
1247
1247 thisDatetime = dataOut.datatime
1248 thisDatetime = dataOut.datatime
1248
1249
1249 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1250 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
1250 xlabel = "Local Time"
1251 xlabel = "Local Time"
1251 ylabel = "Phase (degrees)"
1252 ylabel = "Phase (degrees)"
1252
1253
1253 update_figfile = False
1254 update_figfile = False
1254
1255
1255 nplots = len(pairsIndexList)
1256 nplots = len(pairsIndexList)
1256 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1257 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
1257 phase_beacon = numpy.zeros(len(pairsIndexList))
1258 phase_beacon = numpy.zeros(len(pairsIndexList))
1258 for i in range(nplots):
1259 for i in range(nplots):
1259 pair = dataOut.pairsList[pairsIndexList[i]]
1260 pair = dataOut.pairsList[pairsIndexList[i]]
1260 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
1261 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
1261 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
1262 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
1262 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
1263 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
1263 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1264 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
1264 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1265 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
1265
1266
1266 if dataOut.beacon_heiIndexList:
1267 if dataOut.beacon_heiIndexList:
1267 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1268 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
1268 else:
1269 else:
1269 phase_beacon[i] = numpy.average(phase)
1270 phase_beacon[i] = numpy.average(phase)
1270
1271
1271 if not self.isConfig:
1272 if not self.isConfig:
1272
1273
1273 nplots = len(pairsIndexList)
1274 nplots = len(pairsIndexList)
1274
1275
1275 self.setup(id=id,
1276 self.setup(id=id,
1276 nplots=nplots,
1277 nplots=nplots,
1277 wintitle=wintitle,
1278 wintitle=wintitle,
1278 showprofile=showprofile,
1279 showprofile=showprofile,
1279 show=show)
1280 show=show)
1280
1281
1281 if timerange != None:
1282 if timerange != None:
1282 self.timerange = timerange
1283 self.timerange = timerange
1283
1284
1284 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1285 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
1285
1286
1286 if ymin == None: ymin = 0
1287 if ymin == None: ymin = 0
1287 if ymax == None: ymax = 360
1288 if ymax == None: ymax = 360
1288
1289
1289 self.FTP_WEI = ftp_wei
1290 self.FTP_WEI = ftp_wei
1290 self.EXP_CODE = exp_code
1291 self.EXP_CODE = exp_code
1291 self.SUB_EXP_CODE = sub_exp_code
1292 self.SUB_EXP_CODE = sub_exp_code
1292 self.PLOT_POS = plot_pos
1293 self.PLOT_POS = plot_pos
1293
1294
1294 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1295 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
1295 self.isConfig = True
1296 self.isConfig = True
1296 self.figfile = figfile
1297 self.figfile = figfile
1297 self.xdata = numpy.array([])
1298 self.xdata = numpy.array([])
1298 self.ydata = numpy.array([])
1299 self.ydata = numpy.array([])
1299
1300
1300 update_figfile = True
1301 update_figfile = True
1301
1302
1302 #open file beacon phase
1303 #open file beacon phase
1303 path = '%s%03d' %(self.PREFIX, self.id)
1304 path = '%s%03d' %(self.PREFIX, self.id)
1304 beacon_file = os.path.join(path,'%s.txt'%self.name)
1305 beacon_file = os.path.join(path,'%s.txt'%self.name)
1305 self.filename_phase = os.path.join(figpath,beacon_file)
1306 self.filename_phase = os.path.join(figpath,beacon_file)
1306 #self.save_phase(self.filename_phase)
1307 #self.save_phase(self.filename_phase)
1307
1308
1308
1309
1309 #store data beacon phase
1310 #store data beacon phase
1310 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1311 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
1311
1312
1312 self.setWinTitle(title)
1313 self.setWinTitle(title)
1313
1314
1314
1315
1315 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1316 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
1316
1317
1317 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1318 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
1318
1319
1319 axes = self.axesList[0]
1320 axes = self.axesList[0]
1320
1321
1321 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1322 self.xdata = numpy.hstack((self.xdata, x[0:1]))
1322
1323
1323 if len(self.ydata)==0:
1324 if len(self.ydata)==0:
1324 self.ydata = phase_beacon.reshape(-1,1)
1325 self.ydata = phase_beacon.reshape(-1,1)
1325 else:
1326 else:
1326 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1327 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
1327
1328
1328
1329
1329 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1330 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
1330 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1331 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
1331 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1332 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
1332 XAxisAsTime=True, grid='both'
1333 XAxisAsTime=True, grid='both'
1333 )
1334 )
1334
1335
1335 self.draw()
1336 self.draw()
1336
1337
1337 if dataOut.ltctime >= self.xmax:
1338 if dataOut.ltctime >= self.xmax:
1338 self.counter_imagwr = wr_period
1339 self.counter_imagwr = wr_period
1339 self.isConfig = False
1340 self.isConfig = False
1340 update_figfile = True
1341 update_figfile = True
1341
1342
1342 self.save(figpath=figpath,
1343 self.save(figpath=figpath,
1343 figfile=figfile,
1344 figfile=figfile,
1344 save=save,
1345 save=save,
1345 ftp=ftp,
1346 ftp=ftp,
1346 wr_period=wr_period,
1347 wr_period=wr_period,
1347 thisDatetime=thisDatetime,
1348 thisDatetime=thisDatetime,
1348 update_figfile=update_figfile)
1349 update_figfile=update_figfile)
1349
1350
1350 return dataOut
1351 return dataOut
General Comments 0
You need to be logged in to leave comments. Login now