##// END OF EJS Templates
PPI or RHI mode Detection/GeneralPlot
rflores -
r1461:773419e042d4
parent child
Show More
@@ -257,6 +257,7 class Plot(Operation):
257 257 self.mode = kwargs.get('mode', None)
258 258
259 259
260
260 261 if self.server:
261 262 if not self.server.startswith('tcp://'):
262 263 self.server = 'tcp://{}'.format(self.server)
@@ -514,6 +515,7 class Plot(Operation):
514 515 self.save_time = self.data.max_time
515 516
516 517 fig = self.figures[n]
518 print("save_code",self.save_code)
517 519 if self.throttle == 0:
518 520 if self.oneFigure:
519 521 figname = os.path.join(
@@ -7,7 +7,7 from schainpy.model.graphics.jroplot_base import Plot, plt
7 7 from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot, SpectraCutPlot
8 8 from schainpy.utils import log
9 9 # libreria wradlib
10 import wradlib as wrl
10 #import wradlib as wrl
11 11
12 12 EARTH_RADIUS = 6.3710e3
13 13
@@ -1176,8 +1176,12 class Weather_vRF_Plot(Plot):
1176 1176 r = numpy.arange(len(r_mask))*delta_height
1177 1177 self.y = 2*r
1178 1178
1179 try:
1179 1180 z = data['data'][self.channels[0]][:,r_mask]
1180 1181
1182 except:
1183 z = data['data'][0][:,r_mask]
1184
1181 1185 self.titles = []
1182 1186
1183 1187 self.ymax = self.ymax if self.ymax else numpy.nanmax(r)
@@ -1791,3 +1795,138 class WeatherRHI_vRF4_Plot(Plot):
1791 1795 self.titles = ['RHI {} at AZ: {} Channel {}'.format(self.labels[x], str(round(numpy.mean(data['azi']),1)), x) for x in range(self.nrows)]
1792 1796 else:
1793 1797 self.titles = ['RHI {} at AZ: {} Channel {}'.format(self.labels[0], str(round(numpy.mean(data['azi']),1)), self.channels[0])]
1798
1799 class WeatherParamsPlot(Plot):
1800 #CODE = 'RHI'
1801 #plot_name = 'RHI'
1802 #plot_type = 'rhistyle'
1803 buffering = False
1804
1805 def setup(self):
1806
1807 self.ncols = 1
1808 self.nrows = 1
1809 self.nplots= 1
1810 self.ylabel= 'Range [Km]'
1811 self.xlabel= 'Range [Km]'
1812 self.polar = True
1813 self.grid = True
1814 if self.channels is not None:
1815 self.nplots = len(self.channels)
1816 self.nrows = len(self.channels)
1817 else:
1818 self.nplots = self.data.shape(self.CODE)[0]
1819 self.nrows = self.nplots
1820 self.channels = list(range(self.nplots))
1821
1822 self.colorbar=True
1823 self.width =8
1824 self.height =8
1825 self.ini =0
1826 self.len_azi =0
1827 self.buffer_ini = None
1828 self.buffer_ele = None
1829 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
1830 self.flag =0
1831 self.indicador= 0
1832 self.last_data_ele = None
1833 self.val_mean = None
1834
1835 def update(self, dataOut):
1836
1837 data = {}
1838 meta = {}
1839 if hasattr(dataOut, 'dataPP_POWER'):
1840 factor = 1
1841 if hasattr(dataOut, 'nFFTPoints'):
1842 factor = dataOut.normFactor
1843
1844 if 'pow' in self.attr_data[0].lower():
1845 data['data'] = 10*numpy.log10(getattr(dataOut, self.attr_data[0])/(factor))
1846 else:
1847 data['data'] = getattr(dataOut, self.attr_data[0])/(factor)
1848
1849 if dataOut.mode_op == 'PPI':
1850 self.CODE = 'PPI'
1851 self.title = self.CODE
1852 elif dataOut.mode_op == 'RHI':
1853 self.CODE = 'RHI'
1854 self.title = self.CODE
1855
1856 data['azi'] = dataOut.data_azi
1857 data['ele'] = dataOut.data_ele
1858 data['mode_op'] = dataOut.mode_op
1859
1860 return data, meta
1861
1862 def plot(self):
1863 data = self.data[-1]
1864 r = self.data.yrange
1865 delta_height = r[1]-r[0]
1866 r_mask = numpy.where(r>=0)[0]
1867 self.r_mask =r_mask
1868 r = numpy.arange(len(r_mask))*delta_height
1869 self.y = 2*r
1870
1871 try:
1872 z = data['data'][self.channels[0]][:,r_mask]
1873 except:
1874 z = data['data'][0][:,r_mask]
1875
1876 self.titles = []
1877
1878 self.ymax = self.ymax if self.ymax else numpy.nanmax(r)
1879 self.ymin = self.ymin if self.ymin else numpy.nanmin(r)
1880 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
1881 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
1882 print("mode inside plot",self.data['mode_op'],data['mode_op'])
1883 if data['mode_op'] == 'RHI':
1884 try:
1885 if self.data['mode_op'][-2] == 'PPI':
1886 self.ang_min = None
1887 self.ang_max = None
1888 except:
1889 pass
1890 self.ang_min = self.ang_min if self.ang_min else 0
1891 self.ang_max = self.ang_max if self.ang_max else 90
1892 r, theta = numpy.meshgrid(r, numpy.radians(data['ele']) )
1893 elif data['mode_op'] == 'PPI':
1894 try:
1895 if self.data['mode_op'][-2] == 'RHI':
1896 self.ang_min = None
1897 self.ang_max = None
1898 except:
1899 pass
1900 self.ang_min = self.ang_min if self.ang_min else 0
1901 self.ang_max = self.ang_max if self.ang_max else 360
1902 r, theta = numpy.meshgrid(r, numpy.radians(data['azi']) )
1903
1904 self.clear_figures()
1905
1906 for i,ax in enumerate(self.axes):
1907
1908 if ax.firsttime:
1909 ax.set_xlim(numpy.radians(self.ang_min),numpy.radians(self.ang_max))
1910 ax.plt = ax.pcolormesh(theta, r, z, cmap=self.colormap, vmin=self.zmin, vmax=self.zmax)
1911 if data['mode_op'] == 'PPI':
1912 ax.set_theta_direction(-1)
1913 else:
1914 ax.set_xlim(numpy.radians(self.ang_min),numpy.radians(self.ang_max))
1915 ax.plt = ax.pcolormesh(theta, r, z, cmap=self.colormap, vmin=self.zmin, vmax=self.zmax)
1916 if data['mode_op'] == 'PPI':
1917 ax.set_theta_direction(-1)
1918 ax.grid(True)
1919 if data['mode_op'] == 'RHI':
1920 len_aux = int(data['azi'].shape[0]/4)
1921 mean = numpy.mean(data['azi'][len_aux:-len_aux])
1922 if len(self.channels) !=1:
1923 self.titles = ['RHI {} at AZ: {} Channel {}'.format(self.labels[x], str(round(mean,1)), x) for x in range(self.nrows)]
1924 else:
1925 self.titles = ['RHI {} at AZ: {} Channel {}'.format(self.labels[0], str(round(mean,1)), self.channels[0])]
1926 elif data['mode_op'] == 'PPI':
1927 len_aux = int(data['ele'].shape[0]/4)
1928 mean = numpy.mean(data['ele'][len_aux:-len_aux])
1929 if len(self.channels) !=1:
1930 self.titles = ['PPI {} at EL: {} Channel {}'.format(self.self.labels[x], str(round(mean,1)), x) for x in range(self.nrows)]
1931 else:
1932 self.titles = ['PPI {} at EL: {} Channel {}'.format(self.labels[0], str(round(mean,1)), self.channels[0])]
@@ -408,7 +408,6 class DigitalRFReader(ProcessingUnit):
408 408
409 409
410 410 self.__samples_to_read = int(nSamples) # FIJO: AHORA 40
411 #self.__samples_to_read = int(1000000) # FIJO: AHORA 40
412 411 self.__nChannels = len(self.__channelList)
413 412 #print("------------------------------------------")
414 413 #print("self.__samples_to_read",self.__samples_to_read)
@@ -523,8 +522,6 class DigitalRFReader(ProcessingUnit):
523 522 for indexSubchannel in range(self.__num_subchannels):
524 523 try:
525 524 t0 = time()
526 #print("Unitindex",self.__thisUnixSample)
527 #print("__samples_to_read",self.__samples_to_read)
528 525 result = self.digitalReadObj.read_vector_c81d(self.__thisUnixSample,
529 526 self.__samples_to_read,
530 527 thisChannelName, sub_channel=indexSubchannel)
@@ -637,7 +634,6 class DigitalRFReader(ProcessingUnit):
637 634 # ojo debo anadir el readNextBLock y el __isBufferEmpty(
638 635 self.dataOut.flagNoData = False
639 636 buffer = self.__data_buffer[:,self.__bufferIndex:self.__bufferIndex + self.__samples_to_read]
640 #print("test",self.__bufferIndex)
641 637 buffer = buffer.reshape((self.__nChannels, self.nProfileBlocks, int(self.__samples_to_read/self.nProfileBlocks)))
642 638 self.dataOut.nProfileBlocks = self.nProfileBlocks
643 639 self.dataOut.data = buffer
@@ -557,10 +557,14 class HDFWriter(Operation):
557 557 #Z_SOPHy_Az40.0_20200505_14:02:15.h5
558 558 if self.dataOut.flagMode == 1: #'AZI' #PPI
559 559 ang_type = 'El'
560 ang_ = round(numpy.mean(self.dataOut.data_ele),1)
560 len_aux = int(self.dataOut.data_ele.shape[0]/4)
561 mean = numpy.mean(self.dataOut.data_ele[len_aux:-len:aux])
562 ang_ = round(mean,1)
561 563 elif self.dataOut.flagMode == 0: #'ELE' #RHI
562 564 ang_type = 'Az'
563 ang_ = round(numpy.mean(self.dataOut.data_azi),1)
565 len_aux = int(self.dataOut.data_azi.shape[0]/4)
566 mean = numpy.mean(self.dataOut.data_azi[len_aux:-len:aux])
567 ang_ = round(mean,1)
564 568
565 569 file = '%s%s%s%2.1f%s%2.2d%2.2d%2.2d%s%2.2d%2.2d%2.2d%s' % (wr_type,
566 570 '_SOPHy_',
@@ -587,7 +591,7 class HDFWriter(Operation):
587 591 self.filename = os.path.join( path, subfolder, file )
588 592
589 593 #Setting HDF5 File
590 print("filename",self.filename)
594 #print("filename",self.filename)
591 595 self.fp = h5py.File(self.filename, 'w')
592 596 #write metadata
593 597 self.writeMetadata(self.fp)
@@ -143,6 +143,8 class ParametersProc(ProcessingUnit):
143 143
144 144 if hasattr(self.dataIn, 'dataPP_CCF'):
145 145 self.dataOut.dataPP_CCF = self.dataIn.dataPP_CCF
146 if hasattr(self.dataIn, 'flagAskMode'):
147 self.dataOut.flagAskMode = self.dataIn.flagAskMode
146 148
147 149 return
148 150
@@ -3927,7 +3929,7 class WeatherRadar(Operation):
3927 3929
3928 3930 def setup(self,dataOut,variableList= None,Pt=0,Gt=0,Gr=0,Glna=0,lambda_=0, aL=0,
3929 3931 tauW= 0,thetaT=0,thetaR=0,Km =0):
3930 print("INICIO")
3932
3931 3933 self.nCh = dataOut.nChannels
3932 3934 self.nHeis = dataOut.nHeights
3933 3935 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
@@ -3950,7 +3952,7 class WeatherRadar(Operation):
3950 3952 self.RadarConstant = Numerator/Denominator
3951 3953 if self.variableList== None:
3952 3954 self.variableList= ['Reflectividad','ReflectividadDiferencial','CoeficienteCorrelacion','FaseDiferencial','VelocidadRadial','AnchoEspectral']
3953 print('FIN')
3955
3954 3956 def setMoments(self,dataOut,i):
3955 3957
3956 3958 type = dataOut.inputUnit
@@ -4013,7 +4015,7 class WeatherRadar(Operation):
4013 4015 self.n_radar = numpy.zeros((self.nCh,self.nHeis))
4014 4016 self.Z_radar = numpy.zeros((self.nCh,self.nHeis))
4015 4017 for R in range(self.nHeis):
4016 self.n_radar[:,R] = self.RadarConstant*Pr[:,R]* (self.Range[:,R])**2
4018 self.n_radar[:,R] = self.RadarConstant*Pr[:,R]* (self.Range[:,R])**2*(10**-10.246)
4017 4019
4018 4020 self.Z_radar[:,R] = self.n_radar[:,R]* self.lambda_**4/( numpy.pi**5 * self.Km**2)
4019 4021
@@ -4035,8 +4037,8 class WeatherRadar(Operation):
4035 4037 return Sigmav_W
4036 4038
4037 4039
4038 def run(self,dataOut,variableList=variableList,Pt=0.158,Gt=38.5,Gr=38.5,Glna=70.0,lambda_=0.032, aL=1,
4039 tauW= 0.2*1e-6,thetaT=0.0314,thetaR=0.0314,Km =0.93):
4040 def run(self,dataOut,variableList=variableList,Pt=1.58,Gt=38.5,Gr=38.5,Glna=70.0,lambda_=0.032, aL=1,
4041 tauW= 0.2,thetaT=0.0314,thetaR=0.0314,Km =0.93):
4040 4042
4041 4043 if not self.isConfig:
4042 4044 self.setup(dataOut= dataOut,variableList=variableList,Pt=Pt,Gt=Gt,Gr=Gr,Glna=Glna,lambda_=lambda_, aL=aL,
@@ -4045,7 +4047,6 class WeatherRadar(Operation):
4045 4047 for i in range(len(self.variableList)):
4046 4048 if self.variableList[i]=='Reflectividad':
4047 4049 dataOut.Zdb =self.getReflectividad_D(dataOut=dataOut,type='N')
4048 print(dataOut.Zdb)
4049 4050 if self.variableList[i]=='ReflectividadDiferencial':
4050 4051 dataOut.Zdb_D =self.getReflectividad_D(dataOut=dataOut,type='D')
4051 4052 if self.variableList[i]=='FaseDiferencial':
@@ -4116,14 +4117,76 class PedestalInformation(Operation):
4116 4117 log.error('No new position files found in {}'.format(path))
4117 4118 raise IOError('No new position files found in {}'.format(path))
4118 4119
4120 def find_mode(self,index):
4121 sample_max = 20
4122 start = index
4123 flag_mode = None
4124 azi = self.fp['Data']['azi_pos'][:]
4125 ele = self.fp['Data']['ele_pos'][:]
4126 #print("az: ",az)
4127 #exit(1)
4128 while True:
4129 if start+sample_max > numpy.shape(ele)[0]:
4130 print("CANNOT KNOW IF MODE IS PPI OR RHI, ANALIZE NEXT FILE")
4131 print("ele",ele[start-sample_max:start+sample_max])
4132 print("azi",ele[start-sample_max:start+sample_max])
4133 if sample_max == 10:
4134 break
4135 else:
4136 sample_max = 10
4137 continue
4138 sigma_ele = numpy.nanstd(ele[start:start+sample_max])
4139 sigma_azi = numpy.nanstd(azi[start:start+sample_max])
4140 print("Start",start)
4141 print("ele",ele[start:start+sample_max])
4142 print("s_ele",sigma_ele)
4143 print("azi",azi[start:start+sample_max])
4144 print("s_azi",sigma_azi)
4145 #print(start)
4146 if sigma_ele<.5 and sigma_azi<.5:
4147 if sigma_ele<sigma_azi:
4148 flag_mode = 'PPI'
4149 break
4150 else:
4151 flag_mode = 'RHI'
4152 break
4153 elif sigma_ele<.5:
4154 #print(sigma_ele)
4155 #print(round(numpy.nanmean(ele[start:start+sample_max]),1))
4156 #print(start)
4157 #print(ele[start:start+sample_max])
4158 flag_mode = 'PPI'
4159 break
4160 elif sigma_azi<.5:
4161 #print(sigma_azi)
4162 #print(azi[start:start+sample_max])
4163 #print("round",round(numpy.nanmean(azi[start:start+sample_max]),1))
4164 flag_mode = 'RHI'
4165 break
4166 #else:
4167 #print("STD mayor que .5")
4168 start += sample_max
4169 print("MODE: ",flag_mode)
4170 return flag_mode
4119 4171
4120 4172 def get_values(self):
4121 4173
4122 4174 if self.flagNoData:
4123 return numpy.nan, numpy.nan
4175 print("get_value_1")
4176 return numpy.nan, numpy.nan, numpy.nan #Should be self.mode?
4124 4177 else:
4125 4178 index = int((self.utctime-self.utcfile)/self.interval)
4126 return self.fp['Data']['azi_pos'][index], self.fp['Data']['ele_pos'][index]
4179
4180 if self.flagAskMode:
4181 mode = self.find_mode(index)
4182 else:
4183 mode = self.mode
4184
4185 if mode is not None:
4186 return self.fp['Data']['azi_pos'][index], self.fp['Data']['ele_pos'][index], mode
4187 else:
4188 print("get_value_2")
4189 return numpy.nan, numpy.nan, numpy.nan
4127 4190
4128 4191 def setup(self, dataOut, path, conf, samples, interval, az_offset):
4129 4192
@@ -4146,23 +4209,33 class PedestalInformation(Operation):
4146 4209
4147 4210 if not self.isConfig:
4148 4211 self.setup(dataOut, path, conf, samples, interval, az_offset)
4212 #self.flagAskMode = True
4149 4213 self.isConfig = True
4150 4214
4151 4215 self.utctime = dataOut.utctime + time_offset
4152 4216
4217 if hasattr(dataOut, 'flagAskMode'):
4218 self.flagAskMode = dataOut.flagAskMode
4219 #print("inside",self.flagAskMode)
4220 else:
4221 #print("nooooooo")
4222 self.flagAskMode = True
4223
4153 4224 self.find_next_file()
4154 4225
4155 az, el = self.get_values()
4226 az, el, self.mode = self.get_values()
4227 print("after get_values",az,el,self.mode)
4156 4228 dataOut.flagNoData = False
4157
4158 4229 if numpy.isnan(az) or numpy.isnan(el) :
4159 4230 dataOut.flagNoData = True
4231 #print("NAN")
4160 4232 return dataOut
4161 4233
4162 4234 dataOut.azimuth = az - az_offset
4163 4235 if dataOut.azimuth < 0:
4164 4236 dataOut.azimuth += 360
4165 4237 dataOut.elevation = el
4238 dataOut.mode_op = self.mode[:]
4166 4239
4167 4240 return dataOut
4168 4241
@@ -4926,7 +4999,7 class Block360_vRF4(Operation):
4926 4999 data_e = None
4927 5000
4928 5001 angles = self.putData(data=dataOut, attr = self.attr, flagMode=flagMode)
4929 #print(angles)
5002 #print("ANGLES",angles)
4930 5003 if self.__profIndex > 1:
4931 5004 case_flag = self.checkcase(angles,flagMode)
4932 5005
@@ -4993,12 +5066,17 class Block360_vRF4(Operation):
4993 5066 if diff_angle > 0: #Subida
4994 5067 return 0
4995 5068
4996 def run(self, dataOut, attr_data='dataPP_POWER', axis=None, runNextOp = False,**kwargs):
5069 def run(self, dataOut, attr_data='dataPP_POWER', runNextOp = False,**kwargs):
4997 5070
4998 5071 dataOut.attr_data = attr_data
4999 5072 dataOut.runNextOp = runNextOp
5000
5001 dataOut.flagMode = axis[0] #Provisional, debería venir del header
5073 dataOut.flagAskMode = False
5074 #print("Block 360")
5075 #dataOut.flagMode = axis[0] #Provisional, debería venir del header
5076 if dataOut.mode_op == 'PPI':
5077 dataOut.flagMode = 1
5078 elif dataOut.mode_op == 'RHI':
5079 dataOut.flagMode = 0
5002 5080
5003 5081 if not self.isConfig:
5004 5082 self.setup(dataOut = dataOut, attr = attr_data ,**kwargs)
@@ -5014,6 +5092,9 class Block360_vRF4(Operation):
5014 5092 dataOut.data_ele = data_e
5015 5093 dataOut.utctime = avgdatatime
5016 5094 dataOut.flagNoData = False
5095 dataOut.flagAskMode = True
5096 print("AZI: ",dataOut.data_azi)
5097 print("ELE: ",dataOut.data_ele)
5017 5098 #print("********************attr_data********************",attr_data)
5018 5099 #print(data_360.shape)
5019 5100 #print(dataOut.heightList)
@@ -7,12 +7,12 PATH = '/DATA_RM/DATA'
7 7 # PATH = '/Users/jespinoza/workspace/data/'
8 8
9 9 PARAM = {
10 'P': {'name': 'dataPP_POWER', 'zmin': 35, 'zmax': 60, 'colormap': 'viridis', 'label': 'Power', 'cb_label': 'dB'},
10 'P': {'name': 'dataPP_POWER', 'zmin': 35, 'zmax': 60, 'colormap': 'jet', 'label': 'Power', 'cb_label': 'dB'},
11 11 'V': {'name': 'dataPP_DOP', 'zmin': -20, 'zmax': 20, 'colormap': 'seismic', 'label': 'Velocity', 'cb_label': 'm/s'},
12 12 'RH': {'name': 'RhoHV_R', 'zmin': 0, 'zmax': 1, 'colormap': 'jet', 'label': 'CoeficienteCorrelacion', 'cb_label': '*'},
13 13 'FD': {'name': 'PhiD_P', 'zmin': -180, 'zmax': 180, 'colormap': 'RdBu_r', 'label': 'Fase Diferencial', 'cb_label': 'º'},
14 14 'ZD': {'name': 'Zdb_D', 'zmin': -20, 'zmax': 80, 'colormap': 'viridis', 'label': 'ReflectividadDiferencial', 'cb_label': 'dB'},
15 'Z': {'name': 'Zdb', 'zmin': 100, 'zmax': 200, 'colormap': 'viridis', 'label': 'Reflectividad', 'cb_label': 'dB'},
15 'Z': {'name': 'Zdb', 'zmin': -20, 'zmax': 60, 'colormap': 'viridis', 'label': 'Reflectividad', 'cb_label': 'dB'},
16 16 'W': {'name': 'Sigmav_W', 'zmin': -20, 'zmax': 60, 'colormap': 'viridis', 'label': 'AnchoEspectral', 'cb_label': 'hz'}
17 17 }
18 18 #Z,ZD 'mm^6/m^3'
General Comments 0
You need to be logged in to leave comments. Login now