@@ -0,0 +1,473 | |||||
|
1 | import numpy,math,random,time | |||
|
2 | #---------------1 Heredamos JRODatareader | |||
|
3 | from schainpy.model.io.jroIO_base import * | |||
|
4 | #---------------2 Heredamos las propiedades de ProcessingUnit | |||
|
5 | from schainpy.model.proc.jroproc_base import ProcessingUnit,Operation,MPDecorator | |||
|
6 | #---------------3 Importaremos las clases BascicHeader, SystemHeader, RadarControlHeader, ProcessingHeader | |||
|
7 | from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader,SystemHeader,RadarControllerHeader, ProcessingHeader | |||
|
8 | #---------------4 Importaremos el objeto Voltge | |||
|
9 | from schainpy.model.data.jrodata import Voltage | |||
|
10 | ||||
|
11 | class SimulatorReader(JRODataReader, ProcessingUnit): | |||
|
12 | incIntFactor = 1 | |||
|
13 | nFFTPoints = 0 | |||
|
14 | FixPP_IncInt = 1 | |||
|
15 | FixRCP_IPP = 1000 | |||
|
16 | FixPP_CohInt = 1 | |||
|
17 | Tau_0 = 250 | |||
|
18 | AcqH0_0 = 70 | |||
|
19 | H0 = AcqH0_0 | |||
|
20 | AcqDH_0 = 1.25 | |||
|
21 | DH0 = AcqDH_0 | |||
|
22 | Bauds = 32 | |||
|
23 | BaudWidth = None | |||
|
24 | FixRCP_TXA = 40 | |||
|
25 | FixRCP_TXB = 70 | |||
|
26 | fAngle = 2.0*math.pi*(1/16) | |||
|
27 | DC_level = 500 | |||
|
28 | stdev = 8 | |||
|
29 | Num_Codes = 2 | |||
|
30 | #code0 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1]) | |||
|
31 | #code1 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0]) | |||
|
32 | #Dyn_snCode = numpy.array([Num_Codes,Bauds]) | |||
|
33 | Dyn_snCode = None | |||
|
34 | Samples = 200 | |||
|
35 | channels = 5 | |||
|
36 | pulses = None | |||
|
37 | Reference = None | |||
|
38 | pulse_size = None | |||
|
39 | prof_gen = None | |||
|
40 | Fdoppler = 100 | |||
|
41 | Hdoppler = 36 | |||
|
42 | Adoppler = 300 | |||
|
43 | frequency = 9345 | |||
|
44 | nTotalReadFiles = 1000 | |||
|
45 | ||||
|
46 | def __init__(self): | |||
|
47 | """ | |||
|
48 | Inicializador de la clases SimulatorReader para | |||
|
49 | generar datos de voltage simulados. | |||
|
50 | Input: | |||
|
51 | dataOut: Objeto de la clase Voltage. | |||
|
52 | Este Objeto sera utilizado apra almacenar | |||
|
53 | un perfil de datos cada vez qe se haga | |||
|
54 | un requerimiento (getData) | |||
|
55 | """ | |||
|
56 | ProcessingUnit.__init__(self) | |||
|
57 | print(" [ START ] init - Metodo Simulator Reader") | |||
|
58 | ||||
|
59 | self.isConfig = False | |||
|
60 | self.basicHeaderObj = BasicHeader(LOCALTIME) | |||
|
61 | self.systemHeaderObj = SystemHeader() | |||
|
62 | self.radarControllerHeaderObj = RadarControllerHeader() | |||
|
63 | self.processingHeaderObj = ProcessingHeader() | |||
|
64 | self.profileIndex = 2**32-1 | |||
|
65 | self.dataOut = Voltage() | |||
|
66 | #code0 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1]) | |||
|
67 | code0 = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1]) | |||
|
68 | #code1 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0]) | |||
|
69 | code1 = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1]) | |||
|
70 | #self.Dyn_snCode = numpy.array([code0,code1]) | |||
|
71 | self.Dyn_snCode = None | |||
|
72 | ||||
|
73 | def set_kwargs(self, **kwargs): | |||
|
74 | for key, value in kwargs.items(): | |||
|
75 | setattr(self, key, value) | |||
|
76 | ||||
|
77 | def __hasNotDataInBuffer(self): | |||
|
78 | ||||
|
79 | if self.profileIndex >= self.processingHeaderObj.profilesPerBlock* self.nTxs: | |||
|
80 | if self.nReadBlocks>0: | |||
|
81 | tmp = self.dataOut.utctime | |||
|
82 | tmp_utc = int(self.dataOut.utctime) | |||
|
83 | tmp_milisecond = int((tmp-tmp_utc)*1000) | |||
|
84 | self.basicHeaderObj.utc = tmp_utc | |||
|
85 | self.basicHeaderObj.miliSecond= tmp_milisecond | |||
|
86 | return 1 | |||
|
87 | return 0 | |||
|
88 | ||||
|
89 | def setNextFile(self): | |||
|
90 | """Set the next file to be readed open it and parse de file header""" | |||
|
91 | ||||
|
92 | if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile): | |||
|
93 | self.nReadFiles=self.nReadFiles+1 | |||
|
94 | if self.nReadFiles ==self.nTotalReadFiles: | |||
|
95 | self.flagNoMoreFiles=1 | |||
|
96 | raise schainpy.admin.SchainWarning('No more files to read') | |||
|
97 | ||||
|
98 | print('------------------- [Opening file] ------------------------------',self.nReadFiles) | |||
|
99 | self.nReadBlocks = 0 | |||
|
100 | ||||
|
101 | def __setNewBlock(self): | |||
|
102 | self.setNextFile() | |||
|
103 | if self.flagIsNewFile: | |||
|
104 | return 1 | |||
|
105 | ||||
|
106 | def readNextBlock(self): | |||
|
107 | while True: | |||
|
108 | self.__setNewBlock() | |||
|
109 | if not(self.readBlock()): | |||
|
110 | return 0 | |||
|
111 | self.getBasicHeader() | |||
|
112 | break | |||
|
113 | if self.verbose: | |||
|
114 | print("[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks, | |||
|
115 | self.processingHeaderObj.dataBlocksPerFile, | |||
|
116 | self.dataOut.datatime.ctime()) ) | |||
|
117 | return 1 | |||
|
118 | ||||
|
119 | def getFirstHeader(self): | |||
|
120 | self.getBasicHeader() | |||
|
121 | self.dataOut.processingHeaderObj = self.processingHeaderObj.copy() | |||
|
122 | self.dataOut.systemHeaderObj = self.systemHeaderObj.copy() | |||
|
123 | self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy() | |||
|
124 | ||||
|
125 | self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock | |||
|
126 | self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights) * self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight | |||
|
127 | self.dataOut.channelList = list(range(self.systemHeaderObj.nChannels)) | |||
|
128 | self.dataOut.nCohInt = self.processingHeaderObj.nCohInt | |||
|
129 | # asumo q la data no esta decodificada | |||
|
130 | self.dataOut.flagDecodeData = self.processingHeaderObj.flag_decode | |||
|
131 | # asumo q la data no esta sin flip | |||
|
132 | self.dataOut.flagDeflipData = self.processingHeaderObj.flag_deflip | |||
|
133 | self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft | |||
|
134 | self.dataOut.frequency = self.frequency | |||
|
135 | ||||
|
136 | def getBasicHeader(self): | |||
|
137 | self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \ | |||
|
138 | 1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds | |||
|
139 | ||||
|
140 | self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock | |||
|
141 | self.dataOut.timeZone = self.basicHeaderObj.timeZone | |||
|
142 | self.dataOut.dstFlag = self.basicHeaderObj.dstFlag | |||
|
143 | self.dataOut.errorCount = self.basicHeaderObj.errorCount | |||
|
144 | self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime | |||
|
145 | self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs | |||
|
146 | ||||
|
147 | def set_RCH(self, expType=2, nTx=1,ipp=None, txA=0, txB=0, | |||
|
148 | nWindows=None, nHeights=None, firstHeight=None, deltaHeight=None, | |||
|
149 | numTaus=0, line6Function=0, line5Function=0, fClock=None, | |||
|
150 | prePulseBefore=0, prePulseAfter=0, | |||
|
151 | codeType=0, nCode=0, nBaud=0, code=None, | |||
|
152 | flip1=0, flip2=0): | |||
|
153 | self.radarControllerHeaderObj.expType = expType | |||
|
154 | self.radarControllerHeaderObj.nTx = nTx | |||
|
155 | self.radarControllerHeaderObj.ipp = float(ipp) | |||
|
156 | self.radarControllerHeaderObj.txA = float(txA) | |||
|
157 | self.radarControllerHeaderObj.txB = float(txB) | |||
|
158 | self.radarControllerHeaderObj.rangeIPP = ipp | |||
|
159 | self.radarControllerHeaderObj.rangeTxA = txA | |||
|
160 | self.radarControllerHeaderObj.rangeTxB = txB | |||
|
161 | ||||
|
162 | self.radarControllerHeaderObj.nHeights = int(nHeights) | |||
|
163 | self.radarControllerHeaderObj.firstHeight = numpy.array([firstHeight]) | |||
|
164 | self.radarControllerHeaderObj.deltaHeight = numpy.array([deltaHeight]) | |||
|
165 | self.radarControllerHeaderObj.samplesWin = numpy.array([nHeights]) | |||
|
166 | ||||
|
167 | ||||
|
168 | self.radarControllerHeaderObj.nWindows = nWindows | |||
|
169 | self.radarControllerHeaderObj.numTaus = numTaus | |||
|
170 | self.radarControllerHeaderObj.codeType = codeType | |||
|
171 | self.radarControllerHeaderObj.line6Function = line6Function | |||
|
172 | self.radarControllerHeaderObj.line5Function = line5Function | |||
|
173 | self.radarControllerHeaderObj.fclock = fClock | |||
|
174 | self.radarControllerHeaderObj.prePulseBefore= prePulseBefore | |||
|
175 | self.radarControllerHeaderObj.prePulseAfter = prePulseAfter | |||
|
176 | ||||
|
177 | self.radarControllerHeaderObj.nCode = nCode | |||
|
178 | self.radarControllerHeaderObj.nBaud = nBaud | |||
|
179 | self.radarControllerHeaderObj.code = code | |||
|
180 | self.radarControllerHeaderObj.flip1 = flip1 | |||
|
181 | self.radarControllerHeaderObj.flip2 = flip2 | |||
|
182 | ||||
|
183 | self.radarControllerHeaderObj.code_size = int(numpy.ceil(nBaud / 32.)) * nCode * 4 | |||
|
184 | ||||
|
185 | if fClock is None and deltaHeight is not None: | |||
|
186 | self.fClock = 0.15 / (deltaHeight * 1e-6) | |||
|
187 | ||||
|
188 | def set_PH(self, dtype=0, blockSize=0, profilesPerBlock=0, | |||
|
189 | dataBlocksPerFile=0, nWindows=0, processFlags=0, nCohInt=0, | |||
|
190 | nIncohInt=0, totalSpectra=0, nHeights=0, firstHeight=0, | |||
|
191 | deltaHeight=0, samplesWin=0, spectraComb=0, nCode=0, | |||
|
192 | code=0, nBaud=None, shif_fft=False, flag_dc=False, | |||
|
193 | flag_cspc=False, flag_decode=False, flag_deflip=False): | |||
|
194 | ||||
|
195 | self.processingHeaderObj.profilesPerBlock = profilesPerBlock | |||
|
196 | self.processingHeaderObj.dataBlocksPerFile = dataBlocksPerFile | |||
|
197 | self.processingHeaderObj.nWindows = nWindows | |||
|
198 | self.processingHeaderObj.nCohInt = nCohInt | |||
|
199 | self.processingHeaderObj.nIncohInt = nIncohInt | |||
|
200 | self.processingHeaderObj.totalSpectra = totalSpectra | |||
|
201 | self.processingHeaderObj.nHeights = int(nHeights) | |||
|
202 | self.processingHeaderObj.firstHeight = firstHeight | |||
|
203 | self.processingHeaderObj.deltaHeight = deltaHeight | |||
|
204 | self.processingHeaderObj.samplesWin = nHeights | |||
|
205 | ||||
|
206 | def set_BH(self, utc = 0, miliSecond = 0, timeZone = 0): | |||
|
207 | self.basicHeaderObj.utc = utc | |||
|
208 | self.basicHeaderObj.miliSecond = miliSecond | |||
|
209 | self.basicHeaderObj.timeZone = timeZone | |||
|
210 | ||||
|
211 | def set_SH(self, nSamples=0, nProfiles=0, nChannels=0, adcResolution=14, pciDioBusWidth=0): | |||
|
212 | self.systemHeaderObj.nSamples = nSamples | |||
|
213 | self.systemHeaderObj.nProfiles = nProfiles | |||
|
214 | self.systemHeaderObj.nChannels = nChannels | |||
|
215 | self.systemHeaderObj.adcResolution = adcResolution | |||
|
216 | self.systemHeaderObj.pciDioBusWidth = pciDioBusWidth | |||
|
217 | ||||
|
218 | def init_acquisition(self): | |||
|
219 | ||||
|
220 | if self.nFFTPoints != 0: | |||
|
221 | self.incIntFactor = m_nProfilesperBlock/self.nFFTPoints | |||
|
222 | if (self.FixPP_IncInt > self.incIntFactor): | |||
|
223 | self.incIntFactor = self.FixPP_IncInt/ self.incIntFactor | |||
|
224 | elif(self.FixPP_IncInt< self.incIntFactor): | |||
|
225 | print("False alert...") | |||
|
226 | ||||
|
227 | ProfilesperBlock = self.processingHeaderObj.profilesPerBlock | |||
|
228 | ||||
|
229 | self.timeperblock =int(((self.FixRCP_IPP | |||
|
230 | *ProfilesperBlock | |||
|
231 | *self.FixPP_CohInt | |||
|
232 | *self.incIntFactor) | |||
|
233 | /150.0) | |||
|
234 | *0.9 | |||
|
235 | +0.5) | |||
|
236 | # para cada canal | |||
|
237 | self.profiles = ProfilesperBlock*self.FixPP_CohInt | |||
|
238 | self.profiles = ProfilesperBlock | |||
|
239 | self.Reference = int((self.Tau_0-self.AcqH0_0)/(self.AcqDH_0)+0.5) | |||
|
240 | self.BaudWidth = int((self.FixRCP_TXA/self.AcqDH_0)/self.Bauds + 0.5 ) | |||
|
241 | ||||
|
242 | if (self.BaudWidth==0): | |||
|
243 | self.BaudWidth=1 | |||
|
244 | ||||
|
245 | def init_pulse(self,Num_Codes=Num_Codes,Bauds=Bauds,BaudWidth=BaudWidth,Dyn_snCode=Dyn_snCode): | |||
|
246 | ||||
|
247 | Num_Codes = Num_Codes | |||
|
248 | Bauds = Bauds | |||
|
249 | BaudWidth = BaudWidth | |||
|
250 | Dyn_snCode = Dyn_snCode | |||
|
251 | ||||
|
252 | if Dyn_snCode: | |||
|
253 | print("EXISTE") | |||
|
254 | else: | |||
|
255 | print("No existe") | |||
|
256 | ||||
|
257 | if Dyn_snCode: # if Bauds: | |||
|
258 | pulses = list(range(0,Num_Codes)) | |||
|
259 | num_codes = Num_Codes | |||
|
260 | for i in range(num_codes): | |||
|
261 | pulse_size = Bauds*BaudWidth | |||
|
262 | pulses[i] = numpy.zeros(pulse_size) | |||
|
263 | for j in range(Bauds): | |||
|
264 | for k in range(BaudWidth): | |||
|
265 | pulses[i][j*BaudWidth+k] = int(Dyn_snCode[i][j]*600) | |||
|
266 | else: | |||
|
267 | print("sin code") | |||
|
268 | pulses = list(range(1)) | |||
|
269 | if self.AcqDH_0>0.149: | |||
|
270 | pulse_size = int(self.FixRCP_TXB/0.15+0.5) | |||
|
271 | else: | |||
|
272 | pulse_size = int((self.FixRCP_TXB/self.AcqDH_0)+0.5) #0.0375 | |||
|
273 | pulses[0] = numpy.ones(pulse_size) | |||
|
274 | pulses = 600*pulses[0] | |||
|
275 | ||||
|
276 | return pulses,pulse_size | |||
|
277 | ||||
|
278 | def jro_GenerateBlockOfData(self,Samples=Samples,DC_level= DC_level,stdev=stdev, | |||
|
279 | Reference= Reference,pulses= pulses, | |||
|
280 | Num_Codes= Num_Codes,pulse_size=pulse_size, | |||
|
281 | prof_gen= prof_gen,H0 = H0,DH0=DH0, | |||
|
282 | Adoppler=Adoppler,Fdoppler= Fdoppler,Hdoppler=Hdoppler): | |||
|
283 | Samples = Samples | |||
|
284 | DC_level = DC_level | |||
|
285 | stdev = stdev | |||
|
286 | m_nR = Reference | |||
|
287 | pulses = pulses | |||
|
288 | num_codes = Num_Codes | |||
|
289 | ps = pulse_size | |||
|
290 | prof_gen = prof_gen | |||
|
291 | channels = self.channels | |||
|
292 | H0 = H0 | |||
|
293 | DH0 = DH0 | |||
|
294 | ippSec = self.radarControllerHeaderObj.ippSeconds | |||
|
295 | Fdoppler = self.Fdoppler | |||
|
296 | Hdoppler = self.Hdoppler | |||
|
297 | Adoppler = self.Adoppler | |||
|
298 | ||||
|
299 | self.datablock = numpy.zeros([channels,prof_gen,Samples],dtype= numpy.complex64) | |||
|
300 | for i in range(channels): | |||
|
301 | for k in range(prof_gen): | |||
|
302 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·NOISEΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
303 | Noise_r = numpy.random.normal(DC_level,stdev,Samples) | |||
|
304 | Noise_i = numpy.random.normal(DC_level,stdev,Samples) | |||
|
305 | Noise = numpy.zeros(Samples,dtype=complex) | |||
|
306 | Noise.real = Noise_r | |||
|
307 | Noise.imag = Noise_i | |||
|
308 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·PULSOSΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
309 | Pulso = numpy.zeros(pulse_size,dtype=complex) | |||
|
310 | Pulso.real = pulses[k%num_codes] | |||
|
311 | Pulso.imag = pulses[k%num_codes] | |||
|
312 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· PULSES+NOISEΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
313 | InBuffer = numpy.zeros(Samples,dtype=complex) | |||
|
314 | InBuffer[m_nR:m_nR+ps] = Pulso | |||
|
315 | InBuffer = InBuffer+Noise | |||
|
316 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· ANGLE Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
317 | InBuffer.real[m_nR:m_nR+ps] = InBuffer.real[m_nR:m_nR+ps]*(math.cos( self.fAngle)*5) | |||
|
318 | InBuffer.imag[m_nR:m_nR+ps] = InBuffer.imag[m_nR:m_nR+ps]*(math.sin( self.fAngle)*5) | |||
|
319 | InBuffer=InBuffer | |||
|
320 | self.datablock[i][k]= InBuffer | |||
|
321 | #plot_cts(InBuffer,H0=H0,DH0=DH0) | |||
|
322 | #wave_fft(x=InBuffer,plot_show=True) | |||
|
323 | #time.sleep(1) | |||
|
324 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·DOPPLER SIGNAL............................................... | |||
|
325 | time_vec = numpy.linspace(0,(prof_gen-1)*ippSec,int(prof_gen))+self.nReadBlocks*ippSec*prof_gen+(self.nReadFiles-1)*ippSec*prof_gen | |||
|
326 | fd = Fdoppler #+(600.0/120)*self.nReadBlocks | |||
|
327 | d_signal = Adoppler*numpy.array(numpy.exp(1.0j*2.0*math.pi*fd*time_vec),dtype=numpy.complex64) | |||
|
328 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· DATABLOCK + DOPPLERΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·........................... | |||
|
329 | HD=int(Hdoppler/self.AcqDH_0) | |||
|
330 | for i in range(12): | |||
|
331 | self.datablock[:,:,HD+i]=self.datablock[:,:,HD+i]+ d_signal # RESULT | |||
|
332 | ''' | |||
|
333 | a= numpy.zeros(10) | |||
|
334 | for i in range(10): | |||
|
335 | a[i]=i+self.nReadBlocks+20 | |||
|
336 | for i in a: | |||
|
337 | self.datablock[0,:,int(i)]=self.datablock[0,:,int(i)]+ d_signal # RESULT | |||
|
338 | ''' | |||
|
339 | ||||
|
340 | def readBlock(self): | |||
|
341 | ||||
|
342 | self.jro_GenerateBlockOfData(Samples= self.samples,DC_level=self.DC_level, | |||
|
343 | stdev=self.stdev,Reference= self.Reference, | |||
|
344 | pulses = self.pulses,Num_Codes=self.Num_Codes, | |||
|
345 | pulse_size=self.pulse_size,prof_gen=self.profiles, | |||
|
346 | H0=self.H0,DH0=self.DH0) | |||
|
347 | ||||
|
348 | self.profileIndex = 0 | |||
|
349 | self.flagIsNewFile = 0 | |||
|
350 | self.flagIsNewBlock = 1 | |||
|
351 | self.nTotalBlocks += 1 | |||
|
352 | self.nReadBlocks += 1 | |||
|
353 | ||||
|
354 | return 1 | |||
|
355 | ||||
|
356 | ||||
|
357 | def getData(self): | |||
|
358 | if self.flagNoMoreFiles: | |||
|
359 | self.dataOut.flagNodata = True | |||
|
360 | return 0 | |||
|
361 | self.flagDiscontinuousBlock = 0 | |||
|
362 | self.flagIsNewBlock = 0 | |||
|
363 | if self.__hasNotDataInBuffer(): # aqui es verdad | |||
|
364 | if not(self.readNextBlock()): # return 1 y por eso el if not salta a getBasic Header | |||
|
365 | return 0 | |||
|
366 | self.getFirstHeader() # atributo | |||
|
367 | ||||
|
368 | if not self.getByBlock: | |||
|
369 | self.dataOut.flagDataAsBlock = False | |||
|
370 | self.dataOut.data = self.datablock[:, self.profileIndex, :] | |||
|
371 | self.dataOut.profileIndex = self.profileIndex | |||
|
372 | self.profileIndex += 1 | |||
|
373 | else: | |||
|
374 | pass | |||
|
375 | self.dataOut.flagNoData = False | |||
|
376 | self.getBasicHeader() | |||
|
377 | self.dataOut.realtime = self.online | |||
|
378 | return self.dataOut.data | |||
|
379 | ||||
|
380 | ||||
|
381 | def setup(self,frequency=49.92e6,incIntFactor= 1, nFFTPoints = 0, FixPP_IncInt=1,FixRCP_IPP=1000, | |||
|
382 | FixPP_CohInt= 1,Tau_0= 250,AcqH0_0 = 70 ,AcqDH_0=1.25, Bauds= 32, | |||
|
383 | FixRCP_TXA = 40, FixRCP_TXB = 50, fAngle = 2.0*math.pi*(1/16),DC_level= 50, | |||
|
384 | stdev= 8,Num_Codes = 1 , Dyn_snCode = None, samples=200, | |||
|
385 | channels=2,Fdoppler=20,Hdoppler=36,Adoppler=500,nTotalReadFiles=10000, | |||
|
386 | **kwargs): | |||
|
387 | ||||
|
388 | self.set_kwargs(**kwargs) | |||
|
389 | self.nReadBlocks = 0 | |||
|
390 | self.nReadFiles = 1 | |||
|
391 | print('------------------- [Opening file: ] ------------------------------',self.nReadFiles) | |||
|
392 | ||||
|
393 | tmp = time.time() | |||
|
394 | tmp_utc = int(tmp) | |||
|
395 | tmp_milisecond = int((tmp-tmp_utc)*1000) | |||
|
396 | print(" SETUP -basicHeaderObj.utc",datetime.datetime.utcfromtimestamp(tmp)) | |||
|
397 | if Dyn_snCode is None: | |||
|
398 | Num_Codes=1 | |||
|
399 | Bauds =1 | |||
|
400 | ||||
|
401 | ||||
|
402 | ||||
|
403 | self.set_BH(utc= tmp_utc,miliSecond= tmp_milisecond,timeZone=300 ) | |||
|
404 | ||||
|
405 | self.set_RCH( expType=0, nTx=150,ipp=FixRCP_IPP, txA=FixRCP_TXA, txB= FixRCP_TXB, | |||
|
406 | nWindows=1 , nHeights=samples, firstHeight=AcqH0_0, deltaHeight=AcqDH_0, | |||
|
407 | numTaus=1, line6Function=0, line5Function=0, fClock=None, | |||
|
408 | prePulseBefore=0, prePulseAfter=0, | |||
|
409 | codeType=14, nCode=Num_Codes, nBaud=32, code=Dyn_snCode, | |||
|
410 | flip1=0, flip2=0) | |||
|
411 | ||||
|
412 | self.set_PH(dtype=0, blockSize=0, profilesPerBlock=300, | |||
|
413 | dataBlocksPerFile=120, nWindows=1, processFlags=0, nCohInt=1, | |||
|
414 | nIncohInt=1, totalSpectra=0, nHeights=samples, firstHeight=AcqH0_0, | |||
|
415 | deltaHeight=AcqDH_0, samplesWin=samples, spectraComb=0, nCode=0, | |||
|
416 | code=0, nBaud=None, shif_fft=False, flag_dc=False, | |||
|
417 | flag_cspc=False, flag_decode=False, flag_deflip=False) | |||
|
418 | ||||
|
419 | self.set_SH(nSamples=samples, nProfiles=300, nChannels=channels) | |||
|
420 | ||||
|
421 | ||||
|
422 | self.frequency = frequency | |||
|
423 | self.incIntFactor = incIntFactor | |||
|
424 | self.nFFTPoints = nFFTPoints | |||
|
425 | self.FixPP_IncInt = FixPP_IncInt | |||
|
426 | self.FixRCP_IPP = FixRCP_IPP | |||
|
427 | self.FixPP_CohInt = FixPP_CohInt | |||
|
428 | self.Tau_0 = Tau_0 | |||
|
429 | self.AcqH0_0 = AcqH0_0 | |||
|
430 | self.H0 = AcqH0_0 | |||
|
431 | self.AcqDH_0 = AcqDH_0 | |||
|
432 | self.DH0 = AcqDH_0 | |||
|
433 | self.Bauds = Bauds | |||
|
434 | self.FixRCP_TXA = FixRCP_TXA | |||
|
435 | self.FixRCP_TXB = FixRCP_TXB | |||
|
436 | self.fAngle = fAngle | |||
|
437 | self.DC_level = DC_level | |||
|
438 | self.stdev = stdev | |||
|
439 | self.Num_Codes = Num_Codes | |||
|
440 | self.Dyn_snCode = Dyn_snCode | |||
|
441 | self.samples = samples | |||
|
442 | self.channels = channels | |||
|
443 | self.profiles = None | |||
|
444 | self.m_nReference = None | |||
|
445 | self.Baudwidth = None | |||
|
446 | self.Fdoppler = Fdoppler | |||
|
447 | self.Hdoppler = Hdoppler | |||
|
448 | self.Adoppler = Adoppler | |||
|
449 | self.nTotalReadFiles = int(nTotalReadFiles) | |||
|
450 | ||||
|
451 | print("IPP ", self.FixRCP_IPP) | |||
|
452 | print("Tau_0 ",self.Tau_0) | |||
|
453 | print("AcqH0_0",self.AcqH0_0) | |||
|
454 | print("samples,window ",self.samples) | |||
|
455 | print("AcqDH_0",AcqDH_0) | |||
|
456 | print("FixRCP_TXA",self.FixRCP_TXA) | |||
|
457 | print("FixRCP_TXB",self.FixRCP_TXB) | |||
|
458 | print("Dyn_snCode",Dyn_snCode) | |||
|
459 | print("Fdoppler", Fdoppler) | |||
|
460 | print("Hdoppler",Hdoppler) | |||
|
461 | print("Vdopplermax",Fdoppler*(3.0e8/self.frequency)/2.0) | |||
|
462 | print("nTotalReadFiles", nTotalReadFiles) | |||
|
463 | ||||
|
464 | self.init_acquisition() | |||
|
465 | self.pulses,self.pulse_size=self.init_pulse(Num_Codes=self.Num_Codes,Bauds=self.Bauds,BaudWidth=self.BaudWidth,Dyn_snCode=Dyn_snCode) | |||
|
466 | print(" [ END ] - SETUP metodo") | |||
|
467 | return | |||
|
468 | ||||
|
469 | def run(self,**kwargs): # metodo propio | |||
|
470 | if not(self.isConfig): | |||
|
471 | self.setup(**kwargs) | |||
|
472 | self.isConfig = True | |||
|
473 | self.getData() |
@@ -0,0 +1,61 | |||||
|
1 | import os,sys | |||
|
2 | import datetime | |||
|
3 | import time | |||
|
4 | from schainpy.controller import Project | |||
|
5 | path = '/home/alex/Downloads/NEW_WR2' | |||
|
6 | figpath = path | |||
|
7 | desc = "Simulator Test" | |||
|
8 | ||||
|
9 | controllerObj = Project() | |||
|
10 | ||||
|
11 | controllerObj.setup(id='10',name='Test Simulator',description=desc) | |||
|
12 | ||||
|
13 | readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', | |||
|
14 | frequency=9.345e9, | |||
|
15 | FixRCP_IPP= 60, | |||
|
16 | Tau_0 = 30, | |||
|
17 | AcqH0_0=0, | |||
|
18 | samples=330, | |||
|
19 | AcqDH_0=0.15, | |||
|
20 | FixRCP_TXA=0.15, | |||
|
21 | FixRCP_TXB=0.15, | |||
|
22 | Fdoppler=200.0, | |||
|
23 | Hdoppler=36, | |||
|
24 | Adoppler=300, | |||
|
25 | delay=0, | |||
|
26 | online=0, | |||
|
27 | walk=0) | |||
|
28 | ||||
|
29 | #opObj11 = readUnitConfObj.addOperation(name='printInfo') | |||
|
30 | ||||
|
31 | procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) | |||
|
32 | ||||
|
33 | #opObj10 = procUnitConfObjA.addOperation(name='selectChannels') | |||
|
34 | #opObj10.addParameter(name='channelList', value=[0,1]) | |||
|
35 | #opObj10.addParameter(name='channelList', value='0',format='intlist') | |||
|
36 | ||||
|
37 | opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other') | |||
|
38 | opObj11.addParameter(name='n', value='32', format='int') | |||
|
39 | opObj11.addParameter(name='removeDC', value=1, format='int') | |||
|
40 | ''' | |||
|
41 | type="power" | |||
|
42 | opObj10 = procUnitConfObjA.addOperation(name='ScopePlot', optype='external') | |||
|
43 | #opObj10.addParameter(name='id', value='12') | |||
|
44 | opObj10.addParameter(name='wintitle', value=type ) | |||
|
45 | opObj10.addParameter(name='type', value=type) | |||
|
46 | ''' | |||
|
47 | ||||
|
48 | type="WeatherPower" | |||
|
49 | opObj10 = procUnitConfObjA.addOperation(name='PulsepairPowerPlot', optype='external') | |||
|
50 | #opObj10.addParameter(name='id', value='12') | |||
|
51 | opObj10.addParameter(name='wintitle', value=type ) | |||
|
52 | ||||
|
53 | ''' | |||
|
54 | type="WeatherVeloity" | |||
|
55 | ||||
|
56 | opObj10 = procUnitConfObjA.addOperation(name='PulsepairVelocityPlot', optype='external') | |||
|
57 | #opObj10.addParameter(name='id', value='12') | |||
|
58 | opObj10.addParameter(name='wintitle', value=type ) | |||
|
59 | ''' | |||
|
60 | ||||
|
61 | controllerObj.start() |
@@ -0,0 +1,56 | |||||
|
1 | import os,sys | |||
|
2 | import datetime | |||
|
3 | import time | |||
|
4 | from schainpy.controller import Project | |||
|
5 | path = '/home/alex/Downloads/NEW_WR2/spc16removeDC' | |||
|
6 | figpath = path | |||
|
7 | desc = "Simulator Test" | |||
|
8 | ||||
|
9 | controllerObj = Project() | |||
|
10 | ||||
|
11 | controllerObj.setup(id='10',name='Test Simulator',description=desc) | |||
|
12 | ||||
|
13 | readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', | |||
|
14 | frequency=9.345e9, | |||
|
15 | FixRCP_IPP= 60, | |||
|
16 | Tau_0 = 30, | |||
|
17 | AcqH0_0=0, | |||
|
18 | samples=330, | |||
|
19 | AcqDH_0=0.15, | |||
|
20 | FixRCP_TXA=0.15, | |||
|
21 | FixRCP_TXB=0.15, | |||
|
22 | Fdoppler=200.0, | |||
|
23 | Hdoppler=36, | |||
|
24 | Adoppler=300, | |||
|
25 | delay=0, | |||
|
26 | online=0, | |||
|
27 | walk=0, | |||
|
28 | nTotalReadFiles=4) | |||
|
29 | ||||
|
30 | opObj11 = readUnitConfObj.addOperation(name='printInfo') | |||
|
31 | ||||
|
32 | procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) | |||
|
33 | ||||
|
34 | opObj10 = procUnitConfObjA.addOperation(name='selectChannels') | |||
|
35 | opObj10.addParameter(name='channelList', value=[0,1]) | |||
|
36 | ||||
|
37 | procUnitConfObjB = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjA.getId()) | |||
|
38 | procUnitConfObjB.addParameter(name='nFFTPoints', value=200, format='int') | |||
|
39 | procUnitConfObjB.addParameter(name='nProfiles', value=200, format='int') | |||
|
40 | ||||
|
41 | opObj11 = procUnitConfObjB.addOperation(name='removeDC') | |||
|
42 | opObj11.addParameter(name='mode', value=2) | |||
|
43 | ||||
|
44 | #opObj11 = procUnitConfObjB.addOperation(name='IncohInt', optype='other') | |||
|
45 | #opObj11.addParameter(name='n', value='20', format='int') | |||
|
46 | ||||
|
47 | procUnitConfObjC = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjB.getId()) | |||
|
48 | procUnitConfObjC.addOperation(name='SpectralMoments') | |||
|
49 | ||||
|
50 | opObj11 = procUnitConfObjC.addOperation(name='SpectralMomentsPlot') | |||
|
51 | opObj11.addParameter(name='xmax', value=6) | |||
|
52 | opObj11.addParameter(name='save', value=figpath) | |||
|
53 | opObj11.addParameter(name='showprofile', value=1) | |||
|
54 | opObj11.addParameter(name='save_period', value=10) | |||
|
55 | ||||
|
56 | controllerObj.start() |
@@ -0,0 +1,40 | |||||
|
1 | import os,sys | |||
|
2 | import datetime | |||
|
3 | import time | |||
|
4 | from schainpy.controller import Project | |||
|
5 | path = '/home/alex/Downloads/NEW_WR2/spc16removeDC' | |||
|
6 | figpath = path | |||
|
7 | desc = "Simulator Test" | |||
|
8 | ||||
|
9 | controllerObj = Project() | |||
|
10 | ||||
|
11 | controllerObj.setup(id='10',name='Test Simulator',description=desc) | |||
|
12 | ||||
|
13 | readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', | |||
|
14 | frequency=9.345e9, | |||
|
15 | FixRCP_IPP= 60, | |||
|
16 | Tau_0 = 30, | |||
|
17 | AcqH0_0=0, | |||
|
18 | samples=330, | |||
|
19 | AcqDH_0=0.15, | |||
|
20 | FixRCP_TXA=0.15, | |||
|
21 | FixRCP_TXB=0.15, | |||
|
22 | Fdoppler=200.0, | |||
|
23 | Hdoppler=36, | |||
|
24 | Adoppler=300, | |||
|
25 | delay=0, | |||
|
26 | online=0, | |||
|
27 | walk=0, | |||
|
28 | nTotalReadFiles=4) | |||
|
29 | ||||
|
30 | opObj11 = readUnitConfObj.addOperation(name='printInfo') | |||
|
31 | procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) | |||
|
32 | ||||
|
33 | opObj10 = procUnitConfObjA.addOperation(name='selectChannels') | |||
|
34 | opObj10.addParameter(name='channelList', value=[0]) | |||
|
35 | ||||
|
36 | opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other') | |||
|
37 | opObj11.addParameter(name='n', value='32', format='int')#10 | |||
|
38 | #opObj11.addParameter(name='removeDC', value=1, format='int') | |||
|
39 | ||||
|
40 | controllerObj.start() |
@@ -360,7 +360,8 class Voltage(JROData): | |||||
360 |
|
360 | |||
361 | # data es un numpy array de 2 dmensiones (canales, alturas) |
|
361 | # data es un numpy array de 2 dmensiones (canales, alturas) | |
362 | data = None |
|
362 | data = None | |
363 |
|
363 | data_intensity = None | ||
|
364 | data_velocity = None | |||
364 | def __init__(self): |
|
365 | def __init__(self): | |
365 | ''' |
|
366 | ''' | |
366 | Constructor |
|
367 | Constructor | |
@@ -555,7 +556,7 class Spectra(JROData): | |||||
555 |
|
556 | |||
556 | deltav = self.getVmax() / (self.nFFTPoints * self.ippFactor) |
|
557 | deltav = self.getVmax() / (self.nFFTPoints * self.ippFactor) | |
557 | velrange = deltav * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.) |
|
558 | velrange = deltav * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.) | |
558 |
|
559 | |||
559 | if self.nmodes: |
|
560 | if self.nmodes: | |
560 | return velrange/self.nmodes |
|
561 | return velrange/self.nmodes | |
561 | else: |
|
562 | else: | |
@@ -1111,7 +1112,7 class PlotterData(object): | |||||
1111 | MAXNUMY = 200 |
|
1112 | MAXNUMY = 200 | |
1112 |
|
1113 | |||
1113 | def __init__(self, code, throttle_value, exp_code, buffering=True, snr=False): |
|
1114 | def __init__(self, code, throttle_value, exp_code, buffering=True, snr=False): | |
1114 |
|
1115 | |||
1115 | self.key = code |
|
1116 | self.key = code | |
1116 | self.throttle = throttle_value |
|
1117 | self.throttle = throttle_value | |
1117 | self.exp_code = exp_code |
|
1118 | self.exp_code = exp_code | |
@@ -1139,6 +1140,7 class PlotterData(object): | |||||
1139 | for plot in self.plottypes: |
|
1140 | for plot in self.plottypes: | |
1140 | self.data[plot] = {} |
|
1141 | self.data[plot] = {} | |
1141 |
|
1142 | |||
|
1143 | ||||
1142 | def __str__(self): |
|
1144 | def __str__(self): | |
1143 | dum = ['{}{}'.format(key, self.shape(key)) for key in self.data] |
|
1145 | dum = ['{}{}'.format(key, self.shape(key)) for key in self.data] | |
1144 | return 'Data[{}][{}]'.format(';'.join(dum), len(self.__times)) |
|
1146 | return 'Data[{}][{}]'.format(';'.join(dum), len(self.__times)) | |
@@ -1147,7 +1149,7 class PlotterData(object): | |||||
1147 | return len(self.__times) |
|
1149 | return len(self.__times) | |
1148 |
|
1150 | |||
1149 | def __getitem__(self, key): |
|
1151 | def __getitem__(self, key): | |
1150 |
|
1152 | |||
1151 | if key not in self.data: |
|
1153 | if key not in self.data: | |
1152 | raise KeyError(log.error('Missing key: {}'.format(key))) |
|
1154 | raise KeyError(log.error('Missing key: {}'.format(key))) | |
1153 | if 'spc' in key or not self.buffering: |
|
1155 | if 'spc' in key or not self.buffering: | |
@@ -1167,7 +1169,6 class PlotterData(object): | |||||
1167 | ''' |
|
1169 | ''' | |
1168 | Configure object |
|
1170 | Configure object | |
1169 | ''' |
|
1171 | ''' | |
1170 |
|
||||
1171 | self.type = '' |
|
1172 | self.type = '' | |
1172 | self.ready = False |
|
1173 | self.ready = False | |
1173 | self.data = {} |
|
1174 | self.data = {} | |
@@ -1180,7 +1181,7 class PlotterData(object): | |||||
1180 | elif 'spc_moments' == plot: |
|
1181 | elif 'spc_moments' == plot: | |
1181 | plot = 'moments' |
|
1182 | plot = 'moments' | |
1182 | self.data[plot] = {} |
|
1183 | self.data[plot] = {} | |
1183 |
|
1184 | |||
1184 | if 'spc' in self.data or 'rti' in self.data or 'cspc' in self.data or 'moments' in self.data: |
|
1185 | if 'spc' in self.data or 'rti' in self.data or 'cspc' in self.data or 'moments' in self.data: | |
1185 | self.data['noise'] = {} |
|
1186 | self.data['noise'] = {} | |
1186 | self.data['rti'] = {} |
|
1187 | self.data['rti'] = {} | |
@@ -1188,7 +1189,7 class PlotterData(object): | |||||
1188 | self.plottypes.append('noise') |
|
1189 | self.plottypes.append('noise') | |
1189 | if 'rti' not in self.plottypes: |
|
1190 | if 'rti' not in self.plottypes: | |
1190 | self.plottypes.append('rti') |
|
1191 | self.plottypes.append('rti') | |
1191 |
|
1192 | |||
1192 | def shape(self, key): |
|
1193 | def shape(self, key): | |
1193 | ''' |
|
1194 | ''' | |
1194 | Get the shape of the one-element data for the given key |
|
1195 | Get the shape of the one-element data for the given key | |
@@ -1204,20 +1205,19 class PlotterData(object): | |||||
1204 | ''' |
|
1205 | ''' | |
1205 | Update data object with new dataOut |
|
1206 | Update data object with new dataOut | |
1206 | ''' |
|
1207 | ''' | |
1207 |
|
||||
1208 | if tm in self.__times: |
|
1208 | if tm in self.__times: | |
1209 | return |
|
1209 | return | |
1210 | self.profileIndex = dataOut.profileIndex |
|
1210 | self.profileIndex = dataOut.profileIndex | |
1211 | self.tm = tm |
|
1211 | self.tm = tm | |
1212 | self.type = dataOut.type |
|
1212 | self.type = dataOut.type | |
1213 | self.parameters = getattr(dataOut, 'parameters', []) |
|
1213 | self.parameters = getattr(dataOut, 'parameters', []) | |
1214 |
|
1214 | |||
1215 | if hasattr(dataOut, 'meta'): |
|
1215 | if hasattr(dataOut, 'meta'): | |
1216 | self.meta.update(dataOut.meta) |
|
1216 | self.meta.update(dataOut.meta) | |
1217 |
|
1217 | |||
1218 | if hasattr(dataOut, 'pairsList'): |
|
1218 | if hasattr(dataOut, 'pairsList'): | |
1219 | self.pairs = dataOut.pairsList |
|
1219 | self.pairs = dataOut.pairsList | |
1220 |
|
1220 | |||
1221 | self.interval = dataOut.getTimeInterval() |
|
1221 | self.interval = dataOut.getTimeInterval() | |
1222 | self.localtime = dataOut.useLocalTime |
|
1222 | self.localtime = dataOut.useLocalTime | |
1223 | if True in ['spc' in ptype for ptype in self.plottypes]: |
|
1223 | if True in ['spc' in ptype for ptype in self.plottypes]: | |
@@ -1227,7 +1227,6 class PlotterData(object): | |||||
1227 | self.__heights.append(dataOut.heightList) |
|
1227 | self.__heights.append(dataOut.heightList) | |
1228 | self.__all_heights.update(dataOut.heightList) |
|
1228 | self.__all_heights.update(dataOut.heightList) | |
1229 | self.__times.append(tm) |
|
1229 | self.__times.append(tm) | |
1230 |
|
||||
1231 | for plot in self.plottypes: |
|
1230 | for plot in self.plottypes: | |
1232 | if plot in ('spc', 'spc_moments', 'spc_cut'): |
|
1231 | if plot in ('spc', 'spc_moments', 'spc_cut'): | |
1233 | z = dataOut.data_spc/dataOut.normFactor |
|
1232 | z = dataOut.data_spc/dataOut.normFactor | |
@@ -1260,8 +1259,16 class PlotterData(object): | |||||
1260 | if plot == 'scope': |
|
1259 | if plot == 'scope': | |
1261 | buffer = dataOut.data |
|
1260 | buffer = dataOut.data | |
1262 | self.flagDataAsBlock = dataOut.flagDataAsBlock |
|
1261 | self.flagDataAsBlock = dataOut.flagDataAsBlock | |
1263 |
self.nProfiles = dataOut.nProfiles |
|
1262 | self.nProfiles = dataOut.nProfiles | |
1264 |
|
1263 | if plot == 'pp_power': | ||
|
1264 | buffer = dataOut.data_intensity | |||
|
1265 | self.flagDataAsBlock = dataOut.flagDataAsBlock | |||
|
1266 | self.nProfiles = dataOut.nProfiles | |||
|
1267 | if plot == 'pp_velocity': | |||
|
1268 | buffer = dataOut.data_velocity | |||
|
1269 | self.flagDataAsBlock = dataOut.flagDataAsBlock | |||
|
1270 | self.nProfiles = dataOut.nProfiles | |||
|
1271 | ||||
1265 | if plot == 'spc': |
|
1272 | if plot == 'spc': | |
1266 | self.data['spc'] = buffer |
|
1273 | self.data['spc'] = buffer | |
1267 | elif plot == 'cspc': |
|
1274 | elif plot == 'cspc': | |
@@ -1283,7 +1290,7 class PlotterData(object): | |||||
1283 |
|
1290 | |||
1284 | if buffer is None: |
|
1291 | if buffer is None: | |
1285 | self.flagNoData = True |
|
1292 | self.flagNoData = True | |
1286 |
raise schainpy.admin.SchainWarning('Attribute data_{} is empty'.format(self.key)) |
|
1293 | raise schainpy.admin.SchainWarning('Attribute data_{} is empty'.format(self.key)) | |
1287 |
|
1294 | |||
1288 | def normalize_heights(self): |
|
1295 | def normalize_heights(self): | |
1289 | ''' |
|
1296 | ''' | |
@@ -1341,7 +1348,7 class PlotterData(object): | |||||
1341 | else: |
|
1348 | else: | |
1342 | meta['xrange'] = [] |
|
1349 | meta['xrange'] = [] | |
1343 |
|
1350 | |||
1344 |
meta.update(self.meta) |
|
1351 | meta.update(self.meta) | |
1345 | ret['metadata'] = meta |
|
1352 | ret['metadata'] = meta | |
1346 | return json.dumps(ret) |
|
1353 | return json.dumps(ret) | |
1347 |
|
1354 |
@@ -14,12 +14,12 class ScopePlot(Plot): | |||||
14 |
|
14 | |||
15 | ''' |
|
15 | ''' | |
16 | Plot for Scope |
|
16 | Plot for Scope | |
17 |
''' |
|
17 | ''' | |
18 |
|
18 | |||
19 | CODE = 'scope' |
|
19 | CODE = 'scope' | |
20 | plot_name = 'Scope' |
|
20 | plot_name = 'Scope' | |
21 | plot_type = 'scatter' |
|
21 | plot_type = 'scatter' | |
22 |
|
22 | |||
23 | def setup(self): |
|
23 | def setup(self): | |
24 |
|
24 | |||
25 | self.xaxis = 'Range (Km)' |
|
25 | self.xaxis = 'Range (Km)' | |
@@ -33,20 +33,20 class ScopePlot(Plot): | |||||
33 | self.height = 4 |
|
33 | self.height = 4 | |
34 |
|
34 | |||
35 | def plot_iq(self, x, y, channelIndexList, thisDatetime, wintitle): |
|
35 | def plot_iq(self, x, y, channelIndexList, thisDatetime, wintitle): | |
36 |
|
36 | |||
37 | yreal = y[channelIndexList,:].real |
|
37 | yreal = y[channelIndexList,:].real | |
38 | yimag = y[channelIndexList,:].imag |
|
38 | yimag = y[channelIndexList,:].imag | |
39 | title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) |
|
39 | title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) | |
40 | self.xlabel = "Range (Km)" |
|
40 | self.xlabel = "Range (Km)" | |
41 | self.ylabel = "Intensity - IQ" |
|
41 | self.ylabel = "Intensity - IQ" | |
42 |
|
42 | |||
43 | self.y = yreal |
|
43 | self.y = yreal | |
44 | self.x = x |
|
44 | self.x = x | |
45 | self.xmin = min(x) |
|
45 | self.xmin = min(x) | |
46 | self.xmax = max(x) |
|
46 | self.xmax = max(x) | |
47 |
|
||||
48 |
|
47 | |||
49 | self.titles[0] = title |
|
48 | ||
|
49 | self.titles[0] = title | |||
50 |
|
50 | |||
51 | for i,ax in enumerate(self.axes): |
|
51 | for i,ax in enumerate(self.axes): | |
52 | title = "Channel %d" %(i) |
|
52 | title = "Channel %d" %(i) | |
@@ -56,79 +56,178 class ScopePlot(Plot): | |||||
56 | else: |
|
56 | else: | |
57 | ax.plt_r.set_data(x, yreal[i,:]) |
|
57 | ax.plt_r.set_data(x, yreal[i,:]) | |
58 | ax.plt_i.set_data(x, yimag[i,:]) |
|
58 | ax.plt_i.set_data(x, yimag[i,:]) | |
59 |
|
59 | |||
60 | def plot_power(self, x, y, channelIndexList, thisDatetime, wintitle): |
|
60 | def plot_power(self, x, y, channelIndexList, thisDatetime, wintitle): | |
61 | y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:]) |
|
61 | y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:]) | |
62 | yreal = y.real |
|
62 | yreal = y.real | |
|
63 | yreal = 10*numpy.log10(yreal) | |||
63 | self.y = yreal |
|
64 | self.y = yreal | |
64 | title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) |
|
65 | title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) | |
65 | self.xlabel = "Range (Km)" |
|
66 | self.xlabel = "Range (Km)" | |
66 | self.ylabel = "Intensity" |
|
67 | self.ylabel = "Intensity" | |
67 | self.xmin = min(x) |
|
68 | self.xmin = min(x) | |
68 | self.xmax = max(x) |
|
69 | self.xmax = max(x) | |
69 |
|
70 | |||
70 |
|
71 | |||
71 | self.titles[0] = title |
|
72 | self.titles[0] = title | |
72 |
|
73 | |||
73 | for i,ax in enumerate(self.axes): |
|
74 | for i,ax in enumerate(self.axes): | |
74 | title = "Channel %d" %(i) |
|
75 | title = "Channel %d" %(i) | |
75 |
|
76 | |||
76 | ychannel = yreal[i,:] |
|
77 | ychannel = yreal[i,:] | |
77 |
|
78 | |||
78 |
if ax.firsttime: |
|
79 | if ax.firsttime: | |
79 | ax.plt_r = ax.plot(x, ychannel)[0] |
|
80 | ax.plt_r = ax.plot(x, ychannel)[0] | |
80 | else: |
|
81 | else: | |
81 | #pass |
|
82 | #pass | |
82 | ax.plt_r.set_data(x, ychannel) |
|
83 | ax.plt_r.set_data(x, ychannel) | |
83 |
|
84 | |||
|
85 | def plot_weatherpower(self, x, y, channelIndexList, thisDatetime, wintitle): | |||
|
86 | ||||
|
87 | ||||
|
88 | y = y[channelIndexList,:] | |||
|
89 | yreal = y.real | |||
|
90 | yreal = 10*numpy.log10(yreal) | |||
|
91 | self.y = yreal | |||
|
92 | title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) | |||
|
93 | self.xlabel = "Range (Km)" | |||
|
94 | self.ylabel = "Intensity" | |||
|
95 | self.xmin = min(x) | |||
|
96 | self.xmax = max(x) | |||
|
97 | ||||
|
98 | self.titles[0] =title | |||
|
99 | for i,ax in enumerate(self.axes): | |||
|
100 | title = "Channel %d" %(i) | |||
|
101 | ||||
|
102 | ychannel = yreal[i,:] | |||
|
103 | ||||
|
104 | if ax.firsttime: | |||
|
105 | ax.plt_r = ax.plot(x, ychannel)[0] | |||
|
106 | else: | |||
|
107 | #pass | |||
|
108 | ax.plt_r.set_data(x, ychannel) | |||
|
109 | ||||
|
110 | def plot_weathervelocity(self, x, y, channelIndexList, thisDatetime, wintitle): | |||
|
111 | ||||
|
112 | x = x[channelIndexList,:] | |||
|
113 | yreal = y | |||
|
114 | self.y = yreal | |||
|
115 | title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) | |||
|
116 | self.xlabel = "Velocity (m/s)" | |||
|
117 | self.ylabel = "Range (Km)" | |||
|
118 | self.xmin = numpy.min(x) | |||
|
119 | self.xmax = numpy.max(x) | |||
|
120 | self.titles[0] =title | |||
|
121 | for i,ax in enumerate(self.axes): | |||
|
122 | title = "Channel %d" %(i) | |||
|
123 | xchannel = x[i,:] | |||
|
124 | if ax.firsttime: | |||
|
125 | ax.plt_r = ax.plot(xchannel, yreal)[0] | |||
|
126 | else: | |||
|
127 | #pass | |||
|
128 | ax.plt_r.set_data(xchannel, yreal) | |||
84 |
|
129 | |||
85 | def plot(self): |
|
130 | def plot(self): | |
86 |
|
||||
87 | if self.channels: |
|
131 | if self.channels: | |
88 | channels = self.channels |
|
132 | channels = self.channels | |
89 | else: |
|
133 | else: | |
90 | channels = self.data.channels |
|
134 | channels = self.data.channels | |
91 |
|
135 | |||
92 | thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]) |
|
136 | thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]) | |
93 |
|
137 | if self.CODE == "pp_power": | ||
94 |
scope = self.data[' |
|
138 | scope = self.data['pp_power'] | |
95 |
|
139 | elif self.CODE == "pp_velocity": | ||
|
140 | scope = self.data["pp_velocity"] | |||
|
141 | else: | |||
|
142 | scope =self.data["scope"] | |||
|
143 | ||||
96 | if self.data.flagDataAsBlock: |
|
144 | if self.data.flagDataAsBlock: | |
97 |
|
145 | |||
98 | for i in range(self.data.nProfiles): |
|
146 | for i in range(self.data.nProfiles): | |
99 |
|
147 | |||
100 | wintitle1 = " [Profile = %d] " %i |
|
148 | wintitle1 = " [Profile = %d] " %i | |
101 |
|
149 | if self.CODE =="scope": | ||
102 | if self.type == "power": |
|
150 | if self.type == "power": | |
103 |
self.plot_power(self.data.heights, |
|
151 | self.plot_power(self.data.heights, | |
104 |
scope[:,i,:], |
|
152 | scope[:,i,:], | |
105 | channels, |
|
153 | channels, | |
106 |
thisDatetime, |
|
154 | thisDatetime, | |
107 | wintitle1 |
|
155 | wintitle1 | |
|
156 | ) | |||
|
157 | ||||
|
158 | if self.type == "iq": | |||
|
159 | self.plot_iq(self.data.heights, | |||
|
160 | scope[:,i,:], | |||
|
161 | channels, | |||
|
162 | thisDatetime, | |||
|
163 | wintitle1 | |||
108 | ) |
|
164 | ) | |
|
165 | if self.CODE=="pp_power": | |||
|
166 | self.plot_weatherpower(self.data.heights, | |||
|
167 | scope[:,i,:], | |||
|
168 | channels, | |||
|
169 | thisDatetime, | |||
|
170 | wintitle | |||
|
171 | ) | |||
|
172 | if self.CODE=="pp_velocity": | |||
|
173 | self.plot_weathervelocity(scope[:,i,:], | |||
|
174 | self.data.heights, | |||
|
175 | channels, | |||
|
176 | thisDatetime, | |||
|
177 | wintitle | |||
|
178 | ) | |||
|
179 | else: | |||
|
180 | wintitle = " [Profile = %d] " %self.data.profileIndex | |||
|
181 | if self.CODE== "scope": | |||
|
182 | if self.type == "power": | |||
|
183 | self.plot_power(self.data.heights, | |||
|
184 | scope, | |||
|
185 | channels, | |||
|
186 | thisDatetime, | |||
|
187 | wintitle | |||
|
188 | ) | |||
109 |
|
189 | |||
110 | if self.type == "iq": |
|
190 | if self.type == "iq": | |
111 |
self.plot_iq(self.data.heights, |
|
191 | self.plot_iq(self.data.heights, | |
112 |
|
|
192 | scope, | |
113 |
|
|
193 | channels, | |
114 |
|
|
194 | thisDatetime, | |
115 |
|
|
195 | wintitle | |
116 | ) |
|
196 | ) | |
117 | else: |
|
197 | if self.CODE=="pp_power": | |
118 | wintitle = " [Profile = %d] " %self.data.profileIndex |
|
198 | self.plot_weatherpower(self.data.heights, | |
119 |
|
199 | scope, | ||
120 | if self.type == "power": |
|
200 | channels, | |
121 | self.plot_power(self.data.heights, |
|
201 | thisDatetime, | |
122 |
|
|
202 | wintitle | |
123 |
|
|
203 | ) | |
124 | thisDatetime, |
|
204 | if self.CODE=="pp_velocity": | |
125 | wintitle |
|
205 | self.plot_weathervelocity(scope, | |
126 |
|
|
206 | self.data.heights, | |
127 |
|
207 | channels, | ||
128 | if self.type == "iq": |
|
208 | thisDatetime, | |
129 | self.plot_iq(self.data.heights, |
|
209 | wintitle | |
130 |
|
|
210 | ) | |
131 | channels, |
|
211 | ||
132 | thisDatetime, |
|
212 | ||
133 | wintitle |
|
213 | ||
134 | ) |
|
214 | class PulsepairPowerPlot(ScopePlot): | |
|
215 | ''' | |||
|
216 | Plot for | |||
|
217 | ''' | |||
|
218 | ||||
|
219 | CODE = 'pp_power' | |||
|
220 | plot_name = 'PulsepairPower' | |||
|
221 | plot_type = 'scatter' | |||
|
222 | buffering = False | |||
|
223 | ||||
|
224 | ||||
|
225 | ||||
|
226 | class PulsepairVelocityPlot(ScopePlot): | |||
|
227 | ''' | |||
|
228 | Plot for | |||
|
229 | ''' | |||
|
230 | CODE = 'pp_velocity' | |||
|
231 | plot_name = 'PulsepairVelocity' | |||
|
232 | plot_type = 'scatter' | |||
|
233 | buffering = False |
@@ -1,5 +1,5 | |||||
1 | import sys |
|
1 | import sys | |
2 | import numpy |
|
2 | import numpy,math | |
3 | from scipy import interpolate |
|
3 | from scipy import interpolate | |
4 | from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator |
|
4 | from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator | |
5 | from schainpy.model.data.jrodata import Voltage |
|
5 | from schainpy.model.data.jrodata import Voltage | |
@@ -8,8 +8,8 from time import time | |||||
8 |
|
8 | |||
9 |
|
9 | |||
10 |
|
10 | |||
11 |
class VoltageProc(ProcessingUnit): |
|
11 | class VoltageProc(ProcessingUnit): | |
12 |
|
12 | |||
13 | def __init__(self): |
|
13 | def __init__(self): | |
14 |
|
14 | |||
15 | ProcessingUnit.__init__(self) |
|
15 | ProcessingUnit.__init__(self) | |
@@ -51,22 +51,20 class VoltageProc(ProcessingUnit): | |||||
51 | self.dataOut.beam.codeList = self.dataIn.beam.codeList |
|
51 | self.dataOut.beam.codeList = self.dataIn.beam.codeList | |
52 | self.dataOut.beam.azimuthList = self.dataIn.beam.azimuthList |
|
52 | self.dataOut.beam.azimuthList = self.dataIn.beam.azimuthList | |
53 | self.dataOut.beam.zenithList = self.dataIn.beam.zenithList |
|
53 | self.dataOut.beam.zenithList = self.dataIn.beam.zenithList | |
54 |
|
54 | |||
55 |
|
55 | |||
56 | class selectChannels(Operation): |
|
56 | class selectChannels(Operation): | |
57 |
|
57 | |||
58 | def run(self, dataOut, channelList): |
|
58 | def run(self, dataOut, channelList): | |
59 |
|
59 | |||
60 | channelIndexList = [] |
|
60 | channelIndexList = [] | |
61 | self.dataOut = dataOut |
|
61 | self.dataOut = dataOut | |
62 |
|
||||
63 | for channel in channelList: |
|
62 | for channel in channelList: | |
64 | if channel not in self.dataOut.channelList: |
|
63 | if channel not in self.dataOut.channelList: | |
65 | raise ValueError("Channel %d is not in %s" %(channel, str(self.dataOut.channelList))) |
|
64 | raise ValueError("Channel %d is not in %s" %(channel, str(self.dataOut.channelList))) | |
66 |
|
65 | |||
67 | index = self.dataOut.channelList.index(channel) |
|
66 | index = self.dataOut.channelList.index(channel) | |
68 | channelIndexList.append(index) |
|
67 | channelIndexList.append(index) | |
69 |
|
||||
70 | self.selectChannelsByIndex(channelIndexList) |
|
68 | self.selectChannelsByIndex(channelIndexList) | |
71 | return self.dataOut |
|
69 | return self.dataOut | |
72 |
|
70 | |||
@@ -105,6 +103,7 class selectChannels(Operation): | |||||
105 | self.dataOut.data = data |
|
103 | self.dataOut.data = data | |
106 | # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList] |
|
104 | # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList] | |
107 | self.dataOut.channelList = range(len(channelIndexList)) |
|
105 | self.dataOut.channelList = range(len(channelIndexList)) | |
|
106 | ||||
108 | elif self.dataOut.type == 'Spectra': |
|
107 | elif self.dataOut.type == 'Spectra': | |
109 | data_spc = self.dataOut.data_spc[channelIndexList, :] |
|
108 | data_spc = self.dataOut.data_spc[channelIndexList, :] | |
110 | data_dc = self.dataOut.data_dc[channelIndexList, :] |
|
109 | data_dc = self.dataOut.data_dc[channelIndexList, :] | |
@@ -146,7 +145,7 class selectChannels(Operation): | |||||
146 | return |
|
145 | return | |
147 |
|
146 | |||
148 | class selectHeights(Operation): |
|
147 | class selectHeights(Operation): | |
149 |
|
148 | |||
150 | def run(self, dataOut, minHei=None, maxHei=None): |
|
149 | def run(self, dataOut, minHei=None, maxHei=None): | |
151 | """ |
|
150 | """ | |
152 | Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango |
|
151 | Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango | |
@@ -262,7 +261,7 class selectHeights(Operation): | |||||
262 | self.dataOut.data_dc = data_dc |
|
261 | self.dataOut.data_dc = data_dc | |
263 |
|
262 | |||
264 | self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex + 1] |
|
263 | self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex + 1] | |
265 |
|
264 | |||
266 | return 1 |
|
265 | return 1 | |
267 |
|
266 | |||
268 |
|
267 | |||
@@ -286,7 +285,7 class filterByHeights(Operation): | |||||
286 | """ |
|
285 | """ | |
287 | Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] |
|
286 | Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] | |
288 | """ |
|
287 | """ | |
289 |
buffer = dataOut.data[:, :, 0:int(dataOut.nHeights-r)] |
|
288 | buffer = dataOut.data[:, :, 0:int(dataOut.nHeights-r)] | |
290 | buffer = buffer.reshape(dataOut.nChannels, dataOut.nProfiles, int(dataOut.nHeights/window), window) |
|
289 | buffer = buffer.reshape(dataOut.nChannels, dataOut.nProfiles, int(dataOut.nHeights/window), window) | |
291 | buffer = numpy.sum(buffer,3) |
|
290 | buffer = numpy.sum(buffer,3) | |
292 |
|
291 | |||
@@ -580,8 +579,8 class CohInt(Operation): | |||||
580 | # print self.__bufferStride[self.__profIndexStride - 1] |
|
579 | # print self.__bufferStride[self.__profIndexStride - 1] | |
581 | # raise |
|
580 | # raise | |
582 | return self.__bufferStride[self.__profIndexStride - 1] |
|
581 | return self.__bufferStride[self.__profIndexStride - 1] | |
583 |
|
582 | |||
584 |
|
583 | |||
585 | return None, None |
|
584 | return None, None | |
586 |
|
585 | |||
587 | def integrate(self, data, datatime=None): |
|
586 | def integrate(self, data, datatime=None): | |
@@ -603,7 +602,7 class CohInt(Operation): | |||||
603 | avgdatatime = self.__initime |
|
602 | avgdatatime = self.__initime | |
604 |
|
603 | |||
605 | deltatime = datatime - self.__lastdatatime |
|
604 | deltatime = datatime - self.__lastdatatime | |
606 |
|
605 | |||
607 | if not self.__withOverlapping: |
|
606 | if not self.__withOverlapping: | |
608 | self.__initime = datatime |
|
607 | self.__initime = datatime | |
609 | else: |
|
608 | else: | |
@@ -629,7 +628,7 class CohInt(Operation): | |||||
629 | avgdatatime = (times - 1) * timeInterval + dataOut.utctime |
|
628 | avgdatatime = (times - 1) * timeInterval + dataOut.utctime | |
630 | self.__dataReady = True |
|
629 | self.__dataReady = True | |
631 | return avgdata, avgdatatime |
|
630 | return avgdata, avgdatatime | |
632 |
|
631 | |||
633 | def run(self, dataOut, n=None, timeInterval=None, stride=None, overlapping=False, byblock=False, **kwargs): |
|
632 | def run(self, dataOut, n=None, timeInterval=None, stride=None, overlapping=False, byblock=False, **kwargs): | |
634 |
|
633 | |||
635 | if not self.isConfig: |
|
634 | if not self.isConfig: | |
@@ -643,12 +642,12 class CohInt(Operation): | |||||
643 | avgdata, avgdatatime = self.integrateByBlock(dataOut) |
|
642 | avgdata, avgdatatime = self.integrateByBlock(dataOut) | |
644 | dataOut.nProfiles /= self.n |
|
643 | dataOut.nProfiles /= self.n | |
645 | else: |
|
644 | else: | |
646 |
if stride is None: |
|
645 | if stride is None: | |
647 | avgdata, avgdatatime = self.integrate(dataOut.data, dataOut.utctime) |
|
646 | avgdata, avgdatatime = self.integrate(dataOut.data, dataOut.utctime) | |
648 | else: |
|
647 | else: | |
649 | avgdata, avgdatatime = self.integrateByStride(dataOut.data, dataOut.utctime) |
|
648 | avgdata, avgdatatime = self.integrateByStride(dataOut.data, dataOut.utctime) | |
650 |
|
649 | |||
651 |
|
650 | |||
652 | # dataOut.timeInterval *= n |
|
651 | # dataOut.timeInterval *= n | |
653 | dataOut.flagNoData = True |
|
652 | dataOut.flagNoData = True | |
654 |
|
653 | |||
@@ -753,11 +752,11 class Decoder(Operation): | |||||
753 | junk = junk.flatten() |
|
752 | junk = junk.flatten() | |
754 | code_block = numpy.reshape(junk, (self.nCode*repetitions, self.nBaud)) |
|
753 | code_block = numpy.reshape(junk, (self.nCode*repetitions, self.nBaud)) | |
755 | profilesList = range(self.__nProfiles) |
|
754 | profilesList = range(self.__nProfiles) | |
756 |
|
755 | |||
757 |
for i in range(self.__nChannels): |
|
756 | for i in range(self.__nChannels): | |
758 |
for j in profilesList: |
|
757 | for j in profilesList: | |
759 |
self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='full')[self.nBaud-1:] |
|
758 | self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='full')[self.nBaud-1:] | |
760 |
return self.datadecTime |
|
759 | return self.datadecTime | |
761 |
|
760 | |||
762 | def __convolutionByBlockInFreq(self, data): |
|
761 | def __convolutionByBlockInFreq(self, data): | |
763 |
|
762 | |||
@@ -774,7 +773,7 class Decoder(Operation): | |||||
774 |
|
773 | |||
775 | return data |
|
774 | return data | |
776 |
|
775 | |||
777 |
|
776 | |||
778 | def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, osamp=None, times=None): |
|
777 | def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, osamp=None, times=None): | |
779 |
|
778 | |||
780 | if dataOut.flagDecodeData: |
|
779 | if dataOut.flagDecodeData: | |
@@ -805,7 +804,7 class Decoder(Operation): | |||||
805 |
|
804 | |||
806 | self.__nProfiles = dataOut.nProfiles |
|
805 | self.__nProfiles = dataOut.nProfiles | |
807 | datadec = None |
|
806 | datadec = None | |
808 |
|
807 | |||
809 | if mode == 3: |
|
808 | if mode == 3: | |
810 | mode = 0 |
|
809 | mode = 0 | |
811 |
|
810 | |||
@@ -1186,9 +1185,9 class SplitProfiles(Operation): | |||||
1186 |
|
1185 | |||
1187 | if shape[2] % n != 0: |
|
1186 | if shape[2] % n != 0: | |
1188 | raise ValueError("Could not split the data, n=%d has to be multiple of %d" %(n, shape[2])) |
|
1187 | raise ValueError("Could not split the data, n=%d has to be multiple of %d" %(n, shape[2])) | |
1189 |
|
1188 | |||
1190 | new_shape = shape[0], shape[1]*n, int(shape[2]/n) |
|
1189 | new_shape = shape[0], shape[1]*n, int(shape[2]/n) | |
1191 |
|
1190 | |||
1192 | dataOut.data = numpy.reshape(dataOut.data, new_shape) |
|
1191 | dataOut.data = numpy.reshape(dataOut.data, new_shape) | |
1193 | dataOut.flagNoData = False |
|
1192 | dataOut.flagNoData = False | |
1194 |
|
1193 | |||
@@ -1272,6 +1271,155 class CombineProfiles(Operation): | |||||
1272 | dataOut.ippSeconds *= n |
|
1271 | dataOut.ippSeconds *= n | |
1273 |
|
1272 | |||
1274 | return dataOut |
|
1273 | return dataOut | |
|
1274 | ||||
|
1275 | class PulsePairVoltage(Operation): | |||
|
1276 | ''' | |||
|
1277 | Function PulsePair(Signal Power, Velocity) | |||
|
1278 | The real component of Lag[0] provides Intensity Information | |||
|
1279 | The imag component of Lag[1] Phase provides Velocity Information | |||
|
1280 | ||||
|
1281 | Configuration Parameters: | |||
|
1282 | nPRF = Number of Several PRF | |||
|
1283 | theta = Degree Azimuth angel Boundaries | |||
|
1284 | ||||
|
1285 | Input: | |||
|
1286 | self.dataOut | |||
|
1287 | lag[N] | |||
|
1288 | Affected: | |||
|
1289 | self.dataOut.spc | |||
|
1290 | ''' | |||
|
1291 | isConfig = False | |||
|
1292 | __profIndex = 0 | |||
|
1293 | __initime = None | |||
|
1294 | __lastdatatime = None | |||
|
1295 | __buffer = None | |||
|
1296 | __buffer2 = [] | |||
|
1297 | __buffer3 = None | |||
|
1298 | __dataReady = False | |||
|
1299 | n = None | |||
|
1300 | __nch = 0 | |||
|
1301 | __nHeis = 0 | |||
|
1302 | removeDC = False | |||
|
1303 | ipp = None | |||
|
1304 | lambda_ = 0 | |||
|
1305 | ||||
|
1306 | def __init__(self,**kwargs): | |||
|
1307 | Operation.__init__(self,**kwargs) | |||
|
1308 | ||||
|
1309 | def setup(self, dataOut, n = None, removeDC=False): | |||
|
1310 | ''' | |||
|
1311 | n= Numero de PRF's de entrada | |||
|
1312 | ''' | |||
|
1313 | self.__initime = None | |||
|
1314 | self.__lastdatatime = 0 | |||
|
1315 | self.__dataReady = False | |||
|
1316 | self.__buffer = 0 | |||
|
1317 | self.__buffer2 = [] | |||
|
1318 | self.__buffer3 = 0 | |||
|
1319 | self.__profIndex = 0 | |||
|
1320 | ||||
|
1321 | self.__nch = dataOut.nChannels | |||
|
1322 | self.__nHeis = dataOut.nHeights | |||
|
1323 | self.removeDC = removeDC | |||
|
1324 | self.lambda_ = 3.0e8/(9345.0e6) | |||
|
1325 | self.ippSec = dataOut.ippSeconds | |||
|
1326 | self.nCohInt = dataOut.nCohInt | |||
|
1327 | print("IPPseconds",dataOut.ippSeconds) | |||
|
1328 | ||||
|
1329 | print("ELVALOR DE n es:", n) | |||
|
1330 | if n == None: | |||
|
1331 | raise ValueError("n should be specified.") | |||
|
1332 | ||||
|
1333 | if n != None: | |||
|
1334 | if n<2: | |||
|
1335 | raise ValueError("n should be greater than 2") | |||
|
1336 | ||||
|
1337 | self.n = n | |||
|
1338 | self.__nProf = n | |||
|
1339 | ||||
|
1340 | self.__buffer = numpy.zeros((dataOut.nChannels, | |||
|
1341 | n, | |||
|
1342 | dataOut.nHeights), | |||
|
1343 | dtype='complex') | |||
|
1344 | ||||
|
1345 | def putData(self,data): | |||
|
1346 | ''' | |||
|
1347 | Add a profile to he __buffer and increase in one the __profiel Index | |||
|
1348 | ''' | |||
|
1349 | self.__buffer[:,self.__profIndex,:]= data | |||
|
1350 | self.__profIndex += 1 | |||
|
1351 | return | |||
|
1352 | ||||
|
1353 | def pushData(self): | |||
|
1354 | ''' | |||
|
1355 | Return the PULSEPAIR and the profiles used in the operation | |||
|
1356 | Affected : self.__profileIndex | |||
|
1357 | ''' | |||
|
1358 | ||||
|
1359 | if self.removeDC==True: | |||
|
1360 | mean = numpy.mean(self.__buffer,1) | |||
|
1361 | tmp = mean.reshape(self.__nch,1,self.__nHeis) | |||
|
1362 | dc= numpy.tile(tmp,[1,self.__nProf,1]) | |||
|
1363 | self.__buffer = self.__buffer - dc | |||
|
1364 | ||||
|
1365 | data_intensity = numpy.sum(self.__buffer*numpy.conj(self.__buffer),1)/(self.n*self.nCohInt)#*self.nCohInt) | |||
|
1366 | pair1 = self.__buffer[:,1:,:]*numpy.conjugate(self.__buffer[:,:-1,:]) | |||
|
1367 | angle = numpy.angle(numpy.sum(pair1,1))*180/(math.pi) | |||
|
1368 | #print(angle.shape)#print("__ANGLE__") #print("angle",angle[:,:10]) | |||
|
1369 | data_velocity = (self.lambda_/(4*math.pi*self.ippSec))*numpy.angle(numpy.sum(pair1,1))#self.ippSec*self.nCohInt | |||
|
1370 | n = self.__profIndex | |||
|
1371 | ||||
|
1372 | self.__buffer = numpy.zeros((self.__nch, self.__nProf,self.__nHeis), dtype='complex') | |||
|
1373 | self.__profIndex = 0 | |||
|
1374 | return data_intensity,data_velocity,n | |||
|
1375 | ||||
|
1376 | def pulsePairbyProfiles(self,data): | |||
|
1377 | ||||
|
1378 | self.__dataReady = False | |||
|
1379 | data_intensity = None | |||
|
1380 | data_velocity = None | |||
|
1381 | self.putData(data) | |||
|
1382 | if self.__profIndex == self.n: | |||
|
1383 | data_intensity, data_velocity, n = self.pushData() | |||
|
1384 | self.__dataReady = True | |||
|
1385 | ||||
|
1386 | return data_intensity, data_velocity | |||
|
1387 | ||||
|
1388 | def pulsePairOp(self, data, datatime= None): | |||
|
1389 | ||||
|
1390 | if self.__initime == None: | |||
|
1391 | self.__initime = datatime | |||
|
1392 | ||||
|
1393 | data_intensity, data_velocity = self.pulsePairbyProfiles(data) | |||
|
1394 | self.__lastdatatime = datatime | |||
|
1395 | ||||
|
1396 | if data_intensity is None: | |||
|
1397 | return None, None, None | |||
|
1398 | ||||
|
1399 | avgdatatime = self.__initime | |||
|
1400 | deltatime = datatime - self.__lastdatatime | |||
|
1401 | self.__initime = datatime | |||
|
1402 | ||||
|
1403 | return data_intensity, data_velocity, avgdatatime | |||
|
1404 | ||||
|
1405 | def run(self, dataOut,n = None,removeDC= False, overlapping= False,**kwargs): | |||
|
1406 | ||||
|
1407 | if not self.isConfig: | |||
|
1408 | self.setup(dataOut = dataOut, n = n , removeDC=removeDC , **kwargs) | |||
|
1409 | self.isConfig = True | |||
|
1410 | data_intensity, data_velocity, avgdatatime = self.pulsePairOp(dataOut.data, dataOut.utctime) | |||
|
1411 | dataOut.flagNoData = True | |||
|
1412 | ||||
|
1413 | if self.__dataReady: | |||
|
1414 | dataOut.nCohInt *= self.n | |||
|
1415 | dataOut.data_intensity = data_intensity #valor para intensidad | |||
|
1416 | dataOut.data_velocity = data_velocity #valor para velocidad | |||
|
1417 | dataOut.PRFbyAngle = self.n #numero de PRF*cada angulo rotado que equivale a un tiempo. | |||
|
1418 | dataOut.utctime = avgdatatime | |||
|
1419 | dataOut.flagNoData = False | |||
|
1420 | return dataOut | |||
|
1421 | ||||
|
1422 | ||||
1275 | # import collections |
|
1423 | # import collections | |
1276 | # from scipy.stats import mode |
|
1424 | # from scipy.stats import mode | |
1277 | # |
|
1425 | # |
General Comments 0
You need to be logged in to leave comments.
Login now