@@ -0,0 +1,98 | |||||
|
1 | # Byte-compiled / optimized / DLL files | |||
|
2 | __pycache__/ | |||
|
3 | *.py[cod] | |||
|
4 | *$py.class | |||
|
5 | ||||
|
6 | # C extensions | |||
|
7 | *.so | |||
|
8 | ||||
|
9 | # Distribution / packaging | |||
|
10 | .Python | |||
|
11 | env/ | |||
|
12 | build/ | |||
|
13 | develop-eggs/ | |||
|
14 | dist/ | |||
|
15 | downloads/ | |||
|
16 | eggs/ | |||
|
17 | .eggs/ | |||
|
18 | lib/ | |||
|
19 | lib64/ | |||
|
20 | parts/ | |||
|
21 | sdist/ | |||
|
22 | var/ | |||
|
23 | wheels/ | |||
|
24 | *.egg-info/ | |||
|
25 | .installed.cfg | |||
|
26 | *.egg | |||
|
27 | ||||
|
28 | # PyInstaller | |||
|
29 | # Usually these files are written by a python script from a template | |||
|
30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. | |||
|
31 | *.manifest | |||
|
32 | *.spec | |||
|
33 | ||||
|
34 | # Installer logs | |||
|
35 | pip-log.txt | |||
|
36 | pip-delete-this-directory.txt | |||
|
37 | ||||
|
38 | # Unit test / coverage reports | |||
|
39 | htmlcov/ | |||
|
40 | .tox/ | |||
|
41 | .coverage | |||
|
42 | .coverage.* | |||
|
43 | .cache | |||
|
44 | nosetests.xml | |||
|
45 | coverage.xml | |||
|
46 | *,cover | |||
|
47 | .hypothesis/ | |||
|
48 | ||||
|
49 | # Translations | |||
|
50 | *.mo | |||
|
51 | *.pot | |||
|
52 | ||||
|
53 | # Django stuff: | |||
|
54 | *.log | |||
|
55 | local_settings.py | |||
|
56 | ||||
|
57 | # Flask stuff: | |||
|
58 | instance/ | |||
|
59 | .webassets-cache | |||
|
60 | ||||
|
61 | # Scrapy stuff: | |||
|
62 | .scrapy | |||
|
63 | ||||
|
64 | # Sphinx documentation | |||
|
65 | docs/_build/ | |||
|
66 | ||||
|
67 | # PyBuilder | |||
|
68 | target/ | |||
|
69 | ||||
|
70 | # Jupyter Notebook | |||
|
71 | .ipynb_checkpoints | |||
|
72 | ||||
|
73 | # pyenv | |||
|
74 | .python-version | |||
|
75 | ||||
|
76 | # celery beat schedule file | |||
|
77 | celerybeat-schedule | |||
|
78 | ||||
|
79 | # SageMath parsed files | |||
|
80 | *.sage.py | |||
|
81 | ||||
|
82 | # dotenv | |||
|
83 | .env | |||
|
84 | ||||
|
85 | # virtualenv | |||
|
86 | .venv | |||
|
87 | venv/ | |||
|
88 | ENV/ | |||
|
89 | ||||
|
90 | # Spyder project settings | |||
|
91 | .spyderproject | |||
|
92 | .spyproject | |||
|
93 | ||||
|
94 | # Rope project settings | |||
|
95 | .ropeproject | |||
|
96 | ||||
|
97 | # mkdocs documentation | |||
|
98 | /site |
@@ -0,0 +1,42 | |||||
|
1 | #!/usr/bin/env python | |||
|
2 | ''' | |||
|
3 | Created on Jul 7, 2014 | |||
|
4 | ||||
|
5 | @author: roj-idl71 | |||
|
6 | ''' | |||
|
7 | import os, sys | |||
|
8 | ||||
|
9 | from schainpy.controller import Project | |||
|
10 | ||||
|
11 | if __name__ == '__main__': | |||
|
12 | desc = "Segundo Test" | |||
|
13 | ||||
|
14 | controllerObj = Project() | |||
|
15 | controllerObj.setup(id = '191', name='test01', description=desc) | |||
|
16 | ||||
|
17 | proc1 = controllerObj.addProcUnit(name='ReceiverData') | |||
|
18 | # proc1.addParameter(name='server', value='tcp://10.10.10.87:3000', format='str') | |||
|
19 | proc1.addParameter(name='realtime', value='1', format='bool') | |||
|
20 | proc1.addParameter(name='plottypes', value='rti,spc', format='str') | |||
|
21 | ||||
|
22 | op1 = proc1.addOperation(name='PlotRTIData', optype='other') | |||
|
23 | op1.addParameter(name='wintitle', value='Julia 150Km', format='str') | |||
|
24 | ||||
|
25 | op2 = proc1.addOperation(name='PlotSpectraData', optype='other') | |||
|
26 | op2.addParameter(name='wintitle', value='Julia 150Km', format='str') | |||
|
27 | op2.addParameter(name='xaxis', value='velocity', format='str') | |||
|
28 | op2.addParameter(name='showprofile', value='1', format='bool') | |||
|
29 | #op2.addParameter(name='xmin', value='-0.1', format='float') | |||
|
30 | #op2.addParameter(name='xmax', value='0.1', format='float') | |||
|
31 | ||||
|
32 | # op1 = proc1.addOperation(name='PlotPHASEData', optype='other') | |||
|
33 | # op1.addParameter(name='wintitle', value='Julia 150Km', format='str') | |||
|
34 | ||||
|
35 | ||||
|
36 | # proc1 = controllerObj.addProcUnit(name='ReceiverData') | |||
|
37 | # proc1.addParameter(name='server', value='pipe2', format='str') | |||
|
38 | # proc1.addParameter(name='mode', value='buffer', format='str') | |||
|
39 | # proc1.addParameter(name='plottypes', value='snr', format='str') | |||
|
40 | ||||
|
41 | ||||
|
42 | controllerObj.start() |
@@ -283,6 +283,19 class OperationConf(): | |||||
283 |
|
283 | |||
284 | return value |
|
284 | return value | |
285 |
|
285 | |||
|
286 | ||||
|
287 | def getKwargs(self): | |||
|
288 | ||||
|
289 | kwargs = {} | |||
|
290 | ||||
|
291 | for parmConfObj in self.parmConfObjList: | |||
|
292 | if self.name == 'run' and parmConfObj.name == 'datatype': | |||
|
293 | continue | |||
|
294 | ||||
|
295 | kwargs[parmConfObj.name] = parmConfObj.getValue() | |||
|
296 | ||||
|
297 | return kwargs | |||
|
298 | ||||
286 | def setup(self, id, name, priority, type): |
|
299 | def setup(self, id, name, priority, type): | |
287 |
|
300 | |||
288 | self.id = str(id) |
|
301 | self.id = str(id) | |
@@ -383,10 +396,12 class OperationConf(): | |||||
383 |
|
396 | |||
384 | if self.type == 'external' or self.type == 'other': |
|
397 | if self.type == 'external' or self.type == 'other': | |
385 | className = eval(self.name) |
|
398 | className = eval(self.name) | |
386 | opObj = className() |
|
399 | kwargs = self.getKwargs() | |
|
400 | opObj = className(**kwargs) | |||
387 |
|
401 | |||
388 | return opObj |
|
402 | return opObj | |
389 |
|
403 | |||
|
404 | ||||
390 | class ProcUnitConf(): |
|
405 | class ProcUnitConf(): | |
391 |
|
406 | |||
392 | id = None |
|
407 | id = None | |
@@ -586,10 +601,19 class ProcUnitConf(): | |||||
586 | for opConfObj in self.opConfObjList: |
|
601 | for opConfObj in self.opConfObjList: | |
587 | opConfObj.printattr() |
|
602 | opConfObj.printattr() | |
588 |
|
603 | |||
|
604 | ||||
|
605 | def getKwargs(self): | |||
|
606 | ||||
|
607 | opObj = self.opConfObjList[0] | |||
|
608 | kwargs = opObj.getKwargs() | |||
|
609 | ||||
|
610 | return kwargs | |||
|
611 | ||||
589 | def createObjects(self, plotter_queue=None): |
|
612 | def createObjects(self, plotter_queue=None): | |
590 |
|
613 | |||
591 | className = eval(self.name) |
|
614 | className = eval(self.name) | |
592 | procUnitObj = className() |
|
615 | kwargs = self.getKwargs() | |
|
616 | procUnitObj = className(**kwargs) | |||
593 |
|
617 | |||
594 | for opConfObj in self.opConfObjList: |
|
618 | for opConfObj in self.opConfObjList: | |
595 |
|
619 | |||
@@ -624,7 +648,7 class ProcUnitConf(): | |||||
624 | sts = self.procUnitObj.call(opType = opConfObj.type, |
|
648 | sts = self.procUnitObj.call(opType = opConfObj.type, | |
625 | opName = opConfObj.name, |
|
649 | opName = opConfObj.name, | |
626 | opId = opConfObj.id, |
|
650 | opId = opConfObj.id, | |
627 |
|
|
651 | ) | |
628 |
|
652 | |||
629 | # total_time = time.time() - ini |
|
653 | # total_time = time.time() - ini | |
630 | # |
|
654 | # | |
@@ -1232,63 +1256,6 class Project(): | |||||
1232 | def start(self): |
|
1256 | def start(self): | |
1233 |
|
1257 | |||
1234 | self.writeXml() |
|
1258 | self.writeXml() | |
1235 |
|
||||
1236 | self.createObjects() |
|
1259 | self.createObjects() | |
1237 | self.connectObjects() |
|
1260 | self.connectObjects() | |
1238 | self.run() |
|
1261 | self.run() | |
1239 |
|
||||
1240 | if __name__ == '__main__': |
|
|||
1241 |
|
||||
1242 | desc = "Segundo Test" |
|
|||
1243 | filename = "schain.xml" |
|
|||
1244 |
|
||||
1245 | controllerObj = Project() |
|
|||
1246 |
|
||||
1247 | controllerObj.setup(id = '191', name='test01', description=desc) |
|
|||
1248 |
|
||||
1249 | readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', |
|
|||
1250 | path='data/rawdata/', |
|
|||
1251 | startDate='2011/01/01', |
|
|||
1252 | endDate='2012/12/31', |
|
|||
1253 | startTime='00:00:00', |
|
|||
1254 | endTime='23:59:59', |
|
|||
1255 | online=1, |
|
|||
1256 | walk=1) |
|
|||
1257 |
|
||||
1258 | procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) |
|
|||
1259 |
|
||||
1260 | opObj10 = procUnitConfObj0.addOperation(name='selectChannels') |
|
|||
1261 | opObj10.addParameter(name='channelList', value='3,4,5', format='intlist') |
|
|||
1262 |
|
||||
1263 | opObj10 = procUnitConfObj0.addOperation(name='selectHeights') |
|
|||
1264 | opObj10.addParameter(name='minHei', value='90', format='float') |
|
|||
1265 | opObj10.addParameter(name='maxHei', value='180', format='float') |
|
|||
1266 |
|
||||
1267 | opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='external') |
|
|||
1268 | opObj12.addParameter(name='n', value='10', format='int') |
|
|||
1269 |
|
||||
1270 | procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) |
|
|||
1271 | procUnitConfObj1.addParameter(name='nFFTPoints', value='32', format='int') |
|
|||
1272 | # procUnitConfObj1.addParameter(name='pairList', value='(0,1),(0,2),(1,2)', format='') |
|
|||
1273 |
|
||||
1274 |
|
||||
1275 | opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external') |
|
|||
1276 | opObj11.addParameter(name='idfigure', value='1', format='int') |
|
|||
1277 | opObj11.addParameter(name='wintitle', value='SpectraPlot0', format='str') |
|
|||
1278 | opObj11.addParameter(name='zmin', value='40', format='int') |
|
|||
1279 | opObj11.addParameter(name='zmax', value='90', format='int') |
|
|||
1280 | opObj11.addParameter(name='showprofile', value='1', format='int') |
|
|||
1281 |
|
||||
1282 | print "Escribiendo el archivo XML" |
|
|||
1283 |
|
||||
1284 | controllerObj.writeXml(filename) |
|
|||
1285 |
|
||||
1286 | print "Leyendo el archivo XML" |
|
|||
1287 | controllerObj.readXml(filename) |
|
|||
1288 | #controllerObj.printattr() |
|
|||
1289 |
|
||||
1290 | controllerObj.createObjects() |
|
|||
1291 | controllerObj.connectObjects() |
|
|||
1292 | controllerObj.run() |
|
|||
1293 |
|
||||
1294 | No newline at end of file |
|
@@ -698,6 +698,33 class Spectra(JROData): | |||||
698 |
|
698 | |||
699 | return 10*numpy.log10(avg) |
|
699 | return 10*numpy.log10(avg) | |
700 |
|
700 | |||
|
701 | def getCoherence(self, pairsList=None, phase=False): | |||
|
702 | ||||
|
703 | z = [] | |||
|
704 | if pairsList is None: | |||
|
705 | pairsIndexList = self.pairsIndexList | |||
|
706 | else: | |||
|
707 | pairsIndexList = [] | |||
|
708 | for pair in pairsList: | |||
|
709 | if pair not in self.pairsList: | |||
|
710 | raise ValueError, "Pair %s is not in dataOut.pairsList" %(pair) | |||
|
711 | pairsIndexList.append(self.pairsList.index(pair)) | |||
|
712 | for i in range(len(pairsIndexList)): | |||
|
713 | pair = self.pairsList[pairsIndexList[i]] | |||
|
714 | ccf = numpy.average(self.data_cspc[pairsIndexList[i], :, :], axis=0) | |||
|
715 | powa = numpy.average(self.data_spc[pair[0], :, :], axis=0) | |||
|
716 | powb = numpy.average(self.data_spc[pair[1], :, :], axis=0) | |||
|
717 | avgcoherenceComplex = ccf/numpy.sqrt(powa*powb) | |||
|
718 | if phase: | |||
|
719 | data = numpy.arctan2(avgcoherenceComplex.imag, | |||
|
720 | avgcoherenceComplex.real)*180/numpy.pi | |||
|
721 | else: | |||
|
722 | data = numpy.abs(avgcoherenceComplex) | |||
|
723 | ||||
|
724 | z.append(data) | |||
|
725 | ||||
|
726 | return numpy.array(z) | |||
|
727 | ||||
701 | def setValue(self, value): |
|
728 | def setValue(self, value): | |
702 |
|
729 | |||
703 | print "This property should not be initialized" |
|
730 | print "This property should not be initialized" |
@@ -1,5 +1,6 | |||||
1 |
|
1 | |||
2 | import os |
|
2 | import os | |
|
3 | import zmq | |||
3 | import time |
|
4 | import time | |
4 | import numpy |
|
5 | import numpy | |
5 | import datetime |
|
6 | import datetime | |
@@ -7,80 +8,48 import numpy as np | |||||
7 | import matplotlib.pyplot as plt |
|
8 | import matplotlib.pyplot as plt | |
8 | from mpl_toolkits.axes_grid1 import make_axes_locatable |
|
9 | from mpl_toolkits.axes_grid1 import make_axes_locatable | |
9 | from matplotlib.ticker import FuncFormatter, LinearLocator |
|
10 | from matplotlib.ticker import FuncFormatter, LinearLocator | |
|
11 | from multiprocessing import Process | |||
10 |
|
12 | |||
11 | from schainpy.model.proc.jroproc_base import Operation |
|
13 | from schainpy.model.proc.jroproc_base import Operation | |
12 |
|
14 | |||
|
15 | #plt.ion() | |||
|
16 | ||||
13 | func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime('%H:%M')) |
|
17 | func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime('%H:%M')) | |
14 |
|
18 | |||
15 | d1970 = datetime.datetime(1970,1,1) |
|
19 | d1970 = datetime.datetime(1970,1,1) | |
16 |
|
20 | |||
|
21 | class PlotData(Operation, Process): | |||
17 |
|
22 | |||
18 | class PlotData(Operation): |
|
23 | CODE = 'Figure' | |
19 |
|
24 | colormap = 'jet' | ||
20 | __code = 'Figure' |
|
|||
21 | __MAXNUMX = 80 |
|
25 | __MAXNUMX = 80 | |
22 | __MAXNUMY = 80 |
|
26 | __MAXNUMY = 80 | |
23 | __missing = 1E30 |
|
27 | __missing = 1E30 | |
24 |
|
28 | |||
25 | def __init__(self): |
|
29 | def __init__(self, **kwargs): | |
26 |
|
30 | |||
27 | Operation.__init__(self) |
|
31 | Operation.__init__(self) | |
28 | self.xmin = None |
|
32 | Process.__init__(self) | |
29 |
self. |
|
33 | self.mp = False | |
30 | self.newdataOut = None |
|
|||
31 | self.dataOut = None |
|
34 | self.dataOut = None | |
32 | self.isConfig = False |
|
35 | self.isConfig = False | |
33 | self.figure = None |
|
36 | self.figure = None | |
34 | self.width = 6 |
|
|||
35 | self.height = 4 |
|
|||
36 |
|
||||
37 | def setup(self, dataOut, **kwargs): |
|
|||
38 |
|
||||
39 | self.first = True |
|
|||
40 | self.localtime = kwargs.pop('localtime', True) |
|
|||
41 | self.show = kwargs.pop('show', True) |
|
|||
42 | self.save = kwargs.pop('save', False) |
|
|||
43 | self.pause = kwargs.pop('pause', False) |
|
|||
44 | self.time = [] |
|
|||
45 | self.nblock = 0 |
|
|||
46 | self.z = [] |
|
|||
47 | self.data = [{} for __ in dataOut.channelList] |
|
|||
48 |
self.axes = [] |
|
37 | self.axes = [] | |
49 |
self. |
|
38 | self.localtime = kwargs.pop('localtime', True) | |
|
39 | self.show = kwargs.get('show', True) | |||
|
40 | self.save = kwargs.get('save', False) | |||
|
41 | self.colormap = kwargs.get('colormap', self.colormap) | |||
|
42 | self.showprofile = kwargs.get('showprofile', False) | |||
50 | self.title = kwargs.get('wintitle', '') |
|
43 | self.title = kwargs.get('wintitle', '') | |
51 |
self.xaxis = kwargs.get('xaxis', |
|
44 | self.xaxis = kwargs.get('xaxis', 'time') | |
52 | self.zmin = kwargs.get('zmin', None) |
|
45 | self.zmin = kwargs.get('zmin', None) | |
53 | self.zmax = kwargs.get('zmax', None) |
|
46 | self.zmax = kwargs.get('zmax', None) | |
54 |
|
47 | self.xmin = kwargs.get('xmin', None) | ||
55 |
|
|
48 | self.xmax = kwargs.get('xmax', None) | |
56 |
|
|
49 | self.xrange = kwargs.get('xrange', 24) | |
57 |
|
||||
58 | dt = dataOut.datatime.date() |
|
|||
59 | dtmin = datetime.datetime.combine(dt, datetime.time(xmin, 0, 0)) |
|
|||
60 | dtmax = datetime.datetime.combine(dt, datetime.time(xmax, 59, 59)) |
|
|||
61 |
|
||||
62 | self.xmin = (dtmin-d1970).total_seconds() |
|
|||
63 | self.xmax = (dtmax-d1970).total_seconds() |
|
|||
64 |
|
||||
65 | self.ymin = kwargs.get('ymin', None) |
|
50 | self.ymin = kwargs.get('ymin', None) | |
66 | self.ymax = kwargs.get('ymax', None) |
|
51 | self.ymax = kwargs.get('ymax', None) | |
67 |
|
52 | |||
68 | if self.figure is None: |
|
|||
69 | self.figure = plt.figure() |
|
|||
70 | else: |
|
|||
71 | self.figure.clf() |
|
|||
72 |
|
||||
73 | self.setup_fig() |
|
|||
74 |
|
||||
75 | for n in range(dataOut.nChannels): |
|
|||
76 | ax = self.figure.add_subplot(self.nrows, self.ncols, n+1) |
|
|||
77 | ax.firsttime = True |
|
|||
78 | self.axes.append(ax) |
|
|||
79 |
|
||||
80 | self.setup_fig() |
|
|||
81 |
|
||||
82 | self.figure.set_size_inches (self.width, self.height) |
|
|||
83 |
|
||||
84 | def fill_gaps(self, x_buffer, y_buffer, z_buffer): |
|
53 | def fill_gaps(self, x_buffer, y_buffer, z_buffer): | |
85 |
|
54 | |||
86 | if x_buffer.shape[0] < 2: |
|
55 | if x_buffer.shape[0] < 2: | |
@@ -110,43 +79,60 class PlotData(Operation): | |||||
110 |
|
79 | |||
111 | return x, y, z |
|
80 | return x, y, z | |
112 |
|
81 | |||
113 | def _plot(self): |
|
82 | def __plot(self): | |
114 |
|
83 | |||
115 | self.plot() |
|
84 | print 'plotting...{}'.format(self.CODE) | |
116 |
|
85 | |||
117 | self.figure.suptitle(self.title+self.__code) |
|
86 | self.plot() | |
|
87 | self.figure.suptitle('{} {}'.format(self.title, self.CODE.upper())) | |||
118 |
|
88 | |||
119 | if self.save: |
|
89 | if self.save: | |
120 |
figname = os.path.join(self.save, '{}_{}.png'.format(self. |
|
90 | figname = os.path.join(self.save, '{}_{}.png'.format(self.CODE, | |
121 |
self. |
|
91 | datetime.datetime.utcfromtimestamp(self.times[-1]).strftime('%y%m%d_%H%M%S'))) | |
122 | print 'Saving figure: {}'.format(figname) |
|
92 | print 'Saving figure: {}'.format(figname) | |
123 | self.figure.savefig(figname) |
|
93 | self.figure.savefig(figname) | |
124 |
|
94 | |||
125 | self.figure.canvas.draw() |
|
95 | self.figure.canvas.draw() | |
126 | if self.show: |
|
|||
127 | self.figure.show() |
|
|||
128 | if self.pause: |
|
|||
129 | raw_input('Press <ENTER> to continue') |
|
|||
130 |
|
||||
131 |
|
96 | |||
132 |
def |
|
97 | def plot(self): | |
133 |
|
||||
134 | pass |
|
|||
135 |
|
||||
136 | def run(self, dataOut, **kwargs): |
|
|||
137 |
|
||||
138 | self.dataOut = dataOut |
|
|||
139 |
|
98 | |||
140 | if not self.isConfig: |
|
99 | print 'plotting...{}'.format(self.CODE.upper()) | |
141 | self.setup(dataOut, **kwargs) |
|
100 | return | |
|
101 | ||||
|
102 | def run(self): | |||
|
103 | ||||
|
104 | print '[Starting] {}'.format(self.name) | |||
|
105 | context = zmq.Context() | |||
|
106 | receiver = context.socket(zmq.SUB) | |||
|
107 | receiver.setsockopt(zmq.SUBSCRIBE, '') | |||
|
108 | receiver.setsockopt(zmq.CONFLATE, True) | |||
|
109 | receiver.connect("ipc:///tmp/zmq.plots") | |||
|
110 | ||||
|
111 | while True: | |||
|
112 | try: | |||
|
113 | #if True: | |||
|
114 | self.data = receiver.recv_pyobj(flags=zmq.NOBLOCK) | |||
|
115 | self.dataOut = self.data['dataOut'] | |||
|
116 | self.times = self.data['times'] | |||
|
117 | self.times.sort() | |||
|
118 | self.min_time = self.times[0] | |||
|
119 | self.max_time = self.times[-1] | |||
|
120 | ||||
|
121 | if self.isConfig is False: | |||
|
122 | self.setup() | |||
142 | self.isConfig = True |
|
123 | self.isConfig = True | |
143 |
|
124 | |||
144 | self.nblock += 1 |
|
125 | self.__plot() | |
145 | self.update() |
|
|||
146 |
|
126 | |||
147 | if dataOut.ltctime>=self.xmax: |
|
127 | if 'ENDED' in self.data: | |
148 | self._plot() |
|
128 | #self.setup() | |
149 | self.isConfig = False |
|
129 | #self.__plot() | |
|
130 | pass | |||
|
131 | ||||
|
132 | except zmq.Again as e: | |||
|
133 | print 'Waiting for data...' | |||
|
134 | plt.pause(5) | |||
|
135 | #time.sleep(3) | |||
150 |
|
136 | |||
151 | def close(self): |
|
137 | def close(self): | |
152 | if self.dataOut: |
|
138 | if self.dataOut: | |
@@ -155,56 +141,170 class PlotData(Operation): | |||||
155 |
|
141 | |||
156 | class PlotSpectraData(PlotData): |
|
142 | class PlotSpectraData(PlotData): | |
157 |
|
143 | |||
158 | __code = 'Spectra' |
|
144 | CODE = 'spc' | |
|
145 | colormap = 'jro' | |||
159 |
|
146 | |||
160 |
def setup |
|
147 | def setup(self): | |
161 | pass |
|
148 | ||
|
149 | ncolspan = 1 | |||
|
150 | colspan = 1 | |||
|
151 | self.ncols = int(numpy.sqrt(self.dataOut.nChannels)+0.9) | |||
|
152 | self.nrows = int(self.dataOut.nChannels*1./self.ncols + 0.9) | |||
|
153 | self.width = 3.6*self.ncols | |||
|
154 | self.height = 3.2*self.nrows | |||
|
155 | if self.showprofile: | |||
|
156 | ncolspan = 3 | |||
|
157 | colspan = 2 | |||
|
158 | self.width += 1.2*self.ncols | |||
|
159 | ||||
|
160 | self.ylabel = 'Range [Km]' | |||
|
161 | self.titles = ['Channel {}'.format(x) for x in self.dataOut.channelList] | |||
162 |
|
162 | |||
163 | def update(self): |
|
163 | if self.figure is None: | |
|
164 | self.figure = plt.figure(figsize=(self.width, self.height), | |||
|
165 | edgecolor='k', | |||
|
166 | facecolor='w') | |||
|
167 | else: | |||
|
168 | self.figure.clf() | |||
|
169 | ||||
|
170 | n = 0 | |||
|
171 | for y in range(self.nrows): | |||
|
172 | for x in range(self.ncols): | |||
|
173 | if n>=self.dataOut.nChannels: | |||
|
174 | break | |||
|
175 | ax = plt.subplot2grid((self.nrows, self.ncols*ncolspan), (y, x*ncolspan), 1, colspan) | |||
|
176 | if self.showprofile: | |||
|
177 | ax.ax_profile = plt.subplot2grid((self.nrows, self.ncols*ncolspan), (y, x*ncolspan+colspan), 1, 1) | |||
164 |
|
178 | |||
165 | for ch in self.dataOut.channelList: |
|
179 | ax.firsttime = True | |
166 | self.data[ch] = self.dataOut.data_spc[ch] |
|
180 | self.axes.append(ax) | |
|
181 | n += 1 | |||
|
182 | ||||
|
183 | self.figure.subplots_adjust(wspace=0.9, hspace=0.5) | |||
|
184 | self.figure.show() | |||
167 |
|
185 | |||
168 | def plot(self): |
|
186 | def plot(self): | |
169 | pass |
|
187 | ||
|
188 | if self.xaxis == "frequency": | |||
|
189 | x = self.dataOut.getFreqRange(1)/1000. | |||
|
190 | xlabel = "Frequency (kHz)" | |||
|
191 | elif self.xaxis == "time": | |||
|
192 | x = self.dataOut.getAcfRange(1) | |||
|
193 | xlabel = "Time (ms)" | |||
|
194 | else: | |||
|
195 | x = self.dataOut.getVelRange(1) | |||
|
196 | xlabel = "Velocity (m/s)" | |||
|
197 | ||||
|
198 | y = self.dataOut.getHeiRange() | |||
|
199 | z = self.data[self.CODE] | |||
|
200 | ||||
|
201 | for n, ax in enumerate(self.axes): | |||
|
202 | ||||
|
203 | if ax.firsttime: | |||
|
204 | self.xmax = self.xmax if self.xmax else np.nanmax(x) | |||
|
205 | self.xmin = self.xmin if self.xmin else -self.xmax | |||
|
206 | self.ymin = self.ymin if self.ymin else np.nanmin(y) | |||
|
207 | self.ymax = self.ymax if self.ymax else np.nanmax(y) | |||
|
208 | self.zmin = self.zmin if self.zmin else np.nanmin(z) | |||
|
209 | self.zmax = self.zmax if self.zmax else np.nanmax(z) | |||
|
210 | ax.plot = ax.pcolormesh(x, y, z[n].T, | |||
|
211 | vmin=self.zmin, | |||
|
212 | vmax=self.zmax, | |||
|
213 | cmap=plt.get_cmap(self.colormap) | |||
|
214 | ) | |||
|
215 | divider = make_axes_locatable(ax) | |||
|
216 | cax = divider.new_horizontal(size='3%', pad=0.05) | |||
|
217 | self.figure.add_axes(cax) | |||
|
218 | plt.colorbar(ax.plot, cax) | |||
|
219 | ||||
|
220 | ax.set_xlim(self.xmin, self.xmax) | |||
|
221 | ax.set_ylim(self.ymin, self.ymax) | |||
|
222 | ||||
|
223 | ax.xaxis.set_major_locator(LinearLocator(5)) | |||
|
224 | #ax.yaxis.set_major_locator(LinearLocator(4)) | |||
|
225 | ||||
|
226 | ax.set_ylabel(self.ylabel) | |||
|
227 | ax.set_xlabel(xlabel) | |||
|
228 | ||||
|
229 | ax.firsttime = False | |||
|
230 | ||||
|
231 | if self.showprofile: | |||
|
232 | ax.plot_profile= ax.ax_profile.plot(self.data['rti'][self.max_time][n], y)[0] | |||
|
233 | ax.ax_profile.set_xlim(self.zmin, self.zmax) | |||
|
234 | ax.ax_profile.set_ylim(self.ymin, self.ymax) | |||
|
235 | ax.ax_profile.set_xlabel('dB') | |||
|
236 | ax.ax_profile.grid(b=True, axis='x') | |||
|
237 | [tick.set_visible(False) for tick in ax.ax_profile.get_yticklabels()] | |||
|
238 | noise = 10*numpy.log10(self.data['rti'][self.max_time][n]/self.dataOut.normFactor) | |||
|
239 | ax.ax_profile.vlines(noise, self.ymin, self.ymax, colors="k", linestyle="dashed", lw=2) | |||
|
240 | else: | |||
|
241 | ax.plot.set_array(z[n].T.ravel()) | |||
|
242 | ax.set_title('{} {}'.format(self.titles[n], | |||
|
243 | datetime.datetime.utcfromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')), | |||
|
244 | size=8) | |||
|
245 | if self.showprofile: | |||
|
246 | ax.plot_profile.set_data(self.data['rti'][self.max_time][n], y) | |||
170 |
|
247 | |||
171 |
|
248 | |||
172 | class PlotRTIData(PlotData): |
|
249 | class PlotRTIData(PlotData): | |
173 |
|
250 | |||
174 | __code = 'RTI' |
|
251 | CODE = 'rti' | |
|
252 | colormap = 'jro' | |||
175 |
|
253 | |||
176 |
def setup |
|
254 | def setup(self): | |
177 |
|
255 | |||
178 | self.ncols = 1 |
|
256 | self.ncols = 1 | |
179 | self.nrows = self.dataOut.nChannels |
|
257 | self.nrows = self.dataOut.nChannels | |
180 |
self.width = |
|
258 | self.width = 10 | |
181 | self.height = 2.2*self.nrows |
|
259 | self.height = 2.2*self.nrows | |
182 | self.ylabel = 'Range [Km]' |
|
260 | self.ylabel = 'Range [Km]' | |
|
261 | self.titles = ['Channel {}'.format(x) for x in self.dataOut.channelList] | |||
183 |
|
262 | |||
184 | def update(self): |
|
263 | if self.figure is None: | |
|
264 | self.figure = plt.figure(figsize=(self.width, self.height), | |||
|
265 | edgecolor='k', | |||
|
266 | facecolor='w') | |||
|
267 | else: | |||
|
268 | self.figure.clf() | |||
185 |
|
269 | |||
186 | self.time.append(self.dataOut.ltctime) |
|
270 | for n in range(self.nrows): | |
|
271 | ax = self.figure.add_subplot(self.nrows, self.ncols, n+1) | |||
|
272 | ax.firsttime = True | |||
|
273 | self.axes.append(ax) | |||
187 |
|
274 | |||
188 | for ch in self.dataOut.channelList: |
|
275 | self.figure.subplots_adjust(hspace=0.5) | |
189 | self.data[ch][self.dataOut.ltctime] = self.dataOut.getPower()[ch] |
|
276 | self.figure.show() | |
190 |
|
277 | |||
191 | def plot(self): |
|
278 | def plot(self): | |
192 |
|
279 | |||
193 | self.plot_dt = datetime.datetime.utcfromtimestamp(self.time[-2]) |
|
280 | self.x = np.array(self.times) | |
194 |
|
||||
195 | self.time.sort() |
|
|||
196 | self.x = self.time |
|
|||
197 | self.y = self.dataOut.getHeiRange() |
|
281 | self.y = self.dataOut.getHeiRange() | |
198 | self.z = [] |
|
282 | self.z = [] | |
199 |
|
283 | |||
200 |
for ch in self. |
|
284 | for ch in range(self.nrows): | |
201 |
self.z.append([self.data[ |
|
285 | self.z.append([self.data[self.CODE][t][ch] for t in self.times]) | |
202 |
|
286 | |||
203 | self.x = np.array(self.x) |
|
|||
204 |
self.z = np.array(self.z) |
|
287 | self.z = np.array(self.z) | |
205 |
|
288 | |||
206 |
for n, ax in enumerate(self.axes): |
|
289 | for n, ax in enumerate(self.axes): | |
207 |
|
290 | |||
|
291 | x, y, z = self.fill_gaps(*self.decimate()) | |||
|
292 | ||||
|
293 | if ax.firsttime: | |||
|
294 | self.ymin = self.ymin if self.ymin else np.nanmin(self.y) | |||
|
295 | self.ymax = self.ymax if self.ymax else np.nanmax(self.y) | |||
|
296 | self.zmin = self.zmin if self.zmin else np.nanmin(self.z) | |||
|
297 | zmax = self.zmax if self.zmax else np.nanmax(self.z) | |||
|
298 | plot = ax.pcolormesh(x, y, z[n].T, | |||
|
299 | vmin=self.zmin, | |||
|
300 | vmax=self.zmax, | |||
|
301 | cmap=plt.get_cmap(self.colormap) | |||
|
302 | ) | |||
|
303 | divider = make_axes_locatable(ax) | |||
|
304 | cax = divider.new_horizontal(size='2%', pad=0.05) | |||
|
305 | self.figure.add_axes(cax) | |||
|
306 | plt.colorbar(plot, cax) | |||
|
307 | ax.set_ylim(self.ymin, self.ymax) | |||
208 | if self.xaxis=='time': |
|
308 | if self.xaxis=='time': | |
209 | ax.xaxis.set_major_formatter(FuncFormatter(func)) |
|
309 | ax.xaxis.set_major_formatter(FuncFormatter(func)) | |
210 | ax.xaxis.set_major_locator(LinearLocator(6)) |
|
310 | ax.xaxis.set_major_locator(LinearLocator(6)) | |
@@ -213,47 +313,64 class PlotRTIData(PlotData): | |||||
213 |
|
313 | |||
214 | ax.set_ylabel(self.ylabel) |
|
314 | ax.set_ylabel(self.ylabel) | |
215 |
|
315 | |||
216 |
|
|
316 | if self.xmin is None: | |
217 |
|
317 | print 'is none' | ||
218 | ax.set_title('Channel {} {}'.format(self.dataOut.channelList[n], |
|
318 | xmin = self.min_time | |
219 | self.plot_dt.strftime('%y/%m/%d %H:%M:%S')), |
|
319 | else: | |
220 | size=8) |
|
|||
221 |
|
||||
222 | self.decimate() |
|
|||
223 |
|
320 | |||
224 | for n, ax in enumerate(self.axes): |
|
321 | xmin = (datetime.datetime.combine(self.dataOut.datatime.date(), | |
|
322 | datetime.time(self.xmin, 0, 0))-d1970).total_seconds() | |||
225 |
|
323 | |||
226 | x, y, z = self.fill_gaps(*self.decimate()) |
|
324 | xmax = xmin+self.xrange*60*60 | |
227 |
|
325 | |||
228 | if ax.firsttime: |
|
326 | ax.set_xlim(xmin, xmax) | |
229 | ymin = self.ymin if self.ymin else np.nanmin(self.y) |
|
327 | ax.firsttime = False | |
230 | ymax = self.ymax if self.ymax else np.nanmax(self.y) |
|
328 | else: | |
231 | zmin = self.zmin if self.zmin else np.nanmin(self.z) |
|
329 | ax.collections.remove(ax.collections[0]) | |
232 | zmax = self.zmax if self.zmax else np.nanmax(self.z) |
|
|||
233 | plot = ax.pcolormesh(x, y, z[n].T, |
|
330 | plot = ax.pcolormesh(x, y, z[n].T, | |
234 | vmin=zmin, |
|
331 | vmin=self.zmin, | |
235 | vmax=zmax, |
|
332 | vmax=self.zmax, | |
236 | cmap=plt.get_cmap(self.colormap) |
|
333 | cmap=plt.get_cmap(self.colormap) | |
237 | ) |
|
334 | ) | |
238 | divider = make_axes_locatable(ax) |
|
335 | ax.set_title('{} {}'.format(self.titles[n], | |
239 | cax = divider.new_horizontal(size='3%', pad=0.05) |
|
336 | datetime.datetime.utcfromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')), | |
240 | self.figure.add_axes(cax) |
|
337 | size=8) | |
241 | plt.colorbar(plot, cax) |
|
338 | ||
242 | ax.set_ylim(self.ymin, self.ymax) |
|
339 | ||
243 | ax.firsttime = False |
|
340 | class PlotCOHData(PlotRTIData): | |
|
341 | ||||
|
342 | CODE = 'coh' | |||
|
343 | ||||
|
344 | def setup(self): | |||
|
345 | ||||
|
346 | self.ncols = 1 | |||
|
347 | self.nrows = self.dataOut.nPairs | |||
|
348 | self.width = 10 | |||
|
349 | self.height = 2.2*self.nrows | |||
|
350 | self.ylabel = 'Range [Km]' | |||
|
351 | self.titles = ['Channels {}'.format(x) for x in self.dataOut.pairsList] | |||
|
352 | ||||
|
353 | if self.figure is None: | |||
|
354 | self.figure = plt.figure(figsize=(self.width, self.height), | |||
|
355 | edgecolor='k', | |||
|
356 | facecolor='w') | |||
244 | else: |
|
357 | else: | |
245 | plot = ax.pcolormesh(x, y, z[n].T) |
|
358 | self.figure.clf() | |
246 |
|
359 | |||
247 | self.figure.subplots_adjust(wspace=None, hspace=0.5) |
|
360 | for n in range(self.nrows): | |
|
361 | ax = self.figure.add_subplot(self.nrows, self.ncols, n+1) | |||
|
362 | ax.firsttime = True | |||
|
363 | self.axes.append(ax) | |||
248 |
|
364 | |||
|
365 | self.figure.subplots_adjust(hspace=0.5) | |||
|
366 | self.figure.show() | |||
249 |
|
367 | |||
250 | class PlotSNRData(PlotRTIData): |
|
368 | class PlotSNRData(PlotRTIData): | |
251 |
|
369 | |||
252 | __code = 'SNR' |
|
370 | CODE = 'coh' | |
253 |
|
371 | |||
254 | def update(self): |
|
|||
255 |
|
372 | |||
256 | self.time.append(self.dataOut.ltctime) |
|
373 | class PlotPHASEData(PlotCOHData): | |
257 |
|
374 | |||
258 | for ch in self.dataOut.channelList: |
|
375 | CODE = 'phase' | |
259 | self.data[ch][self.dataOut.ltctime] = 10*np.log10(self.dataOut.data_SNR[ch]) No newline at end of file |
|
376 | colormap = 'seismic' |
@@ -69,7 +69,7 class SpectraReader(JRODataReader, ProcessingUnit): | |||||
69 |
|
69 | |||
70 | rdPairList = [] |
|
70 | rdPairList = [] | |
71 |
|
71 | |||
72 | def __init__(self): |
|
72 | def __init__(self, **kwargs): | |
73 |
""" |
|
73 | """ | |
74 | Inicializador de la clase SpectraReader para la lectura de datos de espectros. |
|
74 | Inicializador de la clase SpectraReader para la lectura de datos de espectros. | |
75 |
|
75 | |||
@@ -88,7 +88,7 class SpectraReader(JRODataReader, ProcessingUnit): | |||||
88 | """ |
|
88 | """ | |
89 |
|
89 | |||
90 | #Eliminar de la base la herencia |
|
90 | #Eliminar de la base la herencia | |
91 | ProcessingUnit.__init__(self) |
|
91 | ProcessingUnit.__init__(self, **kwargs) | |
92 |
|
92 | |||
93 | # self.isConfig = False |
|
93 | # self.isConfig = False | |
94 |
|
94 |
@@ -27,7 +27,7 class ProcessingUnit(object): | |||||
27 | isConfig = False |
|
27 | isConfig = False | |
28 |
|
28 | |||
29 |
|
29 | |||
30 | def __init__(self): |
|
30 | def __init__(self, *args, **kwargs): | |
31 |
|
31 | |||
32 | self.dataIn = None |
|
32 | self.dataIn = None | |
33 | self.dataInList = [] |
|
33 | self.dataInList = [] | |
@@ -38,6 +38,9 class ProcessingUnit(object): | |||||
38 |
|
38 | |||
39 | self.isConfig = False |
|
39 | self.isConfig = False | |
40 |
|
40 | |||
|
41 | self.args = args | |||
|
42 | self.kwargs = kwargs | |||
|
43 | ||||
41 | def addOperation(self, opObj, objId): |
|
44 | def addOperation(self, opObj, objId): | |
42 |
|
45 | |||
43 | """ |
|
46 | """ | |
@@ -104,17 +107,13 class ProcessingUnit(object): | |||||
104 | methodToCall = getattr(self, name) |
|
107 | methodToCall = getattr(self, name) | |
105 |
|
108 | |||
106 | #Executing the self method |
|
109 | #Executing the self method | |
107 | methodToCall(**kwargs) |
|
|||
108 |
|
110 | |||
109 | #Checkin the outputs |
|
111 | if hasattr(self, 'mp'): | |
110 |
|
112 | if self.mp is False: | ||
111 | # if name == 'run': |
|
113 | self.mp = True | |
112 |
|
|
114 | self.start() | |
113 |
|
|
115 | else: | |
114 | # pass |
|
116 | methodToCall(**kwargs) | |
115 | # |
|
|||
116 | # if name != 'run': |
|
|||
117 | # return True |
|
|||
118 |
|
117 | |||
119 | if self.dataOut is None: |
|
118 | if self.dataOut is None: | |
120 | return False |
|
119 | return False | |
@@ -124,7 +123,7 class ProcessingUnit(object): | |||||
124 |
|
123 | |||
125 | return True |
|
124 | return True | |
126 |
|
125 | |||
127 |
def callObject(self, objId |
|
126 | def callObject(self, objId): | |
128 |
|
127 | |||
129 | """ |
|
128 | """ | |
130 | Ejecuta la operacion asociada al identificador del objeto "objId" |
|
129 | Ejecuta la operacion asociada al identificador del objeto "objId" | |
@@ -140,16 +139,21 class ProcessingUnit(object): | |||||
140 | None |
|
139 | None | |
141 | """ |
|
140 | """ | |
142 |
|
141 | |||
143 | if self.dataOut.isEmpty(): |
|
142 | if self.dataOut is not None and self.dataOut.isEmpty(): | |
144 | return False |
|
143 | return False | |
145 |
|
144 | |||
146 | externalProcObj = self.operations2RunDict[objId] |
|
145 | externalProcObj = self.operations2RunDict[objId] | |
147 |
|
146 | |||
148 | externalProcObj.run(self.dataOut, **kwargs) |
|
147 | if hasattr(externalProcObj, 'mp'): | |
|
148 | if externalProcObj.mp is False: | |||
|
149 | externalProcObj.mp = True | |||
|
150 | externalProcObj.start() | |||
|
151 | else: | |||
|
152 | externalProcObj.run(self.dataOut, **externalProcObj.kwargs) | |||
149 |
|
153 | |||
150 | return True |
|
154 | return True | |
151 |
|
155 | |||
152 |
def call(self, opType, opName=None, opId=None |
|
156 | def call(self, opType, opName=None, opId=None): | |
153 |
|
157 | |||
154 | """ |
|
158 | """ | |
155 | Return True si ejecuta la operacion interna nombrada "opName" o la operacion externa |
|
159 | Return True si ejecuta la operacion interna nombrada "opName" o la operacion externa | |
@@ -194,7 +198,7 class ProcessingUnit(object): | |||||
194 | if not opName: |
|
198 | if not opName: | |
195 | raise ValueError, "opName parameter should be defined" |
|
199 | raise ValueError, "opName parameter should be defined" | |
196 |
|
200 | |||
197 | sts = self.callMethod(opName, **kwargs) |
|
201 | sts = self.callMethod(opName, **self.kwargs) | |
198 |
|
202 | |||
199 | elif opType == 'other' or opType == 'external' or opType == 'plotter': |
|
203 | elif opType == 'other' or opType == 'external' or opType == 'plotter': | |
200 |
|
204 | |||
@@ -204,7 +208,7 class ProcessingUnit(object): | |||||
204 | if opId not in self.operations2RunDict.keys(): |
|
208 | if opId not in self.operations2RunDict.keys(): | |
205 | raise ValueError, "Any operation with id=%s has been added" %str(opId) |
|
209 | raise ValueError, "Any operation with id=%s has been added" %str(opId) | |
206 |
|
210 | |||
207 |
sts = self.callObject(opId |
|
211 | sts = self.callObject(opId) | |
208 |
|
212 | |||
209 | else: |
|
213 | else: | |
210 | raise ValueError, "opType should be 'self', 'external' or 'plotter'; and not '%s'" %opType |
|
214 | raise ValueError, "opType should be 'self', 'external' or 'plotter'; and not '%s'" %opType | |
@@ -255,10 +259,11 class Operation(object): | |||||
255 | __buffer = None |
|
259 | __buffer = None | |
256 | isConfig = False |
|
260 | isConfig = False | |
257 |
|
261 | |||
258 | def __init__(self): |
|
262 | def __init__(self, **kwargs): | |
259 |
|
263 | |||
260 | self.__buffer = None |
|
264 | self.__buffer = None | |
261 | self.isConfig = False |
|
265 | self.isConfig = False | |
|
266 | self.kwargs = kwargs | |||
262 |
|
267 | |||
263 | def setup(self): |
|
268 | def setup(self): | |
264 |
|
269 |
@@ -16,6 +16,8 from multiprocessing import Process | |||||
16 |
|
16 | |||
17 | from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit |
|
17 | from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit | |
18 |
|
18 | |||
|
19 | MAXNUMX = 100 | |||
|
20 | MAXNUMY = 100 | |||
19 | throttle_value = 5 |
|
21 | throttle_value = 5 | |
20 |
|
22 | |||
21 | class PrettyFloat(float): |
|
23 | class PrettyFloat(float): | |
@@ -28,14 +30,6 def roundFloats(obj): | |||||
28 | elif isinstance(obj, float): |
|
30 | elif isinstance(obj, float): | |
29 | return round(obj, 2) |
|
31 | return round(obj, 2) | |
30 |
|
32 | |||
31 | def pretty_floats(obj): |
|
|||
32 | if isinstance(obj, float): |
|
|||
33 | return PrettyFloat(obj) |
|
|||
34 | elif isinstance(obj, dict): |
|
|||
35 | return dict((k, pretty_floats(v)) for k, v in obj.items()) |
|
|||
36 | elif isinstance(obj, (list, tuple)): |
|
|||
37 | return map(pretty_floats, obj) |
|
|||
38 | return obj |
|
|||
39 |
|
33 | |||
40 | class throttle(object): |
|
34 | class throttle(object): | |
41 | """Decorator that prevents a function from being called more than once every |
|
35 | """Decorator that prevents a function from being called more than once every | |
@@ -76,9 +70,6 class throttle(object): | |||||
76 | class PublishData(Operation): |
|
70 | class PublishData(Operation): | |
77 | """Clase publish.""" |
|
71 | """Clase publish.""" | |
78 |
|
72 | |||
79 | __MAXNUMX = 100 |
|
|||
80 | __MAXNUMY = 100 |
|
|||
81 |
|
||||
82 | def __init__(self, **kwargs): |
|
73 | def __init__(self, **kwargs): | |
83 | """Inicio.""" |
|
74 | """Inicio.""" | |
84 | Operation.__init__(self, **kwargs) |
|
75 | Operation.__init__(self, **kwargs) | |
@@ -166,8 +157,8 class PublishData(Operation): | |||||
166 | z = data/self.dataOut.normFactor |
|
157 | z = data/self.dataOut.normFactor | |
167 | zdB = 10*numpy.log10(z) |
|
158 | zdB = 10*numpy.log10(z) | |
168 | xlen, ylen = zdB[0].shape |
|
159 | xlen, ylen = zdB[0].shape | |
169 |
dx = |
|
160 | dx = int(xlen/MAXNUMX) + 1 | |
170 |
dy = |
|
161 | dy = int(ylen/MAXNUMY) + 1 | |
171 | Z = [0 for i in self.dataOut.channelList] |
|
162 | Z = [0 for i in self.dataOut.channelList] | |
172 | for i in self.dataOut.channelList: |
|
163 | for i in self.dataOut.channelList: | |
173 | Z[i] = zdB[i][::dx, ::dy].tolist() |
|
164 | Z[i] = zdB[i][::dx, ::dy].tolist() | |
@@ -257,3 +248,131 class PublishData(Operation): | |||||
257 | if self.client: |
|
248 | if self.client: | |
258 | self.client.loop_stop() |
|
249 | self.client.loop_stop() | |
259 | self.client.disconnect() |
|
250 | self.client.disconnect() | |
|
251 | ||||
|
252 | ||||
|
253 | class ReceiverData(ProcessingUnit, Process): | |||
|
254 | ||||
|
255 | def __init__(self, **kwargs): | |||
|
256 | ||||
|
257 | ProcessingUnit.__init__(self, **kwargs) | |||
|
258 | Process.__init__(self) | |||
|
259 | self.mp = False | |||
|
260 | self.isConfig = False | |||
|
261 | self.plottypes =[] | |||
|
262 | self.connections = 0 | |||
|
263 | server = kwargs.get('server', 'zmq.pipe') | |||
|
264 | if 'tcp://' in server: | |||
|
265 | address = server | |||
|
266 | else: | |||
|
267 | address = 'ipc:///tmp/%s' % server | |||
|
268 | ||||
|
269 | self.address = address | |||
|
270 | self.plottypes = [s.strip() for s in kwargs.get('plottypes', 'rti').split(',')] | |||
|
271 | self.realtime = kwargs.get('realtime', False) | |||
|
272 | global throttle_value | |||
|
273 | throttle_value = kwargs.get('throttle', 10) | |||
|
274 | self.setup() | |||
|
275 | ||||
|
276 | def setup(self): | |||
|
277 | ||||
|
278 | self.data = {} | |||
|
279 | self.data['times'] = [] | |||
|
280 | for plottype in self.plottypes: | |||
|
281 | self.data[plottype] = {} | |||
|
282 | ||||
|
283 | self.isConfig = True | |||
|
284 | ||||
|
285 | def event_monitor(self, monitor): | |||
|
286 | ||||
|
287 | events = {} | |||
|
288 | ||||
|
289 | for name in dir(zmq): | |||
|
290 | if name.startswith('EVENT_'): | |||
|
291 | value = getattr(zmq, name) | |||
|
292 | events[value] = name | |||
|
293 | ||||
|
294 | while monitor.poll(): | |||
|
295 | evt = recv_monitor_message(monitor) | |||
|
296 | if evt['event'] == 32: | |||
|
297 | self.connections += 1 | |||
|
298 | if evt['event'] == 512: | |||
|
299 | pass | |||
|
300 | if self.connections == 0 and self.started is True: | |||
|
301 | self.ended = True | |||
|
302 | # send('ENDED') | |||
|
303 | evt.update({'description': events[evt['event']]}) | |||
|
304 | ||||
|
305 | if evt['event'] == zmq.EVENT_MONITOR_STOPPED: | |||
|
306 | break | |||
|
307 | monitor.close() | |||
|
308 | print("event monitor thread done!") | |||
|
309 | ||||
|
310 | @throttle(seconds=throttle_value) | |||
|
311 | def sendData(self, data): | |||
|
312 | self.send(data) | |||
|
313 | ||||
|
314 | def send(self, data): | |||
|
315 | print '[sending] data=%s size=%s' % (data.keys(), len(data['times'])) | |||
|
316 | self.sender.send_pyobj(data) | |||
|
317 | ||||
|
318 | def update(self): | |||
|
319 | ||||
|
320 | t = self.dataOut.ltctime | |||
|
321 | self.data['times'].append(t) | |||
|
322 | self.data['dataOut'] = self.dataOut | |||
|
323 | ||||
|
324 | for plottype in self.plottypes: | |||
|
325 | ||||
|
326 | if plottype == 'spc': | |||
|
327 | z = self.dataOut.data_spc/self.dataOut.normFactor | |||
|
328 | zdB = 10*numpy.log10(z) | |||
|
329 | self.data[plottype] = zdB | |||
|
330 | if plottype == 'rti': | |||
|
331 | self.data[plottype][t] = self.dataOut.getPower() | |||
|
332 | if plottype == 'snr': | |||
|
333 | self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_SNR) | |||
|
334 | if plottype == 'dop': | |||
|
335 | self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_DOP) | |||
|
336 | if plottype == 'coh': | |||
|
337 | self.data[plottype][t] = self.dataOut.getCoherence() | |||
|
338 | if plottype == 'phase': | |||
|
339 | self.data[plottype][t] = self.dataOut.getCoherence(phase=True) | |||
|
340 | ||||
|
341 | def run(self): | |||
|
342 | ||||
|
343 | print '[Starting] {} from {}'.format(self.name, self.address) | |||
|
344 | ||||
|
345 | self.context = zmq.Context() | |||
|
346 | self.receiver = self.context.socket(zmq.PULL) | |||
|
347 | self.receiver.bind(self.address) | |||
|
348 | monitor = self.receiver.get_monitor_socket() | |||
|
349 | self.sender = self.context.socket(zmq.PUB) | |||
|
350 | ||||
|
351 | self.sender.bind("ipc:///tmp/zmq.plots") | |||
|
352 | ||||
|
353 | t = Thread(target=self.event_monitor, args=(monitor,)) | |||
|
354 | t.start() | |||
|
355 | ||||
|
356 | while True: | |||
|
357 | self.dataOut = self.receiver.recv_pyobj() | |||
|
358 | print '[Receiving] {} - {}'.format(self.dataOut.type, | |||
|
359 | self.dataOut.datatime.ctime()) | |||
|
360 | ||||
|
361 | self.update() | |||
|
362 | ||||
|
363 | if self.dataOut.finished is True: | |||
|
364 | self.send(self.data) | |||
|
365 | self.connections -= 1 | |||
|
366 | if self.connections==0 and self.started: | |||
|
367 | self.ended = True | |||
|
368 | self.data['ENDED'] = True | |||
|
369 | self.send(self.data) | |||
|
370 | self.setup() | |||
|
371 | else: | |||
|
372 | if self.realtime: | |||
|
373 | self.send(self.data) | |||
|
374 | else: | |||
|
375 | self.sendData(self.data) | |||
|
376 | self.started = True | |||
|
377 | ||||
|
378 | return |
General Comments 0
You need to be logged in to leave comments.
Login now