##// END OF EJS Templates
Modificaciones realizadas en:...
Daniel Valdez -
r106:04f661d03146
parent child
Show More
@@ -1,541 +1,551
1 '''
1 '''
2 File: SpectraIO.py
2 File: SpectraIO.py
3 Created on 20/02/2012
3 Created on 20/02/2012
4
4
5 @author $Author$
5 @author $Author$
6 @version $Id$
6 @version $Id$
7 '''
7 '''
8
8
9 import os, sys
9 import os, sys
10 import numpy
10 import numpy
11 import glob
11 import glob
12 import fnmatch
12 import fnmatch
13 import time, datetime
13 import time, datetime
14
14
15 path = os.path.split(os.getcwd())[0]
15 path = os.path.split(os.getcwd())[0]
16 sys.path.append(path)
16 sys.path.append(path)
17
17
18 from Model.JROHeader import *
18 from Model.JROHeader import *
19 from Model.Spectra import Spectra
19 from Model.Spectra import Spectra
20
20
21 from JRODataIO import JRODataReader
21 from JRODataIO import JRODataReader
22 from JRODataIO import JRODataWriter
22 from JRODataIO import JRODataWriter
23 from JRODataIO import isNumber
23 from JRODataIO import isNumber
24
24
25
25
26 class SpectraReader(JRODataReader):
26 class SpectraReader(JRODataReader):
27 """
27 """
28 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
28 Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura
29 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
29 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones)
30 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
30 son almacenados en tres buffer's para el Self Spectra, el Cross Spectra y el DC Channel.
31
31
32 paresCanalesIguales * alturas * perfiles (Self Spectra)
32 paresCanalesIguales * alturas * perfiles (Self Spectra)
33 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
33 paresCanalesDiferentes * alturas * perfiles (Cross Spectra)
34 canales * alturas (DC Channels)
34 canales * alturas (DC Channels)
35
35
36 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
36 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
37 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
37 RadarControllerHeader y Spectra. Los tres primeros se usan para almacenar informacion de la
38 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
38 cabecera de datos (metadata), y el cuarto (Spectra) para obtener y almacenar un bloque de
39 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
39 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
40
40
41 Example:
41 Example:
42 dpath = "/home/myuser/data"
42 dpath = "/home/myuser/data"
43
43
44 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
44 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
45
45
46 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
46 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
47
47
48 readerObj = SpectraReader()
48 readerObj = SpectraReader()
49
49
50 readerObj.setup(dpath, startTime, endTime)
50 readerObj.setup(dpath, startTime, endTime)
51
51
52 while(True):
52 while(True):
53
53
54 readerObj.getData()
54 readerObj.getData()
55
55
56 print readerObj.m_Spectra.data
56 print readerObj.m_Spectra.data
57
57
58 if readerObj.flagNoMoreFiles:
58 if readerObj.flagNoMoreFiles:
59 break
59 break
60
60
61 """
61 """
62 m_DataObj = None
62 m_DataObj = None
63
63
64 data_spc = None
64 data_spc = None
65 data_cspc = None
65 data_cspc = None
66 data_dc = None
66 data_dc = None
67
67
68 pts2read_SelfSpectra = 0
68 pts2read_SelfSpectra = 0
69 pts2read_CrossSpectra = 0
69 pts2read_CrossSpectra = 0
70 pts2read_DCchannels = 0
70 pts2read_DCchannels = 0
71
71
72 nChannels = 0
72 nChannels = 0
73
73
74 nPairs = 0
74 nPairs = 0
75
75
76 #pairList = None
76 #pairList = None
77
77
78 channelList = None
78 channelList = None
79
79
80 def __init__(self, m_Spectra=None):
80 def __init__(self, m_Spectra=None):
81 """
81 """
82 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
82 Inicializador de la clase SpectraReader para la lectura de datos de espectros.
83
83
84 Inputs:
84 Inputs:
85 m_Spectra : Objeto de la clase Spectra. Este objeto sera utilizado para
85 m_Spectra : Objeto de la clase Spectra. Este objeto sera utilizado para
86 almacenar un perfil de datos cada vez que se haga un requerimiento
86 almacenar un perfil de datos cada vez que se haga un requerimiento
87 (getData). El perfil sera obtenido a partir del buffer de datos,
87 (getData). El perfil sera obtenido a partir del buffer de datos,
88 si el buffer esta vacio se hara un nuevo proceso de lectura de un
88 si el buffer esta vacio se hara un nuevo proceso de lectura de un
89 bloque de datos.
89 bloque de datos.
90 Si este parametro no es pasado se creara uno internamente.
90 Si este parametro no es pasado se creara uno internamente.
91
91
92 Affected:
92 Affected:
93 self.m_DataObj
93 self.m_DataObj
94
94
95 Return : None
95 Return : None
96 """
96 """
97 if m_Spectra == None:
97 if m_Spectra == None:
98 m_Spectra = Spectra()
98 m_Spectra = Spectra()
99
99
100 if not( isinstance(m_Spectra, Spectra) ):
100 if not( isinstance(m_Spectra, Spectra) ):
101 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
101 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
102
102
103 self.m_DataObj = m_Spectra
103 self.m_DataObj = m_Spectra
104
104
105 self.data_spc = None
105 self.data_spc = None
106 self.data_cspc = None
106 self.data_cspc = None
107 self.data_dc = None
107 self.data_dc = None
108
108
109 self.pts2read_SelfSpectra = 0
109 self.pts2read_SelfSpectra = 0
110 self.pts2read_CrossSpectra = 0
110 self.pts2read_CrossSpectra = 0
111 self.pts2read_DCs = 0
111 self.pts2read_DCs = 0
112
112
113 self.nChannels = 0
113 self.nChannels = 0
114
114
115 self.nPairs = 0
115 self.nPairs = 0
116
116
117 self.ext = ".pdata"
117 self.ext = ".pdata"
118
118
119 self.optchar = "P"
119 self.optchar = "P"
120
120
121 ######################
121 ######################
122
122
123 self.m_BasicHeader = BasicHeader()
123 self.m_BasicHeader = BasicHeader()
124
124
125 self.m_SystemHeader = SystemHeader()
125 self.m_SystemHeader = SystemHeader()
126
126
127 self.m_RadarControllerHeader = RadarControllerHeader()
127 self.m_RadarControllerHeader = RadarControllerHeader()
128
128
129 self.m_ProcessingHeader = ProcessingHeader()
129 self.m_ProcessingHeader = ProcessingHeader()
130
130
131 self.online = 0
131 self.online = 0
132
132
133 self.fp = None
133 self.fp = None
134
134
135 self.fileSizeByHeader = None
135 self.fileSizeByHeader = None
136
136
137 self.filenameList = []
137 self.filenameList = []
138
138
139 self.filename = None
139 self.filename = None
140
140
141 self.fileSize = None
141 self.fileSize = None
142
142
143 self.firstHeaderSize = 0
143 self.firstHeaderSize = 0
144
144
145 self.basicHeaderSize = 24
145 self.basicHeaderSize = 24
146
146
147 self.dataType = None
147 self.dataType = None
148
148
149 self.maxTimeStep = 30
149 self.maxTimeStep = 30
150
150
151 self.flagNoMoreFiles = 0
151 self.flagNoMoreFiles = 0
152
152
153 self.set = 0
153 self.set = 0
154
154
155 self.path = None
155 self.path = None
156
156
157 self.delay = 3 #seconds
157 self.delay = 3 #seconds
158
158
159 self.nTries = 3 #quantity tries
159 self.nTries = 3 #quantity tries
160
160
161 self.nFiles = 3 #number of files for searching
161 self.nFiles = 3 #number of files for searching
162
162
163 self.nReadBlocks = 0
163 self.nReadBlocks = 0
164
164
165 self.flagIsNewFile = 1
165 self.flagIsNewFile = 1
166
166
167 self.ippSeconds = 0
167 self.ippSeconds = 0
168
168
169 self.flagResetProcessing = 0
169 self.flagResetProcessing = 0
170
170
171 self.flagIsNewBlock = 0
171 self.flagIsNewBlock = 0
172
172
173 self.nTotalBlocks = 0
173 self.nTotalBlocks = 0
174
174
175 self.blocksize = 0
175 self.blocksize = 0
176
176
177 #pairList = None
177 #pairList = None
178
178
179 channelList = None
179 channelList = None
180
181 self.flag_cspc = False
180
182
181
183
182 def __hasNotDataInBuffer(self):
184 def __hasNotDataInBuffer(self):
183 return 1
185 return 1
184
186
185
187
186 def getBlockDimension(self):
188 def getBlockDimension(self):
187 """
189 """
188 Obtiene la cantidad de puntos a leer por cada bloque de datos
190 Obtiene la cantidad de puntos a leer por cada bloque de datos
189
191
190 Affected:
192 Affected:
191 self.nChannels
193 self.nChannels
192 self.nPairs
194 self.nPairs
193 self.pts2read_SelfSpectra
195 self.pts2read_SelfSpectra
194 self.pts2read_CrossSpectra
196 self.pts2read_CrossSpectra
195 self.pts2read_DCchannels
197 self.pts2read_DCchannels
196 self.blocksize
198 self.blocksize
197 self.m_DataObj.nChannels
199 self.m_DataObj.nChannels
198 self.m_DataObj.nPairs
200 self.m_DataObj.nPairs
199
201
200 Return:
202 Return:
201 None
203 None
202 """
204 """
203 self.nChannels = 0
205 self.nChannels = 0
204 self.nPairs = 0
206 self.nPairs = 0
205 self.pairList = []
207 self.pairList = []
206
208
207 for i in range( 0, self.m_ProcessingHeader.totalSpectra*2, 2 ):
209 for i in range( 0, self.m_ProcessingHeader.totalSpectra*2, 2 ):
208 if self.m_ProcessingHeader.spectraComb[i] == self.m_ProcessingHeader.spectraComb[i+1]:
210 if self.m_ProcessingHeader.spectraComb[i] == self.m_ProcessingHeader.spectraComb[i+1]:
209 self.nChannels = self.nChannels + 1 #par de canales iguales
211 self.nChannels = self.nChannels + 1 #par de canales iguales
210 else:
212 else:
211 self.nPairs = self.nPairs + 1 #par de canales diferentes
213 self.nPairs = self.nPairs + 1 #par de canales diferentes
212 self.pairList.append( (self.m_ProcessingHeader.spectraComb[i], self.m_ProcessingHeader.spectraComb[i+1]) )
214 self.pairList.append( (self.m_ProcessingHeader.spectraComb[i], self.m_ProcessingHeader.spectraComb[i+1]) )
215
216 if self.nPairs > 0:
217 self.flag_cspc = True
213
218
214 pts2read = self.m_ProcessingHeader.numHeights * self.m_ProcessingHeader.profilesPerBlock
219 pts2read = self.m_ProcessingHeader.numHeights * self.m_ProcessingHeader.profilesPerBlock
215
220
216 self.pts2read_SelfSpectra = int( self.nChannels * pts2read )
221 self.pts2read_SelfSpectra = int(self.nChannels * pts2read)
217 self.pts2read_CrossSpectra = int( self.nPairs * pts2read )
222 self.blocksize = self.pts2read_SelfSpectra
218 self.pts2read_DCchannels = int( self.m_SystemHeader.numChannels * self.m_ProcessingHeader.numHeights )
219
223
220 self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
224 if self.flag_cspc:
225 self.pts2read_CrossSpectra = int(self.nPairs * pts2read)
226 self.blocksize += self.pts2read_CrossSpectra
227
228 if self.m_ProcessingHeader.flag_dc:
229 self.pts2read_DCchannels = int(self.m_SystemHeader.numChannels * self.m_ProcessingHeader.numHeights)
230 self.blocksize += self.pts2read_DCchannels
231
232 # self.blocksize = self.pts2read_SelfSpectra + self.pts2read_CrossSpectra + self.pts2read_DCchannels
221
233
222 self.channelList = numpy.arange( self.nChannels )
234 self.channelList = numpy.arange(self.nChannels)
223
235
224
236
225 def readBlock(self):
237 def readBlock(self):
226 """
238 """
227 Lee el bloque de datos desde la posicion actual del puntero del archivo
239 Lee el bloque de datos desde la posicion actual del puntero del archivo
228 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
240 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
229 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
241 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
230 es seteado a 0
242 es seteado a 0
231
243
232 Return: None
244 Return: None
233
245
234 Variables afectadas:
246 Variables afectadas:
235 self.datablockIndex
247 self.datablockIndex
236 self.flagIsNewFile
248 self.flagIsNewFile
237 self.flagIsNewBlock
249 self.flagIsNewBlock
238 self.nTotalBlocks
250 self.nTotalBlocks
239 self.data_spc
251 self.data_spc
240 self.data_cspc
252 self.data_cspc
241 self.data_dc
253 self.data_dc
242
254
243 Exceptions:
255 Exceptions:
244 Si un bloque leido no es un bloque valido
256 Si un bloque leido no es un bloque valido
245 """
257 """
246 blockOk_flag = False
258 blockOk_flag = False
247 fpointer = self.fp.tell()
259 fpointer = self.fp.tell()
248
260
249 spc = numpy.fromfile( self.fp, self.dataType[0], self.pts2read_SelfSpectra )
261 spc = numpy.fromfile( self.fp, self.dataType[0], self.pts2read_SelfSpectra )
250 cspc = numpy.fromfile( self.fp, self.dataType, self.pts2read_CrossSpectra )
262 spc = spc.reshape( (self.nChannels, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
251 dc = numpy.fromfile( self.fp, self.dataType, self.pts2read_DCchannels ) #int(self.m_ProcessingHeader.numHeights*self.m_SystemHeader.numChannels) )
252
263
253 try:
264 if self.flag_cspc:
254 spc = spc.reshape( (self.nChannels, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
265 cspc = numpy.fromfile( self.fp, self.dataType, self.pts2read_CrossSpectra )
255 if self.nPairs != 0:
266 cspc = cspc.reshape( (self.nPairs, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
256 cspc = cspc.reshape( (self.nPairs, self.m_ProcessingHeader.numHeights, self.m_ProcessingHeader.profilesPerBlock) ) #transforma a un arreglo 3D
267
257 else:
268 if self.m_ProcessingHeader.flag_dc:
258 cspc = None
269 dc = numpy.fromfile( self.fp, self.dataType, self.pts2read_DCchannels ) #int(self.m_ProcessingHeader.numHeights*self.m_SystemHeader.numChannels) )
259 dc = dc.reshape( (self.m_SystemHeader.numChannels, self.m_ProcessingHeader.numHeights) ) #transforma a un arreglo 2D
270 dc = dc.reshape( (self.m_SystemHeader.numChannels, self.m_ProcessingHeader.numHeights) ) #transforma a un arreglo 2D
260 except:
271
261 print "Data file %s is invalid" % self.filename
262 return 0
263
272
264 if not( self.m_ProcessingHeader.shif_fft ):
273 if not(self.m_ProcessingHeader.shif_fft):
265 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
274 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
266
275
267 if cspc != None:
276 if self.flag_cspc:
268 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
277 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
269
278
279
270 spc = numpy.transpose( spc, (0,2,1) )
280 spc = numpy.transpose( spc, (0,2,1) )
281 self.data_spc = spc
271
282
272 if cspc != None:
283 if self.flag_cspc:
273 cspc = numpy.transpose( cspc, (0,2,1) )
284 cspc = numpy.transpose( cspc, (0,2,1) )
274
275
276 if cspc != None:
277 self.data_cspc = cspc['real'] + cspc['imag']*1j
285 self.data_cspc = cspc['real'] + cspc['imag']*1j
278 else:
286 else:
279 self.data_cspc = None
287 self.data_cspc = None
280
288
281 self.data_spc = spc
289 if self.m_ProcessingHeader.flag_dc:
282 self.data_dc = dc['real'] + dc['imag']*1j
290 self.data_dc = dc['real'] + dc['imag']*1j
291 else:
292 self.data_dc = None
283
293
284 self.datablockIndex = 0
294 self.datablockIndex = 0
285 self.flagIsNewFile = 0
295 self.flagIsNewFile = 0
286 self.flagIsNewBlock = 1
296 self.flagIsNewBlock = 1
287
297
288 self.nTotalBlocks += 1
298 self.nTotalBlocks += 1
289 self.nReadBlocks += 1
299 self.nReadBlocks += 1
290
300
291 return 1
301 return 1
292
302
293
303
294 def getData(self):
304 def getData(self):
295 """
305 """
296 Copia el buffer de lectura a la clase "Spectra",
306 Copia el buffer de lectura a la clase "Spectra",
297 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
307 con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de
298 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
308 lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock"
299
309
300 Return:
310 Return:
301 0 : Si no hay mas archivos disponibles
311 0 : Si no hay mas archivos disponibles
302 1 : Si hizo una buena copia del buffer
312 1 : Si hizo una buena copia del buffer
303
313
304 Affected:
314 Affected:
305 self.m_DataObj
315 self.m_DataObj
306 self.datablockIndex
316 self.datablockIndex
307 self.flagResetProcessing
317 self.flagResetProcessing
308 self.flagIsNewBlock
318 self.flagIsNewBlock
309 """
319 """
310
320
311 if self.flagNoMoreFiles: return 0
321 if self.flagNoMoreFiles: return 0
312
322
313 self.flagResetProcessing = 0
323 self.flagResetProcessing = 0
314 self.flagIsNewBlock = 0
324 self.flagIsNewBlock = 0
315
325
316 if self.__hasNotDataInBuffer():
326 if self.__hasNotDataInBuffer():
317
327
318 if not( self.readNextBlock() ):
328 if not( self.readNextBlock() ):
319 return 0
329 return 0
320
330
321 self.updateDataHeader()
331 self.updateDataHeader()
322
332
323 if self.flagNoMoreFiles == 1:
333 if self.flagNoMoreFiles == 1:
324 print 'Process finished'
334 print 'Process finished'
325 return 0
335 return 0
326
336
327 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
337 #data es un numpy array de 3 dmensiones (perfiles, alturas y canales)
328
338
329 if self.data_dc == None:
339 if self.data_dc == None:
330 self.m_DataObj.flagNoData = True
340 self.m_DataObj.flagNoData = True
331 return 0
341 return 0
332
342
333 self.m_DataObj.flagNoData = False
343 self.m_DataObj.flagNoData = False
334 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
344 self.m_DataObj.flagResetProcessing = self.flagResetProcessing
335
345
336 self.m_DataObj.data_spc = self.data_spc
346 self.m_DataObj.data_spc = self.data_spc
337 self.m_DataObj.data_cspc = self.data_cspc
347 self.m_DataObj.data_cspc = self.data_cspc
338 self.m_DataObj.data_dc = self.data_dc
348 self.m_DataObj.data_dc = self.data_dc
339
349
340 return 1
350 return 1
341
351
342
352
343 class SpectraWriter(JRODataWriter):
353 class SpectraWriter(JRODataWriter):
344
354
345 """
355 """
346 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
356 Esta clase permite escribir datos de espectros a archivos procesados (.pdata). La escritura
347 de los datos siempre se realiza por bloques.
357 de los datos siempre se realiza por bloques.
348 """
358 """
349
359
350 m_DataObj = None
360 m_DataObj = None
351
361
352 shape_spc_Buffer = None
362 shape_spc_Buffer = None
353 shape_cspc_Buffer = None
363 shape_cspc_Buffer = None
354 shape_dc_Buffer = None
364 shape_dc_Buffer = None
355
365
356 data_spc = None
366 data_spc = None
357 data_cspc = None
367 data_cspc = None
358 data_dc = None
368 data_dc = None
359
369
360
370
361 def __init__(self, m_Spectra=None):
371 def __init__(self, m_Spectra=None):
362 """
372 """
363 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
373 Inicializador de la clase SpectraWriter para la escritura de datos de espectros.
364
374
365 Affected:
375 Affected:
366 self.m_DataObj
376 self.m_DataObj
367 self.m_BasicHeader
377 self.m_BasicHeader
368 self.m_SystemHeader
378 self.m_SystemHeader
369 self.m_RadarControllerHeader
379 self.m_RadarControllerHeader
370 self.m_ProcessingHeader
380 self.m_ProcessingHeader
371
381
372 Return: None
382 Return: None
373 """
383 """
374 if m_Spectra == None:
384 if m_Spectra == None:
375 m_Spectra = Spectra()
385 m_Spectra = Spectra()
376
386
377 if not( isinstance(m_Spectra, Spectra) ):
387 if not( isinstance(m_Spectra, Spectra) ):
378 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
388 raise ValueError, "in SpectraReader, m_Spectra must be an Spectra class object"
379
389
380 self.m_DataObj = m_Spectra
390 self.m_DataObj = m_Spectra
381
391
382 self.ext = ".pdata"
392 self.ext = ".pdata"
383
393
384 self.optchar = "P"
394 self.optchar = "P"
385
395
386 self.shape_spc_Buffer = None
396 self.shape_spc_Buffer = None
387 self.shape_cspc_Buffer = None
397 self.shape_cspc_Buffer = None
388 self.shape_dc_Buffer = None
398 self.shape_dc_Buffer = None
389
399
390 self.data_spc = None
400 self.data_spc = None
391 self.data_cspc = None
401 self.data_cspc = None
392 self.data_dc = None
402 self.data_dc = None
393
403
394 ####################################
404 ####################################
395
405
396 self.fp = None
406 self.fp = None
397
407
398 self.nWriteBlocks = 0
408 self.nWriteBlocks = 0
399
409
400 self.flagIsNewFile = 1
410 self.flagIsNewFile = 1
401
411
402 self.nTotalBlocks = 0
412 self.nTotalBlocks = 0
403
413
404 self.flagIsNewBlock = 0
414 self.flagIsNewBlock = 0
405
415
406 self.flagNoMoreFiles = 0
416 self.flagNoMoreFiles = 0
407
417
408 self.setFile = None
418 self.setFile = None
409
419
410 self.dataType = None
420 self.dataType = None
411
421
412 self.path = None
422 self.path = None
413
423
414 self.noMoreFiles = 0
424 self.noMoreFiles = 0
415
425
416 self.filename = None
426 self.filename = None
417
427
418 self.m_BasicHeader= BasicHeader()
428 self.m_BasicHeader= BasicHeader()
419
429
420 self.m_SystemHeader = SystemHeader()
430 self.m_SystemHeader = SystemHeader()
421
431
422 self.m_RadarControllerHeader = RadarControllerHeader()
432 self.m_RadarControllerHeader = RadarControllerHeader()
423
433
424 self.m_ProcessingHeader = ProcessingHeader()
434 self.m_ProcessingHeader = ProcessingHeader()
425
435
426
436
427 def hasAllDataInBuffer(self):
437 def hasAllDataInBuffer(self):
428 return 1
438 return 1
429
439
430
440
431 def setBlockDimension(self):
441 def setBlockDimension(self):
432 """
442 """
433 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
443 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
434
444
435 Affected:
445 Affected:
436 self.shape_spc_Buffer
446 self.shape_spc_Buffer
437 self.shape_cspc_Buffer
447 self.shape_cspc_Buffer
438 self.shape_dc_Buffer
448 self.shape_dc_Buffer
439
449
440 Return: None
450 Return: None
441 """
451 """
442 self.shape_spc_Buffer = (self.m_DataObj.nChannels,
452 self.shape_spc_Buffer = (self.m_DataObj.nChannels,
443 self.m_ProcessingHeader.numHeights,
453 self.m_ProcessingHeader.numHeights,
444 self.m_ProcessingHeader.profilesPerBlock)
454 self.m_ProcessingHeader.profilesPerBlock)
445
455
446 self.shape_cspc_Buffer = (self.m_DataObj.nPairs,
456 self.shape_cspc_Buffer = (self.m_DataObj.nPairs,
447 self.m_ProcessingHeader.numHeights,
457 self.m_ProcessingHeader.numHeights,
448 self.m_ProcessingHeader.profilesPerBlock)
458 self.m_ProcessingHeader.profilesPerBlock)
449
459
450 self.shape_dc_Buffer = (self.m_SystemHeader.numChannels,
460 self.shape_dc_Buffer = (self.m_SystemHeader.numChannels,
451 self.m_ProcessingHeader.numHeights)
461 self.m_ProcessingHeader.numHeights)
452
462
453
463
454 def writeBlock(self):
464 def writeBlock(self):
455 """
465 """
456 Escribe el buffer en el file designado
466 Escribe el buffer en el file designado
457
467
458 Affected:
468 Affected:
459 self.data_spc
469 self.data_spc
460 self.data_cspc
470 self.data_cspc
461 self.data_dc
471 self.data_dc
462 self.flagIsNewFile
472 self.flagIsNewFile
463 self.flagIsNewBlock
473 self.flagIsNewBlock
464 self.nTotalBlocks
474 self.nTotalBlocks
465 self.nWriteBlocks
475 self.nWriteBlocks
466
476
467 Return: None
477 Return: None
468 """
478 """
469
479
470 spc = numpy.transpose( self.data_spc, (0,2,1) )
480 spc = numpy.transpose( self.data_spc, (0,2,1) )
471 if not( self.m_ProcessingHeader.shif_fft ):
481 if not( self.m_ProcessingHeader.shif_fft ):
472 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
482 spc = numpy.roll( spc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
473 data = spc.reshape((-1))
483 data = spc.reshape((-1))
474 data.tofile(self.fp)
484 data.tofile(self.fp)
475
485
476 if self.data_cspc != None:
486 if self.data_cspc != None:
477 data = numpy.zeros( self.shape_cspc_Buffer, self.dataType )
487 data = numpy.zeros( self.shape_cspc_Buffer, self.dataType )
478 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
488 cspc = numpy.transpose( self.data_cspc, (0,2,1) )
479 if not( self.m_ProcessingHeader.shif_fft ):
489 if not( self.m_ProcessingHeader.shif_fft ):
480 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
490 cspc = numpy.roll( cspc, self.m_ProcessingHeader.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones
481 data['real'] = cspc.real
491 data['real'] = cspc.real
482 data['imag'] = cspc.imag
492 data['imag'] = cspc.imag
483 data = data.reshape((-1))
493 data = data.reshape((-1))
484 data.tofile(self.fp)
494 data.tofile(self.fp)
485
495
486 data = numpy.zeros( self.shape_dc_Buffer, self.dataType )
496 data = numpy.zeros( self.shape_dc_Buffer, self.dataType )
487 dc = self.data_dc
497 dc = self.data_dc
488 data['real'] = dc.real
498 data['real'] = dc.real
489 data['imag'] = dc.imag
499 data['imag'] = dc.imag
490 data = data.reshape((-1))
500 data = data.reshape((-1))
491 data.tofile(self.fp)
501 data.tofile(self.fp)
492
502
493 self.data_spc.fill(0)
503 self.data_spc.fill(0)
494 self.data_dc.fill(0)
504 self.data_dc.fill(0)
495 if self.data_cspc != None:
505 if self.data_cspc != None:
496 self.data_cspc.fill(0)
506 self.data_cspc.fill(0)
497
507
498 self.flagIsNewFile = 0
508 self.flagIsNewFile = 0
499 self.flagIsNewBlock = 1
509 self.flagIsNewBlock = 1
500 self.nTotalBlocks += 1
510 self.nTotalBlocks += 1
501 self.nWriteBlocks += 1
511 self.nWriteBlocks += 1
502
512
503
513
504 def putData(self):
514 def putData(self):
505 """
515 """
506 Setea un bloque de datos y luego los escribe en un file
516 Setea un bloque de datos y luego los escribe en un file
507
517
508 Affected:
518 Affected:
509 self.data_spc
519 self.data_spc
510 self.data_cspc
520 self.data_cspc
511 self.data_dc
521 self.data_dc
512
522
513 Return:
523 Return:
514 0 : Si no hay data o no hay mas files que puedan escribirse
524 0 : Si no hay data o no hay mas files que puedan escribirse
515 1 : Si se escribio la data de un bloque en un file
525 1 : Si se escribio la data de un bloque en un file
516 """
526 """
517 self.flagIsNewBlock = 0
527 self.flagIsNewBlock = 0
518
528
519 if self.m_DataObj.flagNoData:
529 if self.m_DataObj.flagNoData:
520 return 0
530 return 0
521
531
522 if self.m_DataObj.flagResetProcessing:
532 if self.m_DataObj.flagResetProcessing:
523 self.data_spc.fill(0)
533 self.data_spc.fill(0)
524 self.data_cspc.fill(0)
534 self.data_cspc.fill(0)
525 self.data_dc.fill(0)
535 self.data_dc.fill(0)
526 self.setNextFile()
536 self.setNextFile()
527
537
528 self.data_spc = self.m_DataObj.data_spc
538 self.data_spc = self.m_DataObj.data_spc
529 self.data_cspc = self.m_DataObj.data_cspc
539 self.data_cspc = self.m_DataObj.data_cspc
530 self.data_dc = self.m_DataObj.data_dc
540 self.data_dc = self.m_DataObj.data_dc
531
541
532 # #self.m_ProcessingHeader.dataBlocksPerFile)
542 # #self.m_ProcessingHeader.dataBlocksPerFile)
533 if self.hasAllDataInBuffer():
543 if self.hasAllDataInBuffer():
534 self.getDataHeader()
544 self.getDataHeader()
535 self.writeNextBlock()
545 self.writeNextBlock()
536
546
537 if self.flagNoMoreFiles:
547 if self.flagNoMoreFiles:
538 #print 'Process finished'
548 #print 'Process finished'
539 return 0
549 return 0
540
550
541 return 1 No newline at end of file
551 return 1
@@ -1,482 +1,486
1 '''
1 '''
2 Created on 23/01/2012
2 Created on 23/01/2012
3
3
4 @author $Author: vsarmiento $
4 @author $Author: vsarmiento $
5 @version $Id: HeaderIO.py 37 2012-03-26 22:55:13Z vsarmiento $
5 @version $Id: HeaderIO.py 37 2012-03-26 22:55:13Z vsarmiento $
6 '''
6 '''
7
7
8 import numpy
8 import numpy
9 import copy
9 import copy
10
10
11 class Header:
11 class Header:
12
12
13 def __init__(self):
13 def __init__(self):
14 raise
14 raise
15
15
16 def copy(self):
16 def copy(self):
17 return copy.deepcopy(self)
17 return copy.deepcopy(self)
18
18
19 def read():
19 def read():
20 pass
20 pass
21
21
22 def write():
22 def write():
23 pass
23 pass
24
24
25 class BasicHeader(Header):
25 class BasicHeader(Header):
26
26
27 size = None
27 size = None
28 version = None
28 version = None
29 dataBlock = None
29 dataBlock = None
30 utc = None
30 utc = None
31 miliSecond = None
31 miliSecond = None
32 timeZone = None
32 timeZone = None
33 dstFlag = None
33 dstFlag = None
34 errorCount = None
34 errorCount = None
35 struct = None
35 struct = None
36
36
37 def __init__(self):
37 def __init__(self):
38 self.size = 0
38 self.size = 0
39 self.version = 0
39 self.version = 0
40 self.dataBlock = 0
40 self.dataBlock = 0
41 self.utc = 0
41 self.utc = 0
42 self.miliSecond = 0
42 self.miliSecond = 0
43 self.timeZone = 0
43 self.timeZone = 0
44 self.dstFlag = 0
44 self.dstFlag = 0
45 self.errorCount = 0
45 self.errorCount = 0
46 self.struct = numpy.dtype([
46 self.struct = numpy.dtype([
47 ('nSize','<u4'),
47 ('nSize','<u4'),
48 ('nVersion','<u2'),
48 ('nVersion','<u2'),
49 ('nDataBlockId','<u4'),
49 ('nDataBlockId','<u4'),
50 ('nUtime','<u4'),
50 ('nUtime','<u4'),
51 ('nMilsec','<u2'),
51 ('nMilsec','<u2'),
52 ('nTimezone','<i2'),
52 ('nTimezone','<i2'),
53 ('nDstflag','<i2'),
53 ('nDstflag','<i2'),
54 ('nErrorCount','<u4')
54 ('nErrorCount','<u4')
55 ])
55 ])
56
56
57
57
58 def read(self, fp):
58 def read(self, fp):
59 try:
59 try:
60 header = numpy.fromfile(fp, self.struct,1)
60 header = numpy.fromfile(fp, self.struct,1)
61 self.size = header['nSize'][0]
61 self.size = header['nSize'][0]
62 self.version = header['nVersion'][0]
62 self.version = header['nVersion'][0]
63 self.dataBlock = header['nDataBlockId'][0]
63 self.dataBlock = header['nDataBlockId'][0]
64 self.utc = header['nUtime'][0]
64 self.utc = header['nUtime'][0]
65 self.miliSecond = header['nMilsec'][0]
65 self.miliSecond = header['nMilsec'][0]
66 self.timeZone = header['nTimezone'][0]
66 self.timeZone = header['nTimezone'][0]
67 self.dstFlag = header['nDstflag'][0]
67 self.dstFlag = header['nDstflag'][0]
68 self.errorCount = header['nErrorCount'][0]
68 self.errorCount = header['nErrorCount'][0]
69 except:
69 except:
70 return 0
70 return 0
71
71
72 return 1
72 return 1
73
73
74 def write(self, fp):
74 def write(self, fp):
75 headerTuple = (self.size,self.version,self.dataBlock,self.utc,self.miliSecond,self.timeZone,self.dstFlag,self.errorCount)
75 headerTuple = (self.size,self.version,self.dataBlock,self.utc,self.miliSecond,self.timeZone,self.dstFlag,self.errorCount)
76 header = numpy.array(headerTuple,self.struct)
76 header = numpy.array(headerTuple,self.struct)
77 header.tofile(fp)
77 header.tofile(fp)
78
78
79 return 1
79 return 1
80
80
81 class SystemHeader(Header):
81 class SystemHeader(Header):
82
82
83 size = None
83 size = None
84 numSamples = None
84 numSamples = None
85 numProfiles = None
85 numProfiles = None
86 numChannels = None
86 numChannels = None
87 adcResolution = None
87 adcResolution = None
88 pciDioBusWidth = None
88 pciDioBusWidth = None
89 struct = None
89 struct = None
90
90
91 def __init__(self):
91 def __init__(self):
92 self.size = 0
92 self.size = 0
93 self.numSamples = 0
93 self.numSamples = 0
94 self.numProfiles = 0
94 self.numProfiles = 0
95 self.numChannels = 0
95 self.numChannels = 0
96 self.adcResolution = 0
96 self.adcResolution = 0
97 self.pciDioBusWidth = 0
97 self.pciDioBusWidth = 0
98 self.struct = numpy.dtype([
98 self.struct = numpy.dtype([
99 ('nSize','<u4'),
99 ('nSize','<u4'),
100 ('nNumSamples','<u4'),
100 ('nNumSamples','<u4'),
101 ('nNumProfiles','<u4'),
101 ('nNumProfiles','<u4'),
102 ('nNumChannels','<u4'),
102 ('nNumChannels','<u4'),
103 ('nADCResolution','<u4'),
103 ('nADCResolution','<u4'),
104 ('nPCDIOBusWidth','<u4'),
104 ('nPCDIOBusWidth','<u4'),
105 ])
105 ])
106
106
107
107
108 def read(self, fp):
108 def read(self, fp):
109 try:
109 try:
110 header = numpy.fromfile(fp,self.struct,1)
110 header = numpy.fromfile(fp,self.struct,1)
111 self.size = header['nSize'][0]
111 self.size = header['nSize'][0]
112 self.numSamples = header['nNumSamples'][0]
112 self.numSamples = header['nNumSamples'][0]
113 self.numProfiles = header['nNumProfiles'][0]
113 self.numProfiles = header['nNumProfiles'][0]
114 self.numChannels = header['nNumChannels'][0]
114 self.numChannels = header['nNumChannels'][0]
115 self.adcResolution = header['nADCResolution'][0]
115 self.adcResolution = header['nADCResolution'][0]
116 self.pciDioBusWidth = header['nPCDIOBusWidth'][0]
116 self.pciDioBusWidth = header['nPCDIOBusWidth'][0]
117 except:
117 except:
118 return 0
118 return 0
119
119
120 return 1
120 return 1
121
121
122 def write(self, fp):
122 def write(self, fp):
123 headerTuple = (self.size,self.numSamples,self.numProfiles,self.numChannels,self.adcResolution,self.pciDioBusWidth)
123 headerTuple = (self.size,self.numSamples,self.numProfiles,self.numChannels,self.adcResolution,self.pciDioBusWidth)
124 header = numpy.array(headerTuple,self.struct)
124 header = numpy.array(headerTuple,self.struct)
125 header.tofile(fp)
125 header.tofile(fp)
126
126
127 return 1
127 return 1
128
128
129 class RadarControllerHeader(Header):
129 class RadarControllerHeader(Header):
130
130
131 size = None
131 size = None
132 expType = None
132 expType = None
133 nTx = None
133 nTx = None
134 ipp = None
134 ipp = None
135 txA = None
135 txA = None
136 txB = None
136 txB = None
137 numWindows = None
137 numWindows = None
138 numTaus = None
138 numTaus = None
139 codeType = None
139 codeType = None
140 line6Function = None
140 line6Function = None
141 line5Function = None
141 line5Function = None
142 fClock = None
142 fClock = None
143 prePulseBefore = None
143 prePulseBefore = None
144 prePulserAfter = None
144 prePulserAfter = None
145 rangeIpp = None
145 rangeIpp = None
146 rangeTxA = None
146 rangeTxA = None
147 rangeTxB = None
147 rangeTxB = None
148 struct = None
148 struct = None
149
149
150 def __init__(self):
150 def __init__(self):
151 self.size = 0
151 self.size = 0
152 self.expType = 0
152 self.expType = 0
153 self.nTx = 0
153 self.nTx = 0
154 self.ipp = 0
154 self.ipp = 0
155 self.txA = 0
155 self.txA = 0
156 self.txB = 0
156 self.txB = 0
157 self.numWindows = 0
157 self.numWindows = 0
158 self.numTaus = 0
158 self.numTaus = 0
159 self.codeType = 0
159 self.codeType = 0
160 self.line6Function = 0
160 self.line6Function = 0
161 self.line5Function = 0
161 self.line5Function = 0
162 self.fClock = 0
162 self.fClock = 0
163 self.prePulseBefore = 0
163 self.prePulseBefore = 0
164 self.prePulserAfter = 0
164 self.prePulserAfter = 0
165 self.rangeIpp = 0
165 self.rangeIpp = 0
166 self.rangeTxA = 0
166 self.rangeTxA = 0
167 self.rangeTxB = 0
167 self.rangeTxB = 0
168 self.struct = numpy.dtype([
168 self.struct = numpy.dtype([
169 ('nSize','<u4'),
169 ('nSize','<u4'),
170 ('nExpType','<u4'),
170 ('nExpType','<u4'),
171 ('nNTx','<u4'),
171 ('nNTx','<u4'),
172 ('fIpp','<f4'),
172 ('fIpp','<f4'),
173 ('fTxA','<f4'),
173 ('fTxA','<f4'),
174 ('fTxB','<f4'),
174 ('fTxB','<f4'),
175 ('nNumWindows','<u4'),
175 ('nNumWindows','<u4'),
176 ('nNumTaus','<u4'),
176 ('nNumTaus','<u4'),
177 ('nCodeType','<u4'),
177 ('nCodeType','<u4'),
178 ('nLine6Function','<u4'),
178 ('nLine6Function','<u4'),
179 ('nLine5Function','<u4'),
179 ('nLine5Function','<u4'),
180 ('fClock','<f4'),
180 ('fClock','<f4'),
181 ('nPrePulseBefore','<u4'),
181 ('nPrePulseBefore','<u4'),
182 ('nPrePulseAfter','<u4'),
182 ('nPrePulseAfter','<u4'),
183 ('sRangeIPP','<a20'),
183 ('sRangeIPP','<a20'),
184 ('sRangeTxA','<a20'),
184 ('sRangeTxA','<a20'),
185 ('sRangeTxB','<a20'),
185 ('sRangeTxB','<a20'),
186 ])
186 ])
187
187
188 self.samplingWindowStruct = numpy.dtype([('h0','<f4'),('dh','<f4'),('nsa','<u4')])
188 self.samplingWindowStruct = numpy.dtype([('h0','<f4'),('dh','<f4'),('nsa','<u4')])
189
189
190 self.samplingWindow = None
190 self.samplingWindow = None
191 self.numHeights = None
191 self.numHeights = None
192 self.firstHeight = None
192 self.firstHeight = None
193 self.deltaHeight = None
193 self.deltaHeight = None
194 self.samplesWin = None
194 self.samplesWin = None
195
195
196 self.numCode = None
196 self.numCode = None
197 self.numBaud = None
197 self.numBaud = None
198 self.code = None
198 self.code = None
199 self.flip1 = None
199 self.flip1 = None
200 self.flip2 = None
200 self.flip2 = None
201
201
202 self.dynamic = numpy.array([],numpy.dtype('byte'))
202 self.dynamic = numpy.array([],numpy.dtype('byte'))
203
203
204
204
205 def read(self, fp):
205 def read(self, fp):
206 try:
206 try:
207 startFp = fp.tell()
207 startFp = fp.tell()
208 header = numpy.fromfile(fp,self.struct,1)
208 header = numpy.fromfile(fp,self.struct,1)
209 self.size = header['nSize'][0]
209 self.size = header['nSize'][0]
210 self.expType = header['nExpType'][0]
210 self.expType = header['nExpType'][0]
211 self.nTx = header['nNTx'][0]
211 self.nTx = header['nNTx'][0]
212 self.ipp = header['fIpp'][0]
212 self.ipp = header['fIpp'][0]
213 self.txA = header['fTxA'][0]
213 self.txA = header['fTxA'][0]
214 self.txB = header['fTxB'][0]
214 self.txB = header['fTxB'][0]
215 self.numWindows = header['nNumWindows'][0]
215 self.numWindows = header['nNumWindows'][0]
216 self.numTaus = header['nNumTaus'][0]
216 self.numTaus = header['nNumTaus'][0]
217 self.codeType = header['nCodeType'][0]
217 self.codeType = header['nCodeType'][0]
218 self.line6Function = header['nLine6Function'][0]
218 self.line6Function = header['nLine6Function'][0]
219 self.line5Function = header['nLine5Function'][0]
219 self.line5Function = header['nLine5Function'][0]
220 self.fClock = header['fClock'][0]
220 self.fClock = header['fClock'][0]
221 self.prePulseBefore = header['nPrePulseBefore'][0]
221 self.prePulseBefore = header['nPrePulseBefore'][0]
222 self.prePulserAfter = header['nPrePulseAfter'][0]
222 self.prePulserAfter = header['nPrePulseAfter'][0]
223 self.rangeIpp = header['sRangeIPP'][0]
223 self.rangeIpp = header['sRangeIPP'][0]
224 self.rangeTxA = header['sRangeTxA'][0]
224 self.rangeTxA = header['sRangeTxA'][0]
225 self.rangeTxB = header['sRangeTxB'][0]
225 self.rangeTxB = header['sRangeTxB'][0]
226 # jump Dynamic Radar Controller Header
226 # jump Dynamic Radar Controller Header
227 jumpFp = self.size - 116
227 jumpFp = self.size - 116
228 self.dynamic = numpy.fromfile(fp,numpy.dtype('byte'),jumpFp)
228 self.dynamic = numpy.fromfile(fp,numpy.dtype('byte'),jumpFp)
229 #pointer backward to dynamic header and read
229 #pointer backward to dynamic header and read
230 backFp = fp.tell() - jumpFp
230 backFp = fp.tell() - jumpFp
231 fp.seek(backFp)
231 fp.seek(backFp)
232
232
233 self.samplingWindow = numpy.fromfile(fp,self.samplingWindowStruct,self.numWindows)
233 self.samplingWindow = numpy.fromfile(fp,self.samplingWindowStruct,self.numWindows)
234 self.numHeights = numpy.sum(self.samplingWindow['nsa'])
234 self.numHeights = numpy.sum(self.samplingWindow['nsa'])
235 self.firstHeight = self.samplingWindow['h0']
235 self.firstHeight = self.samplingWindow['h0']
236 self.deltaHeight = self.samplingWindow['dh']
236 self.deltaHeight = self.samplingWindow['dh']
237 self.samplesWin = self.samplingWindow['nsa']
237 self.samplesWin = self.samplingWindow['nsa']
238
238
239 self.Taus = numpy.fromfile(fp,'<f4',self.numTaus)
239 self.Taus = numpy.fromfile(fp,'<f4',self.numTaus)
240
240
241 if self.codeType != 0:
241 if self.codeType != 0:
242 self.numCode = numpy.fromfile(fp,'<u4',1)
242 self.numCode = numpy.fromfile(fp,'<u4',1)
243 self.numBaud = numpy.fromfile(fp,'<u4',1)
243 self.numBaud = numpy.fromfile(fp,'<u4',1)
244 self.code = numpy.empty([self.numCode,self.numBaud],dtype='u1')
244 self.code = numpy.empty([self.numCode,self.numBaud],dtype='u1')
245 tempList = []
245 tempList = []
246 for ic in range(self.numCode):
246 for ic in range(self.numCode):
247 temp = numpy.fromfile(fp,'u1',4*numpy.ceil(self.numBaud/32.))
247 temp = numpy.fromfile(fp,'u1',4*numpy.ceil(self.numBaud/32.))
248 tempList.append(temp)
248 tempList.append(temp)
249 self.code[ic] = numpy.unpackbits(temp[::-1])[-1*self.numBaud:]
249 self.code[ic] = numpy.unpackbits(temp[::-1])[-1*self.numBaud:]
250 self.code = 2.0*self.code - 1.0
250 self.code = 2.0*self.code - 1.0
251
251
252 if self.line5Function == RCfunction.FLIP:
252 if self.line5Function == RCfunction.FLIP:
253 self.flip1 = numpy.fromfile(fp,'<u4',1)
253 self.flip1 = numpy.fromfile(fp,'<u4',1)
254
254
255 if self.line6Function == RCfunction.FLIP:
255 if self.line6Function == RCfunction.FLIP:
256 self.flip2 = numpy.fromfile(fp,'<u4',1)
256 self.flip2 = numpy.fromfile(fp,'<u4',1)
257
257
258 endFp = self.size + startFp
258 endFp = self.size + startFp
259 jumpFp = endFp - fp.tell()
259 jumpFp = endFp - fp.tell()
260 if jumpFp > 0:
260 if jumpFp > 0:
261 fp.seek(jumpFp)
261 fp.seek(jumpFp)
262
262
263 except:
263 except:
264 return 0
264 return 0
265
265
266 return 1
266 return 1
267
267
268 def write(self, fp):
268 def write(self, fp):
269 headerTuple = (self.size,
269 headerTuple = (self.size,
270 self.expType,
270 self.expType,
271 self.nTx,
271 self.nTx,
272 self.ipp,
272 self.ipp,
273 self.txA,
273 self.txA,
274 self.txB,
274 self.txB,
275 self.numWindows,
275 self.numWindows,
276 self.numTaus,
276 self.numTaus,
277 self.codeType,
277 self.codeType,
278 self.line6Function,
278 self.line6Function,
279 self.line5Function,
279 self.line5Function,
280 self.fClock,
280 self.fClock,
281 self.prePulseBefore,
281 self.prePulseBefore,
282 self.prePulserAfter,
282 self.prePulserAfter,
283 self.rangeIpp,
283 self.rangeIpp,
284 self.rangeTxA,
284 self.rangeTxA,
285 self.rangeTxB)
285 self.rangeTxB)
286
286
287 header = numpy.array(headerTuple,self.struct)
287 header = numpy.array(headerTuple,self.struct)
288 header.tofile(fp)
288 header.tofile(fp)
289
289
290 dynamic = self.dynamic
290 dynamic = self.dynamic
291 dynamic.tofile(fp)
291 dynamic.tofile(fp)
292
292
293 return 1
293 return 1
294
294
295
295
296
296
297 class ProcessingHeader(Header):
297 class ProcessingHeader(Header):
298
298
299 size = None
299 size = None
300 dataType = None
300 dataType = None
301 blockSize = None
301 blockSize = None
302 profilesPerBlock = None
302 profilesPerBlock = None
303 dataBlocksPerFile = None
303 dataBlocksPerFile = None
304 numWindows = None
304 numWindows = None
305 processFlags = None
305 processFlags = None
306 coherentInt = None
306 coherentInt = None
307 incoherentInt = None
307 incoherentInt = None
308 totalSpectra = None
308 totalSpectra = None
309 struct = None
309 struct = None
310
310
311 def __init__(self):
311 def __init__(self):
312 self.size = 0
312 self.size = 0
313 self.dataType = 0
313 self.dataType = 0
314 self.blockSize = 0
314 self.blockSize = 0
315 self.profilesPerBlock = 0
315 self.profilesPerBlock = 0
316 self.dataBlocksPerFile = 0
316 self.dataBlocksPerFile = 0
317 self.numWindows = 0
317 self.numWindows = 0
318 self.processFlags = 0
318 self.processFlags = 0
319 self.coherentInt = 0
319 self.coherentInt = 0
320 self.incoherentInt = 0
320 self.incoherentInt = 0
321 self.totalSpectra = 0
321 self.totalSpectra = 0
322 self.struct = numpy.dtype([
322 self.struct = numpy.dtype([
323 ('nSize','<u4'),
323 ('nSize','<u4'),
324 ('nDataType','<u4'),
324 ('nDataType','<u4'),
325 ('nSizeOfDataBlock','<u4'),
325 ('nSizeOfDataBlock','<u4'),
326 ('nProfilesperBlock','<u4'),
326 ('nProfilesperBlock','<u4'),
327 ('nDataBlocksperFile','<u4'),
327 ('nDataBlocksperFile','<u4'),
328 ('nNumWindows','<u4'),
328 ('nNumWindows','<u4'),
329 ('nProcessFlags','<u4'),
329 ('nProcessFlags','<u4'),
330 ('nCoherentIntegrations','<u4'),
330 ('nCoherentIntegrations','<u4'),
331 ('nIncoherentIntegrations','<u4'),
331 ('nIncoherentIntegrations','<u4'),
332 ('nTotalSpectra','<u4')
332 ('nTotalSpectra','<u4')
333 ])
333 ])
334 self.samplingWindow = 0
334 self.samplingWindow = 0
335 self.structSamplingWindow = numpy.dtype([('h0','<f4'),('dh','<f4'),('nsa','<u4')])
335 self.structSamplingWindow = numpy.dtype([('h0','<f4'),('dh','<f4'),('nsa','<u4')])
336 self.numHeights = 0
336 self.numHeights = 0
337 self.firstHeight = 0
337 self.firstHeight = 0
338 self.deltaHeight = 0
338 self.deltaHeight = 0
339 self.samplesWin = 0
339 self.samplesWin = 0
340 self.spectraComb = 0
340 self.spectraComb = 0
341 self.numCode = 0
341 self.numCode = 0
342 self.code = 0
342 self.code = 0
343 self.numBaud = 0
343 self.numBaud = 0
344 self.shif_fft = False
344 self.shif_fft = False
345 self.flag_dc = False
345
346
346 def read(self, fp):
347 def read(self, fp):
347 try:
348 try:
348 header = numpy.fromfile(fp,self.struct,1)
349 header = numpy.fromfile(fp,self.struct,1)
349 self.size = header['nSize'][0]
350 self.size = header['nSize'][0]
350 self.dataType = header['nDataType'][0]
351 self.dataType = header['nDataType'][0]
351 self.blockSize = header['nSizeOfDataBlock'][0]
352 self.blockSize = header['nSizeOfDataBlock'][0]
352 self.profilesPerBlock = header['nProfilesperBlock'][0]
353 self.profilesPerBlock = header['nProfilesperBlock'][0]
353 self.dataBlocksPerFile = header['nDataBlocksperFile'][0]
354 self.dataBlocksPerFile = header['nDataBlocksperFile'][0]
354 self.numWindows = header['nNumWindows'][0]
355 self.numWindows = header['nNumWindows'][0]
355 self.processFlags = header['nProcessFlags']
356 self.processFlags = header['nProcessFlags']
356 self.coherentInt = header['nCoherentIntegrations'][0]
357 self.coherentInt = header['nCoherentIntegrations'][0]
357 self.incoherentInt = header['nIncoherentIntegrations'][0]
358 self.incoherentInt = header['nIncoherentIntegrations'][0]
358 self.totalSpectra = header['nTotalSpectra'][0]
359 self.totalSpectra = header['nTotalSpectra'][0]
359 self.samplingWindow = numpy.fromfile(fp,self.structSamplingWindow,self.numWindows)
360 self.samplingWindow = numpy.fromfile(fp,self.structSamplingWindow,self.numWindows)
360 self.numHeights = numpy.sum(self.samplingWindow['nsa'])
361 self.numHeights = numpy.sum(self.samplingWindow['nsa'])
361 self.firstHeight = self.samplingWindow['h0']
362 self.firstHeight = self.samplingWindow['h0']
362 self.deltaHeight = self.samplingWindow['dh']
363 self.deltaHeight = self.samplingWindow['dh']
363 self.samplesWin = self.samplingWindow['nsa']
364 self.samplesWin = self.samplingWindow['nsa']
364 self.spectraComb = numpy.fromfile(fp,'u1',2*self.totalSpectra)
365 self.spectraComb = numpy.fromfile(fp,'u1',2*self.totalSpectra)
365
366
366 if self.processFlags & PROCFLAG.DEFINE_PROCESS_CODE == PROCFLAG.DEFINE_PROCESS_CODE:
367 if ((self.processFlags & PROCFLAG.DEFINE_PROCESS_CODE) == PROCFLAG.DEFINE_PROCESS_CODE):
367 self.numCode = numpy.fromfile(fp,'<u4',1)
368 self.numCode = numpy.fromfile(fp,'<u4',1)
368 self.numBaud = numpy.fromfile(fp,'<u4',1)
369 self.numBaud = numpy.fromfile(fp,'<u4',1)
369 self.code = numpy.fromfile(fp,'<f4',self.numCode*self.numBaud).reshape(self.numBaud,self.numCode)
370 self.code = numpy.fromfile(fp,'<f4',self.numCode*self.numBaud).reshape(self.numBaud,self.numCode)
370
371
371 if self.processFlags & PROCFLAG.SHIFT_FFT_DATA == PROCFLAG.SHIFT_FFT_DATA:
372 if ((self.processFlags & PROCFLAG.SHIFT_FFT_DATA) == PROCFLAG.SHIFT_FFT_DATA):
372 self.shif_fft = True
373 self.shif_fft = True
373 else:
374 else:
374 self.shif_fft = False
375 self.shif_fft = False
376
377 if ((self.processFlags & PROCFLAG.SAVE_CHANNELS_DC) == PROCFLAG.SAVE_CHANNELS_DC):
378 self.flag_dc = True
375 except:
379 except:
376 return 0
380 return 0
377
381
378 return 1
382 return 1
379
383
380 def write(self, fp):
384 def write(self, fp):
381 headerTuple = (self.size,
385 headerTuple = (self.size,
382 self.dataType,
386 self.dataType,
383 self.blockSize,
387 self.blockSize,
384 self.profilesPerBlock,
388 self.profilesPerBlock,
385 self.dataBlocksPerFile,
389 self.dataBlocksPerFile,
386 self.numWindows,
390 self.numWindows,
387 self.processFlags,
391 self.processFlags,
388 self.coherentInt,
392 self.coherentInt,
389 self.incoherentInt,
393 self.incoherentInt,
390 self.totalSpectra)
394 self.totalSpectra)
391
395
392 header = numpy.array(headerTuple,self.struct)
396 header = numpy.array(headerTuple,self.struct)
393 header.tofile(fp)
397 header.tofile(fp)
394
398
395 if self.numWindows != 0:
399 if self.numWindows != 0:
396 sampleWindowTuple = (self.firstHeight,self.deltaHeight,self.samplesWin)
400 sampleWindowTuple = (self.firstHeight,self.deltaHeight,self.samplesWin)
397 samplingWindow = numpy.array(sampleWindowTuple,self.structSamplingWindow)
401 samplingWindow = numpy.array(sampleWindowTuple,self.structSamplingWindow)
398 samplingWindow.tofile(fp)
402 samplingWindow.tofile(fp)
399
403
400
404
401 if self.totalSpectra != 0:
405 if self.totalSpectra != 0:
402 spectraComb = numpy.array([],numpy.dtype('u1'))
406 spectraComb = numpy.array([],numpy.dtype('u1'))
403 spectraComb = self.spectraComb
407 spectraComb = self.spectraComb
404 spectraComb.tofile(fp)
408 spectraComb.tofile(fp)
405
409
406
410
407 if self.processFlags & PROCFLAG.DEFINE_PROCESS_CODE == PROCFLAG.DEFINE_PROCESS_CODE:
411 if self.processFlags & PROCFLAG.DEFINE_PROCESS_CODE == PROCFLAG.DEFINE_PROCESS_CODE:
408 numCode = self.numCode
412 numCode = self.numCode
409 numCode.tofile(fp)
413 numCode.tofile(fp)
410
414
411 numBaud = self.numBaud
415 numBaud = self.numBaud
412 numBaud.tofile(fp)
416 numBaud.tofile(fp)
413
417
414 code = self.code.reshape(numCode*numBaud)
418 code = self.code.reshape(numCode*numBaud)
415 code.tofile(fp)
419 code.tofile(fp)
416
420
417 return 1
421 return 1
418
422
419 class RCfunction:
423 class RCfunction:
420 NONE=0
424 NONE=0
421 FLIP=1
425 FLIP=1
422 CODE=2
426 CODE=2
423 SAMPLING=3
427 SAMPLING=3
424 LIN6DIV256=4
428 LIN6DIV256=4
425 SYNCHRO=5
429 SYNCHRO=5
426
430
427 class nCodeType:
431 class nCodeType:
428 NONE=0
432 NONE=0
429 USERDEFINE=1
433 USERDEFINE=1
430 BARKER2=2
434 BARKER2=2
431 BARKER3=3
435 BARKER3=3
432 BARKER4=4
436 BARKER4=4
433 BARKER5=5
437 BARKER5=5
434 BARKER7=6
438 BARKER7=6
435 BARKER11=7
439 BARKER11=7
436 BARKER13=8
440 BARKER13=8
437 AC128=9
441 AC128=9
438 COMPLEMENTARYCODE2=10
442 COMPLEMENTARYCODE2=10
439 COMPLEMENTARYCODE4=11
443 COMPLEMENTARYCODE4=11
440 COMPLEMENTARYCODE8=12
444 COMPLEMENTARYCODE8=12
441 COMPLEMENTARYCODE16=13
445 COMPLEMENTARYCODE16=13
442 COMPLEMENTARYCODE32=14
446 COMPLEMENTARYCODE32=14
443 COMPLEMENTARYCODE64=15
447 COMPLEMENTARYCODE64=15
444 COMPLEMENTARYCODE128=16
448 COMPLEMENTARYCODE128=16
445 CODE_BINARY28=17
449 CODE_BINARY28=17
446
450
447 class PROCFLAG:
451 class PROCFLAG:
448 COHERENT_INTEGRATION = numpy.uint32(0x00000001)
452 COHERENT_INTEGRATION = numpy.uint32(0x00000001)
449 DECODE_DATA = numpy.uint32(0x00000002)
453 DECODE_DATA = numpy.uint32(0x00000002)
450 SPECTRA_CALC = numpy.uint32(0x00000004)
454 SPECTRA_CALC = numpy.uint32(0x00000004)
451 INCOHERENT_INTEGRATION = numpy.uint32(0x00000008)
455 INCOHERENT_INTEGRATION = numpy.uint32(0x00000008)
452 POST_COHERENT_INTEGRATION = numpy.uint32(0x00000010)
456 POST_COHERENT_INTEGRATION = numpy.uint32(0x00000010)
453 SHIFT_FFT_DATA = numpy.uint32(0x00000020)
457 SHIFT_FFT_DATA = numpy.uint32(0x00000020)
454
458
455 DATATYPE_CHAR = numpy.uint32(0x00000040)
459 DATATYPE_CHAR = numpy.uint32(0x00000040)
456 DATATYPE_SHORT = numpy.uint32(0x00000080)
460 DATATYPE_SHORT = numpy.uint32(0x00000080)
457 DATATYPE_LONG = numpy.uint32(0x00000100)
461 DATATYPE_LONG = numpy.uint32(0x00000100)
458 DATATYPE_INT64 = numpy.uint32(0x00000200)
462 DATATYPE_INT64 = numpy.uint32(0x00000200)
459 DATATYPE_FLOAT = numpy.uint32(0x00000400)
463 DATATYPE_FLOAT = numpy.uint32(0x00000400)
460 DATATYPE_DOUBLE = numpy.uint32(0x00000800)
464 DATATYPE_DOUBLE = numpy.uint32(0x00000800)
461
465
462 DATAARRANGE_CONTIGUOUS_CH = numpy.uint32(0x00001000)
466 DATAARRANGE_CONTIGUOUS_CH = numpy.uint32(0x00001000)
463 DATAARRANGE_CONTIGUOUS_H = numpy.uint32(0x00002000)
467 DATAARRANGE_CONTIGUOUS_H = numpy.uint32(0x00002000)
464 DATAARRANGE_CONTIGUOUS_P = numpy.uint32(0x00004000)
468 DATAARRANGE_CONTIGUOUS_P = numpy.uint32(0x00004000)
465
469
466 SAVE_CHANNELS_DC = numpy.uint32(0x00008000)
470 SAVE_CHANNELS_DC = numpy.uint32(0x00008000)
467 DEFLIP_DATA = numpy.uint32(0x00010000)
471 DEFLIP_DATA = numpy.uint32(0x00010000)
468 DEFINE_PROCESS_CODE = numpy.uint32(0x00020000)
472 DEFINE_PROCESS_CODE = numpy.uint32(0x00020000)
469
473
470 ACQ_SYS_NATALIA = numpy.uint32(0x00040000)
474 ACQ_SYS_NATALIA = numpy.uint32(0x00040000)
471 ACQ_SYS_ECHOTEK = numpy.uint32(0x00080000)
475 ACQ_SYS_ECHOTEK = numpy.uint32(0x00080000)
472 ACQ_SYS_ADRXD = numpy.uint32(0x000C0000)
476 ACQ_SYS_ADRXD = numpy.uint32(0x000C0000)
473 ACQ_SYS_JULIA = numpy.uint32(0x00100000)
477 ACQ_SYS_JULIA = numpy.uint32(0x00100000)
474 ACQ_SYS_XXXXXX = numpy.uint32(0x00140000)
478 ACQ_SYS_XXXXXX = numpy.uint32(0x00140000)
475
479
476 EXP_NAME_ESP = numpy.uint32(0x00200000)
480 EXP_NAME_ESP = numpy.uint32(0x00200000)
477 CHANNEL_NAMES_ESP = numpy.uint32(0x00400000)
481 CHANNEL_NAMES_ESP = numpy.uint32(0x00400000)
478
482
479 OPERATION_MASK = numpy.uint32(0x0000003F)
483 OPERATION_MASK = numpy.uint32(0x0000003F)
480 DATATYPE_MASK = numpy.uint32(0x00000FC0)
484 DATATYPE_MASK = numpy.uint32(0x00000FC0)
481 DATAARRANGE_MASK = numpy.uint32(0x00007000)
485 DATAARRANGE_MASK = numpy.uint32(0x00007000)
482 ACQ_SYS_MASK = numpy.uint32(0x001C0000) No newline at end of file
486 ACQ_SYS_MASK = numpy.uint32(0x001C0000)
General Comments 0
You need to be logged in to leave comments. Login now