diff --git a/schainc/_noise.c b/schainc/_noise.c index 97e07a0..66ee196 100644 --- a/schainc/_noise.c +++ b/schainc/_noise.c @@ -10,9 +10,9 @@ static PyObject *hildebrand_sekhon(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "Od", &data_obj, &navg)) { return NULL; } - + data_array = PyArray_FROM_OTF(data_obj, NPY_FLOAT64, NPY_IN_ARRAY); - + if (data_array == NULL) { Py_XDECREF(data_array); Py_XDECREF(data_obj); @@ -49,18 +49,17 @@ static PyObject *hildebrand_sekhon(PyObject *self, PyObject *args) { // return PyLong_FromLong(lnoise); return PyFloat_FromDouble(lnoise); } -/* + static PyObject *hildebrand_sekhon2(PyObject *self, PyObject *args) { double navg; - double th; PyObject *data_obj, *data_array; - if (!PyArg_ParseTuple(args, "Od", &data_obj, &navg, &th)) { + if (!PyArg_ParseTuple(args, "Od", &data_obj, &navg)) { return NULL; } - + data_array = PyArray_FROM_OTF(data_obj, NPY_FLOAT64, NPY_IN_ARRAY); - + if (data_array == NULL) { Py_XDECREF(data_array); Py_XDECREF(data_obj); @@ -68,7 +67,7 @@ static PyObject *hildebrand_sekhon2(PyObject *self, PyObject *args) { } double *sortdata = (double*)PyArray_DATA(data_array); int lenOfData = (int)PyArray_SIZE(data_array) ; - double nums_min = lenOfData*th; + double nums_min = lenOfData*0.75; if (nums_min <= 5) nums_min = 5; double sump = 0; double sumq = 0; @@ -94,13 +93,14 @@ static PyObject *hildebrand_sekhon2(PyObject *self, PyObject *args) { Py_DECREF(data_array); - // return PyLong_FromLong(lnoise); - return PyFloat_FromDouble(j,sortID); + return PyLong_FromLong(j); + } -*/ + static PyMethodDef noiseMethods[] = { { "hildebrand_sekhon", hildebrand_sekhon, METH_VARARGS, "Get noise with hildebrand_sekhon algorithm" }, + { "hildebrand_sekhon2", hildebrand_sekhon2, METH_VARARGS, "Get index for satellite cleaning" }, { NULL, NULL, 0, NULL } }; diff --git a/schainpy/model/data/jrodata.py b/schainpy/model/data/jrodata.py index f3a0452..3f70377 100644 --- a/schainpy/model/data/jrodata.py +++ b/schainpy/model/data/jrodata.py @@ -192,9 +192,9 @@ class JROData(GenericData): data = None nmodes = None metadata_list = ['heightList', 'timeZone', 'type'] - codeList = None - azimuthList = None - elevationList = None + codeList = [] + azimuthList = [] + elevationList = [] def __str__(self): @@ -489,7 +489,7 @@ class Spectra(JROData): return noise def getNoise(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None): - + if self.noise_estimation is not None: # this was estimated by getNoise Operation defined in jroproc_spectra.py return self.noise_estimation diff --git a/schainpy/model/graphics/jroplot_parameters.py b/schainpy/model/graphics/jroplot_parameters.py index 93e9230..e8bf6da 100644 --- a/schainpy/model/graphics/jroplot_parameters.py +++ b/schainpy/model/graphics/jroplot_parameters.py @@ -87,7 +87,10 @@ class PowerPlot(RTIPlot): data = { 'pow': 10*numpy.log10(dataOut.data_pow) } - data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) + try: + data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) + except: + pass return data, {} class SpectralWidthPlot(RTIPlot): diff --git a/schainpy/model/graphics/jroplot_spectra.py b/schainpy/model/graphics/jroplot_spectra.py index c758b2d..6b0c4a7 100644 --- a/schainpy/model/graphics/jroplot_spectra.py +++ b/schainpy/model/graphics/jroplot_spectra.py @@ -23,6 +23,8 @@ class SpectraPlot(Plot): plot_type = 'pcolor' buffering = False channelList = [] + elevationList = [] + azimuthList = [] def setup(self): @@ -43,6 +45,10 @@ class SpectraPlot(Plot): def update_list(self,dataOut): if len(self.channelList) == 0: self.channelList = dataOut.channelList + if len(self.elevationList) == 0: + self.elevationList = dataOut.elevationList + if len(self.azimuthList) == 0: + self.azimuthList = dataOut.azimuthList def update(self, dataOut): @@ -110,7 +116,10 @@ class SpectraPlot(Plot): ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y) if self.CODE == 'spc_moments': ax.plt_mean.set_data(mean, y) - self.titles.append('CH {}: {:3.2f}dB'.format(self.channelList[n], noise)) + if len(self.azimuthList) > 0 and len(self.elevationList) > 0: + self.titles.append('CH {}: {:2.1f}elv {:2.1f}az {:3.2f}dB'.format(self.channelList[n], noise, self.elevationList[n], self.azimuthList[n])) + else: + self.titles.append('CH {}: {:3.2f}dB'.format(self.channelList[n], noise)) class CrossSpectraPlot(Plot): @@ -226,6 +235,8 @@ class RTIPlot(Plot): plot_type = 'pcolorbuffer' titles = None channelList = [] + elevationList = [] + azimuthList = [] def setup(self): self.xaxis = 'time' @@ -242,7 +253,12 @@ class RTIPlot(Plot): def update_list(self,dataOut): - self.channelList = dataOut.channelList + if len(self.channelList) == 0: + self.channelList = dataOut.channelList + if len(self.elevationList) == 0: + self.elevationList = dataOut.elevationList + if len(self.azimuthList) == 0: + self.azimuthList = dataOut.azimuthList def update(self, dataOut): @@ -265,12 +281,18 @@ class RTIPlot(Plot): try: if self.channelList != None: - self.titles = ['{} Channel {}'.format( - self.CODE.upper(), x) for x in self.channelList] + if len(self.elevationList) > 0 and len(self.azimuthList) > 0: + self.titles = ['{} Channel {} ({:2.1f} Elev, {:2.1f} Azth)'.format( + self.CODE.upper(), x, self.elevationList[x], self.azimuthList[x]) for x in self.channelList] + else: + self.titles = ['{} Channel {}'.format( + self.CODE.upper(), x) for x in self.channelList] except: if self.channelList.any() != None: + self.titles = ['{} Channel {}'.format( self.CODE.upper(), x) for x in self.channelList] + if self.decimation is None: x, y, z = self.fill_gaps(self.x, self.y, self.z) else: @@ -532,7 +554,7 @@ class SpectraCutPlot(Plot): labels = ['Range = {:2.1f}km'.format(y[i]) for i in index] self.figures[0].legend(ax.plt, labels, loc='center right', prop={'size': 8}) else: - for i, line in enumerate(ax.plt): + for i, line in enumerate(ax.plt): line.set_data(x, z[n, :, index[i]]) self.titles.append('CH {}'.format(self.channelList[n])) plt.suptitle(self.maintitle, fontsize=10) @@ -879,6 +901,8 @@ class NoiselessRTIPlot(Plot): plot_type = 'pcolorbuffer' titles = None channelList = [] + elevationList = [] + azimuthList = [] def setup(self): self.xaxis = 'time' @@ -894,9 +918,12 @@ class NoiselessRTIPlot(Plot): self.CODE.upper(), x) for x in range(self.nplots)] def update_list(self,dataOut): - - self.channelList = dataOut.channelList - + if len(self.channelList) == 0: + self.channelList = dataOut.channelList + if len(self.elevationList) == 0: + self.elevationList = dataOut.elevationList + if len(self.azimuthList) == 0: + self.azimuthList = dataOut.azimuthList def update(self, dataOut): if len(self.channelList) == 0: @@ -906,9 +933,15 @@ class NoiselessRTIPlot(Plot): n0 = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) (nch, nff, nh) = dataOut.data_spc.shape + #print(nch, nff, nh) + if nch != 1: + aux = [] + for c in self.channelList: + aux.append(n0[c]) + n0 = numpy.asarray(aux) noise = numpy.repeat(n0,nh, axis=0).reshape((nch,nh)) - - + #print(dataOut.elevationList, dataOut.azimuthList) + #print(dataOut.channelList) data['noiseless_rti'] = dataOut.getPower() - noise data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) return data, meta @@ -923,10 +956,15 @@ class NoiselessRTIPlot(Plot): try: if self.channelList != None: - self.titles = ['{} Channel {}'.format( - self.CODE.upper(), x) for x in self.channelList] + if len(self.elevationList) > 0 and len(self.azimuthList) > 0: + self.titles = ['{} Channel {} ({:2.1f} Elev, {:2.1f} Azth)'.format( + self.CODE.upper(), x, self.elevationList[x], self.azimuthList[x]) for x in self.channelList] + else: + self.titles = ['{} Channel {}'.format( + self.CODE.upper(), x) for x in self.channelList] except: if self.channelList.any() != None: + self.titles = ['{} Channel {}'.format( self.CODE.upper(), x) for x in self.channelList] if self.decimation is None: diff --git a/schainpy/model/proc/jroproc_spectra.py b/schainpy/model/proc/jroproc_spectra.py index 6f1d952..2a557ac 100644 --- a/schainpy/model/proc/jroproc_spectra.py +++ b/schainpy/model/proc/jroproc_spectra.py @@ -17,6 +17,8 @@ import math from schainpy.model.proc.jroproc_base import ProcessingUnit, MPDecorator, Operation from schainpy.model.data.jrodata import Spectra from schainpy.model.data.jrodata import hildebrand_sekhon +from schainpy.model.data import _noise + from schainpy.utils import log from scipy.optimize import curve_fit @@ -1092,6 +1094,7 @@ class IntegrationFaradaySpectra(Operation): n = None minHei_ind = None maxHei_ind = None + avg = 1.0 factor = 0.0 def __init__(self): @@ -1184,10 +1187,10 @@ class IntegrationFaradaySpectra(Operation): return - def hildebrand_sekhon_Integration(self,data,navg, factor): - - sortdata = numpy.sort(data, axis=None) - sortID=data.argsort() + def hildebrand_sekhon_Integration(self,sortdata,navg, factor): + #data debe estar ordenado + #sortdata = numpy.sort(data, axis=None) + #sortID=data.argsort() lenOfData = len(sortdata) nums_min = lenOfData*factor if nums_min <= 5: @@ -1209,7 +1212,9 @@ class IntegrationFaradaySpectra(Operation): j += 1 #lnoise = sump / j #print("H S done") - return j,sortID + #return j,sortID + return j + def pushData(self): """ @@ -1256,7 +1261,11 @@ class IntegrationFaradaySpectra(Operation): # if i==1 and j==0: #NOT CONSIDERING DC PROFILE AT CHANNEL 1 # continue buffer=buffer1[:,j] - index,sortID=self.hildebrand_sekhon_Integration(buffer,1,self.factor) + sortdata = numpy.sort(buffer, axis=None) + sortID=buffer.argsort() + index = _noise.hildebrand_sekhon2(sortdata,self.navg) + + #index,sortID=self.hildebrand_sekhon_Integration(buffer,1,self.factor) indexes.append(index) #sortIDs.append(sortID) @@ -1272,7 +1281,7 @@ class IntegrationFaradaySpectra(Operation): if indexmin != buffer1.shape[0]: if self.nChannels > 1: cspc_outliers_exist= True - print("outliers cpsc") + #print("outliers cspc") ###sortdata=numpy.sort(buffer1,axis=0) ###avg2=numpy.mean(sortdata[:indexmin,:],axis=0) lt=outliers_IDs