##// END OF EJS Templates
Merge branch 'v3.0-devel' of http://jro-dev.igp.gob.pe/rhodecode/schain into v3.0-devel
Juan C. Espinoza -
r1323:133a5771abd8 merge
parent child
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -0,0 +1,87
1 import numpy
2 import sys
3 import zmq
4 import time
5 import h5py
6 import os
7
8 path="/home/alex/Downloads/pedestal"
9 ext=".hdf5"
10
11 port ="5556"
12 if len(sys.argv)>1:
13 port = sys.argv[1]
14 int(port)
15
16 if len(sys.argv)>2:
17 port1 = sys.argv[2]
18 int(port1)
19
20 #Socket to talk to server
21 context = zmq.Context()
22 socket = context.socket(zmq.SUB)
23
24 print("Collecting updates from weather server...")
25 socket.connect("tcp://localhost:%s"%port)
26
27 if len(sys.argv)>2:
28 socket.connect("tcp://localhost:%s"%port1)
29
30 #Subscribe to zipcode, default is NYC,10001
31 topicfilter = "10001"
32 socket.setsockopt_string(zmq.SUBSCRIBE,topicfilter)
33 #Process 5 updates
34 total_value=0
35 count= -1
36 azi= []
37 elev=[]
38 time0=[]
39 #for update_nbr in range(250):
40 while(True):
41 string= socket.recv()
42 topic,ang_elev,ang_elev_dec,ang_azi,ang_azi_dec,seconds,seconds_dec= string.split()
43 ang_azi =float(ang_azi)+1e-3*float(ang_azi_dec)
44 ang_elev =float(ang_elev)+1e-3*float(ang_elev_dec)
45 seconds =float(seconds) +1e-6*float(seconds_dec)
46 azi.append(ang_azi)
47 elev.append(ang_elev)
48 time0.append(seconds)
49 count +=1
50 if count == 100:
51 timetuple=time.localtime()
52 epoc = time.mktime(timetuple)
53 #print(epoc)
54 fullpath = path + ("/" if path[-1]!="/" else "")
55
56 if not os.path.exists(fullpath):
57 os.mkdir(fullpath)
58
59 azi_array = numpy.array(azi)
60 elev_array = numpy.array(elev)
61 time0_array= numpy.array(time0)
62 pedestal_array=numpy.array([azi,elev,time0])
63 count=0
64 azi= []
65 elev=[]
66 time0=[]
67 #print(pedestal_array[0])
68 #print(pedestal_array[1])
69
70 meta='PE'
71 filex="%s%4.4d%3.3d%10.4d%s"%(meta,timetuple.tm_year,timetuple.tm_yday,epoc,ext)
72 filename = os.path.join(fullpath,filex)
73 fp = h5py.File(filename,'w')
74 #print("Escribiendo HDF5...",epoc)
75 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· DataΒ·....Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
76 grp = fp.create_group("Data")
77 dset = grp.create_dataset("azimuth" , data=pedestal_array[0])
78 dset = grp.create_dataset("elevacion", data=pedestal_array[1])
79 dset = grp.create_dataset("utc" , data=pedestal_array[2])
80 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· MetadataΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
81 grp = fp.create_group("Metadata")
82 dset = grp.create_dataset("utctimeInit", data=pedestal_array[2][0])
83 timeInterval = pedestal_array[2][1]-pedestal_array[2][0]
84 dset = grp.create_dataset("timeInterval", data=timeInterval)
85 fp.close()
86
87 #print ("Average messagedata value for topic '%s' was %dF" % ( topicfilter,total_value / update_nbr))
@@ -0,0 +1,48
1 ###########################################################################
2 ############################### SERVIDOR###################################
3 ######################### SIMULADOR DE PEDESTAL############################
4 ###########################################################################
5 import time
6 import math
7 import numpy
8 import struct
9 from time import sleep
10 import zmq
11 import pickle
12 port="5556"
13 context = zmq.Context()
14 socket = context.socket(zmq.PUB)
15 socket.bind("tcp://*:%s"%port)
16 ###### PARAMETROS DE ENTRADA################################
17 print("PEDESTAL RESOLUCION 0.01")
18 print("MAXIMA VELOCIDAD DEL PEDESTAL")
19 ang_elev = 4.12
20 ang_azi = 30
21 velocidad= input ("Ingresa velocidad:")
22 velocidad= float(velocidad)
23 print (velocidad)
24 ############################################################
25 sleep(3)
26 print("Start program")
27 t1 = time.time()
28 count=0
29 while(True):
30 tmp_vuelta = int(360/velocidad)
31 t1=t1+tmp_vuelta*count
32 count= count+1
33 muestras_seg = 100
34 t2 = time.time()
35 for i in range(tmp_vuelta):
36 for j in range(muestras_seg):
37 tmp_variable = (i+j/100.0)
38 ang_azi = (tmp_variable)*float(velocidad)
39 seconds = t1+ tmp_variable
40 topic=10001
41 print ("AzimΒ°: ","%.4f"%ang_azi,"Time:" ,"%.5f"%seconds)
42 seconds_dec=(seconds-int(seconds))*1e6
43 ang_azi_dec= (ang_azi-int(ang_azi))*1e3
44 ang_elev_dec=(ang_elev-int(ang_elev))*1e3
45 sleep(0.0088)
46 socket.send_string("%d %d %d %d %d %d %d"%(topic,ang_elev,ang_elev_dec,ang_azi,ang_azi_dec,seconds,seconds_dec))
47 t3 = time.time()
48 print ("Total time for 1 vuelta in Seconds",t3-t2)
@@ -0,0 +1,82
1 import os, sys
2 import datetime
3 import time
4 from schainpy.controller import Project
5
6 desc = "USRP_test"
7 filename = "USRP_processing.xml"
8 controllerObj = Project()
9 controllerObj.setup(id = '191', name='Test_USRP', description=desc)
10
11 ############## USED TO PLOT IQ VOLTAGE, POWER AND SPECTRA #############
12 ######PATH DE LECTURA, ESCRITURA, GRAFICOS Y ENVIO WEB#################
13 path = '/home/alex/Downloads/test_rawdata'
14 figpath = '/home/alex/Downloads/hdf5_test'
15 ######################## UNIDAD DE LECTURA#############################
16 '''
17 readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader',
18 path=path,
19 startDate="2020/01/01", #"2020/01/01",#today,
20 endDate= "2020/12/01", #"2020/12/30",#today,
21 startTime='00:00:00',
22 endTime='23:59:59',
23 delay=0,
24 #set=0,
25 online=0,
26 walk=1)
27
28 '''
29 readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader',
30 frequency=9.345e9,
31 FixRCP_IPP= 60,
32 Tau_0 = 30,
33 AcqH0_0=0,
34 samples=330,
35 AcqDH_0=0.15,
36 FixRCP_TXA=0.15,
37 FixRCP_TXB=0.15,
38 Fdoppler=600.0,
39 Hdoppler=36,
40 Adoppler=300,#300
41 delay=0,
42 online=0,
43 walk=0,
44 profilesPerBlock=625,
45 dataBlocksPerFile=100)
46 #nTotalReadFiles=2)
47
48
49 #opObj11 = readUnitConfObj.addOperation(name='printInfo')
50
51 procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
52
53 procUnitConfObjB = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjA.getId())
54 procUnitConfObjB.addParameter(name='nFFTPoints', value=625, format='int')
55 procUnitConfObjB.addParameter(name='nProfiles', value=625, format='int')
56
57 opObj11 = procUnitConfObjB.addOperation(name='removeDC')
58 opObj11.addParameter(name='mode', value=2)
59 #opObj11 = procUnitConfObjB.addOperation(name='SpectraPlot')
60 #opObj11 = procUnitConfObjB.addOperation(name='PowerProfilePlot')
61
62 procUnitConfObjC= controllerObj.addProcUnit(datatype='ParametersProc',inputId=procUnitConfObjB.getId())
63 procUnitConfObjC.addOperation(name='SpectralMoments')
64 #opObj11 = procUnitConfObjC.addOperation(name='PowerPlot')
65
66 '''
67 opObj11 = procUnitConfObjC.addOperation(name='SpectralMomentsPlot')
68 #opObj11.addParameter(name='xmin', value=14)
69 #opObj11.addParameter(name='xmax', value=15)
70 #opObj11.addParameter(name='save', value=figpath)
71 opObj11.addParameter(name='showprofile', value=1)
72 #opObj11.addParameter(name='save_period', value=10)
73 '''
74
75 opObj10 = procUnitConfObjC.addOperation(name='ParameterWriter')
76 opObj10.addParameter(name='path',value=figpath)
77 #opObj10.addParameter(name='mode',value=0)
78 opObj10.addParameter(name='blocksPerFile',value='100',format='int')
79 opObj10.addParameter(name='metadataList',value='utctimeInit,timeInterval',format='list')
80 opObj10.addParameter(name='dataList',value='data_POW,data_DOP,data_WIDTH,data_SNR')#,format='list'
81
82 controllerObj.start()
@@ -0,0 +1,162
1 import os,numpy,h5py
2 from shutil import copyfile
3
4 def isNumber(str):
5 try:
6 float(str)
7 return True
8 except:
9 return False
10
11 def getfirstFilefromPath(path,meta,ext):
12 validFilelist = []
13 fileList = os.listdir(path)
14 if len(fileList)<1:
15 return None
16 # meta 1234 567 8-18 BCDE
17 # H,D,PE YYYY DDD EPOC .ext
18
19 for thisFile in fileList:
20 if meta =="PE":
21 try:
22 number= int(thisFile[len(meta)+7:len(meta)+17])
23 except:
24 print("There is a file or folder with different format")
25 if meta == "D":
26 try:
27 number= int(thisFile[8:11])
28 except:
29 print("There is a file or folder with different format")
30
31 if not isNumber(str=number):
32 continue
33 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
34 continue
35 validFilelist.sort()
36 validFilelist.append(thisFile)
37 if len(validFilelist)>0:
38 validFilelist = sorted(validFilelist,key=str.lower)
39 return validFilelist
40 return None
41
42 def gettimeutcfromDirFilename(path,file):
43 dir_file= path+"/"+file
44 fp = h5py.File(dir_file,'r')
45 epoc = fp['Metadata'].get('utctimeInit')[()]
46 fp.close()
47 return epoc
48
49 def getDatavaluefromDirFilename(path,file,value):
50 dir_file= path+"/"+file
51 fp = h5py.File(dir_file,'r')
52 array = fp['Data'].get(value)[()]
53 fp.close()
54 return array
55
56
57 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Velocidad de PedestalΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
58 w = input ("Ingresa velocidad de Pedestal: ")
59 w = 4
60 w = float(w)
61 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Resolucion minimo en gradosΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
62 alfa = input ("Ingresa resolucion minima en grados: ")
63 alfa = 1
64 alfa = float(alfa)
65 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· IPP del Experimento Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
66 IPP = input ("Ingresa el IPP del experimento: ")
67 IPP = 0.0004
68 IPP = float(IPP)
69 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· MODE Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
70 mode = input ("Ingresa el MODO del experimento T or F: ")
71 mode = "T"
72 mode = str(mode)
73
74 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Tiempo en generar la resolucion minΒ·Β·Β·
75 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· MCU Β·Β· var_ang = w * (var_tiempo)Β·Β·Β·
76 var_tiempo = alfa/w
77 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Tiempo Equivalente en perfilesΒ·Β·Β·Β·Β·Β·Β·Β·
78 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· var_tiempo = IPP * ( num_perfiles )Β·
79 num_perfiles = int(var_tiempo/IPP)
80
81 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·DATA PEDESTALΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
82 dir_pedestal = "/home/alex/Downloads/pedestal"
83 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· DATA ADQΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
84 if mode=="T":
85 dir_adq = "/home/alex/Downloads/hdf5_testPP/d2020194" # Time domain
86 else:
87 dir_adq = "/home/alex/Downloads/hdf5_test/d2020194" # Frequency domain
88
89 print( "Velocidad angular :", w)
90 print( "Resolucion minima en grados :", alfa)
91 print( "Numero de perfiles equivalente:", num_perfiles)
92 print( "Mode :", mode)
93
94 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· First FileΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
95 list_pedestal = getfirstFilefromPath(path=dir_pedestal,meta="PE",ext=".hdf5")
96 list_adq = getfirstFilefromPath(path=dir_adq ,meta="D",ext=".hdf5")
97
98 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· utc time Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
99 utc_pedestal= gettimeutcfromDirFilename(path=dir_pedestal,file=list_pedestal[0])
100 utc_adq = gettimeutcfromDirFilename(path=dir_adq ,file=list_adq[0])
101
102 print("utc_pedestal :",utc_pedestal)
103 print("utc_adq :",utc_adq)
104 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Relacion: utc_adq (+/-) var_tiempo*nro_file= utc_pedestal
105 time_Interval_p = 0.01
106 n_perfiles_p = 100
107 if utc_adq>utc_pedestal:
108 nro_file = int((int(utc_adq) - int(utc_pedestal))/(time_Interval_p*n_perfiles_p))
109 ff_pedestal = list_pedestal[nro_file]
110 utc_pedestal = gettimeutcfromDirFilename(path=dir_pedestal,file=ff_pedestal)
111 nro_key_p = int((utc_adq-utc_pedestal)/time_Interval_p)
112 if utc_adq >utc_pedestal:
113 ff_pedestal = ff_pedestal
114 else:
115 nro_file = nro_file-1
116 ff_pedestal = list_pedestal[nro_file]
117 angulo = getDatavaluefromDirFilename(path=dir_pedestal,file=ff_pedestal,value="azimuth")
118 nro_key_p = int((utc_adq-utc_pedestal)/time_Interval_p)
119 print("nro_file :",nro_file)
120 print("name_file :",ff_pedestal)
121 print("utc_pedestal_file :",utc_pedestal)
122 print("nro_key_p :",nro_key_p)
123 print("utc_pedestal_init :",utc_pedestal+nro_key_p*time_Interval_p)
124 print("angulo_array :",angulo[nro_key_p])
125 #4+25+25+25+21
126 #while True:
127 list_pedestal = getfirstFilefromPath(path=dir_pedestal,meta="PE",ext=".hdf5")
128 list_adq = getfirstFilefromPath(path=dir_adq ,meta="D",ext=".hdf5")
129
130 nro_file = nro_file #10
131 nro_key_perfil = nro_key_p
132 blocksPerFile = 100
133 wr_path = "/home/alex/Downloads/hdf5_wr/"
134 # Lectura de archivos de adquisicion para adicion de azimuth
135 for thisFile in range(len(list_adq)):
136 print("thisFileAdq",thisFile)
137 angulo_adq = numpy.zeros(blocksPerFile)
138 tmp = 0
139 for j in range(blocksPerFile):
140 iterador = nro_key_perfil + 25*(j-tmp)
141 if iterador < n_perfiles_p:
142 nro_file = nro_file
143 else:
144 nro_file = nro_file+1
145 tmp = j
146 iterador = nro_key_perfil
147 ff_pedestal = list_pedestal[nro_file]
148 angulo = getDatavaluefromDirFilename(path=dir_pedestal,file=ff_pedestal,value="azimuth")
149 angulo_adq[j]= angulo[iterador]
150 copyfile(dir_adq+"/"+list_adq[thisFile],wr_path+list_adq[thisFile])
151 fp = h5py.File(wr_path+list_adq[thisFile],'a')
152 grp = fp.create_group("Pedestal")
153 dset = grp.create_dataset("azimuth" , data=angulo_adq)
154 fp.close()
155 print("Angulo",angulo_adq)
156 print("Angulo",len(angulo_adq))
157 nro_key_perfil=iterador + 25
158 if nro_key_perfil< n_perfiles_p:
159 nro_file = nro_file
160 else:
161 nro_file = nro_file+1
162 nro_key_perfil= nro_key_p
@@ -1,1397 +1,1403
1 '''
1 '''
2
2
3 $Author: murco $
3 $Author: murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
4 $Id: JROData.py 173 2012-11-20 15:06:21Z murco $
5 '''
5 '''
6
6
7 import copy
7 import copy
8 import numpy
8 import numpy
9 import datetime
9 import datetime
10 import json
10 import json
11
11
12 import schainpy.admin
12 import schainpy.admin
13 from schainpy.utils import log
13 from schainpy.utils import log
14 from .jroheaderIO import SystemHeader, RadarControllerHeader
14 from .jroheaderIO import SystemHeader, RadarControllerHeader
15 from schainpy.model.data import _noise
15 from schainpy.model.data import _noise
16
16
17
17
18 def getNumpyDtype(dataTypeCode):
18 def getNumpyDtype(dataTypeCode):
19
19
20 if dataTypeCode == 0:
20 if dataTypeCode == 0:
21 numpyDtype = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
21 numpyDtype = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
22 elif dataTypeCode == 1:
22 elif dataTypeCode == 1:
23 numpyDtype = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
23 numpyDtype = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
24 elif dataTypeCode == 2:
24 elif dataTypeCode == 2:
25 numpyDtype = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
25 numpyDtype = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
26 elif dataTypeCode == 3:
26 elif dataTypeCode == 3:
27 numpyDtype = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
27 numpyDtype = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
28 elif dataTypeCode == 4:
28 elif dataTypeCode == 4:
29 numpyDtype = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
29 numpyDtype = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
30 elif dataTypeCode == 5:
30 elif dataTypeCode == 5:
31 numpyDtype = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
31 numpyDtype = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
32 else:
32 else:
33 raise ValueError('dataTypeCode was not defined')
33 raise ValueError('dataTypeCode was not defined')
34
34
35 return numpyDtype
35 return numpyDtype
36
36
37
37
38 def getDataTypeCode(numpyDtype):
38 def getDataTypeCode(numpyDtype):
39
39
40 if numpyDtype == numpy.dtype([('real', '<i1'), ('imag', '<i1')]):
40 if numpyDtype == numpy.dtype([('real', '<i1'), ('imag', '<i1')]):
41 datatype = 0
41 datatype = 0
42 elif numpyDtype == numpy.dtype([('real', '<i2'), ('imag', '<i2')]):
42 elif numpyDtype == numpy.dtype([('real', '<i2'), ('imag', '<i2')]):
43 datatype = 1
43 datatype = 1
44 elif numpyDtype == numpy.dtype([('real', '<i4'), ('imag', '<i4')]):
44 elif numpyDtype == numpy.dtype([('real', '<i4'), ('imag', '<i4')]):
45 datatype = 2
45 datatype = 2
46 elif numpyDtype == numpy.dtype([('real', '<i8'), ('imag', '<i8')]):
46 elif numpyDtype == numpy.dtype([('real', '<i8'), ('imag', '<i8')]):
47 datatype = 3
47 datatype = 3
48 elif numpyDtype == numpy.dtype([('real', '<f4'), ('imag', '<f4')]):
48 elif numpyDtype == numpy.dtype([('real', '<f4'), ('imag', '<f4')]):
49 datatype = 4
49 datatype = 4
50 elif numpyDtype == numpy.dtype([('real', '<f8'), ('imag', '<f8')]):
50 elif numpyDtype == numpy.dtype([('real', '<f8'), ('imag', '<f8')]):
51 datatype = 5
51 datatype = 5
52 else:
52 else:
53 datatype = None
53 datatype = None
54
54
55 return datatype
55 return datatype
56
56
57
57
58 def hildebrand_sekhon(data, navg):
58 def hildebrand_sekhon(data, navg):
59 """
59 """
60 This method is for the objective determination of the noise level in Doppler spectra. This
60 This method is for the objective determination of the noise level in Doppler spectra. This
61 implementation technique is based on the fact that the standard deviation of the spectral
61 implementation technique is based on the fact that the standard deviation of the spectral
62 densities is equal to the mean spectral density for white Gaussian noise
62 densities is equal to the mean spectral density for white Gaussian noise
63
63
64 Inputs:
64 Inputs:
65 Data : heights
65 Data : heights
66 navg : numbers of averages
66 navg : numbers of averages
67
67
68 Return:
68 Return:
69 mean : noise's level
69 mean : noise's level
70 """
70 """
71
71
72 sortdata = numpy.sort(data, axis=None)
72 sortdata = numpy.sort(data, axis=None)
73 '''
73 '''
74 lenOfData = len(sortdata)
74 lenOfData = len(sortdata)
75 nums_min = lenOfData*0.2
75 nums_min = lenOfData*0.2
76
76
77 if nums_min <= 5:
77 if nums_min <= 5:
78
78
79 nums_min = 5
79 nums_min = 5
80
80
81 sump = 0.
81 sump = 0.
82 sumq = 0.
82 sumq = 0.
83
83
84 j = 0
84 j = 0
85 cont = 1
85 cont = 1
86
86
87 while((cont == 1)and(j < lenOfData)):
87 while((cont == 1)and(j < lenOfData)):
88
88
89 sump += sortdata[j]
89 sump += sortdata[j]
90 sumq += sortdata[j]**2
90 sumq += sortdata[j]**2
91
91
92 if j > nums_min:
92 if j > nums_min:
93 rtest = float(j)/(j-1) + 1.0/navg
93 rtest = float(j)/(j-1) + 1.0/navg
94 if ((sumq*j) > (rtest*sump**2)):
94 if ((sumq*j) > (rtest*sump**2)):
95 j = j - 1
95 j = j - 1
96 sump = sump - sortdata[j]
96 sump = sump - sortdata[j]
97 sumq = sumq - sortdata[j]**2
97 sumq = sumq - sortdata[j]**2
98 cont = 0
98 cont = 0
99
99
100 j += 1
100 j += 1
101
101
102 lnoise = sump / j
102 lnoise = sump / j
103 '''
103 '''
104 return _noise.hildebrand_sekhon(sortdata, navg)
104 return _noise.hildebrand_sekhon(sortdata, navg)
105
105
106
106
107 class Beam:
107 class Beam:
108
108
109 def __init__(self):
109 def __init__(self):
110 self.codeList = []
110 self.codeList = []
111 self.azimuthList = []
111 self.azimuthList = []
112 self.zenithList = []
112 self.zenithList = []
113
113
114
114
115 class GenericData(object):
115 class GenericData(object):
116
116
117 flagNoData = True
117 flagNoData = True
118
118
119 def copy(self, inputObj=None):
119 def copy(self, inputObj=None):
120
120
121 if inputObj == None:
121 if inputObj == None:
122 return copy.deepcopy(self)
122 return copy.deepcopy(self)
123
123
124 for key in list(inputObj.__dict__.keys()):
124 for key in list(inputObj.__dict__.keys()):
125
125
126 attribute = inputObj.__dict__[key]
126 attribute = inputObj.__dict__[key]
127
127
128 # If this attribute is a tuple or list
128 # If this attribute is a tuple or list
129 if type(inputObj.__dict__[key]) in (tuple, list):
129 if type(inputObj.__dict__[key]) in (tuple, list):
130 self.__dict__[key] = attribute[:]
130 self.__dict__[key] = attribute[:]
131 continue
131 continue
132
132
133 # If this attribute is another object or instance
133 # If this attribute is another object or instance
134 if hasattr(attribute, '__dict__'):
134 if hasattr(attribute, '__dict__'):
135 self.__dict__[key] = attribute.copy()
135 self.__dict__[key] = attribute.copy()
136 continue
136 continue
137
137
138 self.__dict__[key] = inputObj.__dict__[key]
138 self.__dict__[key] = inputObj.__dict__[key]
139
139
140 def deepcopy(self):
140 def deepcopy(self):
141
141
142 return copy.deepcopy(self)
142 return copy.deepcopy(self)
143
143
144 def isEmpty(self):
144 def isEmpty(self):
145
145
146 return self.flagNoData
146 return self.flagNoData
147
147
148 def isReady(self):
148 def isReady(self):
149
149
150 return not self.flagNoData
150 return not self.flagNoData
151
151
152
152
153 class JROData(GenericData):
153 class JROData(GenericData):
154
154
155 # m_BasicHeader = BasicHeader()
155 # m_BasicHeader = BasicHeader()
156 # m_ProcessingHeader = ProcessingHeader()
156 # m_ProcessingHeader = ProcessingHeader()
157
157
158 systemHeaderObj = SystemHeader()
158 systemHeaderObj = SystemHeader()
159 radarControllerHeaderObj = RadarControllerHeader()
159 radarControllerHeaderObj = RadarControllerHeader()
160 # data = None
160 # data = None
161 type = None
161 type = None
162 datatype = None # dtype but in string
162 datatype = None # dtype but in string
163 # dtype = None
163 # dtype = None
164 # nChannels = None
164 # nChannels = None
165 # nHeights = None
165 # nHeights = None
166 nProfiles = None
166 nProfiles = None
167 heightList = None
167 heightList = None
168 channelList = None
168 channelList = None
169 flagDiscontinuousBlock = False
169 flagDiscontinuousBlock = False
170 useLocalTime = False
170 useLocalTime = False
171 utctime = None
171 utctime = None
172 timeZone = None
172 timeZone = None
173 dstFlag = None
173 dstFlag = None
174 errorCount = None
174 errorCount = None
175 blocksize = None
175 blocksize = None
176 # nCode = None
176 # nCode = None
177 # nBaud = None
177 # nBaud = None
178 # code = None
178 # code = None
179 flagDecodeData = False # asumo q la data no esta decodificada
179 flagDecodeData = False # asumo q la data no esta decodificada
180 flagDeflipData = False # asumo q la data no esta sin flip
180 flagDeflipData = False # asumo q la data no esta sin flip
181 flagShiftFFT = False
181 flagShiftFFT = False
182 # ippSeconds = None
182 # ippSeconds = None
183 # timeInterval = None
183 # timeInterval = None
184 nCohInt = None
184 nCohInt = None
185 # noise = None
185 # noise = None
186 windowOfFilter = 1
186 windowOfFilter = 1
187 # Speed of ligth
187 # Speed of ligth
188 C = 3e8
188 C = 3e8
189 frequency = 49.92e6
189 frequency = 49.92e6
190 realtime = False
190 realtime = False
191 beacon_heiIndexList = None
191 beacon_heiIndexList = None
192 last_block = None
192 last_block = None
193 blocknow = None
193 blocknow = None
194 azimuth = None
194 azimuth = None
195 zenith = None
195 zenith = None
196 beam = Beam()
196 beam = Beam()
197 profileIndex = None
197 profileIndex = None
198 error = None
198 error = None
199 data = None
199 data = None
200 nmodes = None
200 nmodes = None
201
201
202 def __str__(self):
202 def __str__(self):
203
203
204 return '{} - {}'.format(self.type, self.getDatatime())
204 return '{} - {}'.format(self.type, self.getDatatime())
205
205
206 def getNoise(self):
206 def getNoise(self):
207
207
208 raise NotImplementedError
208 raise NotImplementedError
209
209
210 def getNChannels(self):
210 def getNChannels(self):
211
211
212 return len(self.channelList)
212 return len(self.channelList)
213
213
214 def getChannelIndexList(self):
214 def getChannelIndexList(self):
215
215
216 return list(range(self.nChannels))
216 return list(range(self.nChannels))
217
217
218 def getNHeights(self):
218 def getNHeights(self):
219
219
220 return len(self.heightList)
220 return len(self.heightList)
221
221
222 def getHeiRange(self, extrapoints=0):
222 def getHeiRange(self, extrapoints=0):
223
223
224 heis = self.heightList
224 heis = self.heightList
225 # deltah = self.heightList[1] - self.heightList[0]
225 # deltah = self.heightList[1] - self.heightList[0]
226 #
226 #
227 # heis.append(self.heightList[-1])
227 # heis.append(self.heightList[-1])
228
228
229 return heis
229 return heis
230
230
231 def getDeltaH(self):
231 def getDeltaH(self):
232
232
233 delta = self.heightList[1] - self.heightList[0]
233 delta = self.heightList[1] - self.heightList[0]
234
234
235 return delta
235 return delta
236
236
237 def getltctime(self):
237 def getltctime(self):
238
238
239 if self.useLocalTime:
239 if self.useLocalTime:
240 return self.utctime - self.timeZone * 60
240 return self.utctime - self.timeZone * 60
241
241
242 return self.utctime
242 return self.utctime
243
243
244 def getDatatime(self):
244 def getDatatime(self):
245
245
246 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
246 datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime)
247 return datatimeValue
247 return datatimeValue
248
248
249 def getTimeRange(self):
249 def getTimeRange(self):
250
250
251 datatime = []
251 datatime = []
252
252
253 datatime.append(self.ltctime)
253 datatime.append(self.ltctime)
254 datatime.append(self.ltctime + self.timeInterval + 1)
254 datatime.append(self.ltctime + self.timeInterval + 1)
255
255
256 datatime = numpy.array(datatime)
256 datatime = numpy.array(datatime)
257
257
258 return datatime
258 return datatime
259
259
260 def getFmaxTimeResponse(self):
260 def getFmaxTimeResponse(self):
261
261
262 period = (10**-6) * self.getDeltaH() / (0.15)
262 period = (10**-6) * self.getDeltaH() / (0.15)
263
263
264 PRF = 1. / (period * self.nCohInt)
264 PRF = 1. / (period * self.nCohInt)
265
265
266 fmax = PRF
266 fmax = PRF
267
267
268 return fmax
268 return fmax
269
269
270 def getFmax(self):
270 def getFmax(self):
271 PRF = 1. / (self.ippSeconds * self.nCohInt)
271 PRF = 1. / (self.ippSeconds * self.nCohInt)
272
272
273 fmax = PRF
273 fmax = PRF
274 return fmax
274 return fmax
275
275
276 def getVmax(self):
276 def getVmax(self):
277
277
278 _lambda = self.C / self.frequency
278 _lambda = self.C / self.frequency
279
279
280 vmax = self.getFmax() * _lambda / 2
280 vmax = self.getFmax() * _lambda / 2
281
281
282 return vmax
282 return vmax
283
283
284 def get_ippSeconds(self):
284 def get_ippSeconds(self):
285 '''
285 '''
286 '''
286 '''
287 return self.radarControllerHeaderObj.ippSeconds
287 return self.radarControllerHeaderObj.ippSeconds
288
288
289 def set_ippSeconds(self, ippSeconds):
289 def set_ippSeconds(self, ippSeconds):
290 '''
290 '''
291 '''
291 '''
292
292
293 self.radarControllerHeaderObj.ippSeconds = ippSeconds
293 self.radarControllerHeaderObj.ippSeconds = ippSeconds
294
294
295 return
295 return
296
296
297 def get_dtype(self):
297 def get_dtype(self):
298 '''
298 '''
299 '''
299 '''
300 return getNumpyDtype(self.datatype)
300 return getNumpyDtype(self.datatype)
301
301
302 def set_dtype(self, numpyDtype):
302 def set_dtype(self, numpyDtype):
303 '''
303 '''
304 '''
304 '''
305
305
306 self.datatype = getDataTypeCode(numpyDtype)
306 self.datatype = getDataTypeCode(numpyDtype)
307
307
308 def get_code(self):
308 def get_code(self):
309 '''
309 '''
310 '''
310 '''
311 return self.radarControllerHeaderObj.code
311 return self.radarControllerHeaderObj.code
312
312
313 def set_code(self, code):
313 def set_code(self, code):
314 '''
314 '''
315 '''
315 '''
316 self.radarControllerHeaderObj.code = code
316 self.radarControllerHeaderObj.code = code
317
317
318 return
318 return
319
319
320 def get_ncode(self):
320 def get_ncode(self):
321 '''
321 '''
322 '''
322 '''
323 return self.radarControllerHeaderObj.nCode
323 return self.radarControllerHeaderObj.nCode
324
324
325 def set_ncode(self, nCode):
325 def set_ncode(self, nCode):
326 '''
326 '''
327 '''
327 '''
328 self.radarControllerHeaderObj.nCode = nCode
328 self.radarControllerHeaderObj.nCode = nCode
329
329
330 return
330 return
331
331
332 def get_nbaud(self):
332 def get_nbaud(self):
333 '''
333 '''
334 '''
334 '''
335 return self.radarControllerHeaderObj.nBaud
335 return self.radarControllerHeaderObj.nBaud
336
336
337 def set_nbaud(self, nBaud):
337 def set_nbaud(self, nBaud):
338 '''
338 '''
339 '''
339 '''
340 self.radarControllerHeaderObj.nBaud = nBaud
340 self.radarControllerHeaderObj.nBaud = nBaud
341
341
342 return
342 return
343
343
344 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
344 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
345 channelIndexList = property(
345 channelIndexList = property(
346 getChannelIndexList, "I'm the 'channelIndexList' property.")
346 getChannelIndexList, "I'm the 'channelIndexList' property.")
347 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
347 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
348 #noise = property(getNoise, "I'm the 'nHeights' property.")
348 #noise = property(getNoise, "I'm the 'nHeights' property.")
349 datatime = property(getDatatime, "I'm the 'datatime' property")
349 datatime = property(getDatatime, "I'm the 'datatime' property")
350 ltctime = property(getltctime, "I'm the 'ltctime' property")
350 ltctime = property(getltctime, "I'm the 'ltctime' property")
351 ippSeconds = property(get_ippSeconds, set_ippSeconds)
351 ippSeconds = property(get_ippSeconds, set_ippSeconds)
352 dtype = property(get_dtype, set_dtype)
352 dtype = property(get_dtype, set_dtype)
353 # timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
353 # timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
354 code = property(get_code, set_code)
354 code = property(get_code, set_code)
355 nCode = property(get_ncode, set_ncode)
355 nCode = property(get_ncode, set_ncode)
356 nBaud = property(get_nbaud, set_nbaud)
356 nBaud = property(get_nbaud, set_nbaud)
357
357
358
358
359 class Voltage(JROData):
359 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 data_intensity = None
363 dataPP_POW = None
364 data_velocity = None
364 dataPP_DOP = None
365 data_specwidth = None
365 dataPP_WIDTH = None
366 dataPP_SNR = None
367
366 def __init__(self):
368 def __init__(self):
367 '''
369 '''
368 Constructor
370 Constructor
369 '''
371 '''
370
372
371 self.useLocalTime = True
373 self.useLocalTime = True
372 self.radarControllerHeaderObj = RadarControllerHeader()
374 self.radarControllerHeaderObj = RadarControllerHeader()
373 self.systemHeaderObj = SystemHeader()
375 self.systemHeaderObj = SystemHeader()
374 self.type = "Voltage"
376 self.type = "Voltage"
375 self.data = None
377 self.data = None
376 # self.dtype = None
378 # self.dtype = None
377 # self.nChannels = 0
379 # self.nChannels = 0
378 # self.nHeights = 0
380 # self.nHeights = 0
379 self.nProfiles = None
381 self.nProfiles = None
380 self.heightList = None
382 self.heightList = None
381 self.channelList = None
383 self.channelList = None
382 # self.channelIndexList = None
384 # self.channelIndexList = None
383 self.flagNoData = True
385 self.flagNoData = True
384 self.flagDiscontinuousBlock = False
386 self.flagDiscontinuousBlock = False
385 self.utctime = None
387 self.utctime = None
386 self.timeZone = None
388 self.timeZone = None
387 self.dstFlag = None
389 self.dstFlag = None
388 self.errorCount = None
390 self.errorCount = None
389 self.nCohInt = None
391 self.nCohInt = None
390 self.blocksize = None
392 self.blocksize = None
391 self.flagCohInt = False
393 self.flagCohInt = False
392 self.flagDecodeData = False # asumo q la data no esta decodificada
394 self.flagDecodeData = False # asumo q la data no esta decodificada
393 self.flagDeflipData = False # asumo q la data no esta sin flip
395 self.flagDeflipData = False # asumo q la data no esta sin flip
394 self.flagShiftFFT = False
396 self.flagShiftFFT = False
395 self.flagDataAsBlock = False # Asumo que la data es leida perfil a perfil
397 self.flagDataAsBlock = False # Asumo que la data es leida perfil a perfil
396 self.profileIndex = 0
398 self.profileIndex = 0
397
399
398 def getNoisebyHildebrand(self, channel=None):
400 def getNoisebyHildebrand(self, channel=None):
399 """
401 """
400 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
402 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
401
403
402 Return:
404 Return:
403 noiselevel
405 noiselevel
404 """
406 """
405
407
406 if channel != None:
408 if channel != None:
407 data = self.data[channel]
409 data = self.data[channel]
408 nChannels = 1
410 nChannels = 1
409 else:
411 else:
410 data = self.data
412 data = self.data
411 nChannels = self.nChannels
413 nChannels = self.nChannels
412
414
413 noise = numpy.zeros(nChannels)
415 noise = numpy.zeros(nChannels)
414 power = data * numpy.conjugate(data)
416 power = data * numpy.conjugate(data)
415
417
416 for thisChannel in range(nChannels):
418 for thisChannel in range(nChannels):
417 if nChannels == 1:
419 if nChannels == 1:
418 daux = power[:].real
420 daux = power[:].real
419 else:
421 else:
420 daux = power[thisChannel, :].real
422 daux = power[thisChannel, :].real
421 noise[thisChannel] = hildebrand_sekhon(daux, self.nCohInt)
423 noise[thisChannel] = hildebrand_sekhon(daux, self.nCohInt)
422
424
423 return noise
425 return noise
424
426
425 def getNoise(self, type=1, channel=None):
427 def getNoise(self, type=1, channel=None):
426
428
427 if type == 1:
429 if type == 1:
428 noise = self.getNoisebyHildebrand(channel)
430 noise = self.getNoisebyHildebrand(channel)
429
431
430 return noise
432 return noise
431
433
432 def getPower(self, channel=None):
434 def getPower(self, channel=None):
433
435
434 if channel != None:
436 if channel != None:
435 data = self.data[channel]
437 data = self.data[channel]
436 else:
438 else:
437 data = self.data
439 data = self.data
438
440
439 power = data * numpy.conjugate(data)
441 power = data * numpy.conjugate(data)
440 powerdB = 10 * numpy.log10(power.real)
442 powerdB = 10 * numpy.log10(power.real)
441 powerdB = numpy.squeeze(powerdB)
443 powerdB = numpy.squeeze(powerdB)
442
444
443 return powerdB
445 return powerdB
444
446
445 def getTimeInterval(self):
447 def getTimeInterval(self):
446
448
447 timeInterval = self.ippSeconds * self.nCohInt
449 timeInterval = self.ippSeconds * self.nCohInt
448
450
449 return timeInterval
451 return timeInterval
450
452
451 noise = property(getNoise, "I'm the 'nHeights' property.")
453 noise = property(getNoise, "I'm the 'nHeights' property.")
452 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
454 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
453
455
454
456
455 class Spectra(JROData):
457 class Spectra(JROData):
456
458
457 # data spc es un numpy array de 2 dmensiones (canales, perfiles, alturas)
459 # data spc es un numpy array de 2 dmensiones (canales, perfiles, alturas)
458 data_spc = None
460 data_spc = None
459 # data cspc es un numpy array de 2 dmensiones (canales, pares, alturas)
461 # data cspc es un numpy array de 2 dmensiones (canales, pares, alturas)
460 data_cspc = None
462 data_cspc = None
461 # data dc es un numpy array de 2 dmensiones (canales, alturas)
463 # data dc es un numpy array de 2 dmensiones (canales, alturas)
462 data_dc = None
464 data_dc = None
463 # data power
465 # data power
464 data_pwr = None
466 data_pwr = None
465 nFFTPoints = None
467 nFFTPoints = None
466 # nPairs = None
468 # nPairs = None
467 pairsList = None
469 pairsList = None
468 nIncohInt = None
470 nIncohInt = None
469 wavelength = None # Necesario para cacular el rango de velocidad desde la frecuencia
471 wavelength = None # Necesario para cacular el rango de velocidad desde la frecuencia
470 nCohInt = None # se requiere para determinar el valor de timeInterval
472 nCohInt = None # se requiere para determinar el valor de timeInterval
471 ippFactor = None
473 ippFactor = None
472 profileIndex = 0
474 profileIndex = 0
473 plotting = "spectra"
475 plotting = "spectra"
474
476
475 def __init__(self):
477 def __init__(self):
476 '''
478 '''
477 Constructor
479 Constructor
478 '''
480 '''
479
481
480 self.useLocalTime = True
482 self.useLocalTime = True
481 self.radarControllerHeaderObj = RadarControllerHeader()
483 self.radarControllerHeaderObj = RadarControllerHeader()
482 self.systemHeaderObj = SystemHeader()
484 self.systemHeaderObj = SystemHeader()
483 self.type = "Spectra"
485 self.type = "Spectra"
484 # self.data = None
486 # self.data = None
485 # self.dtype = None
487 # self.dtype = None
486 # self.nChannels = 0
488 # self.nChannels = 0
487 # self.nHeights = 0
489 # self.nHeights = 0
488 self.nProfiles = None
490 self.nProfiles = None
489 self.heightList = None
491 self.heightList = None
490 self.channelList = None
492 self.channelList = None
491 # self.channelIndexList = None
493 # self.channelIndexList = None
492 self.pairsList = None
494 self.pairsList = None
493 self.flagNoData = True
495 self.flagNoData = True
494 self.flagDiscontinuousBlock = False
496 self.flagDiscontinuousBlock = False
495 self.utctime = None
497 self.utctime = None
496 self.nCohInt = None
498 self.nCohInt = None
497 self.nIncohInt = None
499 self.nIncohInt = None
498 self.blocksize = None
500 self.blocksize = None
499 self.nFFTPoints = None
501 self.nFFTPoints = None
500 self.wavelength = None
502 self.wavelength = None
501 self.flagDecodeData = False # asumo q la data no esta decodificada
503 self.flagDecodeData = False # asumo q la data no esta decodificada
502 self.flagDeflipData = False # asumo q la data no esta sin flip
504 self.flagDeflipData = False # asumo q la data no esta sin flip
503 self.flagShiftFFT = False
505 self.flagShiftFFT = False
504 self.ippFactor = 1
506 self.ippFactor = 1
505 #self.noise = None
507 #self.noise = None
506 self.beacon_heiIndexList = []
508 self.beacon_heiIndexList = []
507 self.noise_estimation = None
509 self.noise_estimation = None
508
510
509 def getNoisebyHildebrand(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
511 def getNoisebyHildebrand(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
510 """
512 """
511 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
513 Determino el nivel de ruido usando el metodo Hildebrand-Sekhon
512
514
513 Return:
515 Return:
514 noiselevel
516 noiselevel
515 """
517 """
516
518
517 noise = numpy.zeros(self.nChannels)
519 noise = numpy.zeros(self.nChannels)
518
520
519 for channel in range(self.nChannels):
521 for channel in range(self.nChannels):
520 daux = self.data_spc[channel,
522 daux = self.data_spc[channel,
521 xmin_index:xmax_index, ymin_index:ymax_index]
523 xmin_index:xmax_index, ymin_index:ymax_index]
522 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
524 noise[channel] = hildebrand_sekhon(daux, self.nIncohInt)
523
525
524 return noise
526 return noise
525
527
526 def getNoise(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
528 def getNoise(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None):
527
529
528 if self.noise_estimation is not None:
530 if self.noise_estimation is not None:
529 # this was estimated by getNoise Operation defined in jroproc_spectra.py
531 # this was estimated by getNoise Operation defined in jroproc_spectra.py
530 return self.noise_estimation
532 return self.noise_estimation
531 else:
533 else:
532 noise = self.getNoisebyHildebrand(
534 noise = self.getNoisebyHildebrand(
533 xmin_index, xmax_index, ymin_index, ymax_index)
535 xmin_index, xmax_index, ymin_index, ymax_index)
534 return noise
536 return noise
535
537
536 def getFreqRangeTimeResponse(self, extrapoints=0):
538 def getFreqRangeTimeResponse(self, extrapoints=0):
537
539
538 deltafreq = self.getFmaxTimeResponse() / (self.nFFTPoints * self.ippFactor)
540 deltafreq = self.getFmaxTimeResponse() / (self.nFFTPoints * self.ippFactor)
539 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.) - deltafreq / 2
541 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.) - deltafreq / 2
540
542
541 return freqrange
543 return freqrange
542
544
543 def getAcfRange(self, extrapoints=0):
545 def getAcfRange(self, extrapoints=0):
544
546
545 deltafreq = 10. / (self.getFmax() / (self.nFFTPoints * self.ippFactor))
547 deltafreq = 10. / (self.getFmax() / (self.nFFTPoints * self.ippFactor))
546 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
548 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
547
549
548 return freqrange
550 return freqrange
549
551
550 def getFreqRange(self, extrapoints=0):
552 def getFreqRange(self, extrapoints=0):
551
553
552 deltafreq = self.getFmax() / (self.nFFTPoints * self.ippFactor)
554 deltafreq = self.getFmax() / (self.nFFTPoints * self.ippFactor)
553 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
555 freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2
554
556
555 return freqrange
557 return freqrange
556
558
557 def getVelRange(self, extrapoints=0):
559 def getVelRange(self, extrapoints=0):
558
560
559 deltav = self.getVmax() / (self.nFFTPoints * self.ippFactor)
561 deltav = self.getVmax() / (self.nFFTPoints * self.ippFactor)
560 velrange = deltav * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.)
562 velrange = deltav * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.)
561
563
562 if self.nmodes:
564 if self.nmodes:
563 return velrange/self.nmodes
565 return velrange/self.nmodes
564 else:
566 else:
565 return velrange
567 return velrange
566
568
567 def getNPairs(self):
569 def getNPairs(self):
568
570
569 return len(self.pairsList)
571 return len(self.pairsList)
570
572
571 def getPairsIndexList(self):
573 def getPairsIndexList(self):
572
574
573 return list(range(self.nPairs))
575 return list(range(self.nPairs))
574
576
575 def getNormFactor(self):
577 def getNormFactor(self):
576
578
577 pwcode = 1
579 pwcode = 1
578
580
579 if self.flagDecodeData:
581 if self.flagDecodeData:
580 pwcode = numpy.sum(self.code[0]**2)
582 pwcode = numpy.sum(self.code[0]**2)
581 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
583 #normFactor = min(self.nFFTPoints,self.nProfiles)*self.nIncohInt*self.nCohInt*pwcode*self.windowOfFilter
582 normFactor = self.nProfiles * self.nIncohInt * self.nCohInt * pwcode * self.windowOfFilter
584 normFactor = self.nProfiles * self.nIncohInt * self.nCohInt * pwcode * self.windowOfFilter
583
585
584 return normFactor
586 return normFactor
585
587
586 def getFlagCspc(self):
588 def getFlagCspc(self):
587
589
588 if self.data_cspc is None:
590 if self.data_cspc is None:
589 return True
591 return True
590
592
591 return False
593 return False
592
594
593 def getFlagDc(self):
595 def getFlagDc(self):
594
596
595 if self.data_dc is None:
597 if self.data_dc is None:
596 return True
598 return True
597
599
598 return False
600 return False
599
601
600 def getTimeInterval(self):
602 def getTimeInterval(self):
601
603
602 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles * self.ippFactor
604 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles * self.ippFactor
603 if self.nmodes:
605 if self.nmodes:
604 return self.nmodes*timeInterval
606 return self.nmodes*timeInterval
605 else:
607 else:
606 return timeInterval
608 return timeInterval
607
609
608 def getPower(self):
610 def getPower(self):
609
611
610 factor = self.normFactor
612 factor = self.normFactor
611 z = self.data_spc / factor
613 z = self.data_spc / factor
612 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
614 z = numpy.where(numpy.isfinite(z), z, numpy.NAN)
613 avg = numpy.average(z, axis=1)
615 avg = numpy.average(z, axis=1)
614
616
615 return 10 * numpy.log10(avg)
617 return 10 * numpy.log10(avg)
616
618
617 def getCoherence(self, pairsList=None, phase=False):
619 def getCoherence(self, pairsList=None, phase=False):
618
620
619 z = []
621 z = []
620 if pairsList is None:
622 if pairsList is None:
621 pairsIndexList = self.pairsIndexList
623 pairsIndexList = self.pairsIndexList
622 else:
624 else:
623 pairsIndexList = []
625 pairsIndexList = []
624 for pair in pairsList:
626 for pair in pairsList:
625 if pair not in self.pairsList:
627 if pair not in self.pairsList:
626 raise ValueError("Pair %s is not in dataOut.pairsList" % (
628 raise ValueError("Pair %s is not in dataOut.pairsList" % (
627 pair))
629 pair))
628 pairsIndexList.append(self.pairsList.index(pair))
630 pairsIndexList.append(self.pairsList.index(pair))
629 for i in range(len(pairsIndexList)):
631 for i in range(len(pairsIndexList)):
630 pair = self.pairsList[pairsIndexList[i]]
632 pair = self.pairsList[pairsIndexList[i]]
631 ccf = numpy.average(self.data_cspc[pairsIndexList[i], :, :], axis=0)
633 ccf = numpy.average(self.data_cspc[pairsIndexList[i], :, :], axis=0)
632 powa = numpy.average(self.data_spc[pair[0], :, :], axis=0)
634 powa = numpy.average(self.data_spc[pair[0], :, :], axis=0)
633 powb = numpy.average(self.data_spc[pair[1], :, :], axis=0)
635 powb = numpy.average(self.data_spc[pair[1], :, :], axis=0)
634 avgcoherenceComplex = ccf / numpy.sqrt(powa * powb)
636 avgcoherenceComplex = ccf / numpy.sqrt(powa * powb)
635 if phase:
637 if phase:
636 data = numpy.arctan2(avgcoherenceComplex.imag,
638 data = numpy.arctan2(avgcoherenceComplex.imag,
637 avgcoherenceComplex.real) * 180 / numpy.pi
639 avgcoherenceComplex.real) * 180 / numpy.pi
638 else:
640 else:
639 data = numpy.abs(avgcoherenceComplex)
641 data = numpy.abs(avgcoherenceComplex)
640
642
641 z.append(data)
643 z.append(data)
642
644
643 return numpy.array(z)
645 return numpy.array(z)
644
646
645 def setValue(self, value):
647 def setValue(self, value):
646
648
647 print("This property should not be initialized")
649 print("This property should not be initialized")
648
650
649 return
651 return
650
652
651 nPairs = property(getNPairs, setValue, "I'm the 'nPairs' property.")
653 nPairs = property(getNPairs, setValue, "I'm the 'nPairs' property.")
652 pairsIndexList = property(
654 pairsIndexList = property(
653 getPairsIndexList, setValue, "I'm the 'pairsIndexList' property.")
655 getPairsIndexList, setValue, "I'm the 'pairsIndexList' property.")
654 normFactor = property(getNormFactor, setValue,
656 normFactor = property(getNormFactor, setValue,
655 "I'm the 'getNormFactor' property.")
657 "I'm the 'getNormFactor' property.")
656 flag_cspc = property(getFlagCspc, setValue)
658 flag_cspc = property(getFlagCspc, setValue)
657 flag_dc = property(getFlagDc, setValue)
659 flag_dc = property(getFlagDc, setValue)
658 noise = property(getNoise, setValue, "I'm the 'nHeights' property.")
660 noise = property(getNoise, setValue, "I'm the 'nHeights' property.")
659 timeInterval = property(getTimeInterval, setValue,
661 timeInterval = property(getTimeInterval, setValue,
660 "I'm the 'timeInterval' property")
662 "I'm the 'timeInterval' property")
661
663
662
664
663 class SpectraHeis(Spectra):
665 class SpectraHeis(Spectra):
664
666
665 data_spc = None
667 data_spc = None
666 data_cspc = None
668 data_cspc = None
667 data_dc = None
669 data_dc = None
668 nFFTPoints = None
670 nFFTPoints = None
669 # nPairs = None
671 # nPairs = None
670 pairsList = None
672 pairsList = None
671 nCohInt = None
673 nCohInt = None
672 nIncohInt = None
674 nIncohInt = None
673
675
674 def __init__(self):
676 def __init__(self):
675
677
676 self.radarControllerHeaderObj = RadarControllerHeader()
678 self.radarControllerHeaderObj = RadarControllerHeader()
677
679
678 self.systemHeaderObj = SystemHeader()
680 self.systemHeaderObj = SystemHeader()
679
681
680 self.type = "SpectraHeis"
682 self.type = "SpectraHeis"
681
683
682 # self.dtype = None
684 # self.dtype = None
683
685
684 # self.nChannels = 0
686 # self.nChannels = 0
685
687
686 # self.nHeights = 0
688 # self.nHeights = 0
687
689
688 self.nProfiles = None
690 self.nProfiles = None
689
691
690 self.heightList = None
692 self.heightList = None
691
693
692 self.channelList = None
694 self.channelList = None
693
695
694 # self.channelIndexList = None
696 # self.channelIndexList = None
695
697
696 self.flagNoData = True
698 self.flagNoData = True
697
699
698 self.flagDiscontinuousBlock = False
700 self.flagDiscontinuousBlock = False
699
701
700 # self.nPairs = 0
702 # self.nPairs = 0
701
703
702 self.utctime = None
704 self.utctime = None
703
705
704 self.blocksize = None
706 self.blocksize = None
705
707
706 self.profileIndex = 0
708 self.profileIndex = 0
707
709
708 self.nCohInt = 1
710 self.nCohInt = 1
709
711
710 self.nIncohInt = 1
712 self.nIncohInt = 1
711
713
712 def getNormFactor(self):
714 def getNormFactor(self):
713 pwcode = 1
715 pwcode = 1
714 if self.flagDecodeData:
716 if self.flagDecodeData:
715 pwcode = numpy.sum(self.code[0]**2)
717 pwcode = numpy.sum(self.code[0]**2)
716
718
717 normFactor = self.nIncohInt * self.nCohInt * pwcode
719 normFactor = self.nIncohInt * self.nCohInt * pwcode
718
720
719 return normFactor
721 return normFactor
720
722
721 def getTimeInterval(self):
723 def getTimeInterval(self):
722
724
723 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
725 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
724
726
725 return timeInterval
727 return timeInterval
726
728
727 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
729 normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.")
728 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
730 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
729
731
730
732
731 class Fits(JROData):
733 class Fits(JROData):
732
734
733 heightList = None
735 heightList = None
734 channelList = None
736 channelList = None
735 flagNoData = True
737 flagNoData = True
736 flagDiscontinuousBlock = False
738 flagDiscontinuousBlock = False
737 useLocalTime = False
739 useLocalTime = False
738 utctime = None
740 utctime = None
739 timeZone = None
741 timeZone = None
740 # ippSeconds = None
742 # ippSeconds = None
741 # timeInterval = None
743 # timeInterval = None
742 nCohInt = None
744 nCohInt = None
743 nIncohInt = None
745 nIncohInt = None
744 noise = None
746 noise = None
745 windowOfFilter = 1
747 windowOfFilter = 1
746 # Speed of ligth
748 # Speed of ligth
747 C = 3e8
749 C = 3e8
748 frequency = 49.92e6
750 frequency = 49.92e6
749 realtime = False
751 realtime = False
750
752
751 def __init__(self):
753 def __init__(self):
752
754
753 self.type = "Fits"
755 self.type = "Fits"
754
756
755 self.nProfiles = None
757 self.nProfiles = None
756
758
757 self.heightList = None
759 self.heightList = None
758
760
759 self.channelList = None
761 self.channelList = None
760
762
761 # self.channelIndexList = None
763 # self.channelIndexList = None
762
764
763 self.flagNoData = True
765 self.flagNoData = True
764
766
765 self.utctime = None
767 self.utctime = None
766
768
767 self.nCohInt = 1
769 self.nCohInt = 1
768
770
769 self.nIncohInt = 1
771 self.nIncohInt = 1
770
772
771 self.useLocalTime = True
773 self.useLocalTime = True
772
774
773 self.profileIndex = 0
775 self.profileIndex = 0
774
776
775 # self.utctime = None
777 # self.utctime = None
776 # self.timeZone = None
778 # self.timeZone = None
777 # self.ltctime = None
779 # self.ltctime = None
778 # self.timeInterval = None
780 # self.timeInterval = None
779 # self.header = None
781 # self.header = None
780 # self.data_header = None
782 # self.data_header = None
781 # self.data = None
783 # self.data = None
782 # self.datatime = None
784 # self.datatime = None
783 # self.flagNoData = False
785 # self.flagNoData = False
784 # self.expName = ''
786 # self.expName = ''
785 # self.nChannels = None
787 # self.nChannels = None
786 # self.nSamples = None
788 # self.nSamples = None
787 # self.dataBlocksPerFile = None
789 # self.dataBlocksPerFile = None
788 # self.comments = ''
790 # self.comments = ''
789 #
791 #
790
792
791 def getltctime(self):
793 def getltctime(self):
792
794
793 if self.useLocalTime:
795 if self.useLocalTime:
794 return self.utctime - self.timeZone * 60
796 return self.utctime - self.timeZone * 60
795
797
796 return self.utctime
798 return self.utctime
797
799
798 def getDatatime(self):
800 def getDatatime(self):
799
801
800 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
802 datatime = datetime.datetime.utcfromtimestamp(self.ltctime)
801 return datatime
803 return datatime
802
804
803 def getTimeRange(self):
805 def getTimeRange(self):
804
806
805 datatime = []
807 datatime = []
806
808
807 datatime.append(self.ltctime)
809 datatime.append(self.ltctime)
808 datatime.append(self.ltctime + self.timeInterval)
810 datatime.append(self.ltctime + self.timeInterval)
809
811
810 datatime = numpy.array(datatime)
812 datatime = numpy.array(datatime)
811
813
812 return datatime
814 return datatime
813
815
814 def getHeiRange(self):
816 def getHeiRange(self):
815
817
816 heis = self.heightList
818 heis = self.heightList
817
819
818 return heis
820 return heis
819
821
820 def getNHeights(self):
822 def getNHeights(self):
821
823
822 return len(self.heightList)
824 return len(self.heightList)
823
825
824 def getNChannels(self):
826 def getNChannels(self):
825
827
826 return len(self.channelList)
828 return len(self.channelList)
827
829
828 def getChannelIndexList(self):
830 def getChannelIndexList(self):
829
831
830 return list(range(self.nChannels))
832 return list(range(self.nChannels))
831
833
832 def getNoise(self, type=1):
834 def getNoise(self, type=1):
833
835
834 #noise = numpy.zeros(self.nChannels)
836 #noise = numpy.zeros(self.nChannels)
835
837
836 if type == 1:
838 if type == 1:
837 noise = self.getNoisebyHildebrand()
839 noise = self.getNoisebyHildebrand()
838
840
839 if type == 2:
841 if type == 2:
840 noise = self.getNoisebySort()
842 noise = self.getNoisebySort()
841
843
842 if type == 3:
844 if type == 3:
843 noise = self.getNoisebyWindow()
845 noise = self.getNoisebyWindow()
844
846
845 return noise
847 return noise
846
848
847 def getTimeInterval(self):
849 def getTimeInterval(self):
848
850
849 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
851 timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt
850
852
851 return timeInterval
853 return timeInterval
852
854
853 def get_ippSeconds(self):
855 def get_ippSeconds(self):
854 '''
856 '''
855 '''
857 '''
856 return self.ipp_sec
858 return self.ipp_sec
857
859
858
860
859 datatime = property(getDatatime, "I'm the 'datatime' property")
861 datatime = property(getDatatime, "I'm the 'datatime' property")
860 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
862 nHeights = property(getNHeights, "I'm the 'nHeights' property.")
861 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
863 nChannels = property(getNChannels, "I'm the 'nChannel' property.")
862 channelIndexList = property(
864 channelIndexList = property(
863 getChannelIndexList, "I'm the 'channelIndexList' property.")
865 getChannelIndexList, "I'm the 'channelIndexList' property.")
864 noise = property(getNoise, "I'm the 'nHeights' property.")
866 noise = property(getNoise, "I'm the 'nHeights' property.")
865
867
866 ltctime = property(getltctime, "I'm the 'ltctime' property")
868 ltctime = property(getltctime, "I'm the 'ltctime' property")
867 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
869 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
868 ippSeconds = property(get_ippSeconds, '')
870 ippSeconds = property(get_ippSeconds, '')
869
871
870 class Correlation(JROData):
872 class Correlation(JROData):
871
873
872 noise = None
874 noise = None
873 SNR = None
875 SNR = None
874 #--------------------------------------------------
876 #--------------------------------------------------
875 mode = None
877 mode = None
876 split = False
878 split = False
877 data_cf = None
879 data_cf = None
878 lags = None
880 lags = None
879 lagRange = None
881 lagRange = None
880 pairsList = None
882 pairsList = None
881 normFactor = None
883 normFactor = None
882 #--------------------------------------------------
884 #--------------------------------------------------
883 # calculateVelocity = None
885 # calculateVelocity = None
884 nLags = None
886 nLags = None
885 nPairs = None
887 nPairs = None
886 nAvg = None
888 nAvg = None
887
889
888 def __init__(self):
890 def __init__(self):
889 '''
891 '''
890 Constructor
892 Constructor
891 '''
893 '''
892 self.radarControllerHeaderObj = RadarControllerHeader()
894 self.radarControllerHeaderObj = RadarControllerHeader()
893
895
894 self.systemHeaderObj = SystemHeader()
896 self.systemHeaderObj = SystemHeader()
895
897
896 self.type = "Correlation"
898 self.type = "Correlation"
897
899
898 self.data = None
900 self.data = None
899
901
900 self.dtype = None
902 self.dtype = None
901
903
902 self.nProfiles = None
904 self.nProfiles = None
903
905
904 self.heightList = None
906 self.heightList = None
905
907
906 self.channelList = None
908 self.channelList = None
907
909
908 self.flagNoData = True
910 self.flagNoData = True
909
911
910 self.flagDiscontinuousBlock = False
912 self.flagDiscontinuousBlock = False
911
913
912 self.utctime = None
914 self.utctime = None
913
915
914 self.timeZone = None
916 self.timeZone = None
915
917
916 self.dstFlag = None
918 self.dstFlag = None
917
919
918 self.errorCount = None
920 self.errorCount = None
919
921
920 self.blocksize = None
922 self.blocksize = None
921
923
922 self.flagDecodeData = False # asumo q la data no esta decodificada
924 self.flagDecodeData = False # asumo q la data no esta decodificada
923
925
924 self.flagDeflipData = False # asumo q la data no esta sin flip
926 self.flagDeflipData = False # asumo q la data no esta sin flip
925
927
926 self.pairsList = None
928 self.pairsList = None
927
929
928 self.nPoints = None
930 self.nPoints = None
929
931
930 def getPairsList(self):
932 def getPairsList(self):
931
933
932 return self.pairsList
934 return self.pairsList
933
935
934 def getNoise(self, mode=2):
936 def getNoise(self, mode=2):
935
937
936 indR = numpy.where(self.lagR == 0)[0][0]
938 indR = numpy.where(self.lagR == 0)[0][0]
937 indT = numpy.where(self.lagT == 0)[0][0]
939 indT = numpy.where(self.lagT == 0)[0][0]
938
940
939 jspectra0 = self.data_corr[:, :, indR, :]
941 jspectra0 = self.data_corr[:, :, indR, :]
940 jspectra = copy.copy(jspectra0)
942 jspectra = copy.copy(jspectra0)
941
943
942 num_chan = jspectra.shape[0]
944 num_chan = jspectra.shape[0]
943 num_hei = jspectra.shape[2]
945 num_hei = jspectra.shape[2]
944
946
945 freq_dc = jspectra.shape[1] / 2
947 freq_dc = jspectra.shape[1] / 2
946 ind_vel = numpy.array([-2, -1, 1, 2]) + freq_dc
948 ind_vel = numpy.array([-2, -1, 1, 2]) + freq_dc
947
949
948 if ind_vel[0] < 0:
950 if ind_vel[0] < 0:
949 ind_vel[list(range(0, 1))] = ind_vel[list(
951 ind_vel[list(range(0, 1))] = ind_vel[list(
950 range(0, 1))] + self.num_prof
952 range(0, 1))] + self.num_prof
951
953
952 if mode == 1:
954 if mode == 1:
953 jspectra[:, freq_dc, :] = (
955 jspectra[:, freq_dc, :] = (
954 jspectra[:, ind_vel[1], :] + jspectra[:, ind_vel[2], :]) / 2 # CORRECCION
956 jspectra[:, ind_vel[1], :] + jspectra[:, ind_vel[2], :]) / 2 # CORRECCION
955
957
956 if mode == 2:
958 if mode == 2:
957
959
958 vel = numpy.array([-2, -1, 1, 2])
960 vel = numpy.array([-2, -1, 1, 2])
959 xx = numpy.zeros([4, 4])
961 xx = numpy.zeros([4, 4])
960
962
961 for fil in range(4):
963 for fil in range(4):
962 xx[fil, :] = vel[fil]**numpy.asarray(list(range(4)))
964 xx[fil, :] = vel[fil]**numpy.asarray(list(range(4)))
963
965
964 xx_inv = numpy.linalg.inv(xx)
966 xx_inv = numpy.linalg.inv(xx)
965 xx_aux = xx_inv[0, :]
967 xx_aux = xx_inv[0, :]
966
968
967 for ich in range(num_chan):
969 for ich in range(num_chan):
968 yy = jspectra[ich, ind_vel, :]
970 yy = jspectra[ich, ind_vel, :]
969 jspectra[ich, freq_dc, :] = numpy.dot(xx_aux, yy)
971 jspectra[ich, freq_dc, :] = numpy.dot(xx_aux, yy)
970
972
971 junkid = jspectra[ich, freq_dc, :] <= 0
973 junkid = jspectra[ich, freq_dc, :] <= 0
972 cjunkid = sum(junkid)
974 cjunkid = sum(junkid)
973
975
974 if cjunkid.any():
976 if cjunkid.any():
975 jspectra[ich, freq_dc, junkid.nonzero()] = (
977 jspectra[ich, freq_dc, junkid.nonzero()] = (
976 jspectra[ich, ind_vel[1], junkid] + jspectra[ich, ind_vel[2], junkid]) / 2
978 jspectra[ich, ind_vel[1], junkid] + jspectra[ich, ind_vel[2], junkid]) / 2
977
979
978 noise = jspectra0[:, freq_dc, :] - jspectra[:, freq_dc, :]
980 noise = jspectra0[:, freq_dc, :] - jspectra[:, freq_dc, :]
979
981
980 return noise
982 return noise
981
983
982 def getTimeInterval(self):
984 def getTimeInterval(self):
983
985
984 timeInterval = self.ippSeconds * self.nCohInt * self.nProfiles
986 timeInterval = self.ippSeconds * self.nCohInt * self.nProfiles
985
987
986 return timeInterval
988 return timeInterval
987
989
988 def splitFunctions(self):
990 def splitFunctions(self):
989
991
990 pairsList = self.pairsList
992 pairsList = self.pairsList
991 ccf_pairs = []
993 ccf_pairs = []
992 acf_pairs = []
994 acf_pairs = []
993 ccf_ind = []
995 ccf_ind = []
994 acf_ind = []
996 acf_ind = []
995 for l in range(len(pairsList)):
997 for l in range(len(pairsList)):
996 chan0 = pairsList[l][0]
998 chan0 = pairsList[l][0]
997 chan1 = pairsList[l][1]
999 chan1 = pairsList[l][1]
998
1000
999 # Obteniendo pares de Autocorrelacion
1001 # Obteniendo pares de Autocorrelacion
1000 if chan0 == chan1:
1002 if chan0 == chan1:
1001 acf_pairs.append(chan0)
1003 acf_pairs.append(chan0)
1002 acf_ind.append(l)
1004 acf_ind.append(l)
1003 else:
1005 else:
1004 ccf_pairs.append(pairsList[l])
1006 ccf_pairs.append(pairsList[l])
1005 ccf_ind.append(l)
1007 ccf_ind.append(l)
1006
1008
1007 data_acf = self.data_cf[acf_ind]
1009 data_acf = self.data_cf[acf_ind]
1008 data_ccf = self.data_cf[ccf_ind]
1010 data_ccf = self.data_cf[ccf_ind]
1009
1011
1010 return acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf
1012 return acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf
1011
1013
1012 def getNormFactor(self):
1014 def getNormFactor(self):
1013 acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf = self.splitFunctions()
1015 acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf = self.splitFunctions()
1014 acf_pairs = numpy.array(acf_pairs)
1016 acf_pairs = numpy.array(acf_pairs)
1015 normFactor = numpy.zeros((self.nPairs, self.nHeights))
1017 normFactor = numpy.zeros((self.nPairs, self.nHeights))
1016
1018
1017 for p in range(self.nPairs):
1019 for p in range(self.nPairs):
1018 pair = self.pairsList[p]
1020 pair = self.pairsList[p]
1019
1021
1020 ch0 = pair[0]
1022 ch0 = pair[0]
1021 ch1 = pair[1]
1023 ch1 = pair[1]
1022
1024
1023 ch0_max = numpy.max(data_acf[acf_pairs == ch0, :, :], axis=1)
1025 ch0_max = numpy.max(data_acf[acf_pairs == ch0, :, :], axis=1)
1024 ch1_max = numpy.max(data_acf[acf_pairs == ch1, :, :], axis=1)
1026 ch1_max = numpy.max(data_acf[acf_pairs == ch1, :, :], axis=1)
1025 normFactor[p, :] = numpy.sqrt(ch0_max * ch1_max)
1027 normFactor[p, :] = numpy.sqrt(ch0_max * ch1_max)
1026
1028
1027 return normFactor
1029 return normFactor
1028
1030
1029 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
1031 timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property")
1030 normFactor = property(getNormFactor, "I'm the 'normFactor property'")
1032 normFactor = property(getNormFactor, "I'm the 'normFactor property'")
1031
1033
1032
1034
1033 class Parameters(Spectra):
1035 class Parameters(Spectra):
1034
1036
1035 experimentInfo = None # Information about the experiment
1037 experimentInfo = None # Information about the experiment
1036 # Information from previous data
1038 # Information from previous data
1037 inputUnit = None # Type of data to be processed
1039 inputUnit = None # Type of data to be processed
1038 operation = None # Type of operation to parametrize
1040 operation = None # Type of operation to parametrize
1039 # normFactor = None #Normalization Factor
1041 # normFactor = None #Normalization Factor
1040 groupList = None # List of Pairs, Groups, etc
1042 groupList = None # List of Pairs, Groups, etc
1041 # Parameters
1043 # Parameters
1042 data_param = None # Parameters obtained
1044 data_param = None # Parameters obtained
1043 data_pre = None # Data Pre Parametrization
1045 data_pre = None # Data Pre Parametrization
1044 data_SNR = None # Signal to Noise Ratio
1046 data_SNR = None # Signal to Noise Ratio
1045 # heightRange = None #Heights
1047 # heightRange = None #Heights
1046 abscissaList = None # Abscissa, can be velocities, lags or time
1048 abscissaList = None # Abscissa, can be velocities, lags or time
1047 # noise = None #Noise Potency
1049 # noise = None #Noise Potency
1048 utctimeInit = None # Initial UTC time
1050 utctimeInit = None # Initial UTC time
1049 paramInterval = None # Time interval to calculate Parameters in seconds
1051 paramInterval = None # Time interval to calculate Parameters in seconds
1050 useLocalTime = True
1052 useLocalTime = True
1051 # Fitting
1053 # Fitting
1052 data_error = None # Error of the estimation
1054 data_error = None # Error of the estimation
1053 constants = None
1055 constants = None
1054 library = None
1056 library = None
1055 # Output signal
1057 # Output signal
1056 outputInterval = None # Time interval to calculate output signal in seconds
1058 outputInterval = None # Time interval to calculate output signal in seconds
1057 data_output = None # Out signal
1059 data_output = None # Out signal
1058 nAvg = None
1060 nAvg = None
1059 noise_estimation = None
1061 noise_estimation = None
1060 GauSPC = None # Fit gaussian SPC
1062 GauSPC = None # Fit gaussian SPC
1061
1063
1062 def __init__(self):
1064 def __init__(self):
1063 '''
1065 '''
1064 Constructor
1066 Constructor
1065 '''
1067 '''
1066 self.radarControllerHeaderObj = RadarControllerHeader()
1068 self.radarControllerHeaderObj = RadarControllerHeader()
1067
1069
1068 self.systemHeaderObj = SystemHeader()
1070 self.systemHeaderObj = SystemHeader()
1069
1071
1070 self.type = "Parameters"
1072 self.type = "Parameters"
1071
1073
1072 def getTimeRange1(self, interval):
1074 def getTimeRange1(self, interval):
1073
1075
1074 datatime = []
1076 datatime = []
1075
1077
1076 if self.useLocalTime:
1078 if self.useLocalTime:
1077 time1 = self.utctimeInit - self.timeZone * 60
1079 time1 = self.utctimeInit - self.timeZone * 60
1078 else:
1080 else:
1079 time1 = self.utctimeInit
1081 time1 = self.utctimeInit
1080
1082
1081 datatime.append(time1)
1083 datatime.append(time1)
1082 datatime.append(time1 + interval)
1084 datatime.append(time1 + interval)
1083 datatime = numpy.array(datatime)
1085 datatime = numpy.array(datatime)
1084
1086
1085 return datatime
1087 return datatime
1086
1088
1087 def getTimeInterval(self):
1089 def getTimeInterval(self):
1088
1090
1089 if hasattr(self, 'timeInterval1'):
1091 if hasattr(self, 'timeInterval1'):
1090 return self.timeInterval1
1092 return self.timeInterval1
1091 else:
1093 else:
1092 return self.paramInterval
1094 return self.paramInterval
1093
1095
1094 def setValue(self, value):
1096 def setValue(self, value):
1095
1097
1096 print("This property should not be initialized")
1098 print("This property should not be initialized")
1097
1099
1098 return
1100 return
1099
1101
1100 def getNoise(self):
1102 def getNoise(self):
1101
1103
1102 return self.spc_noise
1104 return self.spc_noise
1103
1105
1104 timeInterval = property(getTimeInterval)
1106 timeInterval = property(getTimeInterval)
1105 noise = property(getNoise, setValue, "I'm the 'Noise' property.")
1107 noise = property(getNoise, setValue, "I'm the 'Noise' property.")
1106
1108
1107
1109
1108 class PlotterData(object):
1110 class PlotterData(object):
1109 '''
1111 '''
1110 Object to hold data to be plotted
1112 Object to hold data to be plotted
1111 '''
1113 '''
1112
1114
1113 MAXNUMX = 200
1115 MAXNUMX = 200
1114 MAXNUMY = 200
1116 MAXNUMY = 200
1115
1117
1116 def __init__(self, code, throttle_value, exp_code, buffering=True, snr=False):
1118 def __init__(self, code, throttle_value, exp_code, buffering=True, snr=False):
1117
1119
1118 self.key = code
1120 self.key = code
1119 self.throttle = throttle_value
1121 self.throttle = throttle_value
1120 self.exp_code = exp_code
1122 self.exp_code = exp_code
1121 self.buffering = buffering
1123 self.buffering = buffering
1122 self.ready = False
1124 self.ready = False
1123 self.flagNoData = False
1125 self.flagNoData = False
1124 self.localtime = False
1126 self.localtime = False
1125 self.data = {}
1127 self.data = {}
1126 self.meta = {}
1128 self.meta = {}
1127 self.__heights = []
1129 self.__heights = []
1128
1130
1129 if 'snr' in code:
1131 if 'snr' in code:
1130 self.plottypes = ['snr']
1132 self.plottypes = ['snr']
1131 elif code == 'spc':
1133 elif code == 'spc':
1132 self.plottypes = ['spc', 'noise', 'rti']
1134 self.plottypes = ['spc', 'noise', 'rti']
1133 elif code == 'cspc':
1135 elif code == 'cspc':
1134 self.plottypes = ['cspc', 'spc', 'noise', 'rti']
1136 self.plottypes = ['cspc', 'spc', 'noise', 'rti']
1135 elif code == 'rti':
1137 elif code == 'rti':
1136 self.plottypes = ['noise', 'rti']
1138 self.plottypes = ['noise', 'rti']
1137 else:
1139 else:
1138 self.plottypes = [code]
1140 self.plottypes = [code]
1139
1141
1140 if 'snr' not in self.plottypes and snr:
1142 if 'snr' not in self.plottypes and snr:
1141 self.plottypes.append('snr')
1143 self.plottypes.append('snr')
1142
1144
1143 for plot in self.plottypes:
1145 for plot in self.plottypes:
1144 self.data[plot] = {}
1146 self.data[plot] = {}
1145
1147
1146
1148
1147 def __str__(self):
1149 def __str__(self):
1148 dum = ['{}{}'.format(key, self.shape(key)) for key in self.data]
1150 dum = ['{}{}'.format(key, self.shape(key)) for key in self.data]
1149 return 'Data[{}][{}]'.format(';'.join(dum), len(self.times))
1151 return 'Data[{}][{}]'.format(';'.join(dum), len(self.times))
1150
1152
1151 def __len__(self):
1153 def __len__(self):
1152 return len(self.data[self.key])
1154 return len(self.data[self.key])
1153
1155
1154 def __getitem__(self, key):
1156 def __getitem__(self, key):
1155
1157
1156 if key not in self.data:
1158 if key not in self.data:
1157 raise KeyError(log.error('Missing key: {}'.format(key)))
1159 raise KeyError(log.error('Missing key: {}'.format(key)))
1158 if 'spc' in key or not self.buffering:
1160 if 'spc' in key or not self.buffering:
1159 ret = self.data[key][self.tm]
1161 ret = self.data[key][self.tm]
1160 elif 'scope' in key:
1162 elif 'scope' in key:
1161 ret = numpy.array(self.data[key][float(self.tm)])
1163 ret = numpy.array(self.data[key][float(self.tm)])
1162 else:
1164 else:
1163 ret = numpy.array([self.data[key][x] for x in self.times])
1165 ret = numpy.array([self.data[key][x] for x in self.times])
1164 if ret.ndim > 1:
1166 if ret.ndim > 1:
1165 ret = numpy.swapaxes(ret, 0, 1)
1167 ret = numpy.swapaxes(ret, 0, 1)
1166 return ret
1168 return ret
1167
1169
1168 def __contains__(self, key):
1170 def __contains__(self, key):
1169 return key in self.data
1171 return key in self.data
1170
1172
1171 def setup(self):
1173 def setup(self):
1172 '''
1174 '''
1173 Configure object
1175 Configure object
1174 '''
1176 '''
1175 self.type = ''
1177 self.type = ''
1176 self.ready = False
1178 self.ready = False
1177 del self.data
1179 del self.data
1178 self.data = {}
1180 self.data = {}
1179 self.__heights = []
1181 self.__heights = []
1180 self.__all_heights = set()
1182 self.__all_heights = set()
1181 for plot in self.plottypes:
1183 for plot in self.plottypes:
1182 if 'snr' in plot:
1184 if 'snr' in plot:
1183 plot = 'snr'
1185 plot = 'snr'
1184 elif 'spc_moments' == plot:
1186 elif 'spc_moments' == plot:
1185 plot = 'moments'
1187 plot = 'moments'
1186 self.data[plot] = {}
1188 self.data[plot] = {}
1187
1189
1188 if 'spc' in self.data or 'rti' in self.data or 'cspc' in self.data or 'moments' in self.data:
1190 if 'spc' in self.data or 'rti' in self.data or 'cspc' in self.data or 'moments' in self.data:
1189 self.data['noise'] = {}
1191 self.data['noise'] = {}
1190 self.data['rti'] = {}
1192 self.data['rti'] = {}
1191 if 'noise' not in self.plottypes:
1193 if 'noise' not in self.plottypes:
1192 self.plottypes.append('noise')
1194 self.plottypes.append('noise')
1193 if 'rti' not in self.plottypes:
1195 if 'rti' not in self.plottypes:
1194 self.plottypes.append('rti')
1196 self.plottypes.append('rti')
1195
1197
1196 def shape(self, key):
1198 def shape(self, key):
1197 '''
1199 '''
1198 Get the shape of the one-element data for the given key
1200 Get the shape of the one-element data for the given key
1199 '''
1201 '''
1200
1202
1201 if len(self.data[key]):
1203 if len(self.data[key]):
1202 if 'spc' in key or not self.buffering:
1204 if 'spc' in key or not self.buffering:
1203 return self.data[key].shape
1205 return self.data[key].shape
1204 return self.data[key][self.times[0]].shape
1206 return self.data[key][self.times[0]].shape
1205 return (0,)
1207 return (0,)
1206
1208
1207 def update(self, dataOut, tm):
1209 def update(self, dataOut, tm):
1208 '''
1210 '''
1209 Update data object with new dataOut
1211 Update data object with new dataOut
1210 '''
1212 '''
1211
1213
1212 self.profileIndex = dataOut.profileIndex
1214 self.profileIndex = dataOut.profileIndex
1213 self.tm = tm
1215 self.tm = tm
1214 self.type = dataOut.type
1216 self.type = dataOut.type
1215 self.parameters = getattr(dataOut, 'parameters', [])
1217 self.parameters = getattr(dataOut, 'parameters', [])
1216
1218
1217 if hasattr(dataOut, 'meta'):
1219 if hasattr(dataOut, 'meta'):
1218 self.meta.update(dataOut.meta)
1220 self.meta.update(dataOut.meta)
1219
1221
1220 if hasattr(dataOut, 'pairsList'):
1222 if hasattr(dataOut, 'pairsList'):
1221 self.pairs = dataOut.pairsList
1223 self.pairs = dataOut.pairsList
1222
1224
1223 self.interval = dataOut.getTimeInterval()
1225 self.interval = dataOut.getTimeInterval()
1224 self.localtime = dataOut.useLocalTime
1226 self.localtime = dataOut.useLocalTime
1225 if True in ['spc' in ptype for ptype in self.plottypes]:
1227 if True in ['spc' in ptype for ptype in self.plottypes]:
1226 self.xrange = (dataOut.getFreqRange(1)/1000.,
1228 self.xrange = (dataOut.getFreqRange(1)/1000.,
1227 dataOut.getAcfRange(1), dataOut.getVelRange(1))
1229 dataOut.getAcfRange(1), dataOut.getVelRange(1))
1228 self.__heights.append(dataOut.heightList)
1230 self.__heights.append(dataOut.heightList)
1229 self.__all_heights.update(dataOut.heightList)
1231 self.__all_heights.update(dataOut.heightList)
1230
1232
1231 for plot in self.plottypes:
1233 for plot in self.plottypes:
1232 if plot in ('spc', 'spc_moments', 'spc_cut'):
1234 if plot in ('spc', 'spc_moments', 'spc_cut'):
1233 z = dataOut.data_spc/dataOut.normFactor
1235 z = dataOut.data_spc/dataOut.normFactor
1234 buffer = 10*numpy.log10(z)
1236 buffer = 10*numpy.log10(z)
1235 if plot == 'cspc':
1237 if plot == 'cspc':
1236 buffer = (dataOut.data_spc, dataOut.data_cspc)
1238 buffer = (dataOut.data_spc, dataOut.data_cspc)
1237 if plot == 'noise':
1239 if plot == 'noise':
1238 buffer = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
1240 buffer = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
1239 if plot in ('rti', 'spcprofile'):
1241 if plot in ('rti', 'spcprofile'):
1240 buffer = dataOut.getPower()
1242 buffer = dataOut.getPower()
1241 if plot == 'snr_db':
1243 if plot == 'snr_db':
1242 buffer = dataOut.data_SNR
1244 buffer = dataOut.data_SNR
1243 if plot == 'snr':
1245 if plot == 'snr':
1244 buffer = 10*numpy.log10(dataOut.data_SNR)
1246 buffer = 10*numpy.log10(dataOut.data_SNR)
1245 if plot == 'dop':
1247 if plot == 'dop':
1246 buffer = dataOut.data_DOP
1248 buffer = dataOut.data_DOP
1247 if plot == 'pow':
1249 if plot == 'pow':
1248 buffer = 10*numpy.log10(dataOut.data_POW)
1250 buffer = 10*numpy.log10(dataOut.data_POW)
1249 if plot == 'width':
1251 if plot == 'width':
1250 buffer = dataOut.data_WIDTH
1252 buffer = dataOut.data_WIDTH
1251 if plot == 'coh':
1253 if plot == 'coh':
1252 buffer = dataOut.getCoherence()
1254 buffer = dataOut.getCoherence()
1253 if plot == 'phase':
1255 if plot == 'phase':
1254 buffer = dataOut.getCoherence(phase=True)
1256 buffer = dataOut.getCoherence(phase=True)
1255 if plot == 'output':
1257 if plot == 'output':
1256 buffer = dataOut.data_output
1258 buffer = dataOut.data_output
1257 if plot == 'param':
1259 if plot == 'param':
1258 buffer = dataOut.data_param
1260 buffer = dataOut.data_param
1259 if plot == 'scope':
1261 if plot == 'scope':
1260 buffer = dataOut.data
1262 buffer = dataOut.data
1261 self.flagDataAsBlock = dataOut.flagDataAsBlock
1263 self.flagDataAsBlock = dataOut.flagDataAsBlock
1262 self.nProfiles = dataOut.nProfiles
1264 self.nProfiles = dataOut.nProfiles
1263 if plot == 'pp_power':
1265 if plot == 'pp_power':
1264 buffer = dataOut.data_intensity
1266 buffer = dataOut.dataPP_POWER
1267 self.flagDataAsBlock = dataOut.flagDataAsBlock
1268 self.nProfiles = dataOut.nProfiles
1269 if plot == 'pp_signal':
1270 buffer = dataOut.dataPP_POW
1265 self.flagDataAsBlock = dataOut.flagDataAsBlock
1271 self.flagDataAsBlock = dataOut.flagDataAsBlock
1266 self.nProfiles = dataOut.nProfiles
1272 self.nProfiles = dataOut.nProfiles
1267 if plot == 'pp_velocity':
1273 if plot == 'pp_velocity':
1268 buffer = dataOut.data_velocity
1274 buffer = dataOut.dataPP_DOP
1269 self.flagDataAsBlock = dataOut.flagDataAsBlock
1275 self.flagDataAsBlock = dataOut.flagDataAsBlock
1270 self.nProfiles = dataOut.nProfiles
1276 self.nProfiles = dataOut.nProfiles
1271 if plot == 'pp_specwidth':
1277 if plot == 'pp_specwidth':
1272 buffer = dataOut.data_specwidth
1278 buffer = dataOut.dataPP_WIDTH
1273 self.flagDataAsBlock = dataOut.flagDataAsBlock
1279 self.flagDataAsBlock = dataOut.flagDataAsBlock
1274 self.nProfiles = dataOut.nProfiles
1280 self.nProfiles = dataOut.nProfiles
1275
1281
1276 if plot == 'spc':
1282 if plot == 'spc':
1277 self.data['spc'][tm] = buffer
1283 self.data['spc'][tm] = buffer
1278 elif plot == 'cspc':
1284 elif plot == 'cspc':
1279 self.data['cspc'][tm] = buffer
1285 self.data['cspc'][tm] = buffer
1280 elif plot == 'spc_moments':
1286 elif plot == 'spc_moments':
1281 self.data['spc'][tm] = buffer
1287 self.data['spc'][tm] = buffer
1282 self.data['moments'][tm] = dataOut.moments
1288 self.data['moments'][tm] = dataOut.moments
1283 else:
1289 else:
1284 if self.buffering:
1290 if self.buffering:
1285 self.data[plot][tm] = buffer
1291 self.data[plot][tm] = buffer
1286 else:
1292 else:
1287 self.data[plot][tm] = buffer
1293 self.data[plot][tm] = buffer
1288
1294
1289 if dataOut.channelList is None:
1295 if dataOut.channelList is None:
1290 self.channels = range(buffer.shape[0])
1296 self.channels = range(buffer.shape[0])
1291 else:
1297 else:
1292 self.channels = dataOut.channelList
1298 self.channels = dataOut.channelList
1293
1299
1294 if buffer is None:
1300 if buffer is None:
1295 self.flagNoData = True
1301 self.flagNoData = True
1296 raise schainpy.admin.SchainWarning('Attribute data_{} is empty'.format(self.key))
1302 raise schainpy.admin.SchainWarning('Attribute data_{} is empty'.format(self.key))
1297
1303
1298 def normalize_heights(self):
1304 def normalize_heights(self):
1299 '''
1305 '''
1300 Ensure same-dimension of the data for different heighList
1306 Ensure same-dimension of the data for different heighList
1301 '''
1307 '''
1302
1308
1303 H = numpy.array(list(self.__all_heights))
1309 H = numpy.array(list(self.__all_heights))
1304 H.sort()
1310 H.sort()
1305 for key in self.data:
1311 for key in self.data:
1306 shape = self.shape(key)[:-1] + H.shape
1312 shape = self.shape(key)[:-1] + H.shape
1307 for tm, obj in list(self.data[key].items()):
1313 for tm, obj in list(self.data[key].items()):
1308 h = self.__heights[self.times.tolist().index(tm)]
1314 h = self.__heights[self.times.tolist().index(tm)]
1309 if H.size == h.size:
1315 if H.size == h.size:
1310 continue
1316 continue
1311 index = numpy.where(numpy.in1d(H, h))[0]
1317 index = numpy.where(numpy.in1d(H, h))[0]
1312 dummy = numpy.zeros(shape) + numpy.nan
1318 dummy = numpy.zeros(shape) + numpy.nan
1313 if len(shape) == 2:
1319 if len(shape) == 2:
1314 dummy[:, index] = obj
1320 dummy[:, index] = obj
1315 else:
1321 else:
1316 dummy[index] = obj
1322 dummy[index] = obj
1317 self.data[key][tm] = dummy
1323 self.data[key][tm] = dummy
1318
1324
1319 self.__heights = [H for tm in self.times]
1325 self.__heights = [H for tm in self.times]
1320
1326
1321 def jsonify(self, tm, plot_name, plot_type, decimate=False):
1327 def jsonify(self, tm, plot_name, plot_type, decimate=False):
1322 '''
1328 '''
1323 Convert data to json
1329 Convert data to json
1324 '''
1330 '''
1325
1331
1326 dy = int(self.heights.size/self.MAXNUMY) + 1
1332 dy = int(self.heights.size/self.MAXNUMY) + 1
1327 if self.key in ('spc', 'cspc'):
1333 if self.key in ('spc', 'cspc'):
1328 dx = int(self.data[self.key][tm].shape[1]/self.MAXNUMX) + 1
1334 dx = int(self.data[self.key][tm].shape[1]/self.MAXNUMX) + 1
1329 data = self.roundFloats(
1335 data = self.roundFloats(
1330 self.data[self.key][tm][::, ::dx, ::dy].tolist())
1336 self.data[self.key][tm][::, ::dx, ::dy].tolist())
1331 else:
1337 else:
1332 if self.key is 'noise':
1338 if self.key is 'noise':
1333 data = [[x] for x in self.roundFloats(self.data[self.key][tm].tolist())]
1339 data = [[x] for x in self.roundFloats(self.data[self.key][tm].tolist())]
1334 else:
1340 else:
1335 data = self.roundFloats(self.data[self.key][tm][::, ::dy].tolist())
1341 data = self.roundFloats(self.data[self.key][tm][::, ::dy].tolist())
1336
1342
1337 meta = {}
1343 meta = {}
1338 ret = {
1344 ret = {
1339 'plot': plot_name,
1345 'plot': plot_name,
1340 'code': self.exp_code,
1346 'code': self.exp_code,
1341 'time': float(tm),
1347 'time': float(tm),
1342 'data': data,
1348 'data': data,
1343 }
1349 }
1344 meta['type'] = plot_type
1350 meta['type'] = plot_type
1345 meta['interval'] = float(self.interval)
1351 meta['interval'] = float(self.interval)
1346 meta['localtime'] = self.localtime
1352 meta['localtime'] = self.localtime
1347 meta['yrange'] = self.roundFloats(self.heights[::dy].tolist())
1353 meta['yrange'] = self.roundFloats(self.heights[::dy].tolist())
1348 if 'spc' in self.data or 'cspc' in self.data:
1354 if 'spc' in self.data or 'cspc' in self.data:
1349 meta['xrange'] = self.roundFloats(self.xrange[2][::dx].tolist())
1355 meta['xrange'] = self.roundFloats(self.xrange[2][::dx].tolist())
1350 else:
1356 else:
1351 meta['xrange'] = []
1357 meta['xrange'] = []
1352
1358
1353 meta.update(self.meta)
1359 meta.update(self.meta)
1354 ret['metadata'] = meta
1360 ret['metadata'] = meta
1355 return json.dumps(ret)
1361 return json.dumps(ret)
1356
1362
1357 @property
1363 @property
1358 def times(self):
1364 def times(self):
1359 '''
1365 '''
1360 Return the list of times of the current data
1366 Return the list of times of the current data
1361 '''
1367 '''
1362
1368
1363 ret = numpy.array([*self.data[self.key]])
1369 ret = numpy.array([*self.data[self.key]])
1364 if self:
1370 if self:
1365 ret.sort()
1371 ret.sort()
1366 return ret
1372 return ret
1367
1373
1368 @property
1374 @property
1369 def min_time(self):
1375 def min_time(self):
1370 '''
1376 '''
1371 Return the minimun time value
1377 Return the minimun time value
1372 '''
1378 '''
1373
1379
1374 return self.times[0]
1380 return self.times[0]
1375
1381
1376 @property
1382 @property
1377 def max_time(self):
1383 def max_time(self):
1378 '''
1384 '''
1379 Return the maximun time value
1385 Return the maximun time value
1380 '''
1386 '''
1381
1387
1382 return self.times[-1]
1388 return self.times[-1]
1383
1389
1384 @property
1390 @property
1385 def heights(self):
1391 def heights(self):
1386 '''
1392 '''
1387 Return the list of heights of the current data
1393 Return the list of heights of the current data
1388 '''
1394 '''
1389
1395
1390 return numpy.array(self.__heights[-1])
1396 return numpy.array(self.__heights[-1])
1391
1397
1392 @staticmethod
1398 @staticmethod
1393 def roundFloats(obj):
1399 def roundFloats(obj):
1394 if isinstance(obj, list):
1400 if isinstance(obj, list):
1395 return list(map(PlotterData.roundFloats, obj))
1401 return list(map(PlotterData.roundFloats, obj))
1396 elif isinstance(obj, float):
1402 elif isinstance(obj, float):
1397 return round(obj, 2)
1403 return round(obj, 2)
@@ -1,276 +1,302
1 '''
1 '''
2 Created on Jul 9, 2014
2 Created on Jul 9, 2014
3
3
4 @author: roj-idl71
4 @author: roj-idl71
5 '''
5 '''
6 import os
6 import os
7 import datetime
7 import datetime
8 import numpy
8 import numpy
9
9
10 from schainpy.model.graphics.jroplot_base import Plot, plt
10 from schainpy.model.graphics.jroplot_base import Plot, plt
11
11
12
12
13 class ScopePlot(Plot):
13 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)'
26 self.ncols = 1
26 self.ncols = 1
27 self.nrows = 1
27 self.nrows = 1
28 self.nplots = 1
28 self.nplots = 1
29 self.ylabel = 'Intensity [dB]'
29 self.ylabel = 'Intensity [dB]'
30 self.titles = ['Scope']
30 self.titles = ['Scope']
31 self.colorbar = False
31 self.colorbar = False
32 self.width = 6
32 self.width = 6
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
47
48
48
49 self.titles[0] = title
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)
53 if ax.firsttime:
53 if ax.firsttime:
54 ax.plt_r = ax.plot(x, yreal[i,:], color='b')[0]
54 ax.plt_r = ax.plot(x, yreal[i,:], color='b')[0]
55 ax.plt_i = ax.plot(x, yimag[i,:], color='r')[0]
55 ax.plt_i = ax.plot(x, yimag[i,:], color='r')[0]
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 yreal = 10*numpy.log10(yreal)
64 self.y = yreal
64 self.y = yreal
65 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y"))
65 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y"))
66 self.xlabel = "Range (Km)"
66 self.xlabel = "Range (Km)"
67 self.ylabel = "Intensity"
67 self.ylabel = "Intensity"
68 self.xmin = min(x)
68 self.xmin = min(x)
69 self.xmax = max(x)
69 self.xmax = max(x)
70
70
71
71
72 self.titles[0] = title
72 self.titles[0] = title
73
73
74 for i,ax in enumerate(self.axes):
74 for i,ax in enumerate(self.axes):
75 title = "Channel %d" %(i)
75 title = "Channel %d" %(i)
76
76
77 ychannel = yreal[i,:]
77 ychannel = yreal[i,:]
78
78
79 if ax.firsttime:
79 if ax.firsttime:
80 ax.plt_r = ax.plot(x, ychannel)[0]
80 ax.plt_r = ax.plot(x, ychannel)[0]
81 else:
81 else:
82 #pass
82 #pass
83 ax.plt_r.set_data(x, ychannel)
83 ax.plt_r.set_data(x, ychannel)
84
84
85 def plot_weatherpower(self, x, y, channelIndexList, thisDatetime, wintitle):
85 def plot_weatherpower(self, x, y, channelIndexList, thisDatetime, wintitle):
86
86
87
87
88 y = y[channelIndexList,:]
88 y = y[channelIndexList,:]
89 yreal = y.real
89 yreal = y.real
90 yreal = 10*numpy.log10(yreal)
90 yreal = 10*numpy.log10(yreal)
91 self.y = yreal
91 self.y = yreal
92 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
92 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
93 self.xlabel = "Range (Km)"
93 self.xlabel = "Range (Km)"
94 self.ylabel = "Intensity"
94 self.ylabel = "Intensity"
95 self.xmin = min(x)
95 self.xmin = min(x)
96 self.xmax = max(x)
96 self.xmax = max(x)
97
97
98 self.titles[0] =title
98 self.titles[0] =title
99 for i,ax in enumerate(self.axes):
99 for i,ax in enumerate(self.axes):
100 title = "Channel %d" %(i)
100 title = "Channel %d" %(i)
101
101
102 ychannel = yreal[i,:]
102 ychannel = yreal[i,:]
103
103
104 if ax.firsttime:
104 if ax.firsttime:
105 ax.plt_r = ax.plot(x, ychannel)[0]
105 ax.plt_r = ax.plot(x, ychannel)[0]
106 else:
106 else:
107 #pass
107 #pass
108 ax.plt_r.set_data(x, ychannel)
108 ax.plt_r.set_data(x, ychannel)
109
109
110 def plot_weathervelocity(self, x, y, channelIndexList, thisDatetime, wintitle):
110 def plot_weathervelocity(self, x, y, channelIndexList, thisDatetime, wintitle):
111
111
112 x = x[channelIndexList,:]
112 x = x[channelIndexList,:]
113 yreal = y
113 yreal = y
114 self.y = yreal
114 self.y = yreal
115 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
115 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
116 self.xlabel = "Velocity (m/s)"
116 self.xlabel = "Velocity (m/s)"
117 self.ylabel = "Range (Km)"
117 self.ylabel = "Range (Km)"
118 self.xmin = numpy.min(x)
118 self.xmin = numpy.min(x)
119 self.xmax = numpy.max(x)
119 self.xmax = numpy.max(x)
120 self.titles[0] =title
120 self.titles[0] =title
121 for i,ax in enumerate(self.axes):
121 for i,ax in enumerate(self.axes):
122 title = "Channel %d" %(i)
122 title = "Channel %d" %(i)
123 xchannel = x[i,:]
123 xchannel = x[i,:]
124 if ax.firsttime:
124 if ax.firsttime:
125 ax.plt_r = ax.plot(xchannel, yreal)[0]
125 ax.plt_r = ax.plot(xchannel, yreal)[0]
126 else:
126 else:
127 #pass
127 #pass
128 ax.plt_r.set_data(xchannel, yreal)
128 ax.plt_r.set_data(xchannel, yreal)
129
129
130 def plot_weatherspecwidth(self, x, y, channelIndexList, thisDatetime, wintitle):
130 def plot_weatherspecwidth(self, x, y, channelIndexList, thisDatetime, wintitle):
131
131
132 x = x[channelIndexList,:]
132 x = x[channelIndexList,:]
133 yreal = y
133 yreal = y
134 self.y = yreal
134 self.y = yreal
135 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
135 title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S"))
136 self.xlabel = "width "
136 self.xlabel = "width "
137 self.ylabel = "Range (Km)"
137 self.ylabel = "Range (Km)"
138 self.xmin = numpy.min(x)
138 self.xmin = numpy.min(x)
139 self.xmax = numpy.max(x)
139 self.xmax = numpy.max(x)
140 self.titles[0] =title
140 self.titles[0] =title
141 for i,ax in enumerate(self.axes):
141 for i,ax in enumerate(self.axes):
142 title = "Channel %d" %(i)
142 title = "Channel %d" %(i)
143 xchannel = x[i,:]
143 xchannel = x[i,:]
144 if ax.firsttime:
144 if ax.firsttime:
145 ax.plt_r = ax.plot(xchannel, yreal)[0]
145 ax.plt_r = ax.plot(xchannel, yreal)[0]
146 else:
146 else:
147 #pass
147 #pass
148 ax.plt_r.set_data(xchannel, yreal)
148 ax.plt_r.set_data(xchannel, yreal)
149
149
150 def plot(self):
150 def plot(self):
151 if self.channels:
151 if self.channels:
152 channels = self.channels
152 channels = self.channels
153 else:
153 else:
154 channels = self.data.channels
154 channels = self.data.channels
155
155
156 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1])
156 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1])
157 if self.CODE == "pp_power":
157 if self.CODE == "pp_power":
158 scope = self.data['pp_power']
158 scope = self.data['pp_power']
159 elif self.CODE == "pp_signal":
160 scope = self.data["pp_signal"]
159 elif self.CODE == "pp_velocity":
161 elif self.CODE == "pp_velocity":
160 scope = self.data["pp_velocity"]
162 scope = self.data["pp_velocity"]
161 elif self.CODE == "pp_specwidth":
163 elif self.CODE == "pp_specwidth":
162 scope = self.data["pp_specwidth"]
164 scope = self.data["pp_specwidth"]
163 else:
165 else:
164 scope =self.data["scope"]
166 scope =self.data["scope"]
165
167
166 if self.data.flagDataAsBlock:
168 if self.data.flagDataAsBlock:
167
169
168 for i in range(self.data.nProfiles):
170 for i in range(self.data.nProfiles):
169
171
170 wintitle1 = " [Profile = %d] " %i
172 wintitle1 = " [Profile = %d] " %i
171 if self.CODE =="scope":
173 if self.CODE =="scope":
172 if self.type == "power":
174 if self.type == "power":
173 self.plot_power(self.data.heights,
175 self.plot_power(self.data.heights,
174 scope[:,i,:],
176 scope[:,i,:],
175 channels,
177 channels,
176 thisDatetime,
178 thisDatetime,
177 wintitle1
179 wintitle1
178 )
180 )
179
181
180 if self.type == "iq":
182 if self.type == "iq":
181 self.plot_iq(self.data.heights,
183 self.plot_iq(self.data.heights,
182 scope[:,i,:],
184 scope[:,i,:],
183 channels,
185 channels,
184 thisDatetime,
186 thisDatetime,
185 wintitle1
187 wintitle1
186 )
188 )
187 if self.CODE=="pp_power":
189 if self.CODE=="pp_power":
188 self.plot_weatherpower(self.data.heights,
190 self.plot_weatherpower(self.data.heights,
189 scope[:,i,:],
191 scope[:,i,:],
190 channels,
192 channels,
191 thisDatetime,
193 thisDatetime,
192 wintitle
194 wintitle
193 )
195 )
196 if self.CODE=="pp_signal":
197 self.plot_weatherpower(self.data.heights,
198 scope[:,i,:],
199 channels,
200 thisDatetime,
201 wintitle
202 )
194 if self.CODE=="pp_velocity":
203 if self.CODE=="pp_velocity":
195 self.plot_weathervelocity(scope[:,i,:],
204 self.plot_weathervelocity(scope[:,i,:],
196 self.data.heights,
205 self.data.heights,
197 channels,
206 channels,
198 thisDatetime,
207 thisDatetime,
199 wintitle
208 wintitle
200 )
209 )
201 if self.CODE=="pp_spcwidth":
210 if self.CODE=="pp_spcwidth":
202 self.plot_weatherspecwidth(scope[:,i,:],
211 self.plot_weatherspecwidth(scope[:,i,:],
203 self.data.heights,
212 self.data.heights,
204 channels,
213 channels,
205 thisDatetime,
214 thisDatetime,
206 wintitle
215 wintitle
207 )
216 )
208 else:
217 else:
209 wintitle = " [Profile = %d] " %self.data.profileIndex
218 wintitle = " [Profile = %d] " %self.data.profileIndex
210 if self.CODE== "scope":
219 if self.CODE== "scope":
211 if self.type == "power":
220 if self.type == "power":
212 self.plot_power(self.data.heights,
221 self.plot_power(self.data.heights,
213 scope,
222 scope,
214 channels,
223 channels,
215 thisDatetime,
224 thisDatetime,
216 wintitle
225 wintitle
217 )
226 )
218
227
219 if self.type == "iq":
228 if self.type == "iq":
220 self.plot_iq(self.data.heights,
229 self.plot_iq(self.data.heights,
221 scope,
230 scope,
222 channels,
231 channels,
223 thisDatetime,
232 thisDatetime,
224 wintitle
233 wintitle
225 )
234 )
226 if self.CODE=="pp_power":
235 if self.CODE=="pp_power":
227 self.plot_weatherpower(self.data.heights,
236 self.plot_weatherpower(self.data.heights,
228 scope,
237 scope,
229 channels,
238 channels,
230 thisDatetime,
239 thisDatetime,
231 wintitle
240 wintitle
232 )
241 )
242 if self.CODE=="pp_signal":
243 self.plot_weatherpower(self.data.heights,
244 scope,
245 channels,
246 thisDatetime,
247 wintitle
248 )
233 if self.CODE=="pp_velocity":
249 if self.CODE=="pp_velocity":
234 self.plot_weathervelocity(scope,
250 self.plot_weathervelocity(scope,
235 self.data.heights,
251 self.data.heights,
236 channels,
252 channels,
237 thisDatetime,
253 thisDatetime,
238 wintitle
254 wintitle
239 )
255 )
240 if self.CODE=="pp_specwidth":
256 if self.CODE=="pp_specwidth":
241 self.plot_weatherspecwidth(scope,
257 self.plot_weatherspecwidth(scope,
242 self.data.heights,
258 self.data.heights,
243 channels,
259 channels,
244 thisDatetime,
260 thisDatetime,
245 wintitle
261 wintitle
246 )
262 )
247
263
248
264
249
265
250 class PulsepairPowerPlot(ScopePlot):
266 class PulsepairPowerPlot(ScopePlot):
251 '''
267 '''
252 Plot for
268 Plot for P= S+N
253 '''
269 '''
254
270
255 CODE = 'pp_power'
271 CODE = 'pp_power'
256 plot_name = 'PulsepairPower'
272 plot_name = 'PulsepairPower'
257 plot_type = 'scatter'
273 plot_type = 'scatter'
258 buffering = False
274 buffering = False
259
275
260 class PulsepairVelocityPlot(ScopePlot):
276 class PulsepairVelocityPlot(ScopePlot):
261 '''
277 '''
262 Plot for
278 Plot for VELOCITY
263 '''
279 '''
264 CODE = 'pp_velocity'
280 CODE = 'pp_velocity'
265 plot_name = 'PulsepairVelocity'
281 plot_name = 'PulsepairVelocity'
266 plot_type = 'scatter'
282 plot_type = 'scatter'
267 buffering = False
283 buffering = False
268
284
269 class PulsepairSpecwidthPlot(ScopePlot):
285 class PulsepairSpecwidthPlot(ScopePlot):
270 '''
286 '''
271 Plot for
287 Plot for WIDTH
272 '''
288 '''
273 CODE = 'pp_specwidth'
289 CODE = 'pp_specwidth'
274 plot_name = 'PulsepairSpecwidth'
290 plot_name = 'PulsepairSpecwidth'
275 plot_type = 'scatter'
291 plot_type = 'scatter'
276 buffering = False
292 buffering = False
293
294 class PulsepairSignalPlot(ScopePlot):
295 '''
296 Plot for S
297 '''
298
299 CODE = 'pp_signal'
300 plot_name = 'PulsepairSignal'
301 plot_type = 'scatter'
302 buffering = False
@@ -1,512 +1,519
1 import numpy,math,random,time
1 import numpy,math,random,time
2 #---------------1 Heredamos JRODatareader
2 #---------------1 Heredamos JRODatareader
3 from schainpy.model.io.jroIO_base import *
3 from schainpy.model.io.jroIO_base import *
4 #---------------2 Heredamos las propiedades de ProcessingUnit
4 #---------------2 Heredamos las propiedades de ProcessingUnit
5 from schainpy.model.proc.jroproc_base import ProcessingUnit,Operation,MPDecorator
5 from schainpy.model.proc.jroproc_base import ProcessingUnit,Operation,MPDecorator
6 #---------------3 Importaremos las clases BascicHeader, SystemHeader, RadarControlHeader, ProcessingHeader
6 #---------------3 Importaremos las clases BascicHeader, SystemHeader, RadarControlHeader, ProcessingHeader
7 from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader,SystemHeader,RadarControllerHeader, ProcessingHeader
7 from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader,SystemHeader,RadarControllerHeader, ProcessingHeader
8 #---------------4 Importaremos el objeto Voltge
8 #---------------4 Importaremos el objeto Voltge
9 from schainpy.model.data.jrodata import Voltage
9 from schainpy.model.data.jrodata import Voltage
10
10
11 class SimulatorReader(JRODataReader, ProcessingUnit):
11 class SimulatorReader(JRODataReader, ProcessingUnit):
12 incIntFactor = 1
12 incIntFactor = 1
13 nFFTPoints = 0
13 nFFTPoints = 0
14 FixPP_IncInt = 1
14 FixPP_IncInt = 1
15 FixRCP_IPP = 1000
15 FixRCP_IPP = 1000
16 FixPP_CohInt = 1
16 FixPP_CohInt = 1
17 Tau_0 = 250
17 Tau_0 = 250
18 AcqH0_0 = 70
18 AcqH0_0 = 70
19 H0 = AcqH0_0
19 H0 = AcqH0_0
20 AcqDH_0 = 1.25
20 AcqDH_0 = 1.25
21 DH0 = AcqDH_0
21 DH0 = AcqDH_0
22 Bauds = 32
22 Bauds = 32
23 BaudWidth = None
23 BaudWidth = None
24 FixRCP_TXA = 40
24 FixRCP_TXA = 40
25 FixRCP_TXB = 70
25 FixRCP_TXB = 70
26 fAngle = 2.0*math.pi*(1/16)
26 fAngle = 2.0*math.pi*(1/16)
27 DC_level = 500
27 DC_level = 500
28 stdev = 8
28 stdev = 8
29 Num_Codes = 2
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])
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])
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])
32 #Dyn_snCode = numpy.array([Num_Codes,Bauds])
33 Dyn_snCode = None
33 Dyn_snCode = None
34 Samples = 200
34 Samples = 200
35 channels = 2
35 channels = 2
36 pulses = None
36 pulses = None
37 Reference = None
37 Reference = None
38 pulse_size = None
38 pulse_size = None
39 prof_gen = None
39 prof_gen = None
40 Fdoppler = 100
40 Fdoppler = 100
41 Hdoppler = 36
41 Hdoppler = 36
42 Adoppler = 300
42 Adoppler = 300
43 frequency = 9345
43 frequency = 9345
44 nTotalReadFiles = 1000
44 nTotalReadFiles = 1000
45
45
46 def __init__(self):
46 def __init__(self):
47 """
47 """
48 Inicializador de la clases SimulatorReader para
48 Inicializador de la clases SimulatorReader para
49 generar datos de voltage simulados.
49 generar datos de voltage simulados.
50 Input:
50 Input:
51 dataOut: Objeto de la clase Voltage.
51 dataOut: Objeto de la clase Voltage.
52 Este Objeto sera utilizado apra almacenar
52 Este Objeto sera utilizado apra almacenar
53 un perfil de datos cada vez qe se haga
53 un perfil de datos cada vez qe se haga
54 un requerimiento (getData)
54 un requerimiento (getData)
55 """
55 """
56 ProcessingUnit.__init__(self)
56 ProcessingUnit.__init__(self)
57 print(" [ START ] init - Metodo Simulator Reader")
57 print(" [ START ] init - Metodo Simulator Reader")
58
58
59 self.isConfig = False
59 self.isConfig = False
60 self.basicHeaderObj = BasicHeader(LOCALTIME)
60 self.basicHeaderObj = BasicHeader(LOCALTIME)
61 self.systemHeaderObj = SystemHeader()
61 self.systemHeaderObj = SystemHeader()
62 self.radarControllerHeaderObj = RadarControllerHeader()
62 self.radarControllerHeaderObj = RadarControllerHeader()
63 self.processingHeaderObj = ProcessingHeader()
63 self.processingHeaderObj = ProcessingHeader()
64 self.profileIndex = 2**32-1
64 self.profileIndex = 2**32-1
65 self.dataOut = Voltage()
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])
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])
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])
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])
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])
70 #self.Dyn_snCode = numpy.array([code0,code1])
71 self.Dyn_snCode = None
71 self.Dyn_snCode = None
72
72
73 def set_kwargs(self, **kwargs):
73 def set_kwargs(self, **kwargs):
74 for key, value in kwargs.items():
74 for key, value in kwargs.items():
75 setattr(self, key, value)
75 setattr(self, key, value)
76
76
77 def __hasNotDataInBuffer(self):
77 def __hasNotDataInBuffer(self):
78
78
79 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock* self.nTxs:
79 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock* self.nTxs:
80 if self.nReadBlocks>0:
80 if self.nReadBlocks>0:
81 tmp = self.dataOut.utctime
81 tmp = self.dataOut.utctime
82 tmp_utc = int(self.dataOut.utctime)
82 tmp_utc = int(self.dataOut.utctime)
83 tmp_milisecond = int((tmp-tmp_utc)*1000)
83 tmp_milisecond = int((tmp-tmp_utc)*1000)
84 self.basicHeaderObj.utc = tmp_utc
84 self.basicHeaderObj.utc = tmp_utc
85 self.basicHeaderObj.miliSecond= tmp_milisecond
85 self.basicHeaderObj.miliSecond= tmp_milisecond
86 return 1
86 return 1
87 return 0
87 return 0
88
88
89 def setNextFile(self):
89 def setNextFile(self):
90 """Set the next file to be readed open it and parse de file header"""
90 """Set the next file to be readed open it and parse de file header"""
91
91
92 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
92 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
93 self.nReadFiles=self.nReadFiles+1
93 self.nReadFiles=self.nReadFiles+1
94 if self.nReadFiles > self.nTotalReadFiles:
94 if self.nReadFiles > self.nTotalReadFiles:
95 self.flagNoMoreFiles=1
95 self.flagNoMoreFiles=1
96 raise schainpy.admin.SchainWarning('No more files to read')
96 raise schainpy.admin.SchainWarning('No more files to read')
97
97
98 print('------------------- [Opening file] ------------------------------',self.nReadFiles)
98 print('------------------- [Opening file] ------------------------------',self.nReadFiles)
99 self.nReadBlocks = 0
99 self.nReadBlocks = 0
100 #if self.nReadBlocks==0:
100 #if self.nReadBlocks==0:
101 # self.readFirstHeader()
101 # self.readFirstHeader()
102
102
103 def __setNewBlock(self):
103 def __setNewBlock(self):
104 self.setNextFile()
104 self.setNextFile()
105 if self.flagIsNewFile:
105 if self.flagIsNewFile:
106 return 1
106 return 1
107
107
108 def readNextBlock(self):
108 def readNextBlock(self):
109 while True:
109 while True:
110 self.__setNewBlock()
110 self.__setNewBlock()
111 if not(self.readBlock()):
111 if not(self.readBlock()):
112 return 0
112 return 0
113 self.getBasicHeader()
113 self.getBasicHeader()
114 break
114 break
115 if self.verbose:
115 if self.verbose:
116 print("[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks,
116 print("[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks,
117 self.processingHeaderObj.dataBlocksPerFile,
117 self.processingHeaderObj.dataBlocksPerFile,
118 self.dataOut.datatime.ctime()) )
118 self.dataOut.datatime.ctime()) )
119 return 1
119 return 1
120
120
121 def getFirstHeader(self):
121 def getFirstHeader(self):
122 self.getBasicHeader()
122 self.getBasicHeader()
123 self.dataOut.processingHeaderObj = self.processingHeaderObj.copy()
123 self.dataOut.processingHeaderObj = self.processingHeaderObj.copy()
124 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
124 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
125 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
125 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
126 self.dataOut.dtype = self.dtype
126 self.dataOut.dtype = self.dtype
127
127
128 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
128 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
129 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights) * self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
129 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights) * self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
130 self.dataOut.channelList = list(range(self.systemHeaderObj.nChannels))
130 self.dataOut.channelList = list(range(self.systemHeaderObj.nChannels))
131 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
131 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
132 # asumo q la data no esta decodificada
132 # asumo q la data no esta decodificada
133 self.dataOut.flagDecodeData = self.processingHeaderObj.flag_decode
133 self.dataOut.flagDecodeData = self.processingHeaderObj.flag_decode
134 # asumo q la data no esta sin flip
134 # asumo q la data no esta sin flip
135 self.dataOut.flagDeflipData = self.processingHeaderObj.flag_deflip
135 self.dataOut.flagDeflipData = self.processingHeaderObj.flag_deflip
136 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
136 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
137 self.dataOut.frequency = self.frequency
137 self.dataOut.frequency = self.frequency
138
138
139 def getBasicHeader(self):
139 def getBasicHeader(self):
140 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \
140 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \
141 1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
141 1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
142
142
143 self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
143 self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
144 self.dataOut.timeZone = self.basicHeaderObj.timeZone
144 self.dataOut.timeZone = self.basicHeaderObj.timeZone
145 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
145 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
146 self.dataOut.errorCount = self.basicHeaderObj.errorCount
146 self.dataOut.errorCount = self.basicHeaderObj.errorCount
147 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
147 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
148 self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs
148 self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs
149
149
150 def readFirstHeader(self):
150 def readFirstHeader(self):
151
151
152 datatype = int(numpy.log2((self.processingHeaderObj.processFlags &
152 datatype = int(numpy.log2((self.processingHeaderObj.processFlags &
153 PROCFLAG.DATATYPE_MASK)) - numpy.log2(PROCFLAG.DATATYPE_CHAR))
153 PROCFLAG.DATATYPE_MASK)) - numpy.log2(PROCFLAG.DATATYPE_CHAR))
154 if datatype == 0:
154 if datatype == 0:
155 datatype_str = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
155 datatype_str = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
156 elif datatype == 1:
156 elif datatype == 1:
157 datatype_str = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
157 datatype_str = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
158 elif datatype == 2:
158 elif datatype == 2:
159 datatype_str = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
159 datatype_str = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
160 elif datatype == 3:
160 elif datatype == 3:
161 datatype_str = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
161 datatype_str = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
162 elif datatype == 4:
162 elif datatype == 4:
163 datatype_str = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
163 datatype_str = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
164 elif datatype == 5:
164 elif datatype == 5:
165 datatype_str = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
165 datatype_str = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
166 else:
166 else:
167 raise ValueError('Data type was not defined')
167 raise ValueError('Data type was not defined')
168
168
169 self.dtype = datatype_str
169 self.dtype = datatype_str
170
170
171
171
172 def set_RCH(self, expType=2, nTx=1,ipp=None, txA=0, txB=0,
172 def set_RCH(self, expType=2, nTx=1,ipp=None, txA=0, txB=0,
173 nWindows=None, nHeights=None, firstHeight=None, deltaHeight=None,
173 nWindows=None, nHeights=None, firstHeight=None, deltaHeight=None,
174 numTaus=0, line6Function=0, line5Function=0, fClock=None,
174 numTaus=0, line6Function=0, line5Function=0, fClock=None,
175 prePulseBefore=0, prePulseAfter=0,
175 prePulseBefore=0, prePulseAfter=0,
176 codeType=0, nCode=0, nBaud=0, code=None,
176 codeType=0, nCode=0, nBaud=0, code=None,
177 flip1=0, flip2=0,Taus=0):
177 flip1=0, flip2=0,Taus=0):
178 self.radarControllerHeaderObj.expType = expType
178 self.radarControllerHeaderObj.expType = expType
179 self.radarControllerHeaderObj.nTx = nTx
179 self.radarControllerHeaderObj.nTx = nTx
180 self.radarControllerHeaderObj.ipp = float(ipp)
180 self.radarControllerHeaderObj.ipp = float(ipp)
181 self.radarControllerHeaderObj.txA = float(txA)
181 self.radarControllerHeaderObj.txA = float(txA)
182 self.radarControllerHeaderObj.txB = float(txB)
182 self.radarControllerHeaderObj.txB = float(txB)
183 self.radarControllerHeaderObj.rangeIpp = b'A\n'#ipp
183 self.radarControllerHeaderObj.rangeIpp = b'A\n'#ipp
184 self.radarControllerHeaderObj.rangeTxA = b''
184 self.radarControllerHeaderObj.rangeTxA = b''
185 self.radarControllerHeaderObj.rangeTxB = b''
185 self.radarControllerHeaderObj.rangeTxB = b''
186
186
187 self.radarControllerHeaderObj.nHeights = int(nHeights)
187 self.radarControllerHeaderObj.nHeights = int(nHeights)
188 self.radarControllerHeaderObj.firstHeight = numpy.array([firstHeight])
188 self.radarControllerHeaderObj.firstHeight = numpy.array([firstHeight])
189 self.radarControllerHeaderObj.deltaHeight = numpy.array([deltaHeight])
189 self.radarControllerHeaderObj.deltaHeight = numpy.array([deltaHeight])
190 self.radarControllerHeaderObj.samplesWin = numpy.array([nHeights])
190 self.radarControllerHeaderObj.samplesWin = numpy.array([nHeights])
191
191
192
192
193 self.radarControllerHeaderObj.nWindows = nWindows
193 self.radarControllerHeaderObj.nWindows = nWindows
194 self.radarControllerHeaderObj.numTaus = numTaus
194 self.radarControllerHeaderObj.numTaus = numTaus
195 self.radarControllerHeaderObj.codeType = codeType
195 self.radarControllerHeaderObj.codeType = codeType
196 self.radarControllerHeaderObj.line6Function = line6Function
196 self.radarControllerHeaderObj.line6Function = line6Function
197 self.radarControllerHeaderObj.line5Function = line5Function
197 self.radarControllerHeaderObj.line5Function = line5Function
198 #self.radarControllerHeaderObj.fClock = fClock
198 #self.radarControllerHeaderObj.fClock = fClock
199 self.radarControllerHeaderObj.prePulseBefore= prePulseBefore
199 self.radarControllerHeaderObj.prePulseBefore= prePulseBefore
200 self.radarControllerHeaderObj.prePulseAfter = prePulseAfter
200 self.radarControllerHeaderObj.prePulseAfter = prePulseAfter
201
201
202 self.radarControllerHeaderObj.flip1 = flip1
202 self.radarControllerHeaderObj.flip1 = flip1
203 self.radarControllerHeaderObj.flip2 = flip2
203 self.radarControllerHeaderObj.flip2 = flip2
204
204
205 self.radarControllerHeaderObj.code_size = 0
205 self.radarControllerHeaderObj.code_size = 0
206 if self.radarControllerHeaderObj.codeType != 0:
206 if self.radarControllerHeaderObj.codeType != 0:
207 self.radarControllerHeaderObj.nCode = nCode
207 self.radarControllerHeaderObj.nCode = nCode
208 self.radarControllerHeaderObj.nBaud = nBaud
208 self.radarControllerHeaderObj.nBaud = nBaud
209 self.radarControllerHeaderObj.code = code
209 self.radarControllerHeaderObj.code = code
210 self.radarControllerHeaderObj.code_size = int(numpy.ceil(nBaud / 32.)) * nCode * 4
210 self.radarControllerHeaderObj.code_size = int(numpy.ceil(nBaud / 32.)) * nCode * 4
211
211
212 if fClock is None and deltaHeight is not None:
212 if fClock is None and deltaHeight is not None:
213 self.fClock = 0.15 / (deltaHeight * 1e-6)
213 self.fClock = 0.15 / (deltaHeight * 1e-6)
214 self.radarControllerHeaderObj.fClock = self.fClock
214 self.radarControllerHeaderObj.fClock = self.fClock
215 if numTaus==0:
215 if numTaus==0:
216 self.radarControllerHeaderObj.Taus = numpy.array(0,'<f4')
216 self.radarControllerHeaderObj.Taus = numpy.array(0,'<f4')
217 else:
217 else:
218 self.radarControllerHeaderObj.Taus = numpy.array(Taus,'<f4')
218 self.radarControllerHeaderObj.Taus = numpy.array(Taus,'<f4')
219
219
220 def set_PH(self, dtype=0, blockSize=0, profilesPerBlock=0,
220 def set_PH(self, dtype=0, blockSize=0, profilesPerBlock=0,
221 dataBlocksPerFile=0, nWindows=0, processFlags=0, nCohInt=0,
221 dataBlocksPerFile=0, nWindows=0, processFlags=0, nCohInt=0,
222 nIncohInt=0, totalSpectra=0, nHeights=0, firstHeight=0,
222 nIncohInt=0, totalSpectra=0, nHeights=0, firstHeight=0,
223 deltaHeight=0, samplesWin=0, spectraComb=0, nCode=0,
223 deltaHeight=0, samplesWin=0, spectraComb=0, nCode=0,
224 code=0, nBaud=None, shif_fft=False, flag_dc=False,
224 code=0, nBaud=None, shif_fft=False, flag_dc=False,
225 flag_cspc=False, flag_decode=False, flag_deflip=False):
225 flag_cspc=False, flag_decode=False, flag_deflip=False):
226
226
227 self.processingHeaderObj.dtype = dtype
227 self.processingHeaderObj.dtype = dtype
228 self.processingHeaderObj.profilesPerBlock = profilesPerBlock
228 self.processingHeaderObj.profilesPerBlock = profilesPerBlock
229 self.processingHeaderObj.dataBlocksPerFile = dataBlocksPerFile
229 self.processingHeaderObj.dataBlocksPerFile = dataBlocksPerFile
230 self.processingHeaderObj.nWindows = nWindows
230 self.processingHeaderObj.nWindows = nWindows
231 self.processingHeaderObj.processFlags = processFlags
231 self.processingHeaderObj.processFlags = processFlags
232 self.processingHeaderObj.nCohInt = nCohInt
232 self.processingHeaderObj.nCohInt = nCohInt
233 self.processingHeaderObj.nIncohInt = nIncohInt
233 self.processingHeaderObj.nIncohInt = nIncohInt
234 self.processingHeaderObj.totalSpectra = totalSpectra
234 self.processingHeaderObj.totalSpectra = totalSpectra
235
235
236 self.processingHeaderObj.nHeights = int(nHeights)
236 self.processingHeaderObj.nHeights = int(nHeights)
237 self.processingHeaderObj.firstHeight = firstHeight#numpy.array([firstHeight])#firstHeight
237 self.processingHeaderObj.firstHeight = firstHeight#numpy.array([firstHeight])#firstHeight
238 self.processingHeaderObj.deltaHeight = deltaHeight#numpy.array([deltaHeight])#deltaHeight
238 self.processingHeaderObj.deltaHeight = deltaHeight#numpy.array([deltaHeight])#deltaHeight
239 self.processingHeaderObj.samplesWin = nHeights#numpy.array([nHeights])#nHeights
239 self.processingHeaderObj.samplesWin = nHeights#numpy.array([nHeights])#nHeights
240
240
241 def set_BH(self, utc = 0, miliSecond = 0, timeZone = 0):
241 def set_BH(self, utc = 0, miliSecond = 0, timeZone = 0):
242 self.basicHeaderObj.utc = utc
242 self.basicHeaderObj.utc = utc
243 self.basicHeaderObj.miliSecond = miliSecond
243 self.basicHeaderObj.miliSecond = miliSecond
244 self.basicHeaderObj.timeZone = timeZone
244 self.basicHeaderObj.timeZone = timeZone
245
245
246 def set_SH(self, nSamples=0, nProfiles=0, nChannels=0, adcResolution=14, pciDioBusWidth=32):
246 def set_SH(self, nSamples=0, nProfiles=0, nChannels=0, adcResolution=14, pciDioBusWidth=32):
247 #self.systemHeaderObj.size = size
247 #self.systemHeaderObj.size = size
248 self.systemHeaderObj.nSamples = nSamples
248 self.systemHeaderObj.nSamples = nSamples
249 self.systemHeaderObj.nProfiles = nProfiles
249 self.systemHeaderObj.nProfiles = nProfiles
250 self.systemHeaderObj.nChannels = nChannels
250 self.systemHeaderObj.nChannels = nChannels
251 self.systemHeaderObj.adcResolution = adcResolution
251 self.systemHeaderObj.adcResolution = adcResolution
252 self.systemHeaderObj.pciDioBusWidth = pciDioBusWidth
252 self.systemHeaderObj.pciDioBusWidth = pciDioBusWidth
253
253
254 def init_acquisition(self):
254 def init_acquisition(self):
255
255
256 if self.nFFTPoints != 0:
256 if self.nFFTPoints != 0:
257 self.incIntFactor = m_nProfilesperBlock/self.nFFTPoints
257 self.incIntFactor = m_nProfilesperBlock/self.nFFTPoints
258 if (self.FixPP_IncInt > self.incIntFactor):
258 if (self.FixPP_IncInt > self.incIntFactor):
259 self.incIntFactor = self.FixPP_IncInt/ self.incIntFactor
259 self.incIntFactor = self.FixPP_IncInt/ self.incIntFactor
260 elif(self.FixPP_IncInt< self.incIntFactor):
260 elif(self.FixPP_IncInt< self.incIntFactor):
261 print("False alert...")
261 print("False alert...")
262
262
263 ProfilesperBlock = self.processingHeaderObj.profilesPerBlock
263 ProfilesperBlock = self.processingHeaderObj.profilesPerBlock
264
264
265 self.timeperblock =int(((self.FixRCP_IPP
265 self.timeperblock =int(((self.FixRCP_IPP
266 *ProfilesperBlock
266 *ProfilesperBlock
267 *self.FixPP_CohInt
267 *self.FixPP_CohInt
268 *self.incIntFactor)
268 *self.incIntFactor)
269 /150.0)
269 /150.0)
270 *0.9
270 *0.9
271 +0.5)
271 +0.5)
272 # para cada canal
272 # para cada canal
273 self.profiles = ProfilesperBlock*self.FixPP_CohInt
273 self.profiles = ProfilesperBlock*self.FixPP_CohInt
274 self.profiles = ProfilesperBlock
274 self.profiles = ProfilesperBlock
275 self.Reference = int((self.Tau_0-self.AcqH0_0)/(self.AcqDH_0)+0.5)
275 self.Reference = int((self.Tau_0-self.AcqH0_0)/(self.AcqDH_0)+0.5)
276 self.BaudWidth = int((self.FixRCP_TXA/self.AcqDH_0)/self.Bauds + 0.5 )
276 self.BaudWidth = int((self.FixRCP_TXA/self.AcqDH_0)/self.Bauds + 0.5 )
277
277
278 if (self.BaudWidth==0):
278 if (self.BaudWidth==0):
279 self.BaudWidth=1
279 self.BaudWidth=1
280
280
281 def init_pulse(self,Num_Codes=Num_Codes,Bauds=Bauds,BaudWidth=BaudWidth,Dyn_snCode=Dyn_snCode):
281 def init_pulse(self,Num_Codes=Num_Codes,Bauds=Bauds,BaudWidth=BaudWidth,Dyn_snCode=Dyn_snCode):
282
282
283 Num_Codes = Num_Codes
283 Num_Codes = Num_Codes
284 Bauds = Bauds
284 Bauds = Bauds
285 BaudWidth = BaudWidth
285 BaudWidth = BaudWidth
286 Dyn_snCode = Dyn_snCode
286 Dyn_snCode = Dyn_snCode
287
287
288 if Dyn_snCode:
288 if Dyn_snCode:
289 print("EXISTE")
289 print("EXISTE")
290 else:
290 else:
291 print("No existe")
291 print("No existe")
292
292
293 if Dyn_snCode: # if Bauds:
293 if Dyn_snCode: # if Bauds:
294 pulses = list(range(0,Num_Codes))
294 pulses = list(range(0,Num_Codes))
295 num_codes = Num_Codes
295 num_codes = Num_Codes
296 for i in range(num_codes):
296 for i in range(num_codes):
297 pulse_size = Bauds*BaudWidth
297 pulse_size = Bauds*BaudWidth
298 pulses[i] = numpy.zeros(pulse_size)
298 pulses[i] = numpy.zeros(pulse_size)
299 for j in range(Bauds):
299 for j in range(Bauds):
300 for k in range(BaudWidth):
300 for k in range(BaudWidth):
301 pulses[i][j*BaudWidth+k] = int(Dyn_snCode[i][j]*600)
301 pulses[i][j*BaudWidth+k] = int(Dyn_snCode[i][j]*600)
302 else:
302 else:
303 print("sin code")
303 print("sin code")
304 pulses = list(range(1))
304 pulses = list(range(1))
305 if self.AcqDH_0>0.149:
305 if self.AcqDH_0>0.149:
306 pulse_size = int(self.FixRCP_TXB/0.15+0.5)
306 pulse_size = int(self.FixRCP_TXB/0.15+0.5)
307 else:
307 else:
308 pulse_size = int((self.FixRCP_TXB/self.AcqDH_0)+0.5) #0.0375
308 pulse_size = int((self.FixRCP_TXB/self.AcqDH_0)+0.5) #0.0375
309 pulses[0] = numpy.ones(pulse_size)
309 pulses[0] = numpy.ones(pulse_size)
310 pulses = 600*pulses[0]
310 pulses = 600*pulses[0]
311
311
312 return pulses,pulse_size
312 return pulses,pulse_size
313
313
314 def jro_GenerateBlockOfData(self,Samples=Samples,DC_level= DC_level,stdev=stdev,
314 def jro_GenerateBlockOfData(self,Samples=Samples,DC_level= DC_level,stdev=stdev,
315 Reference= Reference,pulses= pulses,
315 Reference= Reference,pulses= pulses,
316 Num_Codes= Num_Codes,pulse_size=pulse_size,
316 Num_Codes= Num_Codes,pulse_size=pulse_size,
317 prof_gen= prof_gen,H0 = H0,DH0=DH0,
317 prof_gen= prof_gen,H0 = H0,DH0=DH0,
318 Adoppler=Adoppler,Fdoppler= Fdoppler,Hdoppler=Hdoppler):
318 Adoppler=Adoppler,Fdoppler= Fdoppler,Hdoppler=Hdoppler):
319 Samples = Samples
319 Samples = Samples
320 DC_level = DC_level
320 DC_level = DC_level
321 stdev = stdev
321 stdev = stdev
322 m_nR = Reference
322 m_nR = Reference
323 pulses = pulses
323 pulses = pulses
324 num_codes = Num_Codes
324 num_codes = Num_Codes
325 ps = pulse_size
325 ps = pulse_size
326 prof_gen = prof_gen
326 prof_gen = prof_gen
327 channels = self.channels
327 channels = self.channels
328 H0 = H0
328 H0 = H0
329 DH0 = DH0
329 DH0 = DH0
330 ippSec = self.radarControllerHeaderObj.ippSeconds
330 ippSec = self.radarControllerHeaderObj.ippSeconds
331 Fdoppler = self.Fdoppler
331 Fdoppler = self.Fdoppler
332 Hdoppler = self.Hdoppler
332 Hdoppler = self.Hdoppler
333 Adoppler = self.Adoppler
333 Adoppler = self.Adoppler
334
334
335 self.datablock = numpy.zeros([channels,prof_gen,Samples],dtype= numpy.complex64)
335 self.datablock = numpy.zeros([channels,prof_gen,Samples],dtype= numpy.complex64)
336 for i in range(channels):
336 for i in range(channels):
337 for k in range(prof_gen):
337 for k in range(prof_gen):
338 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·NOISEΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
338 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·NOISEΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
339 Noise_r = numpy.random.normal(DC_level,stdev,Samples)
339 Noise_r = numpy.random.normal(DC_level,stdev,Samples)
340 Noise_i = numpy.random.normal(DC_level,stdev,Samples)
340 Noise_i = numpy.random.normal(DC_level,stdev,Samples)
341 Noise = numpy.zeros(Samples,dtype=complex)
341 Noise = numpy.zeros(Samples,dtype=complex)
342 Noise.real = Noise_r
342 Noise.real = Noise_r
343 Noise.imag = Noise_i
343 Noise.imag = Noise_i
344 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·PULSOSΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
344 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·PULSOSΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
345 Pulso = numpy.zeros(pulse_size,dtype=complex)
345 Pulso = numpy.zeros(pulse_size,dtype=complex)
346 Pulso.real = pulses[k%num_codes]
346 Pulso.real = pulses[k%num_codes]
347 Pulso.imag = pulses[k%num_codes]
347 Pulso.imag = pulses[k%num_codes]
348 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· PULSES+NOISEΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·
348 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· PULSES+NOISEΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·
349 InBuffer = numpy.zeros(Samples,dtype=complex)
349 InBuffer = numpy.zeros(Samples,dtype=complex)
350 InBuffer[m_nR:m_nR+ps] = Pulso
350 InBuffer[m_nR:m_nR+ps] = Pulso
351 InBuffer = InBuffer+Noise
351 InBuffer = InBuffer+Noise
352 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· ANGLE Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
352 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· ANGLE Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
353 InBuffer.real[m_nR:m_nR+ps] = InBuffer.real[m_nR:m_nR+ps]*(math.cos( self.fAngle)*5)
353 InBuffer.real[m_nR:m_nR+ps] = InBuffer.real[m_nR:m_nR+ps]*(math.cos( self.fAngle)*5)
354 InBuffer.imag[m_nR:m_nR+ps] = InBuffer.imag[m_nR:m_nR+ps]*(math.sin( self.fAngle)*5)
354 InBuffer.imag[m_nR:m_nR+ps] = InBuffer.imag[m_nR:m_nR+ps]*(math.sin( self.fAngle)*5)
355 InBuffer=InBuffer
355 InBuffer=InBuffer
356 self.datablock[i][k]= InBuffer
356 self.datablock[i][k]= InBuffer
357
357
358 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·DOPPLER SIGNAL...............................................
358 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·DOPPLER SIGNAL...............................................
359 time_vec = numpy.linspace(0,(prof_gen-1)*ippSec,int(prof_gen))+self.nReadBlocks*ippSec*prof_gen+(self.nReadFiles-1)*ippSec*prof_gen
359 time_vec = numpy.linspace(0,(prof_gen-1)*ippSec,int(prof_gen))+self.nReadBlocks*ippSec*prof_gen+(self.nReadFiles-1)*ippSec*prof_gen
360 fd = Fdoppler #+(600.0/120)*self.nReadBlocks
360 fd = Fdoppler #+(600.0/120)*self.nReadBlocks
361 d_signal = Adoppler*numpy.array(numpy.exp(1.0j*2.0*math.pi*fd*time_vec),dtype=numpy.complex64)
361 d_signal = Adoppler*numpy.array(numpy.exp(1.0j*2.0*math.pi*fd*time_vec),dtype=numpy.complex64)
362 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·SeΓ±al con ancho espectralΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
362 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·SeΓ±al con ancho espectralΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
363 #specw_sig = numpy.linspace(-149,150,300)
363 if prof_gen%2==0:
364 #w = 8
364 min = int(prof_gen/2.0-1.0)
365 #A = 20
365 max = int(prof_gen/2.0)
366 #specw_sig = specw_sig/w
366 else:
367 #specw_sig = numpy.sinc(specw_sig)
367 min = int(prof_gen/2.0)
368 #specw_sig = A*numpy.array(specw_sig,dtype=numpy.complex64)
368 max = int(prof_gen/2.0)
369 specw_sig = numpy.linspace(-min,max,prof_gen)
370 w = 4
371 A = 20
372 specw_sig = specw_sig/w
373 specw_sig = numpy.sinc(specw_sig)
374 specw_sig = A*numpy.array(specw_sig,dtype=numpy.complex64)
369 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· DATABLOCK + DOPPLERΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
375 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· DATABLOCK + DOPPLERΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
370 HD=int(Hdoppler/self.AcqDH_0)
376 HD=int(Hdoppler/self.AcqDH_0)
371 for i in range(12):
377 for i in range(12):
372 self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ d_signal# RESULT
378 self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ d_signal# RESULT
373 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· DATABLOCK + DOPPLER*Sinc(x)Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
379 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· DATABLOCK + DOPPLER*Sinc(x)Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
374 #HD=int(Hdoppler/self.AcqDH_0)
380 HD=int(Hdoppler/self.AcqDH_0)
375 #HD=int(HD/2)
381 HD=int(HD/2)
376 #for i in range(12):
382 for i in range(12):
377 # self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ specw_sig*d_signal# RESULT
383 self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ specw_sig*d_signal# RESULT
378
384
379 def readBlock(self):
385 def readBlock(self):
380
386
381 self.jro_GenerateBlockOfData(Samples= self.samples,DC_level=self.DC_level,
387 self.jro_GenerateBlockOfData(Samples= self.samples,DC_level=self.DC_level,
382 stdev=self.stdev,Reference= self.Reference,
388 stdev=self.stdev,Reference= self.Reference,
383 pulses = self.pulses,Num_Codes=self.Num_Codes,
389 pulses = self.pulses,Num_Codes=self.Num_Codes,
384 pulse_size=self.pulse_size,prof_gen=self.profiles,
390 pulse_size=self.pulse_size,prof_gen=self.profiles,
385 H0=self.H0,DH0=self.DH0)
391 H0=self.H0,DH0=self.DH0)
386
392
387 self.profileIndex = 0
393 self.profileIndex = 0
388 self.flagIsNewFile = 0
394 self.flagIsNewFile = 0
389 self.flagIsNewBlock = 1
395 self.flagIsNewBlock = 1
390 self.nTotalBlocks += 1
396 self.nTotalBlocks += 1
391 self.nReadBlocks += 1
397 self.nReadBlocks += 1
392
398
393 return 1
399 return 1
394
400
395
401
396 def getData(self):
402 def getData(self):
397 if self.flagNoMoreFiles:
403 if self.flagNoMoreFiles:
398 self.dataOut.flagNodata = True
404 self.dataOut.flagNodata = True
399 return 0
405 return 0
400 self.flagDiscontinuousBlock = 0
406 self.flagDiscontinuousBlock = 0
401 self.flagIsNewBlock = 0
407 self.flagIsNewBlock = 0
402 if self.__hasNotDataInBuffer(): # aqui es verdad
408 if self.__hasNotDataInBuffer(): # aqui es verdad
403 if not(self.readNextBlock()): # return 1 y por eso el if not salta a getBasic Header
409 if not(self.readNextBlock()): # return 1 y por eso el if not salta a getBasic Header
404 return 0
410 return 0
405 self.getFirstHeader() # atributo
411 self.getFirstHeader() # atributo
406
412
407 if not self.getByBlock:
413 if not self.getByBlock:
408 self.dataOut.flagDataAsBlock = False
414 self.dataOut.flagDataAsBlock = False
409 self.dataOut.data = self.datablock[:, self.profileIndex, :]
415 self.dataOut.data = self.datablock[:, self.profileIndex, :]
410 self.dataOut.profileIndex = self.profileIndex
416 self.dataOut.profileIndex = self.profileIndex
411 self.profileIndex += 1
417 self.profileIndex += 1
412 else:
418 else:
413 pass
419 pass
414 self.dataOut.flagNoData = False
420 self.dataOut.flagNoData = False
415 self.getBasicHeader()
421 self.getBasicHeader()
416 self.dataOut.realtime = self.online
422 self.dataOut.realtime = self.online
417 return self.dataOut.data
423 return self.dataOut.data
418
424
419
425
420 def setup(self,frequency=49.92e6,incIntFactor= 1, nFFTPoints = 0, FixPP_IncInt=1,FixRCP_IPP=1000,
426 def setup(self,frequency=49.92e6,incIntFactor= 1, nFFTPoints = 0, FixPP_IncInt=1,FixRCP_IPP=1000,
421 FixPP_CohInt= 1,Tau_0= 250,AcqH0_0 = 70 ,AcqDH_0=1.25, Bauds= 32,
427 FixPP_CohInt= 1,Tau_0= 250,AcqH0_0 = 70 ,AcqDH_0=1.25, Bauds= 32,
422 FixRCP_TXA = 40, FixRCP_TXB = 50, fAngle = 2.0*math.pi*(1/16),DC_level= 50,
428 FixRCP_TXA = 40, FixRCP_TXB = 50, fAngle = 2.0*math.pi*(1/16),DC_level= 50,
423 stdev= 8,Num_Codes = 1 , Dyn_snCode = None, samples=200,
429 stdev= 8,Num_Codes = 1 , Dyn_snCode = None, samples=200,
424 channels=2,Fdoppler=20,Hdoppler=36,Adoppler=500,nTotalReadFiles=10000,
430 channels=2,Fdoppler=20,Hdoppler=36,Adoppler=500,
431 profilesPerBlock=300,dataBlocksPerFile=120,nTotalReadFiles=10000,
425 **kwargs):
432 **kwargs):
426
433
427 self.set_kwargs(**kwargs)
434 self.set_kwargs(**kwargs)
428 self.nReadBlocks = 0
435 self.nReadBlocks = 0
429 self.nReadFiles = 1
436 self.nReadFiles = 1
430 print('------------------- [Opening file: ] ------------------------------',self.nReadFiles)
437 print('------------------- [Opening file: ] ------------------------------',self.nReadFiles)
431
438
432 tmp = time.time()
439 tmp = time.time()
433 tmp_utc = int(tmp)
440 tmp_utc = int(tmp)
434 tmp_milisecond = int((tmp-tmp_utc)*1000)
441 tmp_milisecond = int((tmp-tmp_utc)*1000)
435 print(" SETUP -basicHeaderObj.utc",datetime.datetime.utcfromtimestamp(tmp))
442 print(" SETUP -basicHeaderObj.utc",datetime.datetime.utcfromtimestamp(tmp))
436 if Dyn_snCode is None:
443 if Dyn_snCode is None:
437 Num_Codes=1
444 Num_Codes=1
438 Bauds =1
445 Bauds =1
439
446
440
447
441
448
442 self.set_BH(utc= tmp_utc,miliSecond= tmp_milisecond,timeZone=300 )
449 self.set_BH(utc= tmp_utc,miliSecond= tmp_milisecond,timeZone=300 )
443 self.set_RCH( expType=0, nTx=150,ipp=FixRCP_IPP, txA=FixRCP_TXA, txB= FixRCP_TXB,
450 self.set_RCH( expType=0, nTx=150,ipp=FixRCP_IPP, txA=FixRCP_TXA, txB= FixRCP_TXB,
444 nWindows=1 , nHeights=samples, firstHeight=AcqH0_0, deltaHeight=AcqDH_0,
451 nWindows=1 , nHeights=samples, firstHeight=AcqH0_0, deltaHeight=AcqDH_0,
445 numTaus=1, line6Function=0, line5Function=0, fClock=None,
452 numTaus=1, line6Function=0, line5Function=0, fClock=None,
446 prePulseBefore=0, prePulseAfter=0,
453 prePulseBefore=0, prePulseAfter=0,
447 codeType=0, nCode=Num_Codes, nBaud=32, code=Dyn_snCode,
454 codeType=0, nCode=Num_Codes, nBaud=32, code=Dyn_snCode,
448 flip1=0, flip2=0,Taus=Tau_0)
455 flip1=0, flip2=0,Taus=Tau_0)
449
456
450 self.set_PH(dtype=0, blockSize=0, profilesPerBlock=300,
457 self.set_PH(dtype=0, blockSize=0, profilesPerBlock=profilesPerBlock,
451 dataBlocksPerFile=120, nWindows=1, processFlags=numpy.array([1024]), nCohInt=1,
458 dataBlocksPerFile=dataBlocksPerFile, nWindows=1, processFlags=numpy.array([1024]), nCohInt=1,
452 nIncohInt=1, totalSpectra=0, nHeights=samples, firstHeight=AcqH0_0,
459 nIncohInt=1, totalSpectra=0, nHeights=samples, firstHeight=AcqH0_0,
453 deltaHeight=AcqDH_0, samplesWin=samples, spectraComb=0, nCode=0,
460 deltaHeight=AcqDH_0, samplesWin=samples, spectraComb=0, nCode=0,
454 code=0, nBaud=None, shif_fft=False, flag_dc=False,
461 code=0, nBaud=None, shif_fft=False, flag_dc=False,
455 flag_cspc=False, flag_decode=False, flag_deflip=False)
462 flag_cspc=False, flag_decode=False, flag_deflip=False)
456
463
457 self.set_SH(nSamples=samples, nProfiles=300, nChannels=channels)
464 self.set_SH(nSamples=samples, nProfiles=profilesPerBlock, nChannels=channels)
458
465
459 self.readFirstHeader()
466 self.readFirstHeader()
460
467
461 self.frequency = frequency
468 self.frequency = frequency
462 self.incIntFactor = incIntFactor
469 self.incIntFactor = incIntFactor
463 self.nFFTPoints = nFFTPoints
470 self.nFFTPoints = nFFTPoints
464 self.FixPP_IncInt = FixPP_IncInt
471 self.FixPP_IncInt = FixPP_IncInt
465 self.FixRCP_IPP = FixRCP_IPP
472 self.FixRCP_IPP = FixRCP_IPP
466 self.FixPP_CohInt = FixPP_CohInt
473 self.FixPP_CohInt = FixPP_CohInt
467 self.Tau_0 = Tau_0
474 self.Tau_0 = Tau_0
468 self.AcqH0_0 = AcqH0_0
475 self.AcqH0_0 = AcqH0_0
469 self.H0 = AcqH0_0
476 self.H0 = AcqH0_0
470 self.AcqDH_0 = AcqDH_0
477 self.AcqDH_0 = AcqDH_0
471 self.DH0 = AcqDH_0
478 self.DH0 = AcqDH_0
472 self.Bauds = Bauds
479 self.Bauds = Bauds
473 self.FixRCP_TXA = FixRCP_TXA
480 self.FixRCP_TXA = FixRCP_TXA
474 self.FixRCP_TXB = FixRCP_TXB
481 self.FixRCP_TXB = FixRCP_TXB
475 self.fAngle = fAngle
482 self.fAngle = fAngle
476 self.DC_level = DC_level
483 self.DC_level = DC_level
477 self.stdev = stdev
484 self.stdev = stdev
478 self.Num_Codes = Num_Codes
485 self.Num_Codes = Num_Codes
479 self.Dyn_snCode = Dyn_snCode
486 self.Dyn_snCode = Dyn_snCode
480 self.samples = samples
487 self.samples = samples
481 self.channels = channels
488 self.channels = channels
482 self.profiles = None
489 self.profiles = None
483 self.m_nReference = None
490 self.m_nReference = None
484 self.Baudwidth = None
491 self.Baudwidth = None
485 self.Fdoppler = Fdoppler
492 self.Fdoppler = Fdoppler
486 self.Hdoppler = Hdoppler
493 self.Hdoppler = Hdoppler
487 self.Adoppler = Adoppler
494 self.Adoppler = Adoppler
488 self.nTotalReadFiles = int(nTotalReadFiles)
495 self.nTotalReadFiles = int(nTotalReadFiles)
489
496
490 print("IPP ", self.FixRCP_IPP)
497 print("IPP ", self.FixRCP_IPP)
491 print("Tau_0 ",self.Tau_0)
498 print("Tau_0 ",self.Tau_0)
492 print("AcqH0_0",self.AcqH0_0)
499 print("AcqH0_0",self.AcqH0_0)
493 print("samples,window ",self.samples)
500 print("samples,window ",self.samples)
494 print("AcqDH_0",AcqDH_0)
501 print("AcqDH_0",AcqDH_0)
495 print("FixRCP_TXA",self.FixRCP_TXA)
502 print("FixRCP_TXA",self.FixRCP_TXA)
496 print("FixRCP_TXB",self.FixRCP_TXB)
503 print("FixRCP_TXB",self.FixRCP_TXB)
497 print("Dyn_snCode",Dyn_snCode)
504 print("Dyn_snCode",Dyn_snCode)
498 print("Fdoppler", Fdoppler)
505 print("Fdoppler", Fdoppler)
499 print("Hdoppler",Hdoppler)
506 print("Hdoppler",Hdoppler)
500 print("Vdopplermax",Fdoppler*(3.0e8/self.frequency)/2.0)
507 print("Vdopplermax",Fdoppler*(3.0e8/self.frequency)/2.0)
501 print("nTotalReadFiles", nTotalReadFiles)
508 print("nTotalReadFiles", nTotalReadFiles)
502
509
503 self.init_acquisition()
510 self.init_acquisition()
504 self.pulses,self.pulse_size=self.init_pulse(Num_Codes=self.Num_Codes,Bauds=self.Bauds,BaudWidth=self.BaudWidth,Dyn_snCode=Dyn_snCode)
511 self.pulses,self.pulse_size=self.init_pulse(Num_Codes=self.Num_Codes,Bauds=self.Bauds,BaudWidth=self.BaudWidth,Dyn_snCode=Dyn_snCode)
505 print(" [ END ] - SETUP metodo")
512 print(" [ END ] - SETUP metodo")
506 return
513 return
507
514
508 def run(self,**kwargs): # metodo propio
515 def run(self,**kwargs): # metodo propio
509 if not(self.isConfig):
516 if not(self.isConfig):
510 self.setup(**kwargs)
517 self.setup(**kwargs)
511 self.isConfig = True
518 self.isConfig = True
512 self.getData()
519 self.getData()
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,1604 +1,1627
1 import sys
1 import sys
2 import numpy,math
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,hildebrand_sekhon
6 from schainpy.utils import log
6 from schainpy.utils import log
7 from time import time
7 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)
16
16
17 self.dataOut = Voltage()
17 self.dataOut = Voltage()
18 self.flip = 1
18 self.flip = 1
19 self.setupReq = False
19 self.setupReq = False
20
20
21 def run(self):
21 def run(self):
22
22
23 if self.dataIn.type == 'AMISR':
23 if self.dataIn.type == 'AMISR':
24 self.__updateObjFromAmisrInput()
24 self.__updateObjFromAmisrInput()
25
25
26 if self.dataIn.type == 'Voltage':
26 if self.dataIn.type == 'Voltage':
27 self.dataOut.copy(self.dataIn)
27 self.dataOut.copy(self.dataIn)
28
28
29 def __updateObjFromAmisrInput(self):
29 def __updateObjFromAmisrInput(self):
30
30
31 self.dataOut.timeZone = self.dataIn.timeZone
31 self.dataOut.timeZone = self.dataIn.timeZone
32 self.dataOut.dstFlag = self.dataIn.dstFlag
32 self.dataOut.dstFlag = self.dataIn.dstFlag
33 self.dataOut.errorCount = self.dataIn.errorCount
33 self.dataOut.errorCount = self.dataIn.errorCount
34 self.dataOut.useLocalTime = self.dataIn.useLocalTime
34 self.dataOut.useLocalTime = self.dataIn.useLocalTime
35
35
36 self.dataOut.flagNoData = self.dataIn.flagNoData
36 self.dataOut.flagNoData = self.dataIn.flagNoData
37 self.dataOut.data = self.dataIn.data
37 self.dataOut.data = self.dataIn.data
38 self.dataOut.utctime = self.dataIn.utctime
38 self.dataOut.utctime = self.dataIn.utctime
39 self.dataOut.channelList = self.dataIn.channelList
39 self.dataOut.channelList = self.dataIn.channelList
40 #self.dataOut.timeInterval = self.dataIn.timeInterval
40 #self.dataOut.timeInterval = self.dataIn.timeInterval
41 self.dataOut.heightList = self.dataIn.heightList
41 self.dataOut.heightList = self.dataIn.heightList
42 self.dataOut.nProfiles = self.dataIn.nProfiles
42 self.dataOut.nProfiles = self.dataIn.nProfiles
43
43
44 self.dataOut.nCohInt = self.dataIn.nCohInt
44 self.dataOut.nCohInt = self.dataIn.nCohInt
45 self.dataOut.ippSeconds = self.dataIn.ippSeconds
45 self.dataOut.ippSeconds = self.dataIn.ippSeconds
46 self.dataOut.frequency = self.dataIn.frequency
46 self.dataOut.frequency = self.dataIn.frequency
47
47
48 self.dataOut.azimuth = self.dataIn.azimuth
48 self.dataOut.azimuth = self.dataIn.azimuth
49 self.dataOut.zenith = self.dataIn.zenith
49 self.dataOut.zenith = self.dataIn.zenith
50
50
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 for channel in channelList:
62 for channel in channelList:
63 if channel not in self.dataOut.channelList:
63 if channel not in self.dataOut.channelList:
64 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)))
65
65
66 index = self.dataOut.channelList.index(channel)
66 index = self.dataOut.channelList.index(channel)
67 channelIndexList.append(index)
67 channelIndexList.append(index)
68 self.selectChannelsByIndex(channelIndexList)
68 self.selectChannelsByIndex(channelIndexList)
69 return self.dataOut
69 return self.dataOut
70
70
71 def selectChannelsByIndex(self, channelIndexList):
71 def selectChannelsByIndex(self, channelIndexList):
72 """
72 """
73 Selecciona un bloque de datos en base a canales segun el channelIndexList
73 Selecciona un bloque de datos en base a canales segun el channelIndexList
74
74
75 Input:
75 Input:
76 channelIndexList : lista sencilla de canales a seleccionar por ej. [2,3,7]
76 channelIndexList : lista sencilla de canales a seleccionar por ej. [2,3,7]
77
77
78 Affected:
78 Affected:
79 self.dataOut.data
79 self.dataOut.data
80 self.dataOut.channelIndexList
80 self.dataOut.channelIndexList
81 self.dataOut.nChannels
81 self.dataOut.nChannels
82 self.dataOut.m_ProcessingHeader.totalSpectra
82 self.dataOut.m_ProcessingHeader.totalSpectra
83 self.dataOut.systemHeaderObj.numChannels
83 self.dataOut.systemHeaderObj.numChannels
84 self.dataOut.m_ProcessingHeader.blockSize
84 self.dataOut.m_ProcessingHeader.blockSize
85
85
86 Return:
86 Return:
87 None
87 None
88 """
88 """
89
89
90 for channelIndex in channelIndexList:
90 for channelIndex in channelIndexList:
91 if channelIndex not in self.dataOut.channelIndexList:
91 if channelIndex not in self.dataOut.channelIndexList:
92 raise ValueError("The value %d in channelIndexList is not valid" %channelIndex)
92 raise ValueError("The value %d in channelIndexList is not valid" %channelIndex)
93
93
94 if self.dataOut.type == 'Voltage':
94 if self.dataOut.type == 'Voltage':
95 if self.dataOut.flagDataAsBlock:
95 if self.dataOut.flagDataAsBlock:
96 """
96 """
97 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
97 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
98 """
98 """
99 data = self.dataOut.data[channelIndexList,:,:]
99 data = self.dataOut.data[channelIndexList,:,:]
100 else:
100 else:
101 data = self.dataOut.data[channelIndexList,:]
101 data = self.dataOut.data[channelIndexList,:]
102
102
103 self.dataOut.data = data
103 self.dataOut.data = data
104 # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
104 # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
105 self.dataOut.channelList = range(len(channelIndexList))
105 self.dataOut.channelList = range(len(channelIndexList))
106
106
107 elif self.dataOut.type == 'Spectra':
107 elif self.dataOut.type == 'Spectra':
108 data_spc = self.dataOut.data_spc[channelIndexList, :]
108 data_spc = self.dataOut.data_spc[channelIndexList, :]
109 data_dc = self.dataOut.data_dc[channelIndexList, :]
109 data_dc = self.dataOut.data_dc[channelIndexList, :]
110
110
111 self.dataOut.data_spc = data_spc
111 self.dataOut.data_spc = data_spc
112 self.dataOut.data_dc = data_dc
112 self.dataOut.data_dc = data_dc
113
113
114 # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
114 # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList]
115 self.dataOut.channelList = range(len(channelIndexList))
115 self.dataOut.channelList = range(len(channelIndexList))
116 self.__selectPairsByChannel(channelIndexList)
116 self.__selectPairsByChannel(channelIndexList)
117
117
118 return 1
118 return 1
119
119
120 def __selectPairsByChannel(self, channelList=None):
120 def __selectPairsByChannel(self, channelList=None):
121
121
122 if channelList == None:
122 if channelList == None:
123 return
123 return
124
124
125 pairsIndexListSelected = []
125 pairsIndexListSelected = []
126 for pairIndex in self.dataOut.pairsIndexList:
126 for pairIndex in self.dataOut.pairsIndexList:
127 # First pair
127 # First pair
128 if self.dataOut.pairsList[pairIndex][0] not in channelList:
128 if self.dataOut.pairsList[pairIndex][0] not in channelList:
129 continue
129 continue
130 # Second pair
130 # Second pair
131 if self.dataOut.pairsList[pairIndex][1] not in channelList:
131 if self.dataOut.pairsList[pairIndex][1] not in channelList:
132 continue
132 continue
133
133
134 pairsIndexListSelected.append(pairIndex)
134 pairsIndexListSelected.append(pairIndex)
135
135
136 if not pairsIndexListSelected:
136 if not pairsIndexListSelected:
137 self.dataOut.data_cspc = None
137 self.dataOut.data_cspc = None
138 self.dataOut.pairsList = []
138 self.dataOut.pairsList = []
139 return
139 return
140
140
141 self.dataOut.data_cspc = self.dataOut.data_cspc[pairsIndexListSelected]
141 self.dataOut.data_cspc = self.dataOut.data_cspc[pairsIndexListSelected]
142 self.dataOut.pairsList = [self.dataOut.pairsList[i]
142 self.dataOut.pairsList = [self.dataOut.pairsList[i]
143 for i in pairsIndexListSelected]
143 for i in pairsIndexListSelected]
144
144
145 return
145 return
146
146
147 class selectHeights(Operation):
147 class selectHeights(Operation):
148
148
149 def run(self, dataOut, minHei=None, maxHei=None):
149 def run(self, dataOut, minHei=None, maxHei=None):
150 """
150 """
151 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
152 minHei <= height <= maxHei
152 minHei <= height <= maxHei
153
153
154 Input:
154 Input:
155 minHei : valor minimo de altura a considerar
155 minHei : valor minimo de altura a considerar
156 maxHei : valor maximo de altura a considerar
156 maxHei : valor maximo de altura a considerar
157
157
158 Affected:
158 Affected:
159 Indirectamente son cambiados varios valores a travez del metodo selectHeightsByIndex
159 Indirectamente son cambiados varios valores a travez del metodo selectHeightsByIndex
160
160
161 Return:
161 Return:
162 1 si el metodo se ejecuto con exito caso contrario devuelve 0
162 1 si el metodo se ejecuto con exito caso contrario devuelve 0
163 """
163 """
164
164
165 self.dataOut = dataOut
165 self.dataOut = dataOut
166
166
167 if minHei == None:
167 if minHei == None:
168 minHei = self.dataOut.heightList[0]
168 minHei = self.dataOut.heightList[0]
169
169
170 if maxHei == None:
170 if maxHei == None:
171 maxHei = self.dataOut.heightList[-1]
171 maxHei = self.dataOut.heightList[-1]
172
172
173 if (minHei < self.dataOut.heightList[0]):
173 if (minHei < self.dataOut.heightList[0]):
174 minHei = self.dataOut.heightList[0]
174 minHei = self.dataOut.heightList[0]
175
175
176 if (maxHei > self.dataOut.heightList[-1]):
176 if (maxHei > self.dataOut.heightList[-1]):
177 maxHei = self.dataOut.heightList[-1]
177 maxHei = self.dataOut.heightList[-1]
178
178
179 minIndex = 0
179 minIndex = 0
180 maxIndex = 0
180 maxIndex = 0
181 heights = self.dataOut.heightList
181 heights = self.dataOut.heightList
182
182
183 inda = numpy.where(heights >= minHei)
183 inda = numpy.where(heights >= minHei)
184 indb = numpy.where(heights <= maxHei)
184 indb = numpy.where(heights <= maxHei)
185
185
186 try:
186 try:
187 minIndex = inda[0][0]
187 minIndex = inda[0][0]
188 except:
188 except:
189 minIndex = 0
189 minIndex = 0
190
190
191 try:
191 try:
192 maxIndex = indb[0][-1]
192 maxIndex = indb[0][-1]
193 except:
193 except:
194 maxIndex = len(heights)
194 maxIndex = len(heights)
195
195
196 self.selectHeightsByIndex(minIndex, maxIndex)
196 self.selectHeightsByIndex(minIndex, maxIndex)
197
197
198 return self.dataOut
198 return self.dataOut
199
199
200 def selectHeightsByIndex(self, minIndex, maxIndex):
200 def selectHeightsByIndex(self, minIndex, maxIndex):
201 """
201 """
202 Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango
202 Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango
203 minIndex <= index <= maxIndex
203 minIndex <= index <= maxIndex
204
204
205 Input:
205 Input:
206 minIndex : valor de indice minimo de altura a considerar
206 minIndex : valor de indice minimo de altura a considerar
207 maxIndex : valor de indice maximo de altura a considerar
207 maxIndex : valor de indice maximo de altura a considerar
208
208
209 Affected:
209 Affected:
210 self.dataOut.data
210 self.dataOut.data
211 self.dataOut.heightList
211 self.dataOut.heightList
212
212
213 Return:
213 Return:
214 1 si el metodo se ejecuto con exito caso contrario devuelve 0
214 1 si el metodo se ejecuto con exito caso contrario devuelve 0
215 """
215 """
216
216
217 if self.dataOut.type == 'Voltage':
217 if self.dataOut.type == 'Voltage':
218 if (minIndex < 0) or (minIndex > maxIndex):
218 if (minIndex < 0) or (minIndex > maxIndex):
219 raise ValueError("Height index range (%d,%d) is not valid" % (minIndex, maxIndex))
219 raise ValueError("Height index range (%d,%d) is not valid" % (minIndex, maxIndex))
220
220
221 if (maxIndex >= self.dataOut.nHeights):
221 if (maxIndex >= self.dataOut.nHeights):
222 maxIndex = self.dataOut.nHeights
222 maxIndex = self.dataOut.nHeights
223
223
224 #voltage
224 #voltage
225 if self.dataOut.flagDataAsBlock:
225 if self.dataOut.flagDataAsBlock:
226 """
226 """
227 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
227 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
228 """
228 """
229 data = self.dataOut.data[:,:, minIndex:maxIndex]
229 data = self.dataOut.data[:,:, minIndex:maxIndex]
230 else:
230 else:
231 data = self.dataOut.data[:, minIndex:maxIndex]
231 data = self.dataOut.data[:, minIndex:maxIndex]
232
232
233 # firstHeight = self.dataOut.heightList[minIndex]
233 # firstHeight = self.dataOut.heightList[minIndex]
234
234
235 self.dataOut.data = data
235 self.dataOut.data = data
236 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex]
236 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex]
237
237
238 if self.dataOut.nHeights <= 1:
238 if self.dataOut.nHeights <= 1:
239 raise ValueError("selectHeights: Too few heights. Current number of heights is %d" %(self.dataOut.nHeights))
239 raise ValueError("selectHeights: Too few heights. Current number of heights is %d" %(self.dataOut.nHeights))
240 elif self.dataOut.type == 'Spectra':
240 elif self.dataOut.type == 'Spectra':
241 if (minIndex < 0) or (minIndex > maxIndex):
241 if (minIndex < 0) or (minIndex > maxIndex):
242 raise ValueError("Error selecting heights: Index range (%d,%d) is not valid" % (
242 raise ValueError("Error selecting heights: Index range (%d,%d) is not valid" % (
243 minIndex, maxIndex))
243 minIndex, maxIndex))
244
244
245 if (maxIndex >= self.dataOut.nHeights):
245 if (maxIndex >= self.dataOut.nHeights):
246 maxIndex = self.dataOut.nHeights - 1
246 maxIndex = self.dataOut.nHeights - 1
247
247
248 # Spectra
248 # Spectra
249 data_spc = self.dataOut.data_spc[:, :, minIndex:maxIndex + 1]
249 data_spc = self.dataOut.data_spc[:, :, minIndex:maxIndex + 1]
250
250
251 data_cspc = None
251 data_cspc = None
252 if self.dataOut.data_cspc is not None:
252 if self.dataOut.data_cspc is not None:
253 data_cspc = self.dataOut.data_cspc[:, :, minIndex:maxIndex + 1]
253 data_cspc = self.dataOut.data_cspc[:, :, minIndex:maxIndex + 1]
254
254
255 data_dc = None
255 data_dc = None
256 if self.dataOut.data_dc is not None:
256 if self.dataOut.data_dc is not None:
257 data_dc = self.dataOut.data_dc[:, minIndex:maxIndex + 1]
257 data_dc = self.dataOut.data_dc[:, minIndex:maxIndex + 1]
258
258
259 self.dataOut.data_spc = data_spc
259 self.dataOut.data_spc = data_spc
260 self.dataOut.data_cspc = data_cspc
260 self.dataOut.data_cspc = data_cspc
261 self.dataOut.data_dc = data_dc
261 self.dataOut.data_dc = data_dc
262
262
263 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex + 1]
263 self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex + 1]
264
264
265 return 1
265 return 1
266
266
267
267
268 class filterByHeights(Operation):
268 class filterByHeights(Operation):
269
269
270 def run(self, dataOut, window):
270 def run(self, dataOut, window):
271
271
272 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
272 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
273
273
274 if window == None:
274 if window == None:
275 window = (dataOut.radarControllerHeaderObj.txA/dataOut.radarControllerHeaderObj.nBaud) / deltaHeight
275 window = (dataOut.radarControllerHeaderObj.txA/dataOut.radarControllerHeaderObj.nBaud) / deltaHeight
276
276
277 newdelta = deltaHeight * window
277 newdelta = deltaHeight * window
278 r = dataOut.nHeights % window
278 r = dataOut.nHeights % window
279 newheights = (dataOut.nHeights-r)/window
279 newheights = (dataOut.nHeights-r)/window
280
280
281 if newheights <= 1:
281 if newheights <= 1:
282 raise ValueError("filterByHeights: Too few heights. Current number of heights is %d and window is %d" %(dataOut.nHeights, window))
282 raise ValueError("filterByHeights: Too few heights. Current number of heights is %d and window is %d" %(dataOut.nHeights, window))
283
283
284 if dataOut.flagDataAsBlock:
284 if dataOut.flagDataAsBlock:
285 """
285 """
286 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
286 Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis]
287 """
287 """
288 buffer = dataOut.data[:, :, 0:int(dataOut.nHeights-r)]
288 buffer = dataOut.data[:, :, 0:int(dataOut.nHeights-r)]
289 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)
290 buffer = numpy.sum(buffer,3)
290 buffer = numpy.sum(buffer,3)
291
291
292 else:
292 else:
293 buffer = dataOut.data[:,0:int(dataOut.nHeights-r)]
293 buffer = dataOut.data[:,0:int(dataOut.nHeights-r)]
294 buffer = buffer.reshape(dataOut.nChannels,int(dataOut.nHeights/window),int(window))
294 buffer = buffer.reshape(dataOut.nChannels,int(dataOut.nHeights/window),int(window))
295 buffer = numpy.sum(buffer,2)
295 buffer = numpy.sum(buffer,2)
296
296
297 dataOut.data = buffer
297 dataOut.data = buffer
298 dataOut.heightList = dataOut.heightList[0] + numpy.arange( newheights )*newdelta
298 dataOut.heightList = dataOut.heightList[0] + numpy.arange( newheights )*newdelta
299 dataOut.windowOfFilter = window
299 dataOut.windowOfFilter = window
300
300
301 return dataOut
301 return dataOut
302
302
303
303
304 class setH0(Operation):
304 class setH0(Operation):
305
305
306 def run(self, dataOut, h0, deltaHeight = None):
306 def run(self, dataOut, h0, deltaHeight = None):
307
307
308 if not deltaHeight:
308 if not deltaHeight:
309 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
309 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
310
310
311 nHeights = dataOut.nHeights
311 nHeights = dataOut.nHeights
312
312
313 newHeiRange = h0 + numpy.arange(nHeights)*deltaHeight
313 newHeiRange = h0 + numpy.arange(nHeights)*deltaHeight
314
314
315 dataOut.heightList = newHeiRange
315 dataOut.heightList = newHeiRange
316
316
317 return dataOut
317 return dataOut
318
318
319
319
320 class deFlip(Operation):
320 class deFlip(Operation):
321
321
322 def run(self, dataOut, channelList = []):
322 def run(self, dataOut, channelList = []):
323
323
324 data = dataOut.data.copy()
324 data = dataOut.data.copy()
325
325
326 if dataOut.flagDataAsBlock:
326 if dataOut.flagDataAsBlock:
327 flip = self.flip
327 flip = self.flip
328 profileList = list(range(dataOut.nProfiles))
328 profileList = list(range(dataOut.nProfiles))
329
329
330 if not channelList:
330 if not channelList:
331 for thisProfile in profileList:
331 for thisProfile in profileList:
332 data[:,thisProfile,:] = data[:,thisProfile,:]*flip
332 data[:,thisProfile,:] = data[:,thisProfile,:]*flip
333 flip *= -1.0
333 flip *= -1.0
334 else:
334 else:
335 for thisChannel in channelList:
335 for thisChannel in channelList:
336 if thisChannel not in dataOut.channelList:
336 if thisChannel not in dataOut.channelList:
337 continue
337 continue
338
338
339 for thisProfile in profileList:
339 for thisProfile in profileList:
340 data[thisChannel,thisProfile,:] = data[thisChannel,thisProfile,:]*flip
340 data[thisChannel,thisProfile,:] = data[thisChannel,thisProfile,:]*flip
341 flip *= -1.0
341 flip *= -1.0
342
342
343 self.flip = flip
343 self.flip = flip
344
344
345 else:
345 else:
346 if not channelList:
346 if not channelList:
347 data[:,:] = data[:,:]*self.flip
347 data[:,:] = data[:,:]*self.flip
348 else:
348 else:
349 for thisChannel in channelList:
349 for thisChannel in channelList:
350 if thisChannel not in dataOut.channelList:
350 if thisChannel not in dataOut.channelList:
351 continue
351 continue
352
352
353 data[thisChannel,:] = data[thisChannel,:]*self.flip
353 data[thisChannel,:] = data[thisChannel,:]*self.flip
354
354
355 self.flip *= -1.
355 self.flip *= -1.
356
356
357 dataOut.data = data
357 dataOut.data = data
358
358
359 return dataOut
359 return dataOut
360
360
361
361
362 class setAttribute(Operation):
362 class setAttribute(Operation):
363 '''
363 '''
364 Set an arbitrary attribute(s) to dataOut
364 Set an arbitrary attribute(s) to dataOut
365 '''
365 '''
366
366
367 def __init__(self):
367 def __init__(self):
368
368
369 Operation.__init__(self)
369 Operation.__init__(self)
370 self._ready = False
370 self._ready = False
371
371
372 def run(self, dataOut, **kwargs):
372 def run(self, dataOut, **kwargs):
373
373
374 for key, value in kwargs.items():
374 for key, value in kwargs.items():
375 setattr(dataOut, key, value)
375 setattr(dataOut, key, value)
376
376
377 return dataOut
377 return dataOut
378
378
379
379
380 @MPDecorator
380 @MPDecorator
381 class printAttribute(Operation):
381 class printAttribute(Operation):
382 '''
382 '''
383 Print an arbitrary attribute of dataOut
383 Print an arbitrary attribute of dataOut
384 '''
384 '''
385
385
386 def __init__(self):
386 def __init__(self):
387
387
388 Operation.__init__(self)
388 Operation.__init__(self)
389
389
390 def run(self, dataOut, attributes):
390 def run(self, dataOut, attributes):
391
391
392 for attr in attributes:
392 for attr in attributes:
393 if hasattr(dataOut, attr):
393 if hasattr(dataOut, attr):
394 log.log(getattr(dataOut, attr), attr)
394 log.log(getattr(dataOut, attr), attr)
395
395
396
396
397 class interpolateHeights(Operation):
397 class interpolateHeights(Operation):
398
398
399 def run(self, dataOut, topLim, botLim):
399 def run(self, dataOut, topLim, botLim):
400 #69 al 72 para julia
400 #69 al 72 para julia
401 #82-84 para meteoros
401 #82-84 para meteoros
402 if len(numpy.shape(dataOut.data))==2:
402 if len(numpy.shape(dataOut.data))==2:
403 sampInterp = (dataOut.data[:,botLim-1] + dataOut.data[:,topLim+1])/2
403 sampInterp = (dataOut.data[:,botLim-1] + dataOut.data[:,topLim+1])/2
404 sampInterp = numpy.transpose(numpy.tile(sampInterp,(topLim-botLim + 1,1)))
404 sampInterp = numpy.transpose(numpy.tile(sampInterp,(topLim-botLim + 1,1)))
405 #dataOut.data[:,botLim:limSup+1] = sampInterp
405 #dataOut.data[:,botLim:limSup+1] = sampInterp
406 dataOut.data[:,botLim:topLim+1] = sampInterp
406 dataOut.data[:,botLim:topLim+1] = sampInterp
407 else:
407 else:
408 nHeights = dataOut.data.shape[2]
408 nHeights = dataOut.data.shape[2]
409 x = numpy.hstack((numpy.arange(botLim),numpy.arange(topLim+1,nHeights)))
409 x = numpy.hstack((numpy.arange(botLim),numpy.arange(topLim+1,nHeights)))
410 y = dataOut.data[:,:,list(range(botLim))+list(range(topLim+1,nHeights))]
410 y = dataOut.data[:,:,list(range(botLim))+list(range(topLim+1,nHeights))]
411 f = interpolate.interp1d(x, y, axis = 2)
411 f = interpolate.interp1d(x, y, axis = 2)
412 xnew = numpy.arange(botLim,topLim+1)
412 xnew = numpy.arange(botLim,topLim+1)
413 ynew = f(xnew)
413 ynew = f(xnew)
414 dataOut.data[:,:,botLim:topLim+1] = ynew
414 dataOut.data[:,:,botLim:topLim+1] = ynew
415
415
416 return dataOut
416 return dataOut
417
417
418
418
419 class CohInt(Operation):
419 class CohInt(Operation):
420
420
421 isConfig = False
421 isConfig = False
422 __profIndex = 0
422 __profIndex = 0
423 __byTime = False
423 __byTime = False
424 __initime = None
424 __initime = None
425 __lastdatatime = None
425 __lastdatatime = None
426 __integrationtime = None
426 __integrationtime = None
427 __buffer = None
427 __buffer = None
428 __bufferStride = []
428 __bufferStride = []
429 __dataReady = False
429 __dataReady = False
430 __profIndexStride = 0
430 __profIndexStride = 0
431 __dataToPutStride = False
431 __dataToPutStride = False
432 n = None
432 n = None
433
433
434 def __init__(self, **kwargs):
434 def __init__(self, **kwargs):
435
435
436 Operation.__init__(self, **kwargs)
436 Operation.__init__(self, **kwargs)
437
437
438 def setup(self, n=None, timeInterval=None, stride=None, overlapping=False, byblock=False):
438 def setup(self, n=None, timeInterval=None, stride=None, overlapping=False, byblock=False):
439 """
439 """
440 Set the parameters of the integration class.
440 Set the parameters of the integration class.
441
441
442 Inputs:
442 Inputs:
443
443
444 n : Number of coherent integrations
444 n : Number of coherent integrations
445 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
445 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
446 overlapping :
446 overlapping :
447 """
447 """
448
448
449 self.__initime = None
449 self.__initime = None
450 self.__lastdatatime = 0
450 self.__lastdatatime = 0
451 self.__buffer = None
451 self.__buffer = None
452 self.__dataReady = False
452 self.__dataReady = False
453 self.byblock = byblock
453 self.byblock = byblock
454 self.stride = stride
454 self.stride = stride
455
455
456 if n == None and timeInterval == None:
456 if n == None and timeInterval == None:
457 raise ValueError("n or timeInterval should be specified ...")
457 raise ValueError("n or timeInterval should be specified ...")
458
458
459 if n != None:
459 if n != None:
460 self.n = n
460 self.n = n
461 self.__byTime = False
461 self.__byTime = False
462 else:
462 else:
463 self.__integrationtime = timeInterval #* 60. #if (type(timeInterval)!=integer) -> change this line
463 self.__integrationtime = timeInterval #* 60. #if (type(timeInterval)!=integer) -> change this line
464 self.n = 9999
464 self.n = 9999
465 self.__byTime = True
465 self.__byTime = True
466
466
467 if overlapping:
467 if overlapping:
468 self.__withOverlapping = True
468 self.__withOverlapping = True
469 self.__buffer = None
469 self.__buffer = None
470 else:
470 else:
471 self.__withOverlapping = False
471 self.__withOverlapping = False
472 self.__buffer = 0
472 self.__buffer = 0
473
473
474 self.__profIndex = 0
474 self.__profIndex = 0
475
475
476 def putData(self, data):
476 def putData(self, data):
477
477
478 """
478 """
479 Add a profile to the __buffer and increase in one the __profileIndex
479 Add a profile to the __buffer and increase in one the __profileIndex
480
480
481 """
481 """
482
482
483 if not self.__withOverlapping:
483 if not self.__withOverlapping:
484 self.__buffer += data.copy()
484 self.__buffer += data.copy()
485 self.__profIndex += 1
485 self.__profIndex += 1
486 return
486 return
487
487
488 #Overlapping data
488 #Overlapping data
489 nChannels, nHeis = data.shape
489 nChannels, nHeis = data.shape
490 data = numpy.reshape(data, (1, nChannels, nHeis))
490 data = numpy.reshape(data, (1, nChannels, nHeis))
491
491
492 #If the buffer is empty then it takes the data value
492 #If the buffer is empty then it takes the data value
493 if self.__buffer is None:
493 if self.__buffer is None:
494 self.__buffer = data
494 self.__buffer = data
495 self.__profIndex += 1
495 self.__profIndex += 1
496 return
496 return
497
497
498 #If the buffer length is lower than n then stakcing the data value
498 #If the buffer length is lower than n then stakcing the data value
499 if self.__profIndex < self.n:
499 if self.__profIndex < self.n:
500 self.__buffer = numpy.vstack((self.__buffer, data))
500 self.__buffer = numpy.vstack((self.__buffer, data))
501 self.__profIndex += 1
501 self.__profIndex += 1
502 return
502 return
503
503
504 #If the buffer length is equal to n then replacing the last buffer value with the data value
504 #If the buffer length is equal to n then replacing the last buffer value with the data value
505 self.__buffer = numpy.roll(self.__buffer, -1, axis=0)
505 self.__buffer = numpy.roll(self.__buffer, -1, axis=0)
506 self.__buffer[self.n-1] = data
506 self.__buffer[self.n-1] = data
507 self.__profIndex = self.n
507 self.__profIndex = self.n
508 return
508 return
509
509
510
510
511 def pushData(self):
511 def pushData(self):
512 """
512 """
513 Return the sum of the last profiles and the profiles used in the sum.
513 Return the sum of the last profiles and the profiles used in the sum.
514
514
515 Affected:
515 Affected:
516
516
517 self.__profileIndex
517 self.__profileIndex
518
518
519 """
519 """
520
520
521 if not self.__withOverlapping:
521 if not self.__withOverlapping:
522 data = self.__buffer
522 data = self.__buffer
523 n = self.__profIndex
523 n = self.__profIndex
524
524
525 self.__buffer = 0
525 self.__buffer = 0
526 self.__profIndex = 0
526 self.__profIndex = 0
527
527
528 return data, n
528 return data, n
529
529
530 #Integration with Overlapping
530 #Integration with Overlapping
531 data = numpy.sum(self.__buffer, axis=0)
531 data = numpy.sum(self.__buffer, axis=0)
532 # print data
532 # print data
533 # raise
533 # raise
534 n = self.__profIndex
534 n = self.__profIndex
535
535
536 return data, n
536 return data, n
537
537
538 def byProfiles(self, data):
538 def byProfiles(self, data):
539
539
540 self.__dataReady = False
540 self.__dataReady = False
541 avgdata = None
541 avgdata = None
542 # n = None
542 # n = None
543 # print data
543 # print data
544 # raise
544 # raise
545 self.putData(data)
545 self.putData(data)
546
546
547 if self.__profIndex == self.n:
547 if self.__profIndex == self.n:
548 avgdata, n = self.pushData()
548 avgdata, n = self.pushData()
549 self.__dataReady = True
549 self.__dataReady = True
550
550
551 return avgdata
551 return avgdata
552
552
553 def byTime(self, data, datatime):
553 def byTime(self, data, datatime):
554
554
555 self.__dataReady = False
555 self.__dataReady = False
556 avgdata = None
556 avgdata = None
557 n = None
557 n = None
558
558
559 self.putData(data)
559 self.putData(data)
560
560
561 if (datatime - self.__initime) >= self.__integrationtime:
561 if (datatime - self.__initime) >= self.__integrationtime:
562 avgdata, n = self.pushData()
562 avgdata, n = self.pushData()
563 self.n = n
563 self.n = n
564 self.__dataReady = True
564 self.__dataReady = True
565
565
566 return avgdata
566 return avgdata
567
567
568 def integrateByStride(self, data, datatime):
568 def integrateByStride(self, data, datatime):
569 # print data
569 # print data
570 if self.__profIndex == 0:
570 if self.__profIndex == 0:
571 self.__buffer = [[data.copy(), datatime]]
571 self.__buffer = [[data.copy(), datatime]]
572 else:
572 else:
573 self.__buffer.append([data.copy(),datatime])
573 self.__buffer.append([data.copy(),datatime])
574 self.__profIndex += 1
574 self.__profIndex += 1
575 self.__dataReady = False
575 self.__dataReady = False
576
576
577 if self.__profIndex == self.n * self.stride :
577 if self.__profIndex == self.n * self.stride :
578 self.__dataToPutStride = True
578 self.__dataToPutStride = True
579 self.__profIndexStride = 0
579 self.__profIndexStride = 0
580 self.__profIndex = 0
580 self.__profIndex = 0
581 self.__bufferStride = []
581 self.__bufferStride = []
582 for i in range(self.stride):
582 for i in range(self.stride):
583 current = self.__buffer[i::self.stride]
583 current = self.__buffer[i::self.stride]
584 data = numpy.sum([t[0] for t in current], axis=0)
584 data = numpy.sum([t[0] for t in current], axis=0)
585 avgdatatime = numpy.average([t[1] for t in current])
585 avgdatatime = numpy.average([t[1] for t in current])
586 # print data
586 # print data
587 self.__bufferStride.append((data, avgdatatime))
587 self.__bufferStride.append((data, avgdatatime))
588
588
589 if self.__dataToPutStride:
589 if self.__dataToPutStride:
590 self.__dataReady = True
590 self.__dataReady = True
591 self.__profIndexStride += 1
591 self.__profIndexStride += 1
592 if self.__profIndexStride == self.stride:
592 if self.__profIndexStride == self.stride:
593 self.__dataToPutStride = False
593 self.__dataToPutStride = False
594 # print self.__bufferStride[self.__profIndexStride - 1]
594 # print self.__bufferStride[self.__profIndexStride - 1]
595 # raise
595 # raise
596 return self.__bufferStride[self.__profIndexStride - 1]
596 return self.__bufferStride[self.__profIndexStride - 1]
597
597
598
598
599 return None, None
599 return None, None
600
600
601 def integrate(self, data, datatime=None):
601 def integrate(self, data, datatime=None):
602
602
603 if self.__initime == None:
603 if self.__initime == None:
604 self.__initime = datatime
604 self.__initime = datatime
605
605
606 if self.__byTime:
606 if self.__byTime:
607 avgdata = self.byTime(data, datatime)
607 avgdata = self.byTime(data, datatime)
608 else:
608 else:
609 avgdata = self.byProfiles(data)
609 avgdata = self.byProfiles(data)
610
610
611
611
612 self.__lastdatatime = datatime
612 self.__lastdatatime = datatime
613
613
614 if avgdata is None:
614 if avgdata is None:
615 return None, None
615 return None, None
616
616
617 avgdatatime = self.__initime
617 avgdatatime = self.__initime
618
618
619 deltatime = datatime - self.__lastdatatime
619 deltatime = datatime - self.__lastdatatime
620
620
621 if not self.__withOverlapping:
621 if not self.__withOverlapping:
622 self.__initime = datatime
622 self.__initime = datatime
623 else:
623 else:
624 self.__initime += deltatime
624 self.__initime += deltatime
625
625
626 return avgdata, avgdatatime
626 return avgdata, avgdatatime
627
627
628 def integrateByBlock(self, dataOut):
628 def integrateByBlock(self, dataOut):
629
629
630 times = int(dataOut.data.shape[1]/self.n)
630 times = int(dataOut.data.shape[1]/self.n)
631 avgdata = numpy.zeros((dataOut.nChannels, times, dataOut.nHeights), dtype=numpy.complex)
631 avgdata = numpy.zeros((dataOut.nChannels, times, dataOut.nHeights), dtype=numpy.complex)
632
632
633 id_min = 0
633 id_min = 0
634 id_max = self.n
634 id_max = self.n
635
635
636 for i in range(times):
636 for i in range(times):
637 junk = dataOut.data[:,id_min:id_max,:]
637 junk = dataOut.data[:,id_min:id_max,:]
638 avgdata[:,i,:] = junk.sum(axis=1)
638 avgdata[:,i,:] = junk.sum(axis=1)
639 id_min += self.n
639 id_min += self.n
640 id_max += self.n
640 id_max += self.n
641
641
642 timeInterval = dataOut.ippSeconds*self.n
642 timeInterval = dataOut.ippSeconds*self.n
643 avgdatatime = (times - 1) * timeInterval + dataOut.utctime
643 avgdatatime = (times - 1) * timeInterval + dataOut.utctime
644 self.__dataReady = True
644 self.__dataReady = True
645 return avgdata, avgdatatime
645 return avgdata, avgdatatime
646
646
647 def run(self, dataOut, n=None, timeInterval=None, stride=None, overlapping=False, byblock=False, **kwargs):
647 def run(self, dataOut, n=None, timeInterval=None, stride=None, overlapping=False, byblock=False, **kwargs):
648
648
649 if not self.isConfig:
649 if not self.isConfig:
650 self.setup(n=n, stride=stride, timeInterval=timeInterval, overlapping=overlapping, byblock=byblock, **kwargs)
650 self.setup(n=n, stride=stride, timeInterval=timeInterval, overlapping=overlapping, byblock=byblock, **kwargs)
651 self.isConfig = True
651 self.isConfig = True
652
652
653 if dataOut.flagDataAsBlock:
653 if dataOut.flagDataAsBlock:
654 """
654 """
655 Si la data es leida por bloques, dimension = [nChannels, nProfiles, nHeis]
655 Si la data es leida por bloques, dimension = [nChannels, nProfiles, nHeis]
656 """
656 """
657 avgdata, avgdatatime = self.integrateByBlock(dataOut)
657 avgdata, avgdatatime = self.integrateByBlock(dataOut)
658 dataOut.nProfiles /= self.n
658 dataOut.nProfiles /= self.n
659 else:
659 else:
660 if stride is None:
660 if stride is None:
661 avgdata, avgdatatime = self.integrate(dataOut.data, dataOut.utctime)
661 avgdata, avgdatatime = self.integrate(dataOut.data, dataOut.utctime)
662 else:
662 else:
663 avgdata, avgdatatime = self.integrateByStride(dataOut.data, dataOut.utctime)
663 avgdata, avgdatatime = self.integrateByStride(dataOut.data, dataOut.utctime)
664
664
665
665
666 # dataOut.timeInterval *= n
666 # dataOut.timeInterval *= n
667 dataOut.flagNoData = True
667 dataOut.flagNoData = True
668
668
669 if self.__dataReady:
669 if self.__dataReady:
670 dataOut.data = avgdata
670 dataOut.data = avgdata
671 if not dataOut.flagCohInt:
671 if not dataOut.flagCohInt:
672 dataOut.nCohInt *= self.n
672 dataOut.nCohInt *= self.n
673 dataOut.flagCohInt = True
673 dataOut.flagCohInt = True
674 dataOut.utctime = avgdatatime
674 dataOut.utctime = avgdatatime
675 # print avgdata, avgdatatime
675 # print avgdata, avgdatatime
676 # raise
676 # raise
677 # dataOut.timeInterval = dataOut.ippSeconds * dataOut.nCohInt
677 # dataOut.timeInterval = dataOut.ippSeconds * dataOut.nCohInt
678 dataOut.flagNoData = False
678 dataOut.flagNoData = False
679 return dataOut
679 return dataOut
680
680
681 class Decoder(Operation):
681 class Decoder(Operation):
682
682
683 isConfig = False
683 isConfig = False
684 __profIndex = 0
684 __profIndex = 0
685
685
686 code = None
686 code = None
687
687
688 nCode = None
688 nCode = None
689 nBaud = None
689 nBaud = None
690
690
691 def __init__(self, **kwargs):
691 def __init__(self, **kwargs):
692
692
693 Operation.__init__(self, **kwargs)
693 Operation.__init__(self, **kwargs)
694
694
695 self.times = None
695 self.times = None
696 self.osamp = None
696 self.osamp = None
697 # self.__setValues = False
697 # self.__setValues = False
698 self.isConfig = False
698 self.isConfig = False
699 self.setupReq = False
699 self.setupReq = False
700 def setup(self, code, osamp, dataOut):
700 def setup(self, code, osamp, dataOut):
701
701
702 self.__profIndex = 0
702 self.__profIndex = 0
703
703
704 self.code = code
704 self.code = code
705
705
706 self.nCode = len(code)
706 self.nCode = len(code)
707 self.nBaud = len(code[0])
707 self.nBaud = len(code[0])
708
708
709 if (osamp != None) and (osamp >1):
709 if (osamp != None) and (osamp >1):
710 self.osamp = osamp
710 self.osamp = osamp
711 self.code = numpy.repeat(code, repeats=self.osamp, axis=1)
711 self.code = numpy.repeat(code, repeats=self.osamp, axis=1)
712 self.nBaud = self.nBaud*self.osamp
712 self.nBaud = self.nBaud*self.osamp
713
713
714 self.__nChannels = dataOut.nChannels
714 self.__nChannels = dataOut.nChannels
715 self.__nProfiles = dataOut.nProfiles
715 self.__nProfiles = dataOut.nProfiles
716 self.__nHeis = dataOut.nHeights
716 self.__nHeis = dataOut.nHeights
717
717
718 if self.__nHeis < self.nBaud:
718 if self.__nHeis < self.nBaud:
719 raise ValueError('Number of heights (%d) should be greater than number of bauds (%d)' %(self.__nHeis, self.nBaud))
719 raise ValueError('Number of heights (%d) should be greater than number of bauds (%d)' %(self.__nHeis, self.nBaud))
720
720
721 #Frequency
721 #Frequency
722 __codeBuffer = numpy.zeros((self.nCode, self.__nHeis), dtype=numpy.complex)
722 __codeBuffer = numpy.zeros((self.nCode, self.__nHeis), dtype=numpy.complex)
723
723
724 __codeBuffer[:,0:self.nBaud] = self.code
724 __codeBuffer[:,0:self.nBaud] = self.code
725
725
726 self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1))
726 self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1))
727
727
728 if dataOut.flagDataAsBlock:
728 if dataOut.flagDataAsBlock:
729
729
730 self.ndatadec = self.__nHeis #- self.nBaud + 1
730 self.ndatadec = self.__nHeis #- self.nBaud + 1
731
731
732 self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex)
732 self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex)
733
733
734 else:
734 else:
735
735
736 #Time
736 #Time
737 self.ndatadec = self.__nHeis #- self.nBaud + 1
737 self.ndatadec = self.__nHeis #- self.nBaud + 1
738
738
739 self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex)
739 self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex)
740
740
741 def __convolutionInFreq(self, data):
741 def __convolutionInFreq(self, data):
742
742
743 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
743 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
744
744
745 fft_data = numpy.fft.fft(data, axis=1)
745 fft_data = numpy.fft.fft(data, axis=1)
746
746
747 conv = fft_data*fft_code
747 conv = fft_data*fft_code
748
748
749 data = numpy.fft.ifft(conv,axis=1)
749 data = numpy.fft.ifft(conv,axis=1)
750
750
751 return data
751 return data
752
752
753 def __convolutionInFreqOpt(self, data):
753 def __convolutionInFreqOpt(self, data):
754
754
755 raise NotImplementedError
755 raise NotImplementedError
756
756
757 def __convolutionInTime(self, data):
757 def __convolutionInTime(self, data):
758
758
759 code = self.code[self.__profIndex]
759 code = self.code[self.__profIndex]
760 for i in range(self.__nChannels):
760 for i in range(self.__nChannels):
761 self.datadecTime[i,:] = numpy.correlate(data[i,:], code, mode='full')[self.nBaud-1:]
761 self.datadecTime[i,:] = numpy.correlate(data[i,:], code, mode='full')[self.nBaud-1:]
762
762
763 return self.datadecTime
763 return self.datadecTime
764
764
765 def __convolutionByBlockInTime(self, data):
765 def __convolutionByBlockInTime(self, data):
766
766
767 repetitions = int(self.__nProfiles / self.nCode)
767 repetitions = int(self.__nProfiles / self.nCode)
768 junk = numpy.lib.stride_tricks.as_strided(self.code, (repetitions, self.code.size), (0, self.code.itemsize))
768 junk = numpy.lib.stride_tricks.as_strided(self.code, (repetitions, self.code.size), (0, self.code.itemsize))
769 junk = junk.flatten()
769 junk = junk.flatten()
770 code_block = numpy.reshape(junk, (self.nCode*repetitions, self.nBaud))
770 code_block = numpy.reshape(junk, (self.nCode*repetitions, self.nBaud))
771 profilesList = range(self.__nProfiles)
771 profilesList = range(self.__nProfiles)
772
772
773 for i in range(self.__nChannels):
773 for i in range(self.__nChannels):
774 for j in profilesList:
774 for j in profilesList:
775 self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='full')[self.nBaud-1:]
775 self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='full')[self.nBaud-1:]
776 return self.datadecTime
776 return self.datadecTime
777
777
778 def __convolutionByBlockInFreq(self, data):
778 def __convolutionByBlockInFreq(self, data):
779
779
780 raise NotImplementedError("Decoder by frequency fro Blocks not implemented")
780 raise NotImplementedError("Decoder by frequency fro Blocks not implemented")
781
781
782
782
783 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
783 fft_code = self.fft_code[self.__profIndex].reshape(1,-1)
784
784
785 fft_data = numpy.fft.fft(data, axis=2)
785 fft_data = numpy.fft.fft(data, axis=2)
786
786
787 conv = fft_data*fft_code
787 conv = fft_data*fft_code
788
788
789 data = numpy.fft.ifft(conv,axis=2)
789 data = numpy.fft.ifft(conv,axis=2)
790
790
791 return data
791 return data
792
792
793
793
794 def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, osamp=None, times=None):
794 def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, osamp=None, times=None):
795
795
796 if dataOut.flagDecodeData:
796 if dataOut.flagDecodeData:
797 print("This data is already decoded, recoding again ...")
797 print("This data is already decoded, recoding again ...")
798
798
799 if not self.isConfig:
799 if not self.isConfig:
800
800
801 if code is None:
801 if code is None:
802 if dataOut.code is None:
802 if dataOut.code is None:
803 raise ValueError("Code could not be read from %s instance. Enter a value in Code parameter" %dataOut.type)
803 raise ValueError("Code could not be read from %s instance. Enter a value in Code parameter" %dataOut.type)
804
804
805 code = dataOut.code
805 code = dataOut.code
806 else:
806 else:
807 code = numpy.array(code).reshape(nCode,nBaud)
807 code = numpy.array(code).reshape(nCode,nBaud)
808 self.setup(code, osamp, dataOut)
808 self.setup(code, osamp, dataOut)
809
809
810 self.isConfig = True
810 self.isConfig = True
811
811
812 if mode == 3:
812 if mode == 3:
813 sys.stderr.write("Decoder Warning: mode=%d is not valid, using mode=0\n" %mode)
813 sys.stderr.write("Decoder Warning: mode=%d is not valid, using mode=0\n" %mode)
814
814
815 if times != None:
815 if times != None:
816 sys.stderr.write("Decoder Warning: Argument 'times' in not used anymore\n")
816 sys.stderr.write("Decoder Warning: Argument 'times' in not used anymore\n")
817
817
818 if self.code is None:
818 if self.code is None:
819 print("Fail decoding: Code is not defined.")
819 print("Fail decoding: Code is not defined.")
820 return
820 return
821
821
822 self.__nProfiles = dataOut.nProfiles
822 self.__nProfiles = dataOut.nProfiles
823 datadec = None
823 datadec = None
824
824
825 if mode == 3:
825 if mode == 3:
826 mode = 0
826 mode = 0
827
827
828 if dataOut.flagDataAsBlock:
828 if dataOut.flagDataAsBlock:
829 """
829 """
830 Decoding when data have been read as block,
830 Decoding when data have been read as block,
831 """
831 """
832
832
833 if mode == 0:
833 if mode == 0:
834 datadec = self.__convolutionByBlockInTime(dataOut.data)
834 datadec = self.__convolutionByBlockInTime(dataOut.data)
835 if mode == 1:
835 if mode == 1:
836 datadec = self.__convolutionByBlockInFreq(dataOut.data)
836 datadec = self.__convolutionByBlockInFreq(dataOut.data)
837 else:
837 else:
838 """
838 """
839 Decoding when data have been read profile by profile
839 Decoding when data have been read profile by profile
840 """
840 """
841 if mode == 0:
841 if mode == 0:
842 datadec = self.__convolutionInTime(dataOut.data)
842 datadec = self.__convolutionInTime(dataOut.data)
843
843
844 if mode == 1:
844 if mode == 1:
845 datadec = self.__convolutionInFreq(dataOut.data)
845 datadec = self.__convolutionInFreq(dataOut.data)
846
846
847 if mode == 2:
847 if mode == 2:
848 datadec = self.__convolutionInFreqOpt(dataOut.data)
848 datadec = self.__convolutionInFreqOpt(dataOut.data)
849
849
850 if datadec is None:
850 if datadec is None:
851 raise ValueError("Codification mode selected is not valid: mode=%d. Try selecting 0 or 1" %mode)
851 raise ValueError("Codification mode selected is not valid: mode=%d. Try selecting 0 or 1" %mode)
852
852
853 dataOut.code = self.code
853 dataOut.code = self.code
854 dataOut.nCode = self.nCode
854 dataOut.nCode = self.nCode
855 dataOut.nBaud = self.nBaud
855 dataOut.nBaud = self.nBaud
856
856
857 dataOut.data = datadec
857 dataOut.data = datadec
858
858
859 dataOut.heightList = dataOut.heightList[0:datadec.shape[-1]]
859 dataOut.heightList = dataOut.heightList[0:datadec.shape[-1]]
860
860
861 dataOut.flagDecodeData = True #asumo q la data esta decodificada
861 dataOut.flagDecodeData = True #asumo q la data esta decodificada
862
862
863 if self.__profIndex == self.nCode-1:
863 if self.__profIndex == self.nCode-1:
864 self.__profIndex = 0
864 self.__profIndex = 0
865 return dataOut
865 return dataOut
866
866
867 self.__profIndex += 1
867 self.__profIndex += 1
868
868
869 return dataOut
869 return dataOut
870 # dataOut.flagDeflipData = True #asumo q la data no esta sin flip
870 # dataOut.flagDeflipData = True #asumo q la data no esta sin flip
871
871
872
872
873 class ProfileConcat(Operation):
873 class ProfileConcat(Operation):
874
874
875 isConfig = False
875 isConfig = False
876 buffer = None
876 buffer = None
877
877
878 def __init__(self, **kwargs):
878 def __init__(self, **kwargs):
879
879
880 Operation.__init__(self, **kwargs)
880 Operation.__init__(self, **kwargs)
881 self.profileIndex = 0
881 self.profileIndex = 0
882
882
883 def reset(self):
883 def reset(self):
884 self.buffer = numpy.zeros_like(self.buffer)
884 self.buffer = numpy.zeros_like(self.buffer)
885 self.start_index = 0
885 self.start_index = 0
886 self.times = 1
886 self.times = 1
887
887
888 def setup(self, data, m, n=1):
888 def setup(self, data, m, n=1):
889 self.buffer = numpy.zeros((data.shape[0],data.shape[1]*m),dtype=type(data[0,0]))
889 self.buffer = numpy.zeros((data.shape[0],data.shape[1]*m),dtype=type(data[0,0]))
890 self.nHeights = data.shape[1]#.nHeights
890 self.nHeights = data.shape[1]#.nHeights
891 self.start_index = 0
891 self.start_index = 0
892 self.times = 1
892 self.times = 1
893
893
894 def concat(self, data):
894 def concat(self, data):
895
895
896 self.buffer[:,self.start_index:self.nHeights*self.times] = data.copy()
896 self.buffer[:,self.start_index:self.nHeights*self.times] = data.copy()
897 self.start_index = self.start_index + self.nHeights
897 self.start_index = self.start_index + self.nHeights
898
898
899 def run(self, dataOut, m):
899 def run(self, dataOut, m):
900 dataOut.flagNoData = True
900 dataOut.flagNoData = True
901
901
902 if not self.isConfig:
902 if not self.isConfig:
903 self.setup(dataOut.data, m, 1)
903 self.setup(dataOut.data, m, 1)
904 self.isConfig = True
904 self.isConfig = True
905
905
906 if dataOut.flagDataAsBlock:
906 if dataOut.flagDataAsBlock:
907 raise ValueError("ProfileConcat can only be used when voltage have been read profile by profile, getBlock = False")
907 raise ValueError("ProfileConcat can only be used when voltage have been read profile by profile, getBlock = False")
908
908
909 else:
909 else:
910 self.concat(dataOut.data)
910 self.concat(dataOut.data)
911 self.times += 1
911 self.times += 1
912 if self.times > m:
912 if self.times > m:
913 dataOut.data = self.buffer
913 dataOut.data = self.buffer
914 self.reset()
914 self.reset()
915 dataOut.flagNoData = False
915 dataOut.flagNoData = False
916 # se deben actualizar mas propiedades del header y del objeto dataOut, por ejemplo, las alturas
916 # se deben actualizar mas propiedades del header y del objeto dataOut, por ejemplo, las alturas
917 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
917 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
918 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * m
918 xf = dataOut.heightList[0] + dataOut.nHeights * deltaHeight * m
919 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
919 dataOut.heightList = numpy.arange(dataOut.heightList[0], xf, deltaHeight)
920 dataOut.ippSeconds *= m
920 dataOut.ippSeconds *= m
921 return dataOut
921 return dataOut
922
922
923 class ProfileSelector(Operation):
923 class ProfileSelector(Operation):
924
924
925 profileIndex = None
925 profileIndex = None
926 # Tamanho total de los perfiles
926 # Tamanho total de los perfiles
927 nProfiles = None
927 nProfiles = None
928
928
929 def __init__(self, **kwargs):
929 def __init__(self, **kwargs):
930
930
931 Operation.__init__(self, **kwargs)
931 Operation.__init__(self, **kwargs)
932 self.profileIndex = 0
932 self.profileIndex = 0
933
933
934 def incProfileIndex(self):
934 def incProfileIndex(self):
935
935
936 self.profileIndex += 1
936 self.profileIndex += 1
937
937
938 if self.profileIndex >= self.nProfiles:
938 if self.profileIndex >= self.nProfiles:
939 self.profileIndex = 0
939 self.profileIndex = 0
940
940
941 def isThisProfileInRange(self, profileIndex, minIndex, maxIndex):
941 def isThisProfileInRange(self, profileIndex, minIndex, maxIndex):
942
942
943 if profileIndex < minIndex:
943 if profileIndex < minIndex:
944 return False
944 return False
945
945
946 if profileIndex > maxIndex:
946 if profileIndex > maxIndex:
947 return False
947 return False
948
948
949 return True
949 return True
950
950
951 def isThisProfileInList(self, profileIndex, profileList):
951 def isThisProfileInList(self, profileIndex, profileList):
952
952
953 if profileIndex not in profileList:
953 if profileIndex not in profileList:
954 return False
954 return False
955
955
956 return True
956 return True
957
957
958 def run(self, dataOut, profileList=None, profileRangeList=None, beam=None, byblock=False, rangeList = None, nProfiles=None):
958 def run(self, dataOut, profileList=None, profileRangeList=None, beam=None, byblock=False, rangeList = None, nProfiles=None):
959
959
960 """
960 """
961 ProfileSelector:
961 ProfileSelector:
962
962
963 Inputs:
963 Inputs:
964 profileList : Index of profiles selected. Example: profileList = (0,1,2,7,8)
964 profileList : Index of profiles selected. Example: profileList = (0,1,2,7,8)
965
965
966 profileRangeList : Minimum and maximum profile indexes. Example: profileRangeList = (4, 30)
966 profileRangeList : Minimum and maximum profile indexes. Example: profileRangeList = (4, 30)
967
967
968 rangeList : List of profile ranges. Example: rangeList = ((4, 30), (32, 64), (128, 256))
968 rangeList : List of profile ranges. Example: rangeList = ((4, 30), (32, 64), (128, 256))
969
969
970 """
970 """
971
971
972 if rangeList is not None:
972 if rangeList is not None:
973 if type(rangeList[0]) not in (tuple, list):
973 if type(rangeList[0]) not in (tuple, list):
974 rangeList = [rangeList]
974 rangeList = [rangeList]
975
975
976 dataOut.flagNoData = True
976 dataOut.flagNoData = True
977
977
978 if dataOut.flagDataAsBlock:
978 if dataOut.flagDataAsBlock:
979 """
979 """
980 data dimension = [nChannels, nProfiles, nHeis]
980 data dimension = [nChannels, nProfiles, nHeis]
981 """
981 """
982 if profileList != None:
982 if profileList != None:
983 dataOut.data = dataOut.data[:,profileList,:]
983 dataOut.data = dataOut.data[:,profileList,:]
984
984
985 if profileRangeList != None:
985 if profileRangeList != None:
986 minIndex = profileRangeList[0]
986 minIndex = profileRangeList[0]
987 maxIndex = profileRangeList[1]
987 maxIndex = profileRangeList[1]
988 profileList = list(range(minIndex, maxIndex+1))
988 profileList = list(range(minIndex, maxIndex+1))
989
989
990 dataOut.data = dataOut.data[:,minIndex:maxIndex+1,:]
990 dataOut.data = dataOut.data[:,minIndex:maxIndex+1,:]
991
991
992 if rangeList != None:
992 if rangeList != None:
993
993
994 profileList = []
994 profileList = []
995
995
996 for thisRange in rangeList:
996 for thisRange in rangeList:
997 minIndex = thisRange[0]
997 minIndex = thisRange[0]
998 maxIndex = thisRange[1]
998 maxIndex = thisRange[1]
999
999
1000 profileList.extend(list(range(minIndex, maxIndex+1)))
1000 profileList.extend(list(range(minIndex, maxIndex+1)))
1001
1001
1002 dataOut.data = dataOut.data[:,profileList,:]
1002 dataOut.data = dataOut.data[:,profileList,:]
1003
1003
1004 dataOut.nProfiles = len(profileList)
1004 dataOut.nProfiles = len(profileList)
1005 dataOut.profileIndex = dataOut.nProfiles - 1
1005 dataOut.profileIndex = dataOut.nProfiles - 1
1006 dataOut.flagNoData = False
1006 dataOut.flagNoData = False
1007
1007
1008 return dataOut
1008 return dataOut
1009
1009
1010 """
1010 """
1011 data dimension = [nChannels, nHeis]
1011 data dimension = [nChannels, nHeis]
1012 """
1012 """
1013
1013
1014 if profileList != None:
1014 if profileList != None:
1015
1015
1016 if self.isThisProfileInList(dataOut.profileIndex, profileList):
1016 if self.isThisProfileInList(dataOut.profileIndex, profileList):
1017
1017
1018 self.nProfiles = len(profileList)
1018 self.nProfiles = len(profileList)
1019 dataOut.nProfiles = self.nProfiles
1019 dataOut.nProfiles = self.nProfiles
1020 dataOut.profileIndex = self.profileIndex
1020 dataOut.profileIndex = self.profileIndex
1021 dataOut.flagNoData = False
1021 dataOut.flagNoData = False
1022
1022
1023 self.incProfileIndex()
1023 self.incProfileIndex()
1024 return dataOut
1024 return dataOut
1025
1025
1026 if profileRangeList != None:
1026 if profileRangeList != None:
1027
1027
1028 minIndex = profileRangeList[0]
1028 minIndex = profileRangeList[0]
1029 maxIndex = profileRangeList[1]
1029 maxIndex = profileRangeList[1]
1030
1030
1031 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
1031 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
1032
1032
1033 self.nProfiles = maxIndex - minIndex + 1
1033 self.nProfiles = maxIndex - minIndex + 1
1034 dataOut.nProfiles = self.nProfiles
1034 dataOut.nProfiles = self.nProfiles
1035 dataOut.profileIndex = self.profileIndex
1035 dataOut.profileIndex = self.profileIndex
1036 dataOut.flagNoData = False
1036 dataOut.flagNoData = False
1037
1037
1038 self.incProfileIndex()
1038 self.incProfileIndex()
1039 return dataOut
1039 return dataOut
1040
1040
1041 if rangeList != None:
1041 if rangeList != None:
1042
1042
1043 nProfiles = 0
1043 nProfiles = 0
1044
1044
1045 for thisRange in rangeList:
1045 for thisRange in rangeList:
1046 minIndex = thisRange[0]
1046 minIndex = thisRange[0]
1047 maxIndex = thisRange[1]
1047 maxIndex = thisRange[1]
1048
1048
1049 nProfiles += maxIndex - minIndex + 1
1049 nProfiles += maxIndex - minIndex + 1
1050
1050
1051 for thisRange in rangeList:
1051 for thisRange in rangeList:
1052
1052
1053 minIndex = thisRange[0]
1053 minIndex = thisRange[0]
1054 maxIndex = thisRange[1]
1054 maxIndex = thisRange[1]
1055
1055
1056 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
1056 if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex):
1057
1057
1058 self.nProfiles = nProfiles
1058 self.nProfiles = nProfiles
1059 dataOut.nProfiles = self.nProfiles
1059 dataOut.nProfiles = self.nProfiles
1060 dataOut.profileIndex = self.profileIndex
1060 dataOut.profileIndex = self.profileIndex
1061 dataOut.flagNoData = False
1061 dataOut.flagNoData = False
1062
1062
1063 self.incProfileIndex()
1063 self.incProfileIndex()
1064
1064
1065 break
1065 break
1066
1066
1067 return dataOut
1067 return dataOut
1068
1068
1069
1069
1070 if beam != None: #beam is only for AMISR data
1070 if beam != None: #beam is only for AMISR data
1071 if self.isThisProfileInList(dataOut.profileIndex, dataOut.beamRangeDict[beam]):
1071 if self.isThisProfileInList(dataOut.profileIndex, dataOut.beamRangeDict[beam]):
1072 dataOut.flagNoData = False
1072 dataOut.flagNoData = False
1073 dataOut.profileIndex = self.profileIndex
1073 dataOut.profileIndex = self.profileIndex
1074
1074
1075 self.incProfileIndex()
1075 self.incProfileIndex()
1076
1076
1077 return dataOut
1077 return dataOut
1078
1078
1079 raise ValueError("ProfileSelector needs profileList, profileRangeList or rangeList parameter")
1079 raise ValueError("ProfileSelector needs profileList, profileRangeList or rangeList parameter")
1080
1080
1081
1081
1082 class Reshaper(Operation):
1082 class Reshaper(Operation):
1083
1083
1084 def __init__(self, **kwargs):
1084 def __init__(self, **kwargs):
1085
1085
1086 Operation.__init__(self, **kwargs)
1086 Operation.__init__(self, **kwargs)
1087
1087
1088 self.__buffer = None
1088 self.__buffer = None
1089 self.__nitems = 0
1089 self.__nitems = 0
1090
1090
1091 def __appendProfile(self, dataOut, nTxs):
1091 def __appendProfile(self, dataOut, nTxs):
1092
1092
1093 if self.__buffer is None:
1093 if self.__buffer is None:
1094 shape = (dataOut.nChannels, int(dataOut.nHeights/nTxs) )
1094 shape = (dataOut.nChannels, int(dataOut.nHeights/nTxs) )
1095 self.__buffer = numpy.empty(shape, dtype = dataOut.data.dtype)
1095 self.__buffer = numpy.empty(shape, dtype = dataOut.data.dtype)
1096
1096
1097 ini = dataOut.nHeights * self.__nitems
1097 ini = dataOut.nHeights * self.__nitems
1098 end = ini + dataOut.nHeights
1098 end = ini + dataOut.nHeights
1099
1099
1100 self.__buffer[:, ini:end] = dataOut.data
1100 self.__buffer[:, ini:end] = dataOut.data
1101
1101
1102 self.__nitems += 1
1102 self.__nitems += 1
1103
1103
1104 return int(self.__nitems*nTxs)
1104 return int(self.__nitems*nTxs)
1105
1105
1106 def __getBuffer(self):
1106 def __getBuffer(self):
1107
1107
1108 if self.__nitems == int(1./self.__nTxs):
1108 if self.__nitems == int(1./self.__nTxs):
1109
1109
1110 self.__nitems = 0
1110 self.__nitems = 0
1111
1111
1112 return self.__buffer.copy()
1112 return self.__buffer.copy()
1113
1113
1114 return None
1114 return None
1115
1115
1116 def __checkInputs(self, dataOut, shape, nTxs):
1116 def __checkInputs(self, dataOut, shape, nTxs):
1117
1117
1118 if shape is None and nTxs is None:
1118 if shape is None and nTxs is None:
1119 raise ValueError("Reshaper: shape of factor should be defined")
1119 raise ValueError("Reshaper: shape of factor should be defined")
1120
1120
1121 if nTxs:
1121 if nTxs:
1122 if nTxs < 0:
1122 if nTxs < 0:
1123 raise ValueError("nTxs should be greater than 0")
1123 raise ValueError("nTxs should be greater than 0")
1124
1124
1125 if nTxs < 1 and dataOut.nProfiles % (1./nTxs) != 0:
1125 if nTxs < 1 and dataOut.nProfiles % (1./nTxs) != 0:
1126 raise ValueError("nProfiles= %d is not divisibled by (1./nTxs) = %f" %(dataOut.nProfiles, (1./nTxs)))
1126 raise ValueError("nProfiles= %d is not divisibled by (1./nTxs) = %f" %(dataOut.nProfiles, (1./nTxs)))
1127
1127
1128 shape = [dataOut.nChannels, dataOut.nProfiles*nTxs, dataOut.nHeights/nTxs]
1128 shape = [dataOut.nChannels, dataOut.nProfiles*nTxs, dataOut.nHeights/nTxs]
1129
1129
1130 return shape, nTxs
1130 return shape, nTxs
1131
1131
1132 if len(shape) != 2 and len(shape) != 3:
1132 if len(shape) != 2 and len(shape) != 3:
1133 raise ValueError("shape dimension should be equal to 2 or 3. shape = (nProfiles, nHeis) or (nChannels, nProfiles, nHeis). Actually shape = (%d, %d, %d)" %(dataOut.nChannels, dataOut.nProfiles, dataOut.nHeights))
1133 raise ValueError("shape dimension should be equal to 2 or 3. shape = (nProfiles, nHeis) or (nChannels, nProfiles, nHeis). Actually shape = (%d, %d, %d)" %(dataOut.nChannels, dataOut.nProfiles, dataOut.nHeights))
1134
1134
1135 if len(shape) == 2:
1135 if len(shape) == 2:
1136 shape_tuple = [dataOut.nChannels]
1136 shape_tuple = [dataOut.nChannels]
1137 shape_tuple.extend(shape)
1137 shape_tuple.extend(shape)
1138 else:
1138 else:
1139 shape_tuple = list(shape)
1139 shape_tuple = list(shape)
1140
1140
1141 nTxs = 1.0*shape_tuple[1]/dataOut.nProfiles
1141 nTxs = 1.0*shape_tuple[1]/dataOut.nProfiles
1142
1142
1143 return shape_tuple, nTxs
1143 return shape_tuple, nTxs
1144
1144
1145 def run(self, dataOut, shape=None, nTxs=None):
1145 def run(self, dataOut, shape=None, nTxs=None):
1146
1146
1147 shape_tuple, self.__nTxs = self.__checkInputs(dataOut, shape, nTxs)
1147 shape_tuple, self.__nTxs = self.__checkInputs(dataOut, shape, nTxs)
1148
1148
1149 dataOut.flagNoData = True
1149 dataOut.flagNoData = True
1150 profileIndex = None
1150 profileIndex = None
1151
1151
1152 if dataOut.flagDataAsBlock:
1152 if dataOut.flagDataAsBlock:
1153
1153
1154 dataOut.data = numpy.reshape(dataOut.data, shape_tuple)
1154 dataOut.data = numpy.reshape(dataOut.data, shape_tuple)
1155 dataOut.flagNoData = False
1155 dataOut.flagNoData = False
1156
1156
1157 profileIndex = int(dataOut.nProfiles*self.__nTxs) - 1
1157 profileIndex = int(dataOut.nProfiles*self.__nTxs) - 1
1158
1158
1159 else:
1159 else:
1160
1160
1161 if self.__nTxs < 1:
1161 if self.__nTxs < 1:
1162
1162
1163 self.__appendProfile(dataOut, self.__nTxs)
1163 self.__appendProfile(dataOut, self.__nTxs)
1164 new_data = self.__getBuffer()
1164 new_data = self.__getBuffer()
1165
1165
1166 if new_data is not None:
1166 if new_data is not None:
1167 dataOut.data = new_data
1167 dataOut.data = new_data
1168 dataOut.flagNoData = False
1168 dataOut.flagNoData = False
1169
1169
1170 profileIndex = dataOut.profileIndex*nTxs
1170 profileIndex = dataOut.profileIndex*nTxs
1171
1171
1172 else:
1172 else:
1173 raise ValueError("nTxs should be greater than 0 and lower than 1, or use VoltageReader(..., getblock=True)")
1173 raise ValueError("nTxs should be greater than 0 and lower than 1, or use VoltageReader(..., getblock=True)")
1174
1174
1175 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1175 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1176
1176
1177 dataOut.heightList = numpy.arange(dataOut.nHeights/self.__nTxs) * deltaHeight + dataOut.heightList[0]
1177 dataOut.heightList = numpy.arange(dataOut.nHeights/self.__nTxs) * deltaHeight + dataOut.heightList[0]
1178
1178
1179 dataOut.nProfiles = int(dataOut.nProfiles*self.__nTxs)
1179 dataOut.nProfiles = int(dataOut.nProfiles*self.__nTxs)
1180
1180
1181 dataOut.profileIndex = profileIndex
1181 dataOut.profileIndex = profileIndex
1182
1182
1183 dataOut.ippSeconds /= self.__nTxs
1183 dataOut.ippSeconds /= self.__nTxs
1184
1184
1185 return dataOut
1185 return dataOut
1186
1186
1187 class SplitProfiles(Operation):
1187 class SplitProfiles(Operation):
1188
1188
1189 def __init__(self, **kwargs):
1189 def __init__(self, **kwargs):
1190
1190
1191 Operation.__init__(self, **kwargs)
1191 Operation.__init__(self, **kwargs)
1192
1192
1193 def run(self, dataOut, n):
1193 def run(self, dataOut, n):
1194
1194
1195 dataOut.flagNoData = True
1195 dataOut.flagNoData = True
1196 profileIndex = None
1196 profileIndex = None
1197
1197
1198 if dataOut.flagDataAsBlock:
1198 if dataOut.flagDataAsBlock:
1199
1199
1200 #nchannels, nprofiles, nsamples
1200 #nchannels, nprofiles, nsamples
1201 shape = dataOut.data.shape
1201 shape = dataOut.data.shape
1202
1202
1203 if shape[2] % n != 0:
1203 if shape[2] % n != 0:
1204 raise ValueError("Could not split the data, n=%d has to be multiple of %d" %(n, shape[2]))
1204 raise ValueError("Could not split the data, n=%d has to be multiple of %d" %(n, shape[2]))
1205
1205
1206 new_shape = shape[0], shape[1]*n, int(shape[2]/n)
1206 new_shape = shape[0], shape[1]*n, int(shape[2]/n)
1207
1207
1208 dataOut.data = numpy.reshape(dataOut.data, new_shape)
1208 dataOut.data = numpy.reshape(dataOut.data, new_shape)
1209 dataOut.flagNoData = False
1209 dataOut.flagNoData = False
1210
1210
1211 profileIndex = int(dataOut.nProfiles/n) - 1
1211 profileIndex = int(dataOut.nProfiles/n) - 1
1212
1212
1213 else:
1213 else:
1214
1214
1215 raise ValueError("Could not split the data when is read Profile by Profile. Use VoltageReader(..., getblock=True)")
1215 raise ValueError("Could not split the data when is read Profile by Profile. Use VoltageReader(..., getblock=True)")
1216
1216
1217 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1217 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1218
1218
1219 dataOut.heightList = numpy.arange(dataOut.nHeights/n) * deltaHeight + dataOut.heightList[0]
1219 dataOut.heightList = numpy.arange(dataOut.nHeights/n) * deltaHeight + dataOut.heightList[0]
1220
1220
1221 dataOut.nProfiles = int(dataOut.nProfiles*n)
1221 dataOut.nProfiles = int(dataOut.nProfiles*n)
1222
1222
1223 dataOut.profileIndex = profileIndex
1223 dataOut.profileIndex = profileIndex
1224
1224
1225 dataOut.ippSeconds /= n
1225 dataOut.ippSeconds /= n
1226
1226
1227 return dataOut
1227 return dataOut
1228
1228
1229 class CombineProfiles(Operation):
1229 class CombineProfiles(Operation):
1230 def __init__(self, **kwargs):
1230 def __init__(self, **kwargs):
1231
1231
1232 Operation.__init__(self, **kwargs)
1232 Operation.__init__(self, **kwargs)
1233
1233
1234 self.__remData = None
1234 self.__remData = None
1235 self.__profileIndex = 0
1235 self.__profileIndex = 0
1236
1236
1237 def run(self, dataOut, n):
1237 def run(self, dataOut, n):
1238
1238
1239 dataOut.flagNoData = True
1239 dataOut.flagNoData = True
1240 profileIndex = None
1240 profileIndex = None
1241
1241
1242 if dataOut.flagDataAsBlock:
1242 if dataOut.flagDataAsBlock:
1243
1243
1244 #nchannels, nprofiles, nsamples
1244 #nchannels, nprofiles, nsamples
1245 shape = dataOut.data.shape
1245 shape = dataOut.data.shape
1246 new_shape = shape[0], shape[1]/n, shape[2]*n
1246 new_shape = shape[0], shape[1]/n, shape[2]*n
1247
1247
1248 if shape[1] % n != 0:
1248 if shape[1] % n != 0:
1249 raise ValueError("Could not split the data, n=%d has to be multiple of %d" %(n, shape[1]))
1249 raise ValueError("Could not split the data, n=%d has to be multiple of %d" %(n, shape[1]))
1250
1250
1251 dataOut.data = numpy.reshape(dataOut.data, new_shape)
1251 dataOut.data = numpy.reshape(dataOut.data, new_shape)
1252 dataOut.flagNoData = False
1252 dataOut.flagNoData = False
1253
1253
1254 profileIndex = int(dataOut.nProfiles*n) - 1
1254 profileIndex = int(dataOut.nProfiles*n) - 1
1255
1255
1256 else:
1256 else:
1257
1257
1258 #nchannels, nsamples
1258 #nchannels, nsamples
1259 if self.__remData is None:
1259 if self.__remData is None:
1260 newData = dataOut.data
1260 newData = dataOut.data
1261 else:
1261 else:
1262 newData = numpy.concatenate((self.__remData, dataOut.data), axis=1)
1262 newData = numpy.concatenate((self.__remData, dataOut.data), axis=1)
1263
1263
1264 self.__profileIndex += 1
1264 self.__profileIndex += 1
1265
1265
1266 if self.__profileIndex < n:
1266 if self.__profileIndex < n:
1267 self.__remData = newData
1267 self.__remData = newData
1268 #continue
1268 #continue
1269 return
1269 return
1270
1270
1271 self.__profileIndex = 0
1271 self.__profileIndex = 0
1272 self.__remData = None
1272 self.__remData = None
1273
1273
1274 dataOut.data = newData
1274 dataOut.data = newData
1275 dataOut.flagNoData = False
1275 dataOut.flagNoData = False
1276
1276
1277 profileIndex = dataOut.profileIndex/n
1277 profileIndex = dataOut.profileIndex/n
1278
1278
1279
1279
1280 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1280 deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1281
1281
1282 dataOut.heightList = numpy.arange(dataOut.nHeights*n) * deltaHeight + dataOut.heightList[0]
1282 dataOut.heightList = numpy.arange(dataOut.nHeights*n) * deltaHeight + dataOut.heightList[0]
1283
1283
1284 dataOut.nProfiles = int(dataOut.nProfiles/n)
1284 dataOut.nProfiles = int(dataOut.nProfiles/n)
1285
1285
1286 dataOut.profileIndex = profileIndex
1286 dataOut.profileIndex = profileIndex
1287
1287
1288 dataOut.ippSeconds *= n
1288 dataOut.ippSeconds *= n
1289
1289
1290 return dataOut
1290 return dataOut
1291
1291
1292 class PulsePairVoltage(Operation):
1292 class PulsePairVoltage(Operation):
1293 '''
1293 '''
1294 Function PulsePair(Signal Power, Velocity)
1294 Function PulsePair(Signal Power, Velocity)
1295 The real component of Lag[0] provides Intensity Information
1295 The real component of Lag[0] provides Intensity Information
1296 The imag component of Lag[1] Phase provides Velocity Information
1296 The imag component of Lag[1] Phase provides Velocity Information
1297
1297
1298 Configuration Parameters:
1298 Configuration Parameters:
1299 nPRF = Number of Several PRF
1299 nPRF = Number of Several PRF
1300 theta = Degree Azimuth angel Boundaries
1300 theta = Degree Azimuth angel Boundaries
1301
1301
1302 Input:
1302 Input:
1303 self.dataOut
1303 self.dataOut
1304 lag[N]
1304 lag[N]
1305 Affected:
1305 Affected:
1306 self.dataOut.spc
1306 self.dataOut.spc
1307 '''
1307 '''
1308 isConfig = False
1308 isConfig = False
1309 __profIndex = 0
1309 __profIndex = 0
1310 __initime = None
1310 __initime = None
1311 __lastdatatime = None
1311 __lastdatatime = None
1312 __buffer = None
1312 __buffer = None
1313 noise = None
1313 noise = None
1314 __dataReady = False
1314 __dataReady = False
1315 n = None
1315 n = None
1316 __nch = 0
1316 __nch = 0
1317 __nHeis = 0
1317 __nHeis = 0
1318 removeDC = False
1318 removeDC = False
1319 ipp = None
1319 ipp = None
1320 lambda_ = 0
1320 lambda_ = 0
1321
1321
1322 def __init__(self,**kwargs):
1322 def __init__(self,**kwargs):
1323 Operation.__init__(self,**kwargs)
1323 Operation.__init__(self,**kwargs)
1324
1324
1325 def setup(self, dataOut, n = None, removeDC=False):
1325 def setup(self, dataOut, n = None, removeDC=False):
1326 '''
1326 '''
1327 n= Numero de PRF's de entrada
1327 n= Numero de PRF's de entrada
1328 '''
1328 '''
1329 self.__initime = None
1329 self.__initime = None
1330 self.__lastdatatime = 0
1330 self.__lastdatatime = 0
1331 self.__dataReady = False
1331 self.__dataReady = False
1332 self.__buffer = 0
1332 self.__buffer = 0
1333 self.__profIndex = 0
1333 self.__profIndex = 0
1334 self.noise = None
1334 self.noise = None
1335 self.__nch = dataOut.nChannels
1335 self.__nch = dataOut.nChannels
1336 self.__nHeis = dataOut.nHeights
1336 self.__nHeis = dataOut.nHeights
1337 self.removeDC = removeDC
1337 self.removeDC = removeDC
1338 self.lambda_ = 3.0e8/(9345.0e6)
1338 self.lambda_ = 3.0e8/(9345.0e6)
1339 self.ippSec = dataOut.ippSeconds
1339 self.ippSec = dataOut.ippSeconds
1340 self.nCohInt = dataOut.nCohInt
1340 self.nCohInt = dataOut.nCohInt
1341 print("IPPseconds",dataOut.ippSeconds)
1341 print("IPPseconds",dataOut.ippSeconds)
1342
1342
1343 print("ELVALOR DE n es:", n)
1343 print("ELVALOR DE n es:", n)
1344 if n == None:
1344 if n == None:
1345 raise ValueError("n should be specified.")
1345 raise ValueError("n should be specified.")
1346
1346
1347 if n != None:
1347 if n != None:
1348 if n<2:
1348 if n<2:
1349 raise ValueError("n should be greater than 2")
1349 raise ValueError("n should be greater than 2")
1350
1350
1351 self.n = n
1351 self.n = n
1352 self.__nProf = n
1352 self.__nProf = n
1353
1353
1354 self.__buffer = numpy.zeros((dataOut.nChannels,
1354 self.__buffer = numpy.zeros((dataOut.nChannels,
1355 n,
1355 n,
1356 dataOut.nHeights),
1356 dataOut.nHeights),
1357 dtype='complex')
1357 dtype='complex')
1358 #self.noise = numpy.zeros([self.__nch,self.__nHeis])
1359 #for i in range(self.__nch):
1360 # self.noise[i]=dataOut.getNoise(channel=i)
1361
1358
1362 def putData(self,data):
1359 def putData(self,data):
1363 '''
1360 '''
1364 Add a profile to he __buffer and increase in one the __profiel Index
1361 Add a profile to he __buffer and increase in one the __profiel Index
1365 '''
1362 '''
1366 self.__buffer[:,self.__profIndex,:]= data
1363 self.__buffer[:,self.__profIndex,:]= data
1367 self.__profIndex += 1
1364 self.__profIndex += 1
1368 return
1365 return
1369
1366
1370 def pushData(self,dataOut):
1367 def pushData(self,dataOut):
1371 '''
1368 '''
1372 Return the PULSEPAIR and the profiles used in the operation
1369 Return the PULSEPAIR and the profiles used in the operation
1373 Affected : self.__profileIndex
1370 Affected : self.__profileIndex
1374 '''
1371 '''
1372 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Remove DCΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1375 if self.removeDC==True:
1373 if self.removeDC==True:
1376 mean = numpy.mean(self.__buffer,1)
1374 mean = numpy.mean(self.__buffer,1)
1377 tmp = mean.reshape(self.__nch,1,self.__nHeis)
1375 tmp = mean.reshape(self.__nch,1,self.__nHeis)
1378 dc= numpy.tile(tmp,[1,self.__nProf,1])
1376 dc= numpy.tile(tmp,[1,self.__nProf,1])
1379 self.__buffer = self.__buffer - dc
1377 self.__buffer = self.__buffer - dc
1378 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Calculo de Potencia Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1379 pair0 = self.__buffer*numpy.conj(self.__buffer)
1380 pair0 = pair0.real
1381 lag_0 = numpy.sum(pair0,1)
1382 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Calculo de Ruido x canalΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1383 self.noise = numpy.zeros(self.__nch)
1384 for i in range(self.__nch):
1385 daux = numpy.sort(pair0[i,:,:],axis= None)
1386 self.noise[i]=hildebrand_sekhon( daux ,self.nCohInt)
1387
1388 self.noise = self.noise.reshape(self.__nch,1)
1389 self.noise = numpy.tile(self.noise,[1,self.__nHeis])
1390 noise_buffer = self.noise.reshape(self.__nch,1,self.__nHeis)
1391 noise_buffer = numpy.tile(noise_buffer,[1,self.__nProf,1])
1392 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Potencia recibida= P , Potencia senal = S , Ruido= NΒ·Β·
1393 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· P= S+N ,P=lag_0/N Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1394 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Power Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1395 data_power = lag_0/(self.n*self.nCohInt)
1396 #------------------ Senal Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1397 data_intensity = pair0 - noise_buffer
1398 data_intensity = numpy.sum(data_intensity,axis=1)*(self.n*self.nCohInt)#*self.nCohInt)
1399 #data_intensity = (lag_0-self.noise*self.n)*(self.n*self.nCohInt)
1400 for i in range(self.__nch):
1401 for j in range(self.__nHeis):
1402 if data_intensity[i][j] < 0:
1403 data_intensity[i][j] = numpy.min(numpy.absolute(data_intensity[i][j]))
1380
1404
1381 lag_0 = numpy.sum(self.__buffer*numpy.conj(self.__buffer),1)
1405 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Calculo de Frecuencia y Velocidad dopplerΒ·Β·Β·Β·Β·Β·Β·Β·
1382 data_intensity = lag_0/(self.n*self.nCohInt)#*self.nCohInt)
1383
1384 pair1 = self.__buffer[:,:-1,:]*numpy.conjugate(self.__buffer[:,1:,:])
1406 pair1 = self.__buffer[:,:-1,:]*numpy.conjugate(self.__buffer[:,1:,:])
1385 lag_1 = numpy.sum(pair1,1)
1407 lag_1 = numpy.sum(pair1,1)
1386 #angle = numpy.angle(numpy.sum(pair1,1))*180/(math.pi)
1408 data_freq = (-1/(2.0*math.pi*self.ippSec*self.nCohInt))*numpy.angle(lag_1)
1387 data_velocity = (-1.0*self.lambda_/(4*math.pi*self.ippSec))*numpy.angle(lag_1)#self.ippSec*self.nCohInt
1409 data_velocity = (self.lambda_/2.0)*data_freq
1388
1410
1389 self.noise = numpy.zeros([self.__nch,self.__nHeis])
1411 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Potencia promedio estimada de la SenalΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1390 for i in range(self.__nch):
1412 lag_0 = lag_0/self.n
1391 self.noise[i]=dataOut.getNoise(channel=i)
1413 S = lag_0-self.noise
1392
1414
1393 lag_0 = lag_0.real/(self.n)
1415 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Frecuencia Doppler promedio Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1394 lag_1 = lag_1/(self.n-1)
1416 lag_1 = lag_1/(self.n-1)
1395 R1 = numpy.abs(lag_1)
1417 R1 = numpy.abs(lag_1)
1396 S = (lag_0-self.noise)
1397
1418
1419 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Calculo del SNRΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1398 data_snrPP = S/self.noise
1420 data_snrPP = S/self.noise
1399 data_snrPP = numpy.where(data_snrPP<0,1,data_snrPP)
1421 for i in range(self.__nch):
1422 for j in range(self.__nHeis):
1423 if data_snrPP[i][j] < 1.e-20:
1424 data_snrPP[i][j] = 1.e-20
1400
1425
1426 #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Calculo del ancho espectral Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·
1401 L = S/R1
1427 L = S/R1
1402 L = numpy.where(L<0,1,L)
1428 L = numpy.where(L<0,1,L)
1403 L = numpy.log(L)
1429 L = numpy.log(L)
1404
1405 tmp = numpy.sqrt(numpy.absolute(L))
1430 tmp = numpy.sqrt(numpy.absolute(L))
1406
1431 data_specwidth = (self.lambda_/(2*math.sqrt(2)*math.pi*self.ippSec*self.nCohInt))*tmp*numpy.sign(L)
1407 data_specwidth = (self.lambda_/(2*math.sqrt(2)*math.pi*self.ippSec))*tmp*numpy.sign(L)
1408 #data_specwidth = (self.lambda_/(2*math.sqrt(2)*math.pi*self.ippSec))*k
1409 n = self.__profIndex
1432 n = self.__profIndex
1410
1433
1411 self.__buffer = numpy.zeros((self.__nch, self.__nProf,self.__nHeis), dtype='complex')
1434 self.__buffer = numpy.zeros((self.__nch, self.__nProf,self.__nHeis), dtype='complex')
1412 self.__profIndex = 0
1435 self.__profIndex = 0
1413 return data_intensity,data_velocity,data_snrPP,data_specwidth,n
1436 return data_power,data_intensity,data_velocity,data_snrPP,data_specwidth,n
1437
1414
1438
1415 def pulsePairbyProfiles(self,dataOut):
1439 def pulsePairbyProfiles(self,dataOut):
1416
1440
1417 self.__dataReady = False
1441 self.__dataReady = False
1442 data_power = None
1418 data_intensity = None
1443 data_intensity = None
1419 data_velocity = None
1444 data_velocity = None
1420 data_specwidth = None
1445 data_specwidth = None
1421 data_snrPP = None
1446 data_snrPP = None
1422 self.putData(data=dataOut.data)
1447 self.putData(data=dataOut.data)
1423 if self.__profIndex == self.n:
1448 if self.__profIndex == self.n:
1424 #self.noise = numpy.zeros([self.__nch,self.__nHeis])
1449 data_power,data_intensity, data_velocity,data_snrPP,data_specwidth, n = self.pushData(dataOut=dataOut)
1425 #for i in range(self.__nch):
1426 # self.noise[i]=data.getNoise(channel=i)
1427 #print(self.noise.shape)
1428 data_intensity, data_velocity,data_snrPP,data_specwidth, n = self.pushData(dataOut=dataOut)
1429 self.__dataReady = True
1450 self.__dataReady = True
1430
1451
1431 return data_intensity, data_velocity,data_snrPP,data_specwidth
1452 return data_power, data_intensity, data_velocity, data_snrPP, data_specwidth
1453
1432
1454
1433 def pulsePairOp(self, dataOut, datatime= None):
1455 def pulsePairOp(self, dataOut, datatime= None):
1434
1456
1435 if self.__initime == None:
1457 if self.__initime == None:
1436 self.__initime = datatime
1458 self.__initime = datatime
1437 #print("hola")
1459 data_power, data_intensity, data_velocity, data_snrPP, data_specwidth = self.pulsePairbyProfiles(dataOut)
1438 data_intensity, data_velocity,data_snrPP,data_specwidth = self.pulsePairbyProfiles(dataOut)
1439 self.__lastdatatime = datatime
1460 self.__lastdatatime = datatime
1440
1461
1441 if data_intensity is None:
1462 if data_power is None:
1442 return None, None,None,None,None
1463 return None, None, None,None,None,None
1443
1464
1444 avgdatatime = self.__initime
1465 avgdatatime = self.__initime
1445 deltatime = datatime - self.__lastdatatime
1466 deltatime = datatime - self.__lastdatatime
1446 self.__initime = datatime
1467 self.__initime = datatime
1447
1468
1448 return data_intensity, data_velocity,data_snrPP,data_specwidth,avgdatatime
1469 return data_power, data_intensity, data_velocity, data_snrPP, data_specwidth, avgdatatime
1449
1470
1450 def run(self, dataOut,n = None,removeDC= False, overlapping= False,**kwargs):
1471 def run(self, dataOut,n = None,removeDC= False, overlapping= False,**kwargs):
1451
1472
1452 if not self.isConfig:
1473 if not self.isConfig:
1453 self.setup(dataOut = dataOut, n = n , removeDC=removeDC , **kwargs)
1474 self.setup(dataOut = dataOut, n = n , removeDC=removeDC , **kwargs)
1454 self.isConfig = True
1475 self.isConfig = True
1455 data_intensity, data_velocity,data_snrPP,data_specwidth, avgdatatime = self.pulsePairOp(dataOut, dataOut.utctime)
1476 data_power, data_intensity, data_velocity,data_snrPP,data_specwidth, avgdatatime = self.pulsePairOp(dataOut, dataOut.utctime)
1456 dataOut.flagNoData = True
1477 dataOut.flagNoData = True
1457
1478
1458 if self.__dataReady:
1479 if self.__dataReady:
1459 dataOut.nCohInt *= self.n
1480 dataOut.nCohInt *= self.n
1460 dataOut.data_intensity = data_intensity #valor para intensidad
1481 dataOut.dataPP_POW = data_intensity # S
1461 dataOut.data_velocity = data_velocity #valor para velocidad
1482 dataOut.dataPP_POWER = data_power # P
1462 dataOut.data_snrPP = data_snrPP # valor para snr
1483 dataOut.dataPP_DOP = data_velocity
1463 dataOut.data_specwidth = data_specwidth
1484 dataOut.dataPP_SNR = data_snrPP
1485 dataOut.dataPP_WIDTH = data_specwidth
1464 dataOut.PRFbyAngle = self.n #numero de PRF*cada angulo rotado que equivale a un tiempo.
1486 dataOut.PRFbyAngle = self.n #numero de PRF*cada angulo rotado que equivale a un tiempo.
1465 dataOut.utctime = avgdatatime
1487 dataOut.utctime = avgdatatime
1466 dataOut.flagNoData = False
1488 dataOut.flagNoData = False
1467 return dataOut
1489 return dataOut
1468
1490
1469
1491
1492
1470 # import collections
1493 # import collections
1471 # from scipy.stats import mode
1494 # from scipy.stats import mode
1472 #
1495 #
1473 # class Synchronize(Operation):
1496 # class Synchronize(Operation):
1474 #
1497 #
1475 # isConfig = False
1498 # isConfig = False
1476 # __profIndex = 0
1499 # __profIndex = 0
1477 #
1500 #
1478 # def __init__(self, **kwargs):
1501 # def __init__(self, **kwargs):
1479 #
1502 #
1480 # Operation.__init__(self, **kwargs)
1503 # Operation.__init__(self, **kwargs)
1481 # # self.isConfig = False
1504 # # self.isConfig = False
1482 # self.__powBuffer = None
1505 # self.__powBuffer = None
1483 # self.__startIndex = 0
1506 # self.__startIndex = 0
1484 # self.__pulseFound = False
1507 # self.__pulseFound = False
1485 #
1508 #
1486 # def __findTxPulse(self, dataOut, channel=0, pulse_with = None):
1509 # def __findTxPulse(self, dataOut, channel=0, pulse_with = None):
1487 #
1510 #
1488 # #Read data
1511 # #Read data
1489 #
1512 #
1490 # powerdB = dataOut.getPower(channel = channel)
1513 # powerdB = dataOut.getPower(channel = channel)
1491 # noisedB = dataOut.getNoise(channel = channel)[0]
1514 # noisedB = dataOut.getNoise(channel = channel)[0]
1492 #
1515 #
1493 # self.__powBuffer.extend(powerdB.flatten())
1516 # self.__powBuffer.extend(powerdB.flatten())
1494 #
1517 #
1495 # dataArray = numpy.array(self.__powBuffer)
1518 # dataArray = numpy.array(self.__powBuffer)
1496 #
1519 #
1497 # filteredPower = numpy.correlate(dataArray, dataArray[0:self.__nSamples], "same")
1520 # filteredPower = numpy.correlate(dataArray, dataArray[0:self.__nSamples], "same")
1498 #
1521 #
1499 # maxValue = numpy.nanmax(filteredPower)
1522 # maxValue = numpy.nanmax(filteredPower)
1500 #
1523 #
1501 # if maxValue < noisedB + 10:
1524 # if maxValue < noisedB + 10:
1502 # #No se encuentra ningun pulso de transmision
1525 # #No se encuentra ningun pulso de transmision
1503 # return None
1526 # return None
1504 #
1527 #
1505 # maxValuesIndex = numpy.where(filteredPower > maxValue - 0.1*abs(maxValue))[0]
1528 # maxValuesIndex = numpy.where(filteredPower > maxValue - 0.1*abs(maxValue))[0]
1506 #
1529 #
1507 # if len(maxValuesIndex) < 2:
1530 # if len(maxValuesIndex) < 2:
1508 # #Solo se encontro un solo pulso de transmision de un baudio, esperando por el siguiente TX
1531 # #Solo se encontro un solo pulso de transmision de un baudio, esperando por el siguiente TX
1509 # return None
1532 # return None
1510 #
1533 #
1511 # phasedMaxValuesIndex = maxValuesIndex - self.__nSamples
1534 # phasedMaxValuesIndex = maxValuesIndex - self.__nSamples
1512 #
1535 #
1513 # #Seleccionar solo valores con un espaciamiento de nSamples
1536 # #Seleccionar solo valores con un espaciamiento de nSamples
1514 # pulseIndex = numpy.intersect1d(maxValuesIndex, phasedMaxValuesIndex)
1537 # pulseIndex = numpy.intersect1d(maxValuesIndex, phasedMaxValuesIndex)
1515 #
1538 #
1516 # if len(pulseIndex) < 2:
1539 # if len(pulseIndex) < 2:
1517 # #Solo se encontro un pulso de transmision con ancho mayor a 1
1540 # #Solo se encontro un pulso de transmision con ancho mayor a 1
1518 # return None
1541 # return None
1519 #
1542 #
1520 # spacing = pulseIndex[1:] - pulseIndex[:-1]
1543 # spacing = pulseIndex[1:] - pulseIndex[:-1]
1521 #
1544 #
1522 # #remover senales que se distancien menos de 10 unidades o muestras
1545 # #remover senales que se distancien menos de 10 unidades o muestras
1523 # #(No deberian existir IPP menor a 10 unidades)
1546 # #(No deberian existir IPP menor a 10 unidades)
1524 #
1547 #
1525 # realIndex = numpy.where(spacing > 10 )[0]
1548 # realIndex = numpy.where(spacing > 10 )[0]
1526 #
1549 #
1527 # if len(realIndex) < 2:
1550 # if len(realIndex) < 2:
1528 # #Solo se encontro un pulso de transmision con ancho mayor a 1
1551 # #Solo se encontro un pulso de transmision con ancho mayor a 1
1529 # return None
1552 # return None
1530 #
1553 #
1531 # #Eliminar pulsos anchos (deja solo la diferencia entre IPPs)
1554 # #Eliminar pulsos anchos (deja solo la diferencia entre IPPs)
1532 # realPulseIndex = pulseIndex[realIndex]
1555 # realPulseIndex = pulseIndex[realIndex]
1533 #
1556 #
1534 # period = mode(realPulseIndex[1:] - realPulseIndex[:-1])[0][0]
1557 # period = mode(realPulseIndex[1:] - realPulseIndex[:-1])[0][0]
1535 #
1558 #
1536 # print "IPP = %d samples" %period
1559 # print "IPP = %d samples" %period
1537 #
1560 #
1538 # self.__newNSamples = dataOut.nHeights #int(period)
1561 # self.__newNSamples = dataOut.nHeights #int(period)
1539 # self.__startIndex = int(realPulseIndex[0])
1562 # self.__startIndex = int(realPulseIndex[0])
1540 #
1563 #
1541 # return 1
1564 # return 1
1542 #
1565 #
1543 #
1566 #
1544 # def setup(self, nSamples, nChannels, buffer_size = 4):
1567 # def setup(self, nSamples, nChannels, buffer_size = 4):
1545 #
1568 #
1546 # self.__powBuffer = collections.deque(numpy.zeros( buffer_size*nSamples,dtype=numpy.float),
1569 # self.__powBuffer = collections.deque(numpy.zeros( buffer_size*nSamples,dtype=numpy.float),
1547 # maxlen = buffer_size*nSamples)
1570 # maxlen = buffer_size*nSamples)
1548 #
1571 #
1549 # bufferList = []
1572 # bufferList = []
1550 #
1573 #
1551 # for i in range(nChannels):
1574 # for i in range(nChannels):
1552 # bufferByChannel = collections.deque(numpy.zeros( buffer_size*nSamples, dtype=numpy.complex) + numpy.NAN,
1575 # bufferByChannel = collections.deque(numpy.zeros( buffer_size*nSamples, dtype=numpy.complex) + numpy.NAN,
1553 # maxlen = buffer_size*nSamples)
1576 # maxlen = buffer_size*nSamples)
1554 #
1577 #
1555 # bufferList.append(bufferByChannel)
1578 # bufferList.append(bufferByChannel)
1556 #
1579 #
1557 # self.__nSamples = nSamples
1580 # self.__nSamples = nSamples
1558 # self.__nChannels = nChannels
1581 # self.__nChannels = nChannels
1559 # self.__bufferList = bufferList
1582 # self.__bufferList = bufferList
1560 #
1583 #
1561 # def run(self, dataOut, channel = 0):
1584 # def run(self, dataOut, channel = 0):
1562 #
1585 #
1563 # if not self.isConfig:
1586 # if not self.isConfig:
1564 # nSamples = dataOut.nHeights
1587 # nSamples = dataOut.nHeights
1565 # nChannels = dataOut.nChannels
1588 # nChannels = dataOut.nChannels
1566 # self.setup(nSamples, nChannels)
1589 # self.setup(nSamples, nChannels)
1567 # self.isConfig = True
1590 # self.isConfig = True
1568 #
1591 #
1569 # #Append new data to internal buffer
1592 # #Append new data to internal buffer
1570 # for thisChannel in range(self.__nChannels):
1593 # for thisChannel in range(self.__nChannels):
1571 # bufferByChannel = self.__bufferList[thisChannel]
1594 # bufferByChannel = self.__bufferList[thisChannel]
1572 # bufferByChannel.extend(dataOut.data[thisChannel])
1595 # bufferByChannel.extend(dataOut.data[thisChannel])
1573 #
1596 #
1574 # if self.__pulseFound:
1597 # if self.__pulseFound:
1575 # self.__startIndex -= self.__nSamples
1598 # self.__startIndex -= self.__nSamples
1576 #
1599 #
1577 # #Finding Tx Pulse
1600 # #Finding Tx Pulse
1578 # if not self.__pulseFound:
1601 # if not self.__pulseFound:
1579 # indexFound = self.__findTxPulse(dataOut, channel)
1602 # indexFound = self.__findTxPulse(dataOut, channel)
1580 #
1603 #
1581 # if indexFound == None:
1604 # if indexFound == None:
1582 # dataOut.flagNoData = True
1605 # dataOut.flagNoData = True
1583 # return
1606 # return
1584 #
1607 #
1585 # self.__arrayBuffer = numpy.zeros((self.__nChannels, self.__newNSamples), dtype = numpy.complex)
1608 # self.__arrayBuffer = numpy.zeros((self.__nChannels, self.__newNSamples), dtype = numpy.complex)
1586 # self.__pulseFound = True
1609 # self.__pulseFound = True
1587 # self.__startIndex = indexFound
1610 # self.__startIndex = indexFound
1588 #
1611 #
1589 # #If pulse was found ...
1612 # #If pulse was found ...
1590 # for thisChannel in range(self.__nChannels):
1613 # for thisChannel in range(self.__nChannels):
1591 # bufferByChannel = self.__bufferList[thisChannel]
1614 # bufferByChannel = self.__bufferList[thisChannel]
1592 # #print self.__startIndex
1615 # #print self.__startIndex
1593 # x = numpy.array(bufferByChannel)
1616 # x = numpy.array(bufferByChannel)
1594 # self.__arrayBuffer[thisChannel] = x[self.__startIndex:self.__startIndex+self.__newNSamples]
1617 # self.__arrayBuffer[thisChannel] = x[self.__startIndex:self.__startIndex+self.__newNSamples]
1595 #
1618 #
1596 # deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1619 # deltaHeight = dataOut.heightList[1] - dataOut.heightList[0]
1597 # dataOut.heightList = numpy.arange(self.__newNSamples)*deltaHeight
1620 # dataOut.heightList = numpy.arange(self.__newNSamples)*deltaHeight
1598 # # dataOut.ippSeconds = (self.__newNSamples / deltaHeight)/1e6
1621 # # dataOut.ippSeconds = (self.__newNSamples / deltaHeight)/1e6
1599 #
1622 #
1600 # dataOut.data = self.__arrayBuffer
1623 # dataOut.data = self.__arrayBuffer
1601 #
1624 #
1602 # self.__startIndex += self.__newNSamples
1625 # self.__startIndex += self.__newNSamples
1603 #
1626 #
1604 # return
1627 # return
@@ -1,49 +1,73
1 import os,sys
1 import os,sys
2 import datetime
2 import datetime
3 import time
3 import time
4 from schainpy.controller import Project
4 from schainpy.controller import Project
5 path = '/home/alex/Downloads/NEW_WR2/spc16removeDC'
5 path = '/home/alex/Downloads/NEW_WR2/spc16removeDC'
6 figpath = path
6 figpath = path
7 desc = "Simulator Test"
7 desc = "Simulator Test"
8
8
9 controllerObj = Project()
9 controllerObj = Project()
10
10
11 controllerObj.setup(id='10',name='Test Simulator',description=desc)
11 controllerObj.setup(id='10',name='Test Simulator',description=desc)
12
12
13 readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader',
13 readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader',
14 frequency=9.345e9,
14 frequency=9.345e9,
15 FixRCP_IPP= 60,
15 FixRCP_IPP= 60,
16 Tau_0 = 30,
16 Tau_0 = 30,
17 AcqH0_0=0,
17 AcqH0_0=0,
18 samples=330,
18 samples=330,
19 AcqDH_0=0.15,
19 AcqDH_0=0.15,
20 FixRCP_TXA=0.15,
20 FixRCP_TXA=0.15,
21 FixRCP_TXB=0.15,
21 FixRCP_TXB=0.15,
22 Fdoppler=600.0,
22 Fdoppler=600.0,
23 Hdoppler=36,
23 Hdoppler=36,
24 Adoppler=300,#300
24 Adoppler=300,#300
25 delay=0,
25 delay=0,
26 online=0,
26 online=0,
27 walk=0,
27 walk=0,
28 nTotalReadFiles=3)
28 profilesPerBlock=625,
29
29 dataBlocksPerFile=100)#,#nTotalReadFiles=2)
30 '''
31 readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader',
32 path=path,
33 startDate="2020/01/01", #"2020/01/01",#today,
34 endDate= "2020/12/01", #"2020/12/30",#today,
35 startTime='00:00:00',
36 endTime='23:59:59',
37 delay=0,
38 #set=0,
39 online=0,
40 walk=1)
41 '''
30 opObj11 = readUnitConfObj.addOperation(name='printInfo')
42 opObj11 = readUnitConfObj.addOperation(name='printInfo')
31
43
32 procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
44 procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId())
33 #opObj11 = procUnitConfObjA.addOperation(name='CohInt', optype='other')
45 #opObj11 = procUnitConfObjA.addOperation(name='CohInt', optype='other')
34 #opObj11.addParameter(name='n', value='10', format='int')
46 #opObj11.addParameter(name='n', value='10', format='int')
35
47
36 #opObj10 = procUnitConfObjA.addOperation(name='selectChannels')
48 #opObj10 = procUnitConfObjA.addOperation(name='selectChannels')
37 #opObj10.addParameter(name='channelList', value=[0])
49 #opObj10.addParameter(name='channelList', value=[0])
38 opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other')
50 opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other')
39 opObj11.addParameter(name='n', value='300', format='int')#10
51 opObj11.addParameter(name='n', value='625', format='int')#10
40 opObj11.addParameter(name='removeDC', value=1, format='int')
52 opObj11.addParameter(name='removeDC', value=1, format='int')
41
53
42 #opObj11 = procUnitConfObjA.addOperation(name='PulsepairPowerPlot', optype='other')
54 #opObj11 = procUnitConfObjA.addOperation(name='PulsepairPowerPlot', optype='other')
55 #opObj11 = procUnitConfObjA.addOperation(name='PulsepairSignalPlot', optype='other')
56
43
57
44 opObj11 = procUnitConfObjA.addOperation(name='PulsepairVelocityPlot', optype='other')
58 #opObj11 = procUnitConfObjA.addOperation(name='PulsepairVelocityPlot', optype='other')
45 #opObj11.addParameter(name='xmax', value=8)
59 #opObj11.addParameter(name='xmax', value=8)
46
60
47 opObj11 = procUnitConfObjA.addOperation(name='PulsepairSpecwidthPlot', optype='other')
61 #opObj11 = procUnitConfObjA.addOperation(name='PulsepairSpecwidthPlot', optype='other')
62
63 procUnitConfObjB= controllerObj.addProcUnit(datatype='ParametersProc',inputId=procUnitConfObjA.getId())
64
65
66 opObj10 = procUnitConfObjB.addOperation(name='ParameterWriter')
67 opObj10.addParameter(name='path',value=figpath)
68 #opObj10.addParameter(name='mode',value=0)
69 opObj10.addParameter(name='blocksPerFile',value='100',format='int')
70 opObj10.addParameter(name='metadataList',value='utctimeInit,timeInterval',format='list')
71 opObj10.addParameter(name='dataList',value='dataPP_POW,dataPP_DOP,dataPP_SNR,dataPP_WIDTH')#,format='list'
48
72
49 controllerObj.start()
73 controllerObj.start()
General Comments 0
You need to be logged in to leave comments. Login now