##// END OF EJS Templates
Affected:...
Miguel Valdez -
r534:e42d2b934f89
parent child
Show More
@@ -201,6 +201,8 class JROData(GenericData):
201
201
202 beam = Beam()
202 beam = Beam()
203
203
204 profileIndex = None
205
204 def __init__(self):
206 def __init__(self):
205
207
206 raise ValueError, "This class has not been implemented"
208 raise ValueError, "This class has not been implemented"
@@ -363,6 +365,8 class Voltage(JROData):
363
365
364 self.flagDataAsBlock = False #Asumo que la data es leida perfil a perfil
366 self.flagDataAsBlock = False #Asumo que la data es leida perfil a perfil
365
367
368 self.profileIndex = 0
369
366 def getNoisebyHildebrand(self):
370 def getNoisebyHildebrand(self):
367 """
371 """
368 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
372 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
@@ -420,6 +424,8 class Spectra(JROData):
420
424
421 ippFactor = None
425 ippFactor = None
422
426
427 profileIndex = 0
428
423 def __init__(self):
429 def __init__(self):
424 '''
430 '''
425 Constructor
431 Constructor
@@ -609,6 +615,8 class SpectraHeis(Spectra):
609 self.utctime = None
615 self.utctime = None
610
616
611 self.blocksize = None
617 self.blocksize = None
618
619 self.profileIndex = 0
612
620
613 def getNormFactor(self):
621 def getNormFactor(self):
614 pwcode = 1
622 pwcode = 1
@@ -686,6 +694,8 class Fits:
686
694
687 self.useLocalTime = True
695 self.useLocalTime = True
688
696
697 self.profileIndex = 0
698
689 # self.utctime = None
699 # self.utctime = None
690 # self.timeZone = None
700 # self.timeZone = None
691 # self.ltctime = None
701 # self.ltctime = None
@@ -378,6 +378,10 class JRODataReader(JRODataIO):
378
378
379 profileIndex = None
379 profileIndex = None
380
380
381 nTxs = 1
382
383 txIndex = None
384
381 def __init__(self):
385 def __init__(self):
382
386
383 """
387 """
@@ -937,7 +941,8 class JRODataReader(JRODataIO):
937 online = False,
941 online = False,
938 delay = 60,
942 delay = 60,
939 walk = True,
943 walk = True,
940 getblock = False):
944 getblock = False,
945 nTxs = 1):
941
946
942 if path == None:
947 if path == None:
943 raise ValueError, "The path is not valid"
948 raise ValueError, "The path is not valid"
@@ -995,6 +1000,7 class JRODataReader(JRODataIO):
995 ext = ext.lower()
1000 ext = ext.lower()
996 self.ext = ext
1001 self.ext = ext
997 self.getByBlock = getblock
1002 self.getByBlock = getblock
1003 self.nTxs = int(nTxs)
998
1004
999 if not(self.setNextFile()):
1005 if not(self.setNextFile()):
1000 if (startDate!=None) and (endDate!=None):
1006 if (startDate!=None) and (endDate!=None):
@@ -153,6 +153,10 class VoltageReader(JRODataReader, ProcessingUnit):
153 self.blocksize = 0
153 self.blocksize = 0
154
154
155 self.dataOut = self.createObjByDefault()
155 self.dataOut = self.createObjByDefault()
156
157 self.nTxs = 1
158
159 self.txIndex = 0
156
160
157 def createObjByDefault(self):
161 def createObjByDefault(self):
158
162
@@ -161,8 +165,10 class VoltageReader(JRODataReader, ProcessingUnit):
161 return dataObj
165 return dataObj
162
166
163 def __hasNotDataInBuffer(self):
167 def __hasNotDataInBuffer(self):
168
164 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
169 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
165 return 1
170 return 1
171
166 return 0
172 return 0
167
173
168
174
@@ -235,7 +241,8 class VoltageReader(JRODataReader, ProcessingUnit):
235
241
236 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
242 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
237
243
238 # self.dataOut.ippSeconds = self.ippSeconds
244 if self.nTxs > 1:
245 self.dataOut.radarControllerHeaderObj.ippSeconds /= self.nTxs
239
246
240 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
247 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
241
248
@@ -249,9 +256,12 class VoltageReader(JRODataReader, ProcessingUnit):
249
256
250 self.dataOut.dtype = self.dtype
257 self.dataOut.dtype = self.dtype
251
258
252 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
259 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock*self.nTxs
260
261 if self.processingHeaderObj.nHeights % self.nTxs != 0:
262 raise ValueError, "nTxs (%d) should be a multiple of nHeights (%d)" %(self.nTxs, self.processingHeaderObj.nHeights)
253
263
254 xf = self.processingHeaderObj.firstHeight + self.processingHeaderObj.nHeights*self.processingHeaderObj.deltaHeight
264 xf = self.processingHeaderObj.firstHeight + int(self.processingHeaderObj.nHeights/self.nTxs)*self.processingHeaderObj.deltaHeight
255
265
256 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
266 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.firstHeight, xf, self.processingHeaderObj.deltaHeight)
257
267
@@ -323,21 +333,52 class VoltageReader(JRODataReader, ProcessingUnit):
323 self.dataOut.flagNoData = True
333 self.dataOut.flagNoData = True
324 return 0
334 return 0
325
335
326 if self.getByBlock:
336 if not self.getByBlock:
337
338 """
339 Return profile by profile
340
341 If nTxs > 1 then one profile is divided by nTxs and number of total
342 blocks is increased by nTxs (nProfiles *= nTxs)
343 """
344 if self.nTxs == 1:
345 self.dataOut.flagDataAsBlock = False
346 self.dataOut.data = self.datablock[:,self.profileIndex,:]
347 self.dataOut.profileIndex = self.profileIndex
348
349 self.profileIndex += 1
350
351 else:
352 self.dataOut.flagDataAsBlock = False
353
354 iniHei_ForThisTx = (self.txIndex)*int(self.processingHeaderObj.nHeights/self.nTxs)
355 endHei_ForThisTx = (self.txIndex+1)*int(self.processingHeaderObj.nHeights/self.nTxs)
356
357 # print iniHei_ForThisTx, endHei_ForThisTx
358
359 self.dataOut.data = self.datablock[:, self.profileIndex, iniHei_ForThisTx:endHei_ForThisTx]
360 self.dataOut.profileIndex = self.profileIndex*self.nTxs + self.txIndex
361
362 self.txIndex += 1
363
364 if self.txIndex == self.nTxs:
365 self.txIndex = 0
366 self.profileIndex += 1
367
368 else:
369 """
370 Return all block
371 """
327 self.dataOut.flagDataAsBlock = True
372 self.dataOut.flagDataAsBlock = True
328 self.dataOut.data = self.datablock
373 self.dataOut.data = self.datablock
329 self.profileIndex = self.processingHeaderObj.profilesPerBlock
374 self.dataOut.profileIndex = self.processingHeaderObj.profilesPerBlock - 1
330 else:
375
331 self.dataOut.flagDataAsBlock = False
376 self.profileIndex = self.processingHeaderObj.profilesPerBlock - 1
332 self.dataOut.data = self.datablock[:,self.profileIndex,:]
333 self.profileIndex += 1
334
377
335 self.dataOut.flagNoData = False
378 self.dataOut.flagNoData = False
336
379
337 self.getBasicHeader()
380 self.getBasicHeader()
338
381
339
340
341 self.dataOut.realtime = self.online
382 self.dataOut.realtime = self.online
342
383
343 return self.dataOut.data
384 return self.dataOut.data
@@ -185,7 +185,7 class VoltageProc(ProcessingUnit):
185 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
185 raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
186
186
187 if (maxIndex >= self.dataOut.nHeights):
187 if (maxIndex >= self.dataOut.nHeights):
188 maxIndex = self.dataOut.nHeights-1
188 maxIndex = self.dataOut.nHeights
189 # raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
189 # raise ValueError, "some value in (%d,%d) is not valid" % (minIndex, maxIndex)
190
190
191 # nHeights = maxIndex - minIndex + 1
191 # nHeights = maxIndex - minIndex + 1
@@ -195,14 +195,14 class VoltageProc(ProcessingUnit):
195 """
195 """
196 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
196 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
197 """
197 """
198 data = self.dataOut.data[:,minIndex:maxIndex+1,:]
198 data = self.dataOut.data[:,minIndex:maxIndex,:]
199 else:
199 else:
200 data = self.dataOut.data[:,minIndex:maxIndex+1]
200 data = self.dataOut.data[:,minIndex:maxIndex]
201
201
202 # firstHeight = self.dataOut.heightList[minIndex]
202 # firstHeight = self.dataOut.heightList[minIndex]
203
203
204 self.dataOut.data = data
204 self.dataOut.data = data
205 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex+1]
205 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex]
206
206
207 return 1
207 return 1
208
208
@@ -539,7 +539,7 class Decoder(Operation):
539
539
540 if dataOut.flagDataAsBlock:
540 if dataOut.flagDataAsBlock:
541
541
542 self.ndatadec = self.__nHeis - self.nBaud + 1
542 self.ndatadec = self.__nHeis #- self.nBaud + 1
543
543
544 self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex)
544 self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex)
545
545
@@ -551,7 +551,7 class Decoder(Operation):
551
551
552 self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1))
552 self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1))
553
553
554 self.ndatadec = self.__nHeis - self.nBaud + 1
554 self.ndatadec = self.__nHeis #- self.nBaud + 1
555
555
556 self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex)
556 self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex)
557
557
@@ -565,7 +565,7 class Decoder(Operation):
565
565
566 data = numpy.fft.ifft(conv,axis=1)
566 data = numpy.fft.ifft(conv,axis=1)
567
567
568 datadec = data[:,:-self.nBaud+1]
568 datadec = data#[:,:]
569
569
570 return datadec
570 return datadec
571
571
@@ -575,7 +575,7 class Decoder(Operation):
575
575
576 data = cfunctions.decoder(fft_code, data)
576 data = cfunctions.decoder(fft_code, data)
577
577
578 datadec = data[:,:-self.nBaud+1]
578 datadec = data#[:,:]
579
579
580 return datadec
580 return datadec
581
581
@@ -584,7 +584,7 class Decoder(Operation):
584 code = self.code[self.__profIndex]
584 code = self.code[self.__profIndex]
585
585
586 for i in range(self.__nChannels):
586 for i in range(self.__nChannels):
587 self.datadecTime[i,:] = numpy.correlate(data[i,:], code, mode='valid')
587 self.datadecTime[i,:] = numpy.correlate(data[i,:], code, mode='same')
588
588
589 return self.datadecTime
589 return self.datadecTime
590
590
@@ -598,7 +598,7 class Decoder(Operation):
598
598
599 for i in range(self.__nChannels):
599 for i in range(self.__nChannels):
600 for j in range(self.__nProfiles):
600 for j in range(self.__nProfiles):
601 self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='valid')
601 self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='same')
602
602
603 return self.datadecTime
603 return self.datadecTime
604
604
@@ -674,14 +674,14 class ProfileConcat(Operation):
674
674
675 def setup(self, data, m, n=1):
675 def setup(self, data, m, n=1):
676 self.buffer = numpy.zeros((data.shape[0],data.shape[1]*m),dtype=type(data[0,0]))
676 self.buffer = numpy.zeros((data.shape[0],data.shape[1]*m),dtype=type(data[0,0]))
677 self.profiles = data.shape[1]
677 self.nHeights = data.nHeights
678 self.start_index = 0
678 self.start_index = 0
679 self.times = 1
679 self.times = 1
680
680
681 def concat(self, data):
681 def concat(self, data):
682
682
683 self.buffer[:,self.start_index:self.profiles*self.times] = data.copy()
683 self.buffer[:,self.start_index:self.profiles*self.times] = data.copy()
684 self.start_index = self.start_index + self.profiles
684 self.start_index = self.start_index + self.nHeights
685
685
686 def run(self, dataOut, m):
686 def run(self, dataOut, m):
687
687
@@ -693,7 +693,7 class ProfileConcat(Operation):
693
693
694 if dataOut.flagDataAsBlock:
694 if dataOut.flagDataAsBlock:
695
695
696 raise ValueError, "ProfileConcat can only be used when voltage have been read profile by profiel, getBlock = False"
696 raise ValueError, "ProfileConcat can only be used when voltage have been read profile by profile, getBlock = False"
697
697
698 else:
698 else:
699 self.concat(dataOut.data)
699 self.concat(dataOut.data)
@@ -704,8 +704,9 class ProfileConcat(Operation):
704 dataOut.flagNoData = False
704 dataOut.flagNoData = False
705 # se deben actualizar mas propiedades del header y del objeto dataOut, por ejemplo, las alturas
705 # se deben actualizar mas propiedades del header y del objeto dataOut, por ejemplo, las alturas
706 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
706 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
707 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * 5
707 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * m
708 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
708 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
709 dataOut.ippSeconds *= m
709
710
710 class ProfileSelector(Operation):
711 class ProfileSelector(Operation):
711
712
@@ -719,33 +720,41 class ProfileSelector(Operation):
719 self.profileIndex = 0
720 self.profileIndex = 0
720
721
721 def incIndex(self):
722 def incIndex(self):
723
722 self.profileIndex += 1
724 self.profileIndex += 1
723
725
724 if self.profileIndex >= self.nProfiles:
726 if self.profileIndex >= self.nProfiles:
725 self.profileIndex = 0
727 self.profileIndex = 0
726
728
727 def isProfileInRange(self, minIndex, maxIndex):
729 def isThisProfileInRange(self, profileIndex, minIndex, maxIndex):
728
730
729 if self.profileIndex < minIndex:
731 if profileIndex < minIndex:
730 return False
732 return False
731
733
732 if self.profileIndex > maxIndex:
734 if profileIndex > maxIndex:
733 return False
735 return False
734
736
735 return True
737 return True
736
738
737 def isProfileInList(self, profileList):
739 def isThisProfileInList(self, profileIndex, profileList):
738
740
739 if self.profileIndex not in profileList:
741 if profileIndex not in profileList:
740 return False
742 return False
741
743
742 return True
744 return True
743
745
744 def run(self, dataOut, profileList=None, profileRangeList=None, beam=None, byblock=False):
746 def run(self, dataOut, profileList=None, profileRangeList=None, beam=None, byblock=False, rangeList = None):
745
747
746 """
748 """
747 ProfileSelector:
749 ProfileSelector:
748
750
751 Inputs:
752 profileList : Index of profiles selected. Example: profileList = (0,1,2,7,8)
753
754 profileRangeList : Minimum and maximum profile indexes. Example: profileRangeList = (4, 30)
755
756 rangeList : List of profile ranges. Example: rangeList = ((4, 30), (32, 64), (128, 256))
757
749 """
758 """
750
759
751 dataOut.flagNoData = True
760 dataOut.flagNoData = True
@@ -758,15 +767,16 class ProfileSelector(Operation):
758 if profileList != None:
767 if profileList != None:
759 dataOut.data = dataOut.data[:,profileList,:]
768 dataOut.data = dataOut.data[:,profileList,:]
760 dataOut.nProfiles = len(profileList)
769 dataOut.nProfiles = len(profileList)
770 dataOut.profileIndex = dataOut.nProfiles - 1
761 else:
771 else:
762 pmin = profileRangeList[0]
772 minIndex = profileRangeList[0]
763 pmax = profileRangeList[1]
773 maxIndex = profileRangeList[1]
764 dataOut.data = dataOut.data[:,pmin:pmax+1,:]
774
765 dataOut.nProfiles = pmax - pmin + 1
775 dataOut.data = dataOut.data[:,minIndex:maxIndex+1,:]
766
776 dataOut.nProfiles = maxIndex - minIndex + 1
777 dataOut.profileIndex = dataOut.nProfiles - 1
767
778
768 dataOut.flagNoData = False
779 dataOut.flagNoData = False
769 self.profileIndex = 0
770
780
771 return True
781 return True
772
782
@@ -777,28 +787,65 class ProfileSelector(Operation):
777 """
787 """
778 if profileList != None:
788 if profileList != None:
779
789
780 if self.isProfileInList(profileList):
790 dataOut.nProfiles = len(profileList)
791
792 if self.isThisProfileInList(dataOut.profileIndex, profileList):
781 dataOut.flagNoData = False
793 dataOut.flagNoData = False
794 dataOut.profileIndex = self.profileIndex
782
795
783 self.incIndex()
796 self.incIndex()
784 return 1
797 return True
785
798
786
799
787 if profileRangeList != None:
800 if profileRangeList != None:
788
801
789 minIndex = profileRangeList[0]
802 minIndex = profileRangeList[0]
790 maxIndex = profileRangeList[1]
803 maxIndex = profileRangeList[1]
791 if self.isProfileInRange(minIndex, maxIndex):
804
805 dataOut.nProfiles = maxIndex - minIndex + 1
806
807 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
792 dataOut.flagNoData = False
808 dataOut.flagNoData = False
809 dataOut.profileIndex = self.profileIndex
793
810
794 self.incIndex()
811 self.incIndex()
795 return 1
812 return True
796
813
814 if rangeList != None:
815
816 nProfiles = 0
817
818 for thisRange in rangeList:
819 minIndex = thisRange[0]
820 maxIndex = thisRange[1]
821
822 nProfiles += maxIndex - minIndex + 1
823
824 dataOut.nProfiles = nProfiles
825
826 for thisRange in rangeList:
827
828 minIndex = thisRange[0]
829 maxIndex = thisRange[1]
830
831 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
832
833 # print "profileIndex = ", dataOut.profileIndex
834
835 dataOut.flagNoData = False
836 dataOut.profileIndex = self.profileIndex
837
838 self.incIndex()
839 break
840 return True
841
842
797 if beam != None: #beam is only for AMISR data
843 if beam != None: #beam is only for AMISR data
798 if self.isProfileInList(dataOut.beamRangeDict[beam]):
844 if self.isThisProfileInList(dataOut.profileIndex, dataOut.beamRangeDict[beam]):
799 dataOut.flagNoData = False
845 dataOut.flagNoData = False
846 dataOut.profileIndex = self.profileIndex
800
847
801 self.incIndex()
848 self.incIndex()
802 return 1
849 return 1
803
850
804 raise ValueError, "ProfileSelector needs profileList or profileRangeList"
851 raise ValueError, "ProfileSelector needs profileList or profileRangeList"
@@ -838,4 +885,6 class Reshaper(Operation):
838
885
839 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
886 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
840
887
841 dataOut.nProfiles = dataOut.data.shape[1] No newline at end of file
888 dataOut.nProfiles = dataOut.data.shape[1]
889
890 dataOut.ippSeconds *= factor No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now