From 45d75be01895a4f483ef0233aae4d3991ea9003b 2018-09-20 17:10:35 From: George Yong Date: 2018-09-20 17:10:35 Subject: [PATCH] Wind and rainfall processing of CLAIRE radar with V3.0 --- diff --git a/schainpy/model/data/jrodata.py b/schainpy/model/data/jrodata.py index e519dc4..4e4fa19 100644 --- a/schainpy/model/data/jrodata.py +++ b/schainpy/model/data/jrodata.py @@ -526,36 +526,29 @@ class Spectra(JROData): def getFreqRangeTimeResponse(self, extrapoints=0): deltafreq = self.getFmaxTimeResponse() / (self.nFFTPoints * self.ippFactor) - freqrange = deltafreq * \ - (numpy.arange(self.nFFTPoints + extrapoints) - - self.nFFTPoints / 2.) - deltafreq / 2 + freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2 return freqrange def getAcfRange(self, extrapoints=0): deltafreq = 10. / (self.getFmax() / (self.nFFTPoints * self.ippFactor)) - freqrange = deltafreq * \ - (numpy.arange(self.nFFTPoints + extrapoints) - - self.nFFTPoints / 2.) - deltafreq / 2 + freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2 return freqrange def getFreqRange(self, extrapoints=0): deltafreq = self.getFmax() / (self.nFFTPoints * self.ippFactor) - freqrange = deltafreq * \ - (numpy.arange(self.nFFTPoints + extrapoints) - - self.nFFTPoints / 2.) - deltafreq / 2 + freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2 return freqrange def getVelRange(self, extrapoints=0): deltav = self.getVmax() / (self.nFFTPoints * self.ippFactor) - velrange = deltav * (numpy.arange(self.nFFTPoints + - extrapoints) - self.nFFTPoints / 2.) - + velrange = deltav * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.) + if self.nmodes: return velrange/self.nmodes else: @@ -576,8 +569,7 @@ class Spectra(JROData): if self.flagDecodeData: pwcode = numpy.sum(self.code[0]**2) #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter - normFactor = self.nProfiles * self.nIncohInt * \ - self.nCohInt * pwcode * self.windowOfFilter + normFactor = self.nProfiles * self.nIncohInt * self.nCohInt * pwcode * self.windowOfFilter return normFactor @@ -597,8 +589,7 @@ class Spectra(JROData): def getTimeInterval(self): - timeInterval = self.ippSeconds * self.nCohInt * \ - self.nIncohInt * self.nProfiles * self.ippFactor + timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles * self.ippFactor return timeInterval @@ -625,8 +616,7 @@ class Spectra(JROData): pairsIndexList.append(self.pairsList.index(pair)) for i in range(len(pairsIndexList)): pair = self.pairsList[pairsIndexList[i]] - ccf = numpy.average( - self.data_cspc[pairsIndexList[i], :, :], axis=0) + ccf = numpy.average(self.data_cspc[pairsIndexList[i], :, :], axis=0) powa = numpy.average(self.data_spc[pair[0], :, :], axis=0) powb = numpy.average(self.data_spc[pair[1], :, :], axis=0) avgcoherenceComplex = ccf / numpy.sqrt(powa * powb) diff --git a/schainpy/model/graphics/jroplot_parameters.py b/schainpy/model/graphics/jroplot_parameters.py index b6d0046..cd9fa92 100644 --- a/schainpy/model/graphics/jroplot_parameters.py +++ b/schainpy/model/graphics/jroplot_parameters.py @@ -735,7 +735,7 @@ class SkyMapPlot_(Figure): - +@MPDecorator class WindProfilerPlot_(Figure): __isConfig = None @@ -745,8 +745,8 @@ class WindProfilerPlot_(Figure): HEIGHTPROF = None PREFIX = 'wind' - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) + def __init__(self): + Figure.__init__(self) self.timerange = None self.isConfig = False self.__nsubplots = 1 @@ -825,6 +825,9 @@ class WindProfilerPlot_(Figure): zmax : None """ + if dataOut.flagNoData: + return dataOut + # if timerange is not None: # self.timerange = timerange # @@ -836,8 +839,8 @@ class WindProfilerPlot_(Figure): z = dataOut.data_output.copy() nplots = z.shape[0] #Number of wind dimensions estimated nplotsw = nplots - - + + #If there is a SNR function defined if dataOut.data_SNR is not None: nplots += 1 @@ -948,6 +951,8 @@ class WindProfilerPlot_(Figure): self.isConfig = False update_figfile = True + return dataOut + @MPDecorator class ParametersPlot_(Figure): @@ -1051,7 +1056,7 @@ class ParametersPlot_(Figure): if not isTimeInHourRange(dataOut.datatime, xmin, xmax): return - + if channelList == None: channelIndexList = list(range(dataOut.data_param.shape[0])) else: diff --git a/schainpy/model/graphics/mpldriver.py b/schainpy/model/graphics/mpldriver.py index 9b4b1b6..2be2ad3 100644 --- a/schainpy/model/graphics/mpldriver.py +++ b/schainpy/model/graphics/mpldriver.py @@ -226,7 +226,7 @@ def createPcolor(ax, x, y, z, xmin, xmax, ymin, ymax, zmin, zmax, z = numpy.ma.masked_invalid(z) cmap = matplotlib.pyplot.get_cmap(colormap) - cmap.set_bad('black', 1.) + cmap.set_bad('white', 1.) imesh = ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap) cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb) cb.set_label(cblabel) @@ -291,7 +291,7 @@ def addpcolorbuffer(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', col z = numpy.ma.masked_invalid(z) cmap = matplotlib.pyplot.get_cmap(colormap) - cmap.set_bad('black', 1.) + cmap.set_bad('white', 1.) ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap) diff --git a/schainpy/model/io/jroIO_madrigal.py b/schainpy/model/io/jroIO_madrigal.py index f76d861..4f85128 100644 --- a/schainpy/model/io/jroIO_madrigal.py +++ b/schainpy/model/io/jroIO_madrigal.py @@ -192,10 +192,10 @@ class MADReader(JRODataReader, ProcessingUnit): self.parameters = one + two self.parameters_d = one_d + two_d - log.success('Parameters found: {}'.format(','.join(self.parameters)), + log.success('Parameters found: {}'.format(','.join(str(self.parameters))), 'MADReader') if s_parameters: - log.success('Spatial parameters: {}'.format(','.join(s_parameters)), + log.success('Spatial parameters: {}'.format(','.join(str(s_parameters))), 'MADReader') for param in list(self.oneDDict.keys()): diff --git a/schainpy/model/proc/jroproc_parameters.py b/schainpy/model/proc/jroproc_parameters.py index 5c4e2f1..1211e3f 100755 --- a/schainpy/model/proc/jroproc_parameters.py +++ b/schainpy/model/proc/jroproc_parameters.py @@ -123,7 +123,7 @@ class ParametersProc(ProcessingUnit): self.dataOut.ippFactor = self.dataIn.ippFactor self.dataOut.abscissaList = self.dataIn.getVelRange(1) self.dataOut.spc_noise = self.dataIn.getNoise() - self.dataOut.spc_range = (self.dataIn.getFreqRange(1)/1000. , self.dataIn.getAcfRange(1) , self.dataIn.getVelRange(1)) + self.dataOut.spc_range = (self.dataIn.getFreqRange(1) , self.dataIn.getAcfRange(1) , self.dataIn.getVelRange(1)) # self.dataOut.normFactor = self.dataIn.normFactor self.dataOut.pairsList = self.dataIn.pairsList self.dataOut.groupList = self.dataIn.pairsList @@ -239,18 +239,18 @@ class SpectralFilters(Operation): '''Reacomodando SPCrange''' + + VelRange=numpy.roll(VelRange,-(int(self.Num_Bin/2)) ,axis=0) - VelRange=numpy.roll(VelRange,-(self.Num_Bin/2) ,axis=0) - - VelRange[-(self.Num_Bin/2):]+= Vmax + VelRange[-(int(self.Num_Bin/2)):]+= Vmax - FrecRange=numpy.roll(FrecRange,-(self.Num_Bin/2),axis=0) + FrecRange=numpy.roll(FrecRange,-(int(self.Num_Bin/2)),axis=0) - FrecRange[-(self.Num_Bin/2):]+= Fmax + FrecRange[-(int(self.Num_Bin/2)):]+= Fmax - TimeRange=numpy.roll(TimeRange,-(self.Num_Bin/2),axis=0) + TimeRange=numpy.roll(TimeRange,-(int(self.Num_Bin/2)),axis=0) - TimeRange[-(self.Num_Bin/2):]+= Tmax + TimeRange[-(int(self.Num_Bin/2)):]+= Tmax ''' ------------------ ''' @@ -258,7 +258,7 @@ class SpectralFilters(Operation): Breaker2R=numpy.where(VelRange == Breaker2R) - SPCroll = numpy.roll(self.spc,-(self.Num_Bin/2) ,axis=1) + SPCroll = numpy.roll(self.spc,-(int(self.Num_Bin/2)) ,axis=1) SPCcut = SPCroll.copy() for i in range(self.Num_Chn): @@ -285,7 +285,7 @@ class SpectralFilters(Operation): dataOut.spcparam_range[2]=VelRange dataOut.spcparam_range[1]=TimeRange dataOut.spcparam_range[0]=FrecRange - + return dataOut class GaussianFit(Operation): @@ -660,7 +660,7 @@ class PrecipitationProc(Operation): Numerator = ( (4*numpy.pi)**3 * aL**2 * 16 * numpy.log(2) ) Denominator = ( Pt * Gt * Gr * Lambda**2 * SPEED_OF_LIGHT * tauW * numpy.pi * ThetaT * ThetaR) - RadarConstant = 5e-26 * Numerator / Denominator # + RadarConstant = 10e-26 * Numerator / Denominator # ''' ============================= ''' @@ -753,6 +753,7 @@ class PrecipitationProc(Operation): dataOut.data_param[1]=V_mean dataOut.data_param[2]=RR + return dataOut def dBZeMODE2(self, dataOut): # Processing for MIRA35C @@ -833,7 +834,7 @@ class FullSpectralAnalysis(Operation): SNRspc = spc.copy() SNRspc[:,:,0:7]= numpy.NaN - + """##########################################""" @@ -876,8 +877,8 @@ class FullSpectralAnalysis(Operation): dbSNR = numpy.average(dbSNR,0) for Height in range(nHeights): - - [Vzon,Vmer,Vver, GaussCenter, PhaseSlope, FitGaussCSPC]= self.WindEstimation(spc, cspc, pairsList, ChanDist, Height, noise, dataOut.spc_range.copy(), dbSNR[Height], SNRlimit) + + [Vzon,Vmer,Vver, GaussCenter, PhaseSlope, FitGaussCSPC]= self.WindEstimation(spc, cspc, pairsList, ChanDist, Height, noise, dataOut.spc_range, dbSNR[Height], SNRlimit) PhaseLine = numpy.append(PhaseLine, PhaseSlope) if abs(Vzon)<100. and abs(Vzon)> 0.: @@ -908,7 +909,7 @@ class FullSpectralAnalysis(Operation): dataOut.data_output=data_output - return + return dataOut def moving_average(self,x, N=2):