@@ -66,7 +66,7 static PyObject *hildebrand_sekhon2(PyObject *self, PyObject *args) { | |||
|
66 | 66 | } |
|
67 | 67 | double *sortdata = (double*)PyArray_DATA(data_array); |
|
68 | 68 | int lenOfData = (int)PyArray_SIZE(data_array) ; |
|
69 |
double nums_min = lenOfData*0. |
|
|
69 | double nums_min = lenOfData*0.85; | |
|
70 | 70 | if (nums_min <= 5) nums_min = 5; |
|
71 | 71 | double sump = 0; |
|
72 | 72 | double sumq = 0; |
@@ -661,12 +661,10 class Project(Process): | |||
|
661 | 661 | elif ok == 'no_Read' and (not flag_no_read): |
|
662 | 662 | nProc_noRead = n_proc - 1 |
|
663 | 663 | flag_no_read = True |
|
664 | print("No read") | |
|
665 | 664 | continue |
|
666 | 665 | elif ok == 'new_Read': |
|
667 | 666 | nProc_noRead = 0 |
|
668 | 667 | flag_no_read = False |
|
669 | print("read again") | |
|
670 | 668 | continue |
|
671 | 669 | elif not ok: |
|
672 | 670 | #print("not ok",ok) |
@@ -78,7 +78,7 def hildebrand_sekhon(data, navg): | |||
|
78 | 78 | sortdata = numpy.sort(data, axis=None) |
|
79 | 79 | ''' |
|
80 | 80 | lenOfData = len(sortdata) |
|
81 |
nums_min = lenOfData*0. |
|
|
81 | nums_min = lenOfData*0.5 | |
|
82 | 82 | |
|
83 | 83 | if nums_min <= 5: |
|
84 | 84 | |
@@ -106,6 +106,7 def hildebrand_sekhon(data, navg): | |||
|
106 | 106 | j += 1 |
|
107 | 107 | |
|
108 | 108 | lnoise = sump / j |
|
109 | return lnoise | |
|
109 | 110 | ''' |
|
110 | 111 | return _noise.hildebrand_sekhon(sortdata, navg) |
|
111 | 112 | |
@@ -380,7 +381,7 class Voltage(JROData): | |||
|
380 | 381 | self.metadata_list = ['type', 'heightList', 'timeZone', 'nProfiles', 'channelList', 'nCohInt', |
|
381 | 382 | 'code', 'nCode', 'nBaud', 'ippSeconds', 'ipp'] |
|
382 | 383 | |
|
383 | def getNoisebyHildebrand(self, channel=None): | |
|
384 | def getNoisebyHildebrand(self, channel=None, ymin_index=None, ymax_index=None): | |
|
384 | 385 | """ |
|
385 | 386 | Determino el nivel de ruido usando el metodo Hildebrand-Sekhon |
|
386 | 387 | |
@@ -389,10 +390,10 class Voltage(JROData): | |||
|
389 | 390 | """ |
|
390 | 391 | |
|
391 | 392 | if channel != None: |
|
392 | data = self.data[channel] | |
|
393 | data = self.data[channel,ymin_index:ymax_index] | |
|
393 | 394 | nChannels = 1 |
|
394 | 395 | else: |
|
395 | data = self.data | |
|
396 | data = self.data[:,ymin_index:ymax_index] | |
|
396 | 397 | nChannels = self.nChannels |
|
397 | 398 | |
|
398 | 399 | noise = numpy.zeros(nChannels) |
@@ -407,10 +408,10 class Voltage(JROData): | |||
|
407 | 408 | |
|
408 | 409 | return noise |
|
409 | 410 | |
|
410 | def getNoise(self, type=1, channel=None): | |
|
411 | def getNoise(self, type=1, channel=None,ymin_index=None, ymax_index=None): | |
|
411 | 412 | |
|
412 | 413 | if type == 1: |
|
413 | noise = self.getNoisebyHildebrand(channel) | |
|
414 | noise = self.getNoisebyHildebrand(channel,ymin_index, ymax_index) | |
|
414 | 415 | |
|
415 | 416 | return noise |
|
416 | 417 | |
@@ -437,6 +438,8 class Voltage(JROData): | |||
|
437 | 438 | |
|
438 | 439 | class Spectra(JROData): |
|
439 | 440 | |
|
441 | data_outlier = 0 | |
|
442 | ||
|
440 | 443 | def __init__(self): |
|
441 | 444 | ''' |
|
442 | 445 | Constructor |
@@ -475,6 +478,9 class Spectra(JROData): | |||
|
475 | 478 | 'code', 'nCode', 'nBaud', 'ippSeconds', 'ipp','nIncohInt', 'nFFTPoints', 'nProfiles'] |
|
476 | 479 | |
|
477 | 480 | |
|
481 | self.max_nIncohInt = 1 | |
|
482 | ||
|
483 | ||
|
478 | 484 | def getNoisebyHildebrand(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None): |
|
479 | 485 | """ |
|
480 | 486 | Determino el nivel de ruido usando el metodo Hildebrand-Sekhon |
@@ -482,12 +488,28 class Spectra(JROData): | |||
|
482 | 488 | Return: |
|
483 | 489 | noiselevel |
|
484 | 490 | """ |
|
485 | ||
|
491 | # if hasattr(self.nIncohInt, "__len__"): #nIncohInt is a matrix | |
|
492 | # | |
|
493 | # heis = self.data_spc.shape[2] | |
|
494 | # | |
|
495 | # noise = numpy.zeros((self.nChannels, heis)) | |
|
496 | # for hei in range(heis): | |
|
497 | # for channel in range(self.nChannels): | |
|
498 | # daux = self.data_spc[channel, xmin_index:xmax_index, hei] | |
|
499 | # | |
|
500 | # noise[channel,hei] = hildebrand_sekhon(daux, self.nIncohInt[channel,hei]) | |
|
501 | # | |
|
502 | # else: | |
|
503 | # noise = numpy.zeros(self.nChannels) | |
|
504 | # for channel in range(self.nChannels): | |
|
505 | # daux = self.data_spc[channel,xmin_index:xmax_index, ymin_index:ymax_index] | |
|
506 | # | |
|
507 | # noise[channel] = hildebrand_sekhon(daux, self.nIncohInt) | |
|
486 | 508 | noise = numpy.zeros(self.nChannels) |
|
487 | 509 | for channel in range(self.nChannels): |
|
488 | daux = self.data_spc[channel, | |
|
489 | xmin_index:xmax_index, ymin_index:ymax_index] | |
|
490 | noise[channel] = hildebrand_sekhon(daux, self.nIncohInt) | |
|
510 | daux = self.data_spc[channel,xmin_index:xmax_index, ymin_index:ymax_index] | |
|
511 | ||
|
512 | noise[channel] = hildebrand_sekhon(daux, self.max_nIncohInt) | |
|
491 | 513 | |
|
492 | 514 | return noise |
|
493 | 515 | |
@@ -552,6 +574,7 class Spectra(JROData): | |||
|
552 | 574 | #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter |
|
553 | 575 | normFactor = self.nProfiles * self.nIncohInt * self.nCohInt * pwcode * self.windowOfFilter |
|
554 | 576 | |
|
577 | ||
|
555 | 578 | return normFactor |
|
556 | 579 | |
|
557 | 580 | @property |
@@ -582,7 +605,7 class Spectra(JROData): | |||
|
582 | 605 | def getPower(self): |
|
583 | 606 | |
|
584 | 607 | factor = self.normFactor |
|
585 |
z = self.data_spc |
|
|
608 | z = numpy.divide(self.data_spc,factor) | |
|
586 | 609 | z = numpy.where(numpy.isfinite(z), z, numpy.NAN) |
|
587 | 610 | avg = numpy.average(z, axis=1) |
|
588 | 611 |
@@ -58,7 +58,7 class SpectraPlot(Plot): | |||
|
58 | 58 | spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor) |
|
59 | 59 | data['spc'] = spc |
|
60 | 60 | data['rti'] = dataOut.getPower() |
|
61 | data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) | |
|
61 | #data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) | |
|
62 | 62 | meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1)) |
|
63 | 63 | if self.CODE == 'spc_moments': |
|
64 | 64 | data['moments'] = dataOut.moments |
@@ -86,9 +86,10 class SpectraPlot(Plot): | |||
|
86 | 86 | |
|
87 | 87 | data = self.data[-1] |
|
88 | 88 | z = data['spc'] |
|
89 | print(z.shape, x.shape, y.shape) | |
|
89 | #print(z.shape, x.shape, y.shape) | |
|
90 | 90 | for n, ax in enumerate(self.axes): |
|
91 | noise = data['noise'][n] | |
|
91 | #noise = data['noise'][n] | |
|
92 | noise=62 | |
|
92 | 93 | if self.CODE == 'spc_moments': |
|
93 | 94 | mean = data['moments'][n, 1] |
|
94 | 95 | if ax.firsttime: |
@@ -105,15 +106,15 class SpectraPlot(Plot): | |||
|
105 | 106 | if self.showprofile: |
|
106 | 107 | ax.plt_profile = self.pf_axes[n].plot( |
|
107 | 108 | data['rti'][n], y)[0] |
|
108 | ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y, | |
|
109 | color="k", linestyle="dashed", lw=1)[0] | |
|
109 | # ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y, | |
|
110 | # color="k", linestyle="dashed", lw=1)[0] | |
|
110 | 111 | if self.CODE == 'spc_moments': |
|
111 | 112 | ax.plt_mean = ax.plot(mean, y, color='k')[0] |
|
112 | 113 | else: |
|
113 | 114 | ax.plt.set_array(z[n].T.ravel()) |
|
114 | 115 | if self.showprofile: |
|
115 | 116 | ax.plt_profile.set_data(data['rti'][n], y) |
|
116 | ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y) | |
|
117 | #ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y) | |
|
117 | 118 | if self.CODE == 'spc_moments': |
|
118 | 119 | ax.plt_mean.set_data(mean, y) |
|
119 | 120 | if len(self.azimuthList) > 0 and len(self.elevationList) > 0: |
@@ -274,7 +275,7 class RTIPlot(Plot): | |||
|
274 | 275 | |
|
275 | 276 | self.x = self.data.times |
|
276 | 277 | self.y = self.data.yrange |
|
277 | ||
|
278 | #print(" x, y: ",self.x, self.y) | |
|
278 | 279 | self.z = self.data[self.CODE] |
|
279 | 280 | self.z = numpy.array(self.z, dtype=float) |
|
280 | 281 | self.z = numpy.ma.masked_invalid(self.z) |
@@ -816,6 +817,7 class NoiselessSpectraPlot(Plot): | |||
|
816 | 817 | plot_type = 'pcolor' |
|
817 | 818 | buffering = False |
|
818 | 819 | channelList = [] |
|
820 | last_noise = None | |
|
819 | 821 | |
|
820 | 822 | def setup(self): |
|
821 | 823 | |
@@ -842,18 +844,22 class NoiselessSpectraPlot(Plot): | |||
|
842 | 844 | self.update_list(dataOut) |
|
843 | 845 | data = {} |
|
844 | 846 | meta = {} |
|
845 | n0 = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) | |
|
846 | (nch, nff, nh) = dataOut.data_spc.shape | |
|
847 | n1 = numpy.repeat(n0,nh, axis=0).reshape((nch,nh)) | |
|
848 | noise = numpy.repeat(n1,nff, axis=1).reshape((nch,nff,nh)) | |
|
849 | #print(noise.shape, "noise", noise) | |
|
850 | 847 | |
|
851 | spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor) - noise | |
|
848 | norm = dataOut.nProfiles * dataOut.max_nIncohInt * dataOut.nCohInt * dataOut.windowOfFilter | |
|
849 | n0 = 10*numpy.log10(dataOut.getNoise()/float(norm)) | |
|
852 | 850 | |
|
853 | data['spc'] = spc | |
|
854 | data['rti'] = dataOut.getPower() - n1 | |
|
851 | if self.last_noise == None: | |
|
852 | self.last_noise = n0 | |
|
853 | else: | |
|
854 | n0 = (n0*0.2 + self.last_noise*0.8) | |
|
855 | self.last_noise = n0 | |
|
856 | ||
|
857 | spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor) | |
|
855 | 858 | |
|
856 |
data[' |
|
|
859 | data['spc'] = spc - n0 | |
|
860 | data['rti'] = dataOut.getPower() - n0 | |
|
861 | ||
|
862 | #data['noise'] = noise | |
|
857 | 863 | meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1)) |
|
858 | 864 | |
|
859 | 865 | return data, meta |
@@ -877,7 +883,7 class NoiselessSpectraPlot(Plot): | |||
|
877 | 883 | z = data['spc'] |
|
878 | 884 | |
|
879 | 885 | for n, ax in enumerate(self.axes): |
|
880 | noise = data['noise'][n] | |
|
886 | #noise = data['noise'][n] | |
|
881 | 887 | |
|
882 | 888 | if ax.firsttime: |
|
883 | 889 | self.xmax = self.xmax if self.xmax else numpy.nanmax(x) |
@@ -893,16 +899,15 class NoiselessSpectraPlot(Plot): | |||
|
893 | 899 | if self.showprofile: |
|
894 | 900 | ax.plt_profile = self.pf_axes[n].plot( |
|
895 | 901 | data['rti'][n], y)[0] |
|
896 | ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y, | |
|
897 | color="k", linestyle="dashed", lw=1)[0] | |
|
902 | ||
|
898 | 903 | |
|
899 | 904 | else: |
|
900 | 905 | ax.plt.set_array(z[n].T.ravel()) |
|
901 | 906 | if self.showprofile: |
|
902 | 907 | ax.plt_profile.set_data(data['rti'][n], y) |
|
903 | ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y) | |
|
904 | 908 | |
|
905 | self.titles.append('CH {}: {:3.2f}dB'.format(self.channelList[n], noise)) | |
|
909 | ||
|
910 | self.titles.append('CH {}'.format(self.channelList[n])) | |
|
906 | 911 | |
|
907 | 912 | |
|
908 | 913 | class NoiselessRTIPlot(Plot): |
@@ -917,6 +922,7 class NoiselessRTIPlot(Plot): | |||
|
917 | 922 | channelList = [] |
|
918 | 923 | elevationList = [] |
|
919 | 924 | azimuthList = [] |
|
925 | last_noise = None | |
|
920 | 926 | |
|
921 | 927 | def setup(self): |
|
922 | 928 | self.xaxis = 'time' |
@@ -945,19 +951,21 class NoiselessRTIPlot(Plot): | |||
|
945 | 951 | data = {} |
|
946 | 952 | meta = {} |
|
947 | 953 | |
|
948 | n0 = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) | |
|
949 | (nch, nff, nh) = dataOut.data_spc.shape | |
|
950 | #print(nch, nff, nh) | |
|
951 | if nch != 1: | |
|
952 | aux = [] | |
|
953 |
|
|
|
954 | aux.append(n0[c]) | |
|
955 | n0 = numpy.asarray(aux) | |
|
956 | noise = numpy.repeat(n0,nh, axis=0).reshape((nch,nh)) | |
|
957 | #print(dataOut.elevationList, dataOut.azimuthList) | |
|
958 | #print(dataOut.channelList) | |
|
959 |
data['noiseless_rti'] = dataOut.getPower() - n |
|
|
960 | data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) | |
|
954 | ||
|
955 | norm = dataOut.nProfiles * dataOut.max_nIncohInt * dataOut.nCohInt * dataOut.windowOfFilter | |
|
956 | n0 = 10*numpy.log10(dataOut.getNoise()/float(norm)) | |
|
957 | #print("noise: ",n0, dataOut.normFactor, norm, dataOut.nIncohInt, dataOut.max_nIncohInt) | |
|
958 | if self.last_noise == None: | |
|
959 | self.last_noise = n0 | |
|
960 | else: | |
|
961 | n0 = (n0*0.2 + self.last_noise*0.8) | |
|
962 | self.last_noise = n0 | |
|
963 | ||
|
964 | ||
|
965 | data['noiseless_rti'] = dataOut.getPower() - n0 | |
|
966 | ||
|
967 | #data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) | |
|
968 | #print(noise) | |
|
961 | 969 | return data, meta |
|
962 | 970 | |
|
963 | 971 | def plot(self): |
@@ -986,6 +994,7 class NoiselessRTIPlot(Plot): | |||
|
986 | 994 | else: |
|
987 | 995 | x, y, z = self.fill_gaps(*self.decimate()) |
|
988 | 996 | dummy_var = self.axes #Extrañamente esto actualiza el valor axes |
|
997 | #print("plot shapes ", z.shape, x.shape, y.shape) | |
|
989 | 998 | for n, ax in enumerate(self.axes): |
|
990 | 999 | self.zmin = self.zmin if self.zmin else numpy.min(self.z) |
|
991 | 1000 | self.zmax = self.zmax if self.zmax else numpy.max(self.z) |
@@ -999,9 +1008,6 class NoiselessRTIPlot(Plot): | |||
|
999 | 1008 | if self.showprofile: |
|
1000 | 1009 | ax.plot_profile = self.pf_axes[n].plot(data['noiseless_rti'][n], self.y)[0] |
|
1001 | 1010 | |
|
1002 | if "noise" in self.data: | |
|
1003 | ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(data['noise'][n], len(self.y)), self.y, | |
|
1004 | color="k", linestyle="dashed", lw=1)[0] | |
|
1005 | 1011 | else: |
|
1006 | 1012 | ax.collections.remove(ax.collections[0]) |
|
1007 | 1013 | ax.plt = ax.pcolormesh(x, y, z[n].T, |
@@ -1011,6 +1017,164 class NoiselessRTIPlot(Plot): | |||
|
1011 | 1017 | ) |
|
1012 | 1018 | if self.showprofile: |
|
1013 | 1019 | ax.plot_profile.set_data(data['noiseless_rti'][n], self.y) |
|
1014 | if "noise" in self.data: | |
|
1015 | ax.plot_noise.set_data(numpy.repeat( | |
|
1016 |
data['noise'][n] |
|
|
1020 | # if "noise" in self.data: | |
|
1021 | # #ax.plot_noise.set_data(numpy.repeat(data['noise'][n], len(self.y)), self.y) | |
|
1022 | # ax.plot_noise.set_data(data['noise'][n], self.y) | |
|
1023 | ||
|
1024 | ||
|
1025 | class OutliersRTIPlot(Plot): | |
|
1026 | ''' | |
|
1027 | Plot for data_xxxx object | |
|
1028 | ''' | |
|
1029 | ||
|
1030 | CODE = 'outlier' | |
|
1031 | colormap = 'cool' | |
|
1032 | plot_type = 'pcolorbuffer' | |
|
1033 | ||
|
1034 | def setup(self): | |
|
1035 | self.xaxis = 'time' | |
|
1036 | self.ncols = 1 | |
|
1037 | self.nrows = self.data.shape('outlier')[0] | |
|
1038 | self.nplots = self.nrows | |
|
1039 | self.plots_adjust.update({'hspace':0.8, 'left': 0.08, 'bottom': 0.2, 'right':0.94}) | |
|
1040 | ||
|
1041 | ||
|
1042 | if not self.xlabel: | |
|
1043 | self.xlabel = 'Time' | |
|
1044 | ||
|
1045 | self.ylabel = 'Height [km]' | |
|
1046 | if not self.titles: | |
|
1047 | self.titles = ['Outliers Ch:{}'.format(x) for x in range(self.nrows)] | |
|
1048 | ||
|
1049 | def update(self, dataOut): | |
|
1050 | ||
|
1051 | data = {} | |
|
1052 | data['outlier'] = dataOut.data_outlier | |
|
1053 | ||
|
1054 | meta = {} | |
|
1055 | ||
|
1056 | return data, meta | |
|
1057 | ||
|
1058 | def plot(self): | |
|
1059 | # self.data.normalize_heights() | |
|
1060 | self.x = self.data.times | |
|
1061 | self.y = self.data.yrange | |
|
1062 | self.z = self.data['outlier'] | |
|
1063 | ||
|
1064 | #self.z = numpy.ma.masked_invalid(self.z) | |
|
1065 | ||
|
1066 | if self.decimation is None: | |
|
1067 | x, y, z = self.fill_gaps(self.x, self.y, self.z) | |
|
1068 | else: | |
|
1069 | x, y, z = self.fill_gaps(*self.decimate()) | |
|
1070 | ||
|
1071 | for n, ax in enumerate(self.axes): | |
|
1072 | ||
|
1073 | self.zmax = self.zmax if self.zmax is not None else numpy.max( | |
|
1074 | self.z[n]) | |
|
1075 | self.zmin = self.zmin if self.zmin is not None else numpy.min( | |
|
1076 | self.z[n]) | |
|
1077 | data = self.data[-1] | |
|
1078 | if ax.firsttime: | |
|
1079 | if self.zlimits is not None: | |
|
1080 | self.zmin, self.zmax = self.zlimits[n] | |
|
1081 | ||
|
1082 | ax.plt = ax.pcolormesh(x, y, z[n].T, | |
|
1083 | vmin=self.zmin, | |
|
1084 | vmax=self.zmax, | |
|
1085 | cmap=self.cmaps[n] | |
|
1086 | ) | |
|
1087 | if self.showprofile: | |
|
1088 | ax.plot_profile = self.pf_axes[n].plot(data['outlier'][n], self.y)[0] | |
|
1089 | self.pf_axes[n].set_xlabel('') | |
|
1090 | else: | |
|
1091 | if self.zlimits is not None: | |
|
1092 | self.zmin, self.zmax = self.zlimits[n] | |
|
1093 | ax.collections.remove(ax.collections[0]) | |
|
1094 | ax.plt = ax.pcolormesh(x, y, z[n].T , | |
|
1095 | vmin=self.zmin, | |
|
1096 | vmax=self.zmax, | |
|
1097 | cmap=self.cmaps[n] | |
|
1098 | ) | |
|
1099 | if self.showprofile: | |
|
1100 | ax.plot_profile.set_data(data['outlier'][n], self.y) | |
|
1101 | self.pf_axes[n].set_xlabel('') | |
|
1102 | ||
|
1103 | # class NoiseRTIPlot(Plot): | |
|
1104 | # ''' | |
|
1105 | # Plot for data_xxxx object | |
|
1106 | # ''' | |
|
1107 | # | |
|
1108 | # CODE = 'noise' | |
|
1109 | # colormap = 'jet' | |
|
1110 | # plot_type = 'pcolorbuffer' | |
|
1111 | # | |
|
1112 | # def setup(self): | |
|
1113 | # self.xaxis = 'time' | |
|
1114 | # self.ncols = 1 | |
|
1115 | # self.nrows = self.data.shape('noise')[0] | |
|
1116 | # self.nplots = self.nrows | |
|
1117 | # self.plots_adjust.update({'hspace':0.8, 'left': 0.08, 'bottom': 0.2, 'right':0.94}) | |
|
1118 | # | |
|
1119 | # | |
|
1120 | # if not self.xlabel: | |
|
1121 | # self.xlabel = 'Time' | |
|
1122 | # | |
|
1123 | # self.ylabel = 'Height [km]' | |
|
1124 | # if not self.titles: | |
|
1125 | # self.titles = ['noise Ch:{}'.format(x) for x in range(self.nrows)] | |
|
1126 | # | |
|
1127 | # def update(self, dataOut): | |
|
1128 | # | |
|
1129 | # data = {} | |
|
1130 | # norm = dataOut.max_nIncohInt*dataOut.nProfiles* dataOut.nCohInt*dataOut.windowOfFilter | |
|
1131 | # print("max incoh: ",dataOut.max_nIncohInt ) | |
|
1132 | # n0 = 10*numpy.log10(dataOut.getNoise()/norm) | |
|
1133 | # data['noise'] = n0 | |
|
1134 | # | |
|
1135 | # meta = {} | |
|
1136 | # | |
|
1137 | # return data, meta | |
|
1138 | # | |
|
1139 | # def plot(self): | |
|
1140 | # # self.data.normalize_heights() | |
|
1141 | # self.x = self.data.times | |
|
1142 | # self.y = self.data.yrange | |
|
1143 | # self.z = self.data['noise'] | |
|
1144 | # | |
|
1145 | # #self.z = numpy.ma.masked_invalid(self.z) | |
|
1146 | # | |
|
1147 | # if self.decimation is None: | |
|
1148 | # x, y, z = self.fill_gaps(self.x, self.y, self.z) | |
|
1149 | # else: | |
|
1150 | # x, y, z = self.fill_gaps(*self.decimate()) | |
|
1151 | # | |
|
1152 | # for n, ax in enumerate(self.axes): | |
|
1153 | # | |
|
1154 | # self.zmax = self.zmax if self.zmax is not None else numpy.max( | |
|
1155 | # self.z[n]) | |
|
1156 | # self.zmin = self.zmin if self.zmin is not None else numpy.min( | |
|
1157 | # self.z[n]) | |
|
1158 | # data = self.data[-1] | |
|
1159 | # if ax.firsttime: | |
|
1160 | # if self.zlimits is not None: | |
|
1161 | # self.zmin, self.zmax = self.zlimits[n] | |
|
1162 | # | |
|
1163 | # ax.plt = ax.pcolormesh(x, y, z[n].T, | |
|
1164 | # vmin=self.zmin, | |
|
1165 | # vmax=self.zmax, | |
|
1166 | # cmap=self.cmaps[n] | |
|
1167 | # ) | |
|
1168 | # if self.showprofile: | |
|
1169 | # ax.plot_profile = self.pf_axes[n].plot(data['noise'][n], self.y)[0] | |
|
1170 | # else: | |
|
1171 | # if self.zlimits is not None: | |
|
1172 | # self.zmin, self.zmax = self.zlimits[n] | |
|
1173 | # ax.collections.remove(ax.collections[0]) | |
|
1174 | # ax.plt = ax.pcolormesh(x, y, z[n].T , | |
|
1175 | # vmin=self.zmin, | |
|
1176 | # vmax=self.zmax, | |
|
1177 | # cmap=self.cmaps[n] | |
|
1178 | # ) | |
|
1179 | # if self.showprofile: | |
|
1180 | # ax.plot_profile.set_data(data['noise'][n], self.y) |
@@ -185,6 +185,7 class AMISRReader(ProcessingUnit): | |||
|
185 | 185 | self.nsa = self.nsamplesPulse[0,0] #ngates |
|
186 | 186 | self.nchannels = len(self.beamCode) |
|
187 | 187 | self.ippSeconds = (self.radacTime[0][1] -self.radacTime[0][0]) #Ipp in seconds |
|
188 | #print("IPPS secs: ",self.ippSeconds) | |
|
188 | 189 | #self.__waitForNewFile = self.nblocks # wait depending on the number of blocks since each block is 1 sec |
|
189 | 190 | self.__waitForNewFile = self.nblocks * self.nprofiles * self.ippSeconds # wait until new file is created |
|
190 | 191 |
@@ -20,7 +20,7 from schainpy.model.data.jrodata import hildebrand_sekhon | |||
|
20 | 20 | from schainpy.model.data import _noise |
|
21 | 21 | |
|
22 | 22 | from schainpy.utils import log |
|
23 | ||
|
23 | import matplotlib.pyplot as plt | |
|
24 | 24 | from scipy.optimize import curve_fit |
|
25 | 25 | |
|
26 | 26 | class SpectraProc(ProcessingUnit): |
@@ -125,7 +125,7 class SpectraProc(ProcessingUnit): | |||
|
125 | 125 | self.dataOut.flagShiftFFT = False |
|
126 | 126 | |
|
127 | 127 | def run(self, nProfiles=None, nFFTPoints=None, pairsList=None, ippFactor=None, shift_fft=False): |
|
128 | ||
|
128 | #print("run spc proc") | |
|
129 | 129 | if self.dataIn.type == "Spectra": |
|
130 | 130 | |
|
131 | 131 | try: |
@@ -199,6 +199,7 class SpectraProc(ProcessingUnit): | |||
|
199 | 199 | if self.profIndex == nProfiles: |
|
200 | 200 | |
|
201 | 201 | self.__updateSpecFromVoltage() |
|
202 | ||
|
202 | 203 | if pairsList == None: |
|
203 | 204 | self.dataOut.pairsList = [pair for pair in itertools.combinations(self.dataOut.channelList, 2)] |
|
204 | 205 | else: |
@@ -208,6 +209,7 class SpectraProc(ProcessingUnit): | |||
|
208 | 209 | self.firstdatatime = None |
|
209 | 210 | self.profIndex = 0 |
|
210 | 211 | |
|
212 | ||
|
211 | 213 | else: |
|
212 | 214 | raise ValueError("The type of input object '%s' is not valid".format( |
|
213 | 215 | self.dataIn.type)) |
@@ -529,55 +531,56 class getNoise(Operation): | |||
|
529 | 531 | # validacion de velocidades |
|
530 | 532 | indminPoint = None |
|
531 | 533 | indmaxPoint = None |
|
534 | if self.dataOut.type == 'Spectra': | |
|
535 | if minVel == None and maxVel == None : | |
|
532 | 536 | |
|
533 | if minVel == None and maxVel == None: | |
|
537 | freqrange = self.dataOut.getFreqRange(1) | |
|
534 | 538 | |
|
535 | freqrange = self.dataOut.getFreqRange(1) | |
|
539 | if minFreq == None: | |
|
540 | minFreq = freqrange[0] | |
|
536 | 541 | |
|
537 |
if m |
|
|
538 |
|
|
|
542 | if maxFreq == None: | |
|
543 | maxFreq = freqrange[-1] | |
|
539 | 544 | |
|
540 | if maxFreq == None: | |
|
541 | maxFreq = freqrange[-1] | |
|
545 | if (minFreq < freqrange[0]) or (minFreq > maxFreq): | |
|
546 | if self.warnings: | |
|
547 | print('minFreq: %.2f is out of the frequency range' % (minFreq)) | |
|
548 | print('minFreq is setting to %.2f' % (freqrange[0])) | |
|
549 | minFreq = freqrange[0] | |
|
542 | 550 | |
|
543 |
if (m |
|
|
544 | if self.warnings: | |
|
545 |
print('m |
|
|
546 |
print('m |
|
|
547 |
|
|
|
551 | if (maxFreq > freqrange[-1]) or (maxFreq < minFreq): | |
|
552 | if self.warnings: | |
|
553 | print('maxFreq: %.2f is out of the frequency range' % (maxFreq)) | |
|
554 | print('maxFreq is setting to %.2f' % (freqrange[-1])) | |
|
555 | maxFreq = freqrange[-1] | |
|
548 | 556 | |
|
549 | if (maxFreq > freqrange[-1]) or (maxFreq < minFreq): | |
|
550 | if self.warnings: | |
|
551 | print('maxFreq: %.2f is out of the frequency range' % (maxFreq)) | |
|
552 | print('maxFreq is setting to %.2f' % (freqrange[-1])) | |
|
553 | maxFreq = freqrange[-1] | |
|
557 | indminPoint = numpy.where(freqrange >= minFreq) | |
|
558 | indmaxPoint = numpy.where(freqrange <= maxFreq) | |
|
554 | 559 | |
|
555 | indminPoint = numpy.where(freqrange >= minFreq) | |
|
556 | indmaxPoint = numpy.where(freqrange <= maxFreq) | |
|
560 | else: | |
|
557 | 561 | |
|
558 | else: | |
|
559 | velrange = self.dataOut.getVelRange(1) | |
|
562 | velrange = self.dataOut.getVelRange(1) | |
|
560 | 563 | |
|
561 | if minVel == None: | |
|
562 | minVel = velrange[0] | |
|
564 | if minVel == None: | |
|
565 | minVel = velrange[0] | |
|
563 | 566 | |
|
564 | if maxVel == None: | |
|
565 | maxVel = velrange[-1] | |
|
567 | if maxVel == None: | |
|
568 | maxVel = velrange[-1] | |
|
566 | 569 | |
|
567 | if (minVel < velrange[0]) or (minVel > maxVel): | |
|
568 | if self.warnings: | |
|
569 | print('minVel: %.2f is out of the velocity range' % (minVel)) | |
|
570 | print('minVel is setting to %.2f' % (velrange[0])) | |
|
571 | minVel = velrange[0] | |
|
570 | if (minVel < velrange[0]) or (minVel > maxVel): | |
|
571 | if self.warnings: | |
|
572 | print('minVel: %.2f is out of the velocity range' % (minVel)) | |
|
573 | print('minVel is setting to %.2f' % (velrange[0])) | |
|
574 | minVel = velrange[0] | |
|
572 | 575 | |
|
573 | if (maxVel > velrange[-1]) or (maxVel < minVel): | |
|
574 | if self.warnings: | |
|
575 | print('maxVel: %.2f is out of the velocity range' % (maxVel)) | |
|
576 | print('maxVel is setting to %.2f' % (velrange[-1])) | |
|
577 | maxVel = velrange[-1] | |
|
576 | if (maxVel > velrange[-1]) or (maxVel < minVel): | |
|
577 | if self.warnings: | |
|
578 | print('maxVel: %.2f is out of the velocity range' % (maxVel)) | |
|
579 | print('maxVel is setting to %.2f' % (velrange[-1])) | |
|
580 | maxVel = velrange[-1] | |
|
578 | 581 | |
|
579 | indminPoint = numpy.where(velrange >= minVel) | |
|
580 | indmaxPoint = numpy.where(velrange <= maxVel) | |
|
582 | indminPoint = numpy.where(velrange >= minVel) | |
|
583 | indmaxPoint = numpy.where(velrange <= maxVel) | |
|
581 | 584 | |
|
582 | 585 | |
|
583 | 586 | # seleccion de indices para rango |
@@ -606,23 +609,30 class getNoise(Operation): | |||
|
606 | 609 | maxIndex = self.dataOut.nHeights - 1 |
|
607 | 610 | #############################################################3 |
|
608 | 611 | # seleccion de indices para velocidades |
|
612 | if self.dataOut.type == 'Spectra': | |
|
613 | try: | |
|
614 | minIndexFFT = indminPoint[0][0] | |
|
615 | except: | |
|
616 | minIndexFFT = 0 | |
|
609 | 617 | |
|
610 | try: | |
|
611 |
|
|
|
612 | except: | |
|
613 | minIndexFFT = 0 | |
|
618 | try: | |
|
619 | maxIndexFFT = indmaxPoint[0][-1] | |
|
620 | except: | |
|
621 | maxIndexFFT = len( self.dataOut.getFreqRange(1)) | |
|
614 | 622 | |
|
615 | try: | |
|
616 | maxIndexFFT = indmaxPoint[0][-1] | |
|
617 | except: | |
|
618 | maxIndexFFT = len( self.dataOut.getFreqRange(1)) | |
|
619 | 623 | |
|
620 | #print(minIndex, maxIndex,minIndexVel, maxIndexVel) | |
|
621 | 624 | self.dataOut.noise_estimation = None |
|
622 | noise = self.dataOut.getNoise(xmin_index=minIndexFFT, xmax_index=maxIndexFFT, ymin_index=minIndex, ymax_index=maxIndex) | |
|
623 | ||
|
625 | noise = None | |
|
626 | if self.dataOut.type == 'Voltage': | |
|
627 | noise = self.dataOut.getNoise(ymin_index=minIndex, ymax_index=maxIndex) | |
|
628 | #print(minIndex, maxIndex,minIndexVel, maxIndexVel) | |
|
629 | elif self.dataOut.type == 'Spectra': | |
|
630 | noise = self.dataOut.getNoise(xmin_index=minIndexFFT, xmax_index=maxIndexFFT, ymin_index=minIndex, ymax_index=maxIndex) | |
|
631 | else: | |
|
632 | noise = self.dataOut.getNoise(xmin_index=minIndexFFT, xmax_index=maxIndexFFT, ymin_index=minIndex, ymax_index=maxIndex) | |
|
624 | 633 | self.dataOut.noise_estimation = noise.copy() # dataOut.noise |
|
625 | 634 | #print("2: ",10*numpy.log10(self.dataOut.noise_estimation/64)) |
|
635 | ||
|
626 | 636 | return self.dataOut |
|
627 | 637 | |
|
628 | 638 | |
@@ -705,7 +715,7 class CleanRayleigh(Operation): | |||
|
705 | 715 | |
|
706 | 716 | |
|
707 | 717 | def run(self, dataOut,min_hei=None,max_hei=None, n=None, timeInterval=10,factor_stdv=2.5): |
|
708 | ||
|
718 | #print("runing cleanRayleigh") | |
|
709 | 719 | if not self.isConfig : |
|
710 | 720 | |
|
711 | 721 | self.setup(dataOut, min_hei,max_hei,n,timeInterval,factor_stdv) |
@@ -736,7 +746,10 class CleanRayleigh(Operation): | |||
|
736 | 746 | if numpy.any(jspc) : |
|
737 | 747 | #print( jspc.shape, jcspc.shape) |
|
738 | 748 | jspc = numpy.reshape(jspc,(int(len(jspc)/self.nChannels),self.nChannels,self.nFFTPoints,self.nHeights)) |
|
739 | jcspc= numpy.reshape(jcspc,(int(len(jcspc)/self.nPairs),self.nPairs,self.nFFTPoints,self.nHeights)) | |
|
749 | try: | |
|
750 | jcspc= numpy.reshape(jcspc,(int(len(jcspc)/self.nPairs),self.nPairs,self.nFFTPoints,self.nHeights)) | |
|
751 | except: | |
|
752 | print("no cspc") | |
|
740 | 753 | self.__dataReady = False |
|
741 | 754 | #print( jspc.shape, jcspc.shape) |
|
742 | 755 | dataOut.flagNoData = False |
@@ -748,8 +761,11 class CleanRayleigh(Operation): | |||
|
748 | 761 | #print( len(self.buffer)) |
|
749 | 762 | if numpy.any(self.buffer): |
|
750 | 763 | self.buffer = numpy.concatenate((self.buffer,dataOut.data_spc), axis=0) |
|
751 | self.buffer2 = numpy.concatenate((self.buffer2,dataOut.data_cspc), axis=0) | |
|
752 |
self.buffer |
|
|
764 | try: | |
|
765 | self.buffer2 = numpy.concatenate((self.buffer2,dataOut.data_cspc), axis=0) | |
|
766 | self.buffer3 += dataOut.data_dc | |
|
767 | except: | |
|
768 | pass | |
|
753 | 769 | else: |
|
754 | 770 | self.buffer = dataOut.data_spc |
|
755 | 771 | self.buffer2 = dataOut.data_cspc |
@@ -762,7 +778,9 class CleanRayleigh(Operation): | |||
|
762 | 778 | |
|
763 | 779 | |
|
764 | 780 | #index = tini.tm_hour*12+tini.tm_min/5 |
|
765 |
''' |
|
|
781 | ''' | |
|
782 | REVISAR | |
|
783 | ''' | |
|
766 | 784 | # jspc = jspc/self.nFFTPoints/self.normFactor |
|
767 | 785 | # jcspc = jcspc/self.nFFTPoints/self.normFactor |
|
768 | 786 | |
@@ -776,6 +794,7 class CleanRayleigh(Operation): | |||
|
776 | 794 | |
|
777 | 795 | dataOut.data_dc = self.buffer3 |
|
778 | 796 | dataOut.nIncohInt *= self.nIntProfiles |
|
797 | dataOut.max_nIncohInt = self.nIntProfiles | |
|
779 | 798 | dataOut.utctime = self.currentTime #tiempo promediado |
|
780 | 799 | #print("Time: ",time.localtime(dataOut.utctime)) |
|
781 | 800 | # dataOut.data_spc = sat_spectra |
@@ -787,7 +806,7 class CleanRayleigh(Operation): | |||
|
787 | 806 | return dataOut |
|
788 | 807 | |
|
789 | 808 | def cleanRayleigh(self,dataOut,spectra,cspectra,factor_stdv): |
|
790 |
|
|
|
809 | print("OP cleanRayleigh") | |
|
791 | 810 | #import matplotlib.pyplot as plt |
|
792 | 811 | #for k in range(149): |
|
793 | 812 | #channelsProcssd = [] |
@@ -803,6 +822,8 class CleanRayleigh(Operation): | |||
|
803 | 822 | |
|
804 | 823 | ###ONLY FOR TEST: |
|
805 | 824 | raxs = math.ceil(math.sqrt(self.nPairs)) |
|
825 | if raxs == 0: | |
|
826 | raxs = 1 | |
|
806 | 827 | caxs = math.ceil(self.nPairs/raxs) |
|
807 | 828 | if self.nPairs <4: |
|
808 | 829 | raxs = 2 |
@@ -1100,12 +1121,13 class IntegrationFaradaySpectra(Operation): | |||
|
1100 | 1121 | __dataReady = False |
|
1101 | 1122 | |
|
1102 | 1123 | __timeInterval = None |
|
1103 | ||
|
1124 | n_ints = None #matriz de numero de integracions (CH,HEI) | |
|
1104 | 1125 | n = None |
|
1105 | 1126 | minHei_ind = None |
|
1106 | 1127 | maxHei_ind = None |
|
1107 | 1128 | navg = 1.0 |
|
1108 | 1129 | factor = 0.0 |
|
1130 | dataoutliers = None # (CHANNELS, HEIGHTS) | |
|
1109 | 1131 | |
|
1110 | 1132 | def __init__(self): |
|
1111 | 1133 | |
@@ -1138,6 +1160,7 class IntegrationFaradaySpectra(Operation): | |||
|
1138 | 1160 | self.navg = avg |
|
1139 | 1161 | #self.ByLags = dataOut.ByLags ###REDEFINIR |
|
1140 | 1162 | self.ByLags = False |
|
1163 | self.maxProfilesInt = 1 | |
|
1141 | 1164 | |
|
1142 | 1165 | if DPL != None: |
|
1143 | 1166 | self.DPL=DPL |
@@ -1251,6 +1274,8 class IntegrationFaradaySpectra(Operation): | |||
|
1251 | 1274 | freq_dc = int(self.__buffer_spc.shape[2] / 2) |
|
1252 | 1275 | #print("FREQ_DC",freq_dc,self.__buffer_spc.shape,self.nHeights) |
|
1253 | 1276 | |
|
1277 | self.dataOutliers = numpy.zeros((self.nChannels,self.nHeights)) # --> almacen de outliers | |
|
1278 | ||
|
1254 | 1279 | for k in range(self.minHei_ind,self.maxHei_ind): |
|
1255 | 1280 | try: |
|
1256 | 1281 | buffer_cspc=numpy.copy(self.__buffer_cspc[:,:,:,k]) |
@@ -1266,22 +1291,31 class IntegrationFaradaySpectra(Operation): | |||
|
1266 | 1291 | #sortIDs=[] |
|
1267 | 1292 | outliers_IDs=[] |
|
1268 | 1293 | |
|
1269 | for j in range(self.nProfiles): | |
|
1294 | for j in range(self.nProfiles): #frecuencias en el tiempo | |
|
1270 | 1295 | # if i==0 and j==freq_dc: #NOT CONSIDERING DC PROFILE AT CHANNEL 0 |
|
1271 | 1296 | # continue |
|
1272 | 1297 | # if i==1 and j==0: #NOT CONSIDERING DC PROFILE AT CHANNEL 1 |
|
1273 | 1298 | # continue |
|
1274 | 1299 | buffer=buffer1[:,j] |
|
1275 | 1300 | sortdata = numpy.sort(buffer, axis=None) |
|
1301 | ||
|
1276 | 1302 | sortID=buffer.argsort() |
|
1277 | 1303 | index = _noise.hildebrand_sekhon2(sortdata,self.navg) |
|
1278 | 1304 | |
|
1279 | 1305 | #index,sortID=self.hildebrand_sekhon_Integration(buffer,1,self.factor) |
|
1280 | 1306 | |
|
1307 | # fig,ax = plt.subplots() | |
|
1308 | # ax.set_title(str(k)+" "+str(j)) | |
|
1309 | # x=range(len(sortdata)) | |
|
1310 | # ax.scatter(x,sortdata) | |
|
1311 | # ax.axvline(index) | |
|
1312 | # plt.show() | |
|
1313 | ||
|
1281 | 1314 | indexes.append(index) |
|
1282 | 1315 | #sortIDs.append(sortID) |
|
1283 | 1316 | outliers_IDs=numpy.append(outliers_IDs,sortID[index:]) |
|
1284 | 1317 | |
|
1318 | #print("Outliers: ",outliers_IDs) | |
|
1285 | 1319 | outliers_IDs=numpy.array(outliers_IDs) |
|
1286 | 1320 | outliers_IDs=outliers_IDs.ravel() |
|
1287 | 1321 | outliers_IDs=numpy.unique(outliers_IDs) |
@@ -1289,31 +1323,45 class IntegrationFaradaySpectra(Operation): | |||
|
1289 | 1323 | indexes=numpy.array(indexes) |
|
1290 | 1324 | indexmin=numpy.min(indexes) |
|
1291 | 1325 | |
|
1326 | ||
|
1327 | #print(indexmin,buffer1.shape[0], k) | |
|
1328 | ||
|
1329 | # fig,ax = plt.subplots() | |
|
1330 | # ax.plot(sortdata) | |
|
1331 | # ax2 = ax.twinx() | |
|
1332 | # x=range(len(indexes)) | |
|
1333 | # #plt.scatter(x,indexes) | |
|
1334 | # ax2.scatter(x,indexes) | |
|
1335 | # plt.show() | |
|
1336 | ||
|
1292 | 1337 | if indexmin != buffer1.shape[0]: |
|
1293 | 1338 | if self.nChannels > 1: |
|
1294 | 1339 | cspc_outliers_exist= True |
|
1295 | 1340 | |
|
1296 | 1341 | lt=outliers_IDs |
|
1297 | avg=numpy.mean(buffer1[[t for t in range(buffer1.shape[0]) if t not in lt],:],axis=0) | |
|
1342 | #avg=numpy.mean(buffer1[[t for t in range(buffer1.shape[0]) if t not in lt],:],axis=0) | |
|
1298 | 1343 | |
|
1299 | 1344 | for p in list(outliers_IDs): |
|
1300 | buffer1[p,:]=avg | |
|
1345 | #buffer1[p,:]=avg | |
|
1346 | buffer1[p,:] = numpy.NaN | |
|
1347 | ||
|
1348 | self.dataOutliers[i,k] = len(outliers_IDs) | |
|
1301 | 1349 | |
|
1302 | 1350 | self.__buffer_spc[:,i,:,k]=numpy.copy(buffer1) |
|
1303 | ###cspc IDs | |
|
1304 | #indexmin_cspc+=indexmin_cspc | |
|
1351 | ||
|
1305 | 1352 | outliers_IDs_cspc=numpy.append(outliers_IDs_cspc,outliers_IDs) |
|
1306 | 1353 | |
|
1307 | #if not breakFlag: | |
|
1354 | ||
|
1355 | ||
|
1308 | 1356 | outliers_IDs_cspc=outliers_IDs_cspc.astype(numpy.dtype('int64')) |
|
1309 | 1357 | if cspc_outliers_exist : |
|
1310 | #sortdata=numpy.sort(buffer_cspc,axis=0) | |
|
1311 | #avg=numpy.mean(sortdata[:indexmin_cpsc,:],axis=0) | |
|
1358 | ||
|
1312 | 1359 | lt=outliers_IDs_cspc |
|
1313 | 1360 | |
|
1314 | avg=numpy.mean(buffer_cspc[[t for t in range(buffer_cspc.shape[0]) if t not in lt],:],axis=0) | |
|
1361 | #avg=numpy.mean(buffer_cspc[[t for t in range(buffer_cspc.shape[0]) if t not in lt],:],axis=0) | |
|
1315 | 1362 | for p in list(outliers_IDs_cspc): |
|
1316 | buffer_cspc[p,:]=avg | |
|
1363 | #buffer_cspc[p,:]=avg | |
|
1364 | buffer_cspc[p,:] = numpy.NaN | |
|
1317 | 1365 | |
|
1318 | 1366 | try: |
|
1319 | 1367 | self.__buffer_cspc[:,:,:,k]=numpy.copy(buffer_cspc) |
@@ -1325,39 +1373,36 class IntegrationFaradaySpectra(Operation): | |||
|
1325 | 1373 | |
|
1326 | 1374 | |
|
1327 | 1375 | |
|
1328 | ||
|
1376 | nOutliers = len(outliers_IDs) | |
|
1377 | #print("Outliers n: ",self.dataOutliers,nOutliers) | |
|
1329 | 1378 | buffer=None |
|
1330 | 1379 | bufferH=None |
|
1331 | 1380 | buffer1=None |
|
1332 | 1381 | buffer_cspc=None |
|
1333 | 1382 | |
|
1334 | #print("cpsc",self.__buffer_cspc[:,0,0,0,0]) | |
|
1335 | #exit() | |
|
1336 | 1383 | |
|
1337 | 1384 | buffer=None |
|
1338 | #print(self.__buffer_spc[:,1,3,20,0]) | |
|
1339 |
# |
|
|
1340 | data_spc = numpy.sum(self.__buffer_spc,axis=0) | |
|
1385 | ||
|
1386 | #data_spc = numpy.sum(self.__buffer_spc,axis=0) | |
|
1387 | data_spc = numpy.nansum(self.__buffer_spc,axis=0) | |
|
1341 | 1388 | try: |
|
1342 | data_cspc = numpy.sum(self.__buffer_cspc,axis=0) | |
|
1389 | #data_cspc = numpy.sum(self.__buffer_cspc,axis=0) | |
|
1390 | data_cspc = numpy.nansum(self.__buffer_cspc,axis=0) | |
|
1343 | 1391 | except: |
|
1344 | 1392 | #print("No cpsc",e) |
|
1345 | 1393 | pass |
|
1346 | 1394 | |
|
1347 | 1395 | |
|
1348 | #print(numpy.shape(data_spc)) | |
|
1349 | #data_spc[1,4,20,0]=numpy.nan | |
|
1350 | ||
|
1351 | #data_cspc = self.__buffer_cspc | |
|
1352 | #print("pushData pre Done") | |
|
1353 | 1396 | data_dc = self.__buffer_dc |
|
1354 | n = self.__profIndex | |
|
1397 | #(CH, HEIGH) | |
|
1398 | self.maxProfilesInt = self.__profIndex | |
|
1399 | n = self.__profIndex - self.dataOutliers | |
|
1355 | 1400 | |
|
1356 | 1401 | self.__buffer_spc = [] |
|
1357 | 1402 | self.__buffer_cspc = [] |
|
1358 | 1403 | self.__buffer_dc = 0 |
|
1359 | 1404 | self.__profIndex = 0 |
|
1360 | #print("pushData Done") | |
|
1405 | ||
|
1361 | 1406 | return data_spc, data_cspc, data_dc, n |
|
1362 | 1407 | |
|
1363 | 1408 | def byProfiles(self, *args): |
@@ -1372,7 +1417,7 class IntegrationFaradaySpectra(Operation): | |||
|
1372 | 1417 | if self.__profIndex == self.n: |
|
1373 | 1418 | |
|
1374 | 1419 | avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData() |
|
1375 | self.n = n | |
|
1420 | self.n_ints = n | |
|
1376 | 1421 | self.__dataReady = True |
|
1377 | 1422 | |
|
1378 | 1423 | return avgdata_spc, avgdata_cspc, avgdata_dc |
@@ -1388,7 +1433,7 class IntegrationFaradaySpectra(Operation): | |||
|
1388 | 1433 | |
|
1389 | 1434 | if (datatime - self.__initime) >= self.__integrationtime: |
|
1390 | 1435 | avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData() |
|
1391 | self.n = n | |
|
1436 | self.n_ints = n | |
|
1392 | 1437 | self.__dataReady = True |
|
1393 | 1438 | |
|
1394 | 1439 | return avgdata_spc, avgdata_cspc, avgdata_dc |
@@ -1450,7 +1495,7 class IntegrationFaradaySpectra(Operation): | |||
|
1450 | 1495 | self.dataOut.data_spc = numpy.squeeze(avgdata_spc) |
|
1451 | 1496 | self.dataOut.data_cspc = numpy.squeeze(avgdata_cspc) |
|
1452 | 1497 | self.dataOut.data_dc = avgdata_dc |
|
1453 | ||
|
1498 | self.dataOut.data_outlier = self.dataOutliers | |
|
1454 | 1499 | |
|
1455 | 1500 | else: |
|
1456 | 1501 | self.dataOut.dataLag_spc = avgdata_spc |
@@ -1462,10 +1507,12 class IntegrationFaradaySpectra(Operation): | |||
|
1462 | 1507 | self.dataOut.data_dc=self.dataOut.dataLag_dc[:,:,self.dataOut.LagPlot] |
|
1463 | 1508 | |
|
1464 | 1509 | |
|
1465 | self.dataOut.nIncohInt *= self.n | |
|
1510 | self.dataOut.nIncohInt *= self.n_ints | |
|
1511 | self.dataOut.max_nIncohInt = self.maxProfilesInt | |
|
1512 | #print(self.dataOut.max_nIncohInt) | |
|
1466 | 1513 | self.dataOut.utctime = avgdatatime |
|
1467 | 1514 | self.dataOut.flagNoData = False |
|
1468 | ||
|
1515 | #print("Faraday Integration DONE...") | |
|
1469 | 1516 | return self.dataOut |
|
1470 | 1517 | |
|
1471 | 1518 | class removeInterference(Operation): |
@@ -1705,7 +1752,8 class IncohInt(Operation): | |||
|
1705 | 1752 | __dataReady = False |
|
1706 | 1753 | |
|
1707 | 1754 | __timeInterval = None |
|
1708 | ||
|
1755 | incohInt = 0 | |
|
1756 | nOutliers = 0 | |
|
1709 | 1757 | n = None |
|
1710 | 1758 | |
|
1711 | 1759 | def __init__(self): |
@@ -1734,7 +1782,8 class IncohInt(Operation): | |||
|
1734 | 1782 | self.__profIndex = 0 |
|
1735 | 1783 | self.__dataReady = False |
|
1736 | 1784 | self.__byTime = False |
|
1737 | ||
|
1785 | self.incohInt = 0 | |
|
1786 | self.nOutliers = 0 | |
|
1738 | 1787 | if n is None and timeInterval is None: |
|
1739 | 1788 | raise ValueError("n or timeInterval should be specified ...") |
|
1740 | 1789 | |
@@ -1788,7 +1837,7 class IncohInt(Operation): | |||
|
1788 | 1837 | self.__buffer_spc = 0 |
|
1789 | 1838 | self.__buffer_cspc = 0 |
|
1790 | 1839 | self.__buffer_dc = 0 |
|
1791 | self.__profIndex = 0 | |
|
1840 | ||
|
1792 | 1841 | |
|
1793 | 1842 | return data_spc, data_cspc, data_dc, n |
|
1794 | 1843 | |
@@ -1845,6 +1894,9 class IncohInt(Operation): | |||
|
1845 | 1894 | if n == 1: |
|
1846 | 1895 | return dataOut |
|
1847 | 1896 | |
|
1897 | if dataOut.flagNoData == True: | |
|
1898 | return dataOut | |
|
1899 | ||
|
1848 | 1900 | dataOut.flagNoData = True |
|
1849 | 1901 | |
|
1850 | 1902 | if not self.isConfig: |
@@ -1855,15 +1907,21 class IncohInt(Operation): | |||
|
1855 | 1907 | dataOut.data_spc, |
|
1856 | 1908 | dataOut.data_cspc, |
|
1857 | 1909 | dataOut.data_dc) |
|
1858 | ||
|
1910 | self.incohInt += dataOut.nIncohInt | |
|
1911 | self.nOutliers += dataOut.data_outlier | |
|
1859 | 1912 | if self.__dataReady: |
|
1860 | 1913 | |
|
1861 | 1914 | dataOut.data_spc = avgdata_spc |
|
1862 | 1915 | dataOut.data_cspc = avgdata_cspc |
|
1863 | 1916 | dataOut.data_dc = avgdata_dc |
|
1864 |
dataOut.nIncohInt |
|
|
1917 | dataOut.nIncohInt = self.incohInt | |
|
1918 | dataOut.data_outlier = self.nOutliers | |
|
1865 | 1919 | dataOut.utctime = avgdatatime |
|
1866 | 1920 | dataOut.flagNoData = False |
|
1921 | dataOut.max_nIncohInt = self.__profIndex | |
|
1922 | self.incohInt = 0 | |
|
1923 | self.nOutliers = 0 | |
|
1924 | self.__profIndex = 0 | |
|
1867 | 1925 | |
|
1868 | 1926 | return dataOut |
|
1869 | 1927 |
@@ -8,7 +8,8 from schainpy.model.io.utils import getHei_index | |||
|
8 | 8 | from time import time |
|
9 | 9 | import datetime |
|
10 | 10 | import numpy |
|
11 | import copy | |
|
11 | #import copy | |
|
12 | from schainpy.model.data import _noise | |
|
12 | 13 | |
|
13 | 14 | class VoltageProc(ProcessingUnit): |
|
14 | 15 | |
@@ -1759,6 +1760,8 class SSheightProfiles2(Operation): | |||
|
1759 | 1760 | profileShape = None |
|
1760 | 1761 | sshProfiles = None |
|
1761 | 1762 | profileIndex = None |
|
1763 | deltaHeight = None | |
|
1764 | init_range = None | |
|
1762 | 1765 | |
|
1763 | 1766 | def __init__(self, **kwargs): |
|
1764 | 1767 | |
@@ -1780,7 +1783,8 class SSheightProfiles2(Operation): | |||
|
1780 | 1783 | if residue != 0: |
|
1781 | 1784 | print("The residue is %d, step=%d should be multiple of %d to avoid loss of %d samples"%(residue,step,shape[1] - self.nsamples,residue)) |
|
1782 | 1785 | |
|
1783 | deltaHeight = dataOut.heightList[1] - dataOut.heightList[0] | |
|
1786 | self.deltaHeight = dataOut.heightList[1] - dataOut.heightList[0] | |
|
1787 | self.init_range = dataOut.heightList[0] | |
|
1784 | 1788 | #numberProfile = self.nsamples |
|
1785 | 1789 | self.numberSamples = (self.__nHeis - self.nsamples)/self.step |
|
1786 | 1790 | |
@@ -1800,21 +1804,25 class SSheightProfiles2(Operation): | |||
|
1800 | 1804 | |
|
1801 | 1805 | if repeat is not None: |
|
1802 | 1806 | code_block = numpy.repeat(code_block, repeats=repeat, axis=1) |
|
1803 | #print("buff, data, :",self.buffer.shape, data.shape) | |
|
1807 | if data.ndim == 2: | |
|
1808 | data = data.reshape(1,1,self.__nHeis ) | |
|
1809 | #print("buff, data, :",self.buffer.shape, data.shape,self.sshProfiles.shape) | |
|
1804 | 1810 | for i in range(int(self.new_nHeights)): #nuevas alturas |
|
1805 | 1811 | if code is not None: |
|
1806 | self.buffer[:,i] = data[:,i*self.step:i*self.step + self.nsamples]*code_block | |
|
1812 | self.buffer[:,i,:] = data[:,:,i*self.step:i*self.step + self.nsamples]*code_block | |
|
1807 | 1813 | else: |
|
1808 |
self.buffer[:,i] |
|
|
1814 | self.buffer[:,i,:] = data[:,:,i*self.step:i*self.step + self.nsamples]#*code[dataOut.profileIndex,:] | |
|
1809 | 1815 | |
|
1810 | 1816 | for j in range(self.__nChannels): #en los cananles |
|
1811 | self.sshProfiles[j] = numpy.transpose(self.buffer[j]) | |
|
1812 | ||
|
1817 | self.sshProfiles[j,:,:] = numpy.transpose(self.buffer[j,:,:]) | |
|
1818 | #print("new profs Done") | |
|
1813 | 1819 | |
|
1814 | 1820 | |
|
1815 | 1821 | |
|
1816 | 1822 | def run(self, dataOut, step, nsamples, code = None, repeat = None): |
|
1817 | 1823 | |
|
1824 | if dataOut.flagNoData == True: | |
|
1825 | return dataOut | |
|
1818 | 1826 | dataOut.flagNoData = True |
|
1819 | 1827 | #print("init data shape:", dataOut.data.shape) |
|
1820 | 1828 | #print("ch: {} prof: {} hs: {}".format(int(dataOut.nChannels), |
@@ -1838,24 +1846,26 class SSheightProfiles2(Operation): | |||
|
1838 | 1846 | #print("dataOut nProfiles:", dataOut.nProfiles) |
|
1839 | 1847 | for profile in range(nprof): |
|
1840 | 1848 | if dataOut.flagDataAsBlock: |
|
1849 | #print("read blocks") | |
|
1841 | 1850 | self.getNewProfiles(dataOut.data[:,profile,:], code=code, repeat=repeat) |
|
1842 | 1851 | else: |
|
1843 | self.getNewProfiles(dataOut.data, code=code, repeat=repeat) | |
|
1852 | #print("read profiles") | |
|
1853 | self.getNewProfiles(dataOut.data, code=code, repeat=repeat) #only one channe | |
|
1844 | 1854 | if profile == 0: |
|
1845 | 1855 | dataBlock = self.sshProfiles.copy() |
|
1846 | 1856 | else: #by blocks |
|
1847 | 1857 | dataBlock = numpy.concatenate((dataBlock,self.sshProfiles), axis=1) #profile axis |
|
1848 | print("by blocks: ",dataBlock.shape, self.sshProfiles.shape) | |
|
1858 | #print("by blocks: ",dataBlock.shape, self.sshProfiles.shape) | |
|
1849 | 1859 | |
|
1850 | 1860 | profileIndex = self.nsamples |
|
1851 | deltaHeight = dataOut.heightList[1] - dataOut.heightList[0] | |
|
1852 | ippSeconds = (deltaHeight*1.0e-6)/(0.15) | |
|
1861 | #deltaHeight = dataOut.heightList[1] - dataOut.heightList[0] | |
|
1862 | ippSeconds = (self.deltaHeight*1.0e-6)/(0.15) | |
|
1853 | 1863 | |
|
1854 | 1864 | |
|
1855 | 1865 | dataOut.data = dataBlock |
|
1856 | dataOut.heightList = numpy.arange(self.new_nHeights) *self.step*deltaHeight + dataOut.heightList[0] | |
|
1857 | #print("show me: ",dataOut.nHeights, self.new_nHeights) | |
|
1858 | #dataOut.nHeights = int(self.new_nHeights) | |
|
1866 | #print("show me: ",self.step,self.deltaHeight, dataOut.heightList, self.new_nHeights) | |
|
1867 | dataOut.heightList = numpy.arange(int(self.new_nHeights)) *self.step*self.deltaHeight + self.init_range | |
|
1868 | ||
|
1859 | 1869 | dataOut.ippSeconds = ippSeconds |
|
1860 | 1870 | dataOut.step = self.step |
|
1861 | 1871 | dataOut.flagNoData = False |
@@ -1877,17 +1887,17 class SSheightProfiles2(Operation): | |||
|
1877 | 1887 | |
|
1878 | 1888 | #import skimage.color |
|
1879 | 1889 | #import skimage.io |
|
1880 | import matplotlib.pyplot as plt | |
|
1890 | #import matplotlib.pyplot as plt | |
|
1881 | 1891 | |
|
1882 |
class |
|
|
1892 | class removeProfileByFaradayHS(Operation): | |
|
1883 | 1893 | ''' |
|
1884 | 1894 | |
|
1885 | 1895 | ''' |
|
1886 | 1896 | isConfig = False |
|
1887 | 1897 | n = None |
|
1888 | __timeInterval = None | |
|
1898 | ||
|
1889 | 1899 | __profIndex = 0 |
|
1890 | __byTime = False | |
|
1900 | ||
|
1891 | 1901 | __dataReady = False |
|
1892 | 1902 | __buffer_data = [] |
|
1893 | 1903 | __buffer_times = [] |
@@ -1901,6 +1911,7 class clean2DArray(Operation): | |||
|
1901 | 1911 | end_prof = 0 |
|
1902 | 1912 | n_profiles = 0 |
|
1903 | 1913 | first_utcBlock = None |
|
1914 | outliers_IDs_list = [] | |
|
1904 | 1915 | __dh = 0 |
|
1905 | 1916 | |
|
1906 | 1917 | def __init__(self, **kwargs): |
@@ -1908,42 +1919,122 class clean2DArray(Operation): | |||
|
1908 | 1919 | Operation.__init__(self, **kwargs) |
|
1909 | 1920 | self.isConfig = False |
|
1910 | 1921 | |
|
1911 |
def setup(self,dataOut, n=None , |
|
|
1922 | def setup(self,dataOut, n=None , navg=0.8, profileMargin=50,thHistOutlier=3, minHei=None, maxHei=None): | |
|
1912 | 1923 | |
|
1913 | 1924 | if n == None and timeInterval == None: |
|
1914 | 1925 | raise ValueError("nprofiles or timeInterval should be specified ...") |
|
1915 | 1926 | |
|
1916 | 1927 | if n != None: |
|
1917 | 1928 | self.n = n |
|
1918 | self.__byTime = False | |
|
1919 | else: | |
|
1920 | self.__timeInterval = timeInterval #* 60. #if (type(timeInterval)!=integer) -> change this line | |
|
1921 | self.n = 9999 | |
|
1922 | self.__byTime = True | |
|
1923 | 1929 | |
|
1930 | self.navg = navg | |
|
1931 | self.profileMargin = profileMargin | |
|
1932 | self.thHistOutlier = thHistOutlier | |
|
1924 | 1933 | self.__profIndex = 0 |
|
1925 | 1934 | self.buffer = None |
|
1926 | 1935 | self.lenProfileOut = 1 |
|
1927 | ||
|
1936 | self.n_prof_released = 0 | |
|
1937 | self.heightList = dataOut.heightList | |
|
1928 | 1938 | self.init_prof = 0 |
|
1929 | 1939 | self.end_prof = 0 |
|
1930 | 1940 | self.n_profiles = 0 |
|
1931 | 1941 | self.first_utcBlock = None |
|
1932 | 1942 | self.__dh = dataOut.heightList[1] - dataOut.heightList[0] |
|
1943 | minHei = minHei | |
|
1944 | maxHei = maxHei | |
|
1945 | if minHei==None : | |
|
1946 | minHei = dataOut.heightList[0] | |
|
1947 | if maxHei==None : | |
|
1948 | maxHei = dataOut.heightList[-1] | |
|
1949 | self.minHei_idx,self.maxHei_idx = getHei_index(minHei, maxHei, dataOut.heightList) | |
|
1950 | ||
|
1951 | ||
|
1952 | def filterSatsProfiles(self): | |
|
1953 | data = self.__buffer_data | |
|
1954 | #print(data.shape) | |
|
1955 | nChannels, profiles, heights = data.shape | |
|
1956 | indexes=[] | |
|
1957 | outliers_IDs=[] | |
|
1958 | for c in range(nChannels): | |
|
1959 | for h in range(self.minHei_idx, self.maxHei_idx): | |
|
1960 | power = data[c,:,h] * numpy.conjugate(data[c,:,h]) | |
|
1961 | power = power.real | |
|
1962 | #power = (numpy.abs(data[c,:,h].real)) | |
|
1963 | sortdata = numpy.sort(power, axis=None) | |
|
1964 | sortID=power.argsort() | |
|
1965 | index = _noise.hildebrand_sekhon2(sortdata,self.navg) #0.75-> buen valor | |
|
1966 | ||
|
1967 | indexes.append(index) | |
|
1968 | outliers_IDs=numpy.append(outliers_IDs,sortID[index:]) | |
|
1969 | # print(outliers_IDs) | |
|
1970 | # fig,ax = plt.subplots() | |
|
1971 | # #ax.set_title(str(k)+" "+str(j)) | |
|
1972 | # x=range(len(sortdata)) | |
|
1973 | # ax.scatter(x,sortdata) | |
|
1974 | # ax.axvline(index) | |
|
1975 | # plt.grid() | |
|
1976 | # plt.show() | |
|
1977 | ||
|
1978 | outliers_IDs = outliers_IDs.astype(numpy.dtype('int64')) | |
|
1979 | outliers_IDs = numpy.unique(outliers_IDs) | |
|
1980 | outs_lines = numpy.sort(outliers_IDs) | |
|
1981 | # #print("outliers Ids: ", outs_lines, outs_lines.shape) | |
|
1982 | #hist, bin_edges = numpy.histogram(outs_lines, bins=10, density=True) | |
|
1983 | ||
|
1984 | ||
|
1985 | #Agrupando el histograma de outliers, | |
|
1986 | my_bins = numpy.linspace(0,9600, 96, endpoint=False) | |
|
1987 | ||
|
1988 | ||
|
1989 | hist, bins = numpy.histogram(outs_lines,bins=my_bins) | |
|
1990 | hist_outliers_indexes = numpy.where(hist > self.thHistOutlier) #es outlier | |
|
1991 | #print(hist_outliers_indexes[0]) | |
|
1992 | bins_outliers_indexes = [int(i) for i in bins[hist_outliers_indexes]] # | |
|
1993 | #print(bins_outliers_indexes) | |
|
1994 | outlier_loc_index = [] | |
|
1995 | ||
|
1996 | #outlier_loc_index = [k for k in range(bins_outliers_indexes[n]-50,bins_outliers_indexes[n+1]+50) for n in range(len(bins_outliers_indexes)-1) ] | |
|
1997 | for n in range(len(bins_outliers_indexes)-1): | |
|
1998 | #outlier_loc_index = [k for k in range(bins_outliers_indexes[n]-50,bins_outliers_indexes[n+1]+50)] | |
|
1999 | for k in range(bins_outliers_indexes[n]-self.profileMargin,bins_outliers_indexes[n+1]+self.profileMargin): | |
|
2000 | outlier_loc_index.append(k) | |
|
2001 | ||
|
2002 | outlier_loc_index = numpy.asarray(outlier_loc_index) | |
|
2003 | #print(numpy.unique(outlier_loc_index)) | |
|
2004 | ||
|
2005 | ||
|
2006 | ||
|
2007 | # x, y = numpy.meshgrid(numpy.arange(profiles), self.heightList) | |
|
2008 | # fig, ax = plt.subplots(1,2,figsize=(8, 6)) | |
|
2009 | # | |
|
2010 | # dat = data[0,:,:].real | |
|
2011 | # m = numpy.nanmean(dat) | |
|
2012 | # o = numpy.nanstd(dat) | |
|
2013 | # #print(m, o, x.shape, y.shape) | |
|
2014 | # c = ax[0].pcolormesh(x, y, dat.T, cmap ='YlGnBu', vmin = (m-2*o), vmax = (m+2*o)) | |
|
2015 | # ax[0].vlines(outs_lines,200,600, linestyles='dashed', label = 'outs', color='w') | |
|
2016 | # fig.colorbar(c) | |
|
2017 | # ax[0].vlines(outlier_loc_index,650,750, linestyles='dashed', label = 'outs', color='r') | |
|
2018 | # ax[1].hist(outs_lines,bins=my_bins) | |
|
2019 | # plt.show() | |
|
2020 | ||
|
2021 | ||
|
2022 | self.outliers_IDs_list = numpy.unique(outlier_loc_index) | |
|
2023 | return data | |
|
1933 | 2024 | |
|
1934 | 2025 | def cleanOutliersByBlock(self): |
|
1935 | 2026 | #print(self.__buffer_data[0].shape) |
|
1936 | 2027 | data = self.__buffer_data#.copy() |
|
1937 | 2028 | #print("cleaning shape inpt: ",data.shape) |
|
1938 | ||
|
2029 | ''' | |
|
1939 | 2030 | self.__buffer_data = [] |
|
1940 | 2031 |
|
|
1941 | 2032 | spectrum = numpy.fft.fft2(data, axes=(0,2)) |
|
1942 | 2033 | #print("spc : ",spectrum.shape) |
|
1943 | 2034 | (nch,nsamples, nh) = spectrum.shape |
|
1944 | ||
|
1945 | #nch = | |
|
1946 | ||
|
2035 | data2 = None | |
|
2036 | #print(data.shape) | |
|
2037 | spectrum2 = spectrum.copy() | |
|
1947 | 2038 | for ch in range(nch): |
|
1948 | 2039 | dh = self.__dh |
|
1949 | 2040 | dt1 = (dh*1.0e-6)/(0.15) |
@@ -1951,57 +2042,48 class clean2DArray(Operation): | |||
|
1951 | 2042 | freqv = numpy.fft.fftfreq(nh, d=dt1) |
|
1952 | 2043 | freqh = numpy.fft.fftfreq(self.n, d=dt2) |
|
1953 | 2044 | #print("spc loop: ") |
|
1954 | x, y = numpy.meshgrid(numpy.sort(freqh),numpy.sort(freqv)) | |
|
1955 | z = numpy.abs(spectrum[ch,:,:]) | |
|
1956 | ||
|
1957 | ||
|
1958 | dat = numpy.log10(z.T) | |
|
1959 | m = numpy.mean(dat) | |
|
1960 | o = numpy.std(dat) | |
|
1961 | fig, ax = plt.subplots(figsize=(8, 6)) | |
|
1962 | 2045 |
|
|
1963 | c = ax.pcolormesh(x, y, dat, cmap ='YlGnBu', vmin = (m-2*o), vmax = (m+2*o)) | |
|
1964 | #c = ax.pcolor( z.T , cmap ='gray', vmin = (m-2*o), vmax = (m+2*o)) | |
|
1965 | date_time = datetime.datetime.fromtimestamp(self.__buffer_times[0]).strftime('%Y-%m-%d %H:%M:%S.%f') | |
|
1966 | #strftime('%Y-%m-%d %H:%M:%S') | |
|
1967 | ax.set_title('Spectrum magnitude '+date_time) | |
|
1968 | fig.canvas.set_window_title('Spectrum magnitude {} '.format(self.n)+date_time) | |
|
1969 | fig.colorbar(c) | |
|
1970 | 2046 |
|
|
1971 | plt.show() | |
|
1972 | 2047 |
|
|
2048 | x, y = numpy.meshgrid(numpy.sort(freqh),numpy.sort(freqv)) | |
|
2049 | z = numpy.abs(spectrum[ch,:,:]) | |
|
2050 | # Find all peaks higher than the 98th percentile | |
|
2051 | peaks = z < numpy.percentile(z, 98) | |
|
2052 | #print(peaks) | |
|
2053 | # Set those peak coefficients to zero | |
|
2054 | spectrum2 = spectrum2 * peaks.astype(int) | |
|
2055 | data2 = numpy.fft.ifft2(spectrum2) | |
|
1973 | 2056 |
|
|
2057 | dat = numpy.log10(z.T) | |
|
2058 | dat2 = numpy.log10(spectrum2.T) | |
|
2059 | ||
|
2060 | # m = numpy.mean(dat) | |
|
2061 | # o = numpy.std(dat) | |
|
2062 | # fig, ax = plt.subplots(2,1,figsize=(8, 6)) | |
|
2063 | # | |
|
2064 | # c = ax[0].pcolormesh(x, y, dat, cmap ='YlGnBu', vmin = (m-2*o), vmax = (m+2*o)) | |
|
2065 | # #c = ax.pcolor( z.T , cmap ='gray', vmin = (m-2*o), vmax = (m+2*o)) | |
|
2066 | # date_time = datetime.datetime.fromtimestamp(self.__buffer_times[0]).strftime('%Y-%m-%d %H:%M:%S.%f') | |
|
2067 | # #strftime('%Y-%m-%d %H:%M:%S') | |
|
2068 | # ax[0].set_title('Spectrum magnitude '+date_time) | |
|
2069 | # fig.canvas.set_window_title('Spectrum magnitude {} '.format(self.n)+date_time) | |
|
2070 | # | |
|
2071 | # | |
|
2072 | # c = ax[1].pcolormesh(x, y, dat, cmap ='YlGnBu', vmin = (m-2*o), vmax = (m+2*o)) | |
|
2073 | # fig.colorbar(c) | |
|
2074 | # plt.show() | |
|
2075 | ||
|
2076 | #print(data2.shape) | |
|
2077 | ||
|
2078 | data = data2 | |
|
1974 | 2079 |
|
|
1975 | 2080 | #cleanBlock = numpy.fft.ifft2(spectrum, axes=(0,2)).reshape() |
|
2081 | ''' | |
|
2082 | #print("cleanOutliersByBlock Done") | |
|
1976 | 2083 | |
|
1977 | print("cleanOutliersByBlock Done") | |
|
1978 | return data | |
|
1979 | ||
|
1980 | def byTime(self, data, datatime): | |
|
1981 | ||
|
1982 | self.__dataReady = False | |
|
1983 | ||
|
1984 | self.fillBuffer(data, datatime) | |
|
1985 | dataBlock = None | |
|
1986 | ||
|
1987 | if (datatime - self.__initime) >= self.__timeInterval: | |
|
1988 | dataBlock = self.cleanOutliersByBlock() | |
|
1989 | self.__dataReady = True | |
|
1990 | self.n = self.__profIndex | |
|
1991 | return dataBlock | |
|
1992 | ||
|
1993 | def byProfiles(self, data, datatime): | |
|
1994 | self.__dataReady = False | |
|
1995 | ||
|
1996 | self.fillBuffer(data, datatime) | |
|
1997 | dataBlock = None | |
|
2084 | return self.filterSatsProfiles() | |
|
1998 | 2085 | |
|
1999 | if self.__profIndex == self.n: | |
|
2000 | #print("apnd : ",data) | |
|
2001 | dataBlock = self.cleanOutliersByBlock() | |
|
2002 | self.__dataReady = True | |
|
2003 | 2086 | |
|
2004 | return dataBlock | |
|
2005 | 2087 | |
|
2006 | 2088 | def fillBuffer(self, data, datatime): |
|
2007 | 2089 | |
@@ -2011,54 +2093,60 class clean2DArray(Operation): | |||
|
2011 | 2093 | else: |
|
2012 | 2094 | self.__buffer_data = numpy.concatenate((self.__buffer_data,data), axis=1)#en perfiles |
|
2013 | 2095 | self.__profIndex += 1 |
|
2014 | self.__buffer_times.append(datatime) | |
|
2096 | #self.__buffer_times.append(datatime) | |
|
2015 | 2097 | |
|
2016 | 2098 | def getData(self, data, datatime=None): |
|
2017 | 2099 | |
|
2018 | 2100 | if self.__profIndex == 0: |
|
2019 | 2101 | self.__initime = datatime |
|
2020 | 2102 | |
|
2021 | if self.__byTime: | |
|
2022 | dataBlock = self.byTime(data, datatime) | |
|
2023 | else: | |
|
2024 | dataBlock = self.byProfiles(data, datatime) | |
|
2025 | 2103 | |
|
2104 | self.__dataReady = False | |
|
2026 | 2105 | |
|
2106 | self.fillBuffer(data, datatime) | |
|
2107 | dataBlock = None | |
|
2108 | ||
|
2109 | if self.__profIndex == self.n: | |
|
2110 | #print("apnd : ",data) | |
|
2111 | #dataBlock = self.cleanOutliersByBlock() | |
|
2112 | dataBlock = self.filterSatsProfiles() | |
|
2113 | self.__dataReady = True | |
|
2114 | ||
|
2115 | return dataBlock | |
|
2027 | 2116 | |
|
2028 | 2117 | if dataBlock is None: |
|
2029 | return None | |
|
2118 | return None, None | |
|
2030 | 2119 | |
|
2031 | 2120 | |
|
2032 | 2121 | |
|
2033 | 2122 | return dataBlock |
|
2034 | 2123 | |
|
2035 |
def releaseBlock(self |
|
|
2124 | def releaseBlock(self): | |
|
2036 | 2125 | |
|
2037 | 2126 | if self.n % self.lenProfileOut != 0: |
|
2038 | 2127 | raise ValueError("lenProfileOut %d must be submultiple of nProfiles %d" %(self.lenProfileOut, self.n_profiles)) |
|
2039 | 2128 | return None |
|
2040 | 2129 | |
|
2041 |
|
|
|
2042 | dataOut.profileIndex = self.lenProfileOut | |
|
2043 | dataOut.utctime = self.first_utcBlock + self.init_prof*dataOut.ippSeconds | |
|
2130 | data = self.buffer[:,self.init_prof:self.end_prof:,:] #ch, prof, alt | |
|
2131 | ||
|
2044 | 2132 | self.init_prof = self.end_prof |
|
2045 | 2133 | self.end_prof += self.lenProfileOut |
|
2046 | print("data release shape: ",dataOut.data.shape, self.end_prof) | |
|
2134 | #print("data release shape: ",dataOut.data.shape, self.end_prof) | |
|
2135 | self.n_prof_released += 1 | |
|
2047 | 2136 | |
|
2048 | if self.end_prof >= (self.n +self.lenProfileOut): | |
|
2049 | self.init_prof = 0 | |
|
2050 | self.__profIndex = 0 | |
|
2051 | self.buffer = None | |
|
2052 | dataOut.buffer_empty = True | |
|
2053 | return dataOut | |
|
2054 | 2137 | |
|
2055 | def run(self, dataOut, n=None, timeInterval=None, nProfilesOut=1): | |
|
2138 | #print("f_no_data ", dataOut.flagNoData) | |
|
2139 | return data | |
|
2140 | ||
|
2141 | def run(self, dataOut, n=None, navg=0.8, nProfilesOut=1, profile_margin=50,th_hist_outlier=3,minHei=None, maxHei=None): | |
|
2056 | 2142 | #print("run op buffer 2D") |
|
2057 | 2143 | self.nChannels = dataOut.nChannels |
|
2058 | 2144 | self.nHeights = dataOut.nHeights |
|
2059 | 2145 | |
|
2060 | 2146 | if not self.isConfig: |
|
2061 | self.setup(dataOut,n=n, timeInterval=timeInterval) | |
|
2147 | #print("init p idx: ", dataOut.profileIndex ) | |
|
2148 | self.setup(dataOut,n=n, navg=navg,profileMargin=profile_margin, | |
|
2149 | thHistOutlier=th_hist_outlier,minHei=minHei, maxHei=maxHei) | |
|
2062 | 2150 | self.isConfig = True |
|
2063 | 2151 | |
|
2064 | 2152 | dataBlock = None |
@@ -2066,6 +2154,7 class clean2DArray(Operation): | |||
|
2066 | 2154 | if not dataOut.buffer_empty: #hay datos acumulados |
|
2067 | 2155 | |
|
2068 | 2156 | if self.init_prof == 0: |
|
2157 | self.n_prof_released = 0 | |
|
2069 | 2158 | self.lenProfileOut = nProfilesOut |
|
2070 | 2159 | dataOut.flagNoData = False |
|
2071 | 2160 | #print("tp 2 ",dataOut.data.shape) |
@@ -2074,13 +2163,45 class clean2DArray(Operation): | |||
|
2074 | 2163 | #print("rel: ",self.buffer[:,-1,:]) |
|
2075 | 2164 | self.init_prof = 0 |
|
2076 | 2165 | self.end_prof = self.lenProfileOut |
|
2077 | self.first_utcBlock = dataOut.utctime | |
|
2166 | ||
|
2078 | 2167 | dataOut.nProfiles = self.lenProfileOut |
|
2079 | dataOut.error = False | |
|
2168 | if nProfilesOut == 1: | |
|
2169 | dataOut.flagDataAsBlock = False | |
|
2170 | else: | |
|
2080 | 2171 | dataOut.flagDataAsBlock = True |
|
2081 | 2172 | #print("prof: ",self.init_prof) |
|
2082 | 2173 | dataOut.flagNoData = False |
|
2083 | return self.releaseBlock(dataOut) | |
|
2174 | if numpy.isin(self.n_prof_released, self.outliers_IDs_list): | |
|
2175 | #print("omitting: ", self.n_prof_released) | |
|
2176 | dataOut.flagNoData = True | |
|
2177 | ||
|
2178 | dataOut.utctime = self.first_utcBlock + self.init_prof*dataOut.ippSeconds | |
|
2179 | #dataOut.data = self.releaseBlock() | |
|
2180 | #########################################################3 | |
|
2181 | if self.n % self.lenProfileOut != 0: | |
|
2182 | raise ValueError("lenProfileOut %d must be submultiple of nProfiles %d" %(self.lenProfileOut, self.n_profiles)) | |
|
2183 | return None | |
|
2184 | ||
|
2185 | dataOut.data = self.buffer[:,self.init_prof:self.end_prof:,:] #ch, prof, alt | |
|
2186 | ||
|
2187 | self.init_prof = self.end_prof | |
|
2188 | self.end_prof += self.lenProfileOut | |
|
2189 | #print("data release shape: ",dataOut.data.shape, self.end_prof) | |
|
2190 | self.n_prof_released += 1 | |
|
2191 | ||
|
2192 | if self.end_prof >= (self.n +self.lenProfileOut): | |
|
2193 | ||
|
2194 | self.init_prof = 0 | |
|
2195 | self.__profIndex = 0 | |
|
2196 | self.buffer = None | |
|
2197 | dataOut.buffer_empty = True | |
|
2198 | self.outliers_IDs_list = [] | |
|
2199 | self.n_prof_released = 0 | |
|
2200 | dataOut.flagNoData = False #enviar ultimo aunque sea outlier :( | |
|
2201 | #print("cleaning...", dataOut.buffer_empty) | |
|
2202 | dataOut.profileIndex = 0 #self.lenProfileOut | |
|
2203 | #################################################################### | |
|
2204 | return dataOut | |
|
2084 | 2205 | |
|
2085 | 2206 | |
|
2086 | 2207 | #print("tp 223 ",dataOut.data.shape) |
@@ -2098,13 +2219,16 class clean2DArray(Operation): | |||
|
2098 | 2219 | sys.exit() |
|
2099 | 2220 | |
|
2100 | 2221 | if self.__dataReady: |
|
2222 | #print("omitting: ", len(self.outliers_IDs_list)) | |
|
2101 | 2223 | self.__count_exec = 0 |
|
2102 | 2224 | #dataOut.data = |
|
2103 | self.buffer = numpy.flip(dataBlock, axis=1) | |
|
2104 | ||
|
2225 | #self.buffer = numpy.flip(dataBlock, axis=1) | |
|
2226 | self.buffer = dataBlock | |
|
2227 | self.first_utcBlock = self.__initime | |
|
2105 | 2228 | dataOut.utctime = self.__initime |
|
2106 | 2229 | dataOut.nProfiles = self.__profIndex |
|
2107 | 2230 | #dataOut.flagNoData = False |
|
2231 | self.init_prof = 0 | |
|
2108 | 2232 | self.__profIndex = 0 |
|
2109 | 2233 | self.__initime = None |
|
2110 | 2234 | dataBlock = None |
@@ -2112,16 +2236,15 class clean2DArray(Operation): | |||
|
2112 | 2236 | dataOut.error = False |
|
2113 | 2237 | dataOut.useInputBuffer = True |
|
2114 | 2238 | dataOut.buffer_empty = False |
|
2115 | print("1 ch: {} prof: {} hs: {}".format(int(dataOut.nChannels), | |
|
2116 | int(dataOut.nProfiles),int(dataOut.nHeights))) | |
|
2117 | #return None | |
|
2239 | #print("1 ch: {} prof: {} hs: {}".format(int(dataOut.nChannels),int(dataOut.nProfiles),int(dataOut.nHeights))) | |
|
2240 | ||
|
2118 | 2241 | |
|
2119 | 2242 | |
|
2120 | 2243 | #print(self.__count_exec) |
|
2121 | 2244 | |
|
2122 | 2245 | return dataOut |
|
2123 | 2246 | |
|
2124 |
class |
|
|
2247 | class RemoveProfileSats(Operation): | |
|
2125 | 2248 | ''' |
|
2126 | 2249 | Omite los perfiles contaminados con señal de satelites, |
|
2127 | 2250 | In: minHei = min_sat_range |
@@ -2144,6 +2267,7 class CleanProfileSats(Operation): | |||
|
2144 | 2267 | byRanges = False |
|
2145 | 2268 | min_sats = None |
|
2146 | 2269 | max_sats = None |
|
2270 | noise = 0 | |
|
2147 | 2271 | |
|
2148 | 2272 | def __init__(self, **kwargs): |
|
2149 | 2273 | |
@@ -2177,16 +2301,19 class CleanProfileSats(Operation): | |||
|
2177 | 2301 | |
|
2178 | 2302 | |
|
2179 | 2303 | def compareRanges(self,data, minHei,maxHei): |
|
2180 | ref = data[0,self.min_ref:self.max_ref] * numpy.conjugate(data[0,self.min_ref:self.max_ref]) | |
|
2181 | p_ref = 10*numpy.log10(ref.real) | |
|
2182 |
|
|
|
2304 | ||
|
2305 | # ref = data[0,self.min_ref:self.max_ref] * numpy.conjugate(data[0,self.min_ref:self.max_ref]) | |
|
2306 | # p_ref = 10*numpy.log10(ref.real) | |
|
2307 | # m_ref = numpy.mean(p_ref) | |
|
2308 | ||
|
2309 | m_ref = self.noise | |
|
2183 | 2310 | |
|
2184 | 2311 | sats = data[0,minHei:maxHei] * numpy.conjugate(data[0,minHei:maxHei]) |
|
2185 | 2312 | p_sats = 10*numpy.log10(sats.real) |
|
2186 | 2313 | m_sats = numpy.mean(p_sats) |
|
2187 | 2314 | |
|
2188 | if m_sats > (m_ref + self.th) and (m_sats > self.thdB): | |
|
2189 | #print("msats: ",m_sats," mRef: ", m_ref, (m_sats - m_ref)) | |
|
2315 | if m_sats > (m_ref + self.th): #and (m_sats > self.thdB): | |
|
2316 | #print("msats: ",m_sats," \tmRef: ", m_ref, "\t",(m_sats - m_ref)) | |
|
2190 | 2317 | #print("Removing profiles...") |
|
2191 | 2318 | return False |
|
2192 | 2319 | |
@@ -2218,12 +2345,12 class CleanProfileSats(Operation): | |||
|
2218 | 2345 | if not self.isConfig: |
|
2219 | 2346 | self.setup(dataOut, minHei, maxHei, minRef, maxRef, th, thdB, rangeHeiList) |
|
2220 | 2347 | self.isConfig = True |
|
2221 | ||
|
2348 | #print(self.min_sats,self.max_sats) | |
|
2222 | 2349 | if dataOut.flagDataAsBlock: |
|
2223 | 2350 | raise ValueError("ProfileConcat can only be used when voltage have been read profile by profile, getBlock = False") |
|
2224 | 2351 | |
|
2225 | 2352 | else: |
|
2226 | ||
|
2353 | self.noise =10*numpy.log10(dataOut.getNoisebyHildebrand(ymin_index=self.min_ref, ymax_index=self.max_ref)) | |
|
2227 | 2354 | if not self.isProfileClean(dataOut.data): |
|
2228 | 2355 | return dataOut |
|
2229 | 2356 | #dataOut.data = numpy.full((dataOut.nChannels,dataOut.nHeights),numpy.NAN) |
General Comments 0
You need to be logged in to leave comments.
Login now