##// END OF EJS Templates
Test version ready
Juan C. Espinoza -
r27:c1db622aca0e
parent child
Show More
@@ -4,7 +4,7 import os
4 import json
4 import json
5
5
6 from datetime import datetime, timedelta
6 from datetime import datetime, timedelta
7
7 import numpy
8 from pymongo import MongoClient
8 from pymongo import MongoClient
9 import mongoengine
9 import mongoengine
10 from asgiref.sync import async_to_sync
10 from asgiref.sync import async_to_sync
@@ -75,9 +75,6 class PlotConsumer(WebsocketConsumer):
75 dt = datetime.strptime(text_data, '%d-%m-%Y')
75 dt = datetime.strptime(text_data, '%d-%m-%Y')
76 code = self.scope['url_route']['kwargs']['code']
76 code = self.scope['url_route']['kwargs']['code']
77 plot = self.scope['url_route']['kwargs']['plot']
77 plot = self.scope['url_route']['kwargs']['plot']
78 # exp = DB.experiment.find_one({'code': int(code)})
79 # det0 = DB.exp_detail.find_one({'experiment': exp['_id'], 'date': dt-timedelta(days=1)})
80 # det1 = DB.exp_detail.find_one({'experiment': exp['_id'], 'date': dt})
81 exp = Experiment.objects.get(code=code)
78 exp = Experiment.objects.get(code=code)
82 det0 = ExpDetail.objects(experiment=exp, date=dt-timedelta(days=1))
79 det0 = ExpDetail.objects(experiment=exp, date=dt-timedelta(days=1))
83 det1 = ExpDetail.objects(experiment=exp, date=dt)
80 det1 = ExpDetail.objects(experiment=exp, date=dt)
@@ -85,22 +82,11 class PlotConsumer(WebsocketConsumer):
85 if det1:
82 if det1:
86 meta1 = PlotMeta.objects(exp_detail=det1[0], plot=plot)
83 meta1 = PlotMeta.objects(exp_detail=det1[0], plot=plot)
87 if meta1:
84 if meta1:
88 if plot == 'spc':
85 if meta1[0].metadata['type'] in ('pcolor',):
89 datas = PlotData.objects(plot=meta1[0]).order_by('-time').first()
86 datas = PlotData.objects(plot=meta1[0]).order_by('-time').first()
90 ret['time'] = [datas['time']]
87 ret['time'] = [datas['time']]
91 ret['spc'] = datas['data']
88 ret['data'] = datas['data']
92 ret['meta'] = dict(meta1[0].metadata)
89 ret['metadata'] = meta1[0].metadata
93 meta = PlotMeta.objects(exp_detail=det1[0], plot='rti')
94 if meta:
95 data = PlotData.objects(plot=meta[0], time=ret['time'][0])
96 if data:
97 ret['rti'] = data[0]['data']
98
99 meta = PlotMeta.objects(exp_detail=det1[0], plot='noise')
100 if meta:
101 data = PlotData.objects(plot=meta[0], time=ret['time'][0])
102 if data:
103 ret['meta']['titles'] = ['{} dB'.format(x) for x in data[0]['data']]
104 else:
90 else:
105 last = det1[0]['last_time']
91 last = det1[0]['last_time']
106 metas = [meta1[0]]
92 metas = [meta1[0]]
@@ -111,9 +97,12 class PlotConsumer(WebsocketConsumer):
111 datas = PlotData.objects(plot__in=metas, time__gt=last-12*60*60).limit(720)
97 datas = PlotData.objects(plot__in=metas, time__gt=last-12*60*60).limit(720)
112 dum = [(d['time'], d['data']) for d in datas]
98 dum = [(d['time'], d['data']) for d in datas]
113 ret['time'] = [d[0] for d in dum]
99 ret['time'] = [d[0] for d in dum]
114 dum = [d[1] for d in dum]
100 dum = numpy.array([d[1] for d in dum])
115 ret[plot] = [t for t in map(list, list(zip(*dum)))]
101 if len(dum[0][0])==1:
116 ret['meta'] = metas[0].metadata
102 ret['data'] = dum.T[0].tolist()
103 else:
104 ret['data'] = [t for t in map(list, list(zip(*dum.tolist())))]
105 ret['metadata'] = metas[0].metadata
117
106
118 # exp.pop('date', None)
107 # exp.pop('date', None)
119 # exp.pop('_id', None)
108 # exp.pop('_id', None)
@@ -124,49 +113,3 class PlotConsumer(WebsocketConsumer):
124 def zmq_message(self, event):
113 def zmq_message(self, event):
125 # Send message to WebSocket
114 # Send message to WebSocket
126 self.send(text_data=event['message'])
115 self.send(text_data=event['message'])
127
128 def ws_message(message, id, code, plot):
129 # Accept the incoming connection
130 dt = datetime.strptime(str(json.loads(message.content['text'])['date']), '%d/%m/%Y')
131 exp0 = DB.exp_meta.find_one({'code': int(code), 'date': dt-timedelta(days=1)})
132 exp = DB.exp_meta.find_one({'code': int(code), 'date': dt})
133 print(('New request for id={}'.format(id)))
134 if exp and plot in exp['plots']:
135 if plot == 'spc':
136 datas = DB.exp_data.find({'expmeta': exp['_id']}, ['time', 'data']).sort('time', -1).limit(1)[0]
137 exp['time'] = [datas['time']]
138 exp['spc'] = datas['data']['spc']
139 exp['rti'] = datas['data']['rti']
140 exp['noise'] = datas['data']['noise']
141 else:
142 last = DB.exp_data.find_one({'expmeta': exp['_id']}, ['time'], sort=[('time', -1)])
143 if exp0:
144 datas = DB.exp_data.find(
145 {
146 'expmeta': {'$in': [exp0['_id'], exp['_id']]},
147 'time': {'$gt': last['time']-12*60*60}
148 },
149 ['time', 'data'],
150 sort=[('time', 1)],
151 limit=720
152 )
153 else:
154 datas = DB.exp_data.find(
155 {
156 'expmeta': exp['_id'],
157 'time': {'$gt': last['time']-12*60*60}
158 },
159 ['time', 'data'],
160 sort=[('time', 1)],
161 limit=720
162 )
163 dum = [(d['time'], d['data'][plot]) for d in datas]
164 exp['time'] = [d[0] for d in dum]
165 dum = [d[1] for d in dum]
166 exp[plot] = [t for t in map(list, list(zip(*dum)))]
167
168 exp.pop('date', None)
169 exp.pop('_id', None)
170 message.reply_channel.send({'text': json.dumps(exp)})
171 else:
172 message.reply_channel.send({'text': json.dumps({'interval': 0})})
@@ -16,6 +16,12
16 margin: 0px !important;
16 margin: 0px !important;
17 }
17 }
18
18
19 #loader {
20 background-image: url(/static/images/loader.gif);
21 background-repeat: no-repeat;
22 height: 40px;
23 }
24
19 /* Change Buttons Bootstrap */
25 /* Change Buttons Bootstrap */
20 .btn-primary {
26 .btn-primary {
21 color: #fff;
27 color: #fff;
@@ -16,18 +16,17 function list2dict(values) {
16 };
16 };
17 /* In this class is defined all the function to RTI plot */
17 /* In this class is defined all the function to RTI plot */
18 class PcolorBuffer {
18 class PcolorBuffer {
19 constructor({ div, data, key, props }) {
19 constructor({ div, data, props }) {
20 this.div = document.getElementById(div);
20 this.div = document.getElementById(div);
21 this.n = 0;
21 this.n = 0;
22 this.divs = [];
22 this.divs = [];
23 this.wait = false;
23 this.wait = false;
24 this.key = key;
25 this.timer = (props.throttle || 30) * 1000;
24 this.timer = (props.throttle || 30) * 1000;
26 this.lastRan = Date.now();
25 this.lastRan = Date.now();
27 this.lastFunc = null;
26 this.lastFunc = null;
28 this.zbuffer = [];
27 this.zbuffer = [];
29 this.xbuffer = [];
28 this.xbuffer = [];
30 this.empty = Array(data.meta.yrange.length).fill(null);
29 this.empty = Array(data.metadata.yrange.length).fill(null);
31 this.props = props;
30 this.props = props;
32 this.setup(data);
31 this.setup(data);
33 }
32 }
@@ -35,21 +34,21 class PcolorBuffer {
35 setup(data) {
34 setup(data) {
36 this.last = data.time.slice(-1);
35 this.last = data.time.slice(-1);
37 if (data.time.length == 1) {
36 if (data.time.length == 1) {
38 var values = { 'time': data.time, 'data': data[this.key].map(function (x) { return [x] }) };
37 var values = { 'time': data.time, 'data': data['data'].map(function (x) { return [x] }) };
39 } else {
38 } else {
40 var values = this.fill_gaps(data.time, data[this.key], data.meta.interval, data[this.key].length);
39 var values = this.fill_gaps(data.time, data['data'], data.metadata.interval, data['data'].length);
41 }
40 }
42 var t = values.time.map(function (x) {
41 var t = values.time.map(function (x) {
43 var a = new Date(x * 1000);
42 var a = new Date(x * 1000);
44 // This condition is used to change from UTC to LT
43 // This condition is used to change from UTC to LT
45 if (data.localtime == true){
44 if (data.metadata.localtime == true){
46 a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 );
45 a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 );
47 }
46 }
48 return a;
47 return a;
49 });
48 });
50
49
51 var label;
50 var label;
52 if (data.localtime == true){
51 if (data.metadata.localtime == true){
53 label = "[LT]";
52 label = "[LT]";
54
53
55 }
54 }
@@ -57,7 +56,7 class PcolorBuffer {
57 label = "[UTC]";
56 label = "[UTC]";
58 }
57 }
59
58
60 for (var i = 0; i < data[this.key].length; i++) {
59 for (var i = 0; i < data['data'].length; i++) {
61 var layout = {
60 var layout = {
62 height: 350,
61 height: 350,
63 xaxis: {
62 xaxis: {
@@ -143,7 +142,7 class PcolorBuffer {
143
142
144 for (var i = 1; i < xBuffer.length; i++) {
143 for (var i = 1; i < xBuffer.length; i++) {
145 var cnt = 0;
144 var cnt = 0;
146 last = x.slice(-1)[0];
145 last = x[x.length-1];
147 while (Math.abs(parseFloat(xBuffer[i]) - last ) > 1.5 * parseFloat(interval)) {
146 while (Math.abs(parseFloat(xBuffer[i]) - last ) > 1.5 * parseFloat(interval)) {
148 cnt += 1;
147 cnt += 1;
149 last = last + interval;
148 last = last + interval;
@@ -186,16 +185,16 class PcolorBuffer {
186 // fill data gaps
185 // fill data gaps
187 var cnt = 0;
186 var cnt = 0;
188
187
189 while (Math.abs(parseFloat(obj.time[0]) - this.last) > 1.5 * parseFloat(obj.interval)) {
188 while (Math.abs(parseFloat(obj.time[0]) - this.last) > 1.5 * parseFloat(obj.metadata.interval)) {
190 cnt += 1;
189 cnt += 1;
191 this.last += obj.interval;
190 this.last += obj.metadata.interval;
192 var newt = new Date((this.last) * 1000);
191 var newt = new Date((this.last) * 1000);
193 // This condition is used to change from UTC to LT
192 // This condition is used to change from UTC to LT
194 if (obj.localtime == true){
193 if (obj.metadata.localtime == true){
195 newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 );
194 newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 );
196 }
195 }
197 this.xbuffer.push(newt);
196 this.xbuffer.push(newt);
198 for (var i = 0; i < obj[this.key].length; i++) {
197 for (var i = 0; i < obj['data'].length; i++) {
199 this.zbuffer[i].push(this.empty);
198 this.zbuffer[i].push(this.empty);
200 }
199 }
201 // Avoid infinite loop
200 // Avoid infinite loop
@@ -206,12 +205,12 class PcolorBuffer {
206 this.last = parseFloat(obj.time[0]);
205 this.last = parseFloat(obj.time[0]);
207 var t = new Date(obj.time[0] * 1000);
206 var t = new Date(obj.time[0] * 1000);
208 // This condition is used to change from UTC to LT
207 // This condition is used to change from UTC to LT
209 if (obj.localtime == true){
208 if (obj.metadata.localtime == true){
210 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
209 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
211 }
210 }
212 this.xbuffer.push(t);
211 this.xbuffer.push(t);
213 for (var i = 0; i < obj[this.key].length; i++) {
212 for (var i = 0; i < obj['data'].length; i++) {
214 this.zbuffer[i].push(obj[this.key][i]);
213 this.zbuffer[i].push(obj['data'][i]);
215 var div = document.getElementById(this.divs[i]);
214 var div = document.getElementById(this.divs[i]);
216 Plotly.relayout(div, {
215 Plotly.relayout(div, {
217 title: 'Ch ' + i + ' - ' + t.toLocaleString(),
216 title: 'Ch ' + i + ' - ' + t.toLocaleString(),
@@ -267,7 +266,7 class Pcolor {
267 }
266 }
268 /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/
267 /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/
269 setup(data) {
268 setup(data) {
270 for (var i = 0; i < data.spc.length; i++) {
269 for (var i = 0; i < data['data'].length; i++) {
271 var layout = {
270 var layout = {
272 margin: {
271 margin: {
273 t:30,
272 t:30,
@@ -287,7 +286,6 class Pcolor {
287 linewidth: 2,
286 linewidth: 2,
288 mirror: 'all',
287 mirror: 'all',
289 size: 12,
288 size: 12,
290 //range: [data.meta.yrange[0], data.meta.yrange.slice(-1)[0]],
291 },
289 },
292 titlefont: {
290 titlefont: {
293 size: 14
291 size: 14
@@ -303,14 +301,14 class Pcolor {
303 iDiv.className = 'col-md-1';
301 iDiv.className = 'col-md-1';
304 this.div.appendChild(iDiv);
302 this.div.appendChild(iDiv);
305 var trace1 = {
303 var trace1 = {
306 z: data.spc[i],
304 z: data['data'][i],
307 y: data.meta.yrange,
305 y: data.metadata.yrange,
308 x: data.meta.xrange,
306 x: data.metadata.xrange,
309 colorscale: this.props.colormap || 'Jet',
307 colorscale: this.props.colormap || 'Jet',
310 transpose: true,
308 transpose: true,
311 type: 'heatmap'
309 type: 'heatmap'
312 };
310 };
313
311 /*
314 if ('rti' in data){
312 if ('rti' in data){
315 layout.xaxis.domain = [0, 0.7];
313 layout.xaxis.domain = [0, 0.7];
316 layout.xaxis2 = {
314 layout.xaxis2 = {
@@ -323,29 +321,26 class Pcolor {
323 };
321 };
324 var trace2 = {
322 var trace2 = {
325 x: data.rti[i],
323 x: data.rti[i],
326 y: data.meta.yrange,
324 y: data.metadata.yrange,
327 xaxis: 'x2',
325 xaxis: 'x2',
328 type: 'scatter',
326 type: 'scatter',
329 };
327 };
330 }
328 }
331
329 */
332 if (this.props.zmin) {
330 if (this.props.zmin) {
333 trace1.zmin = this.props.zmin
331 trace1.zmin = this.props.zmin
334 }
332 }
335 if (this.props.zmax) {
333 if (this.props.zmax) {
336 trace1.zmax = this.props.zmax;
334 trace1.zmax = this.props.zmax;
337 if ('rti' in data){
338 layout.xaxis2.range = [this.props.zmin, this.props.zmax]
339 }
340 }
335 }
341
336
342 var t = new Date(data.time * 1000);
337 var t = new Date(data.time * 1000);
343 // This condition is used to change from UTC to LT
338 // This condition is used to change from UTC to LT
344 if (data.localtime == true){
339 if (data.metadata.localtime == true){
345 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
340 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
346 }
341 }
347 if ('titles' in data.meta){
342 if ('titles' in data.metadata){
348 layout.title = 'Ch ' + i + ': ' + data.meta.titles[i] + ' ' + t.toLocaleString();
343 layout.title = 'Ch ' + i + ': ' + data.metadata.titles[i] + ' ' + t.toLocaleString();
349 }else{
344 }else{
350 layout.title = 'Ch ' + i + ': ' + t.toLocaleString();
345 layout.title = 'Ch ' + i + ': ' + t.toLocaleString();
351 }
346 }
@@ -363,34 +358,39 class Pcolor {
363 displaylogo: false,
358 displaylogo: false,
364 showTips: true
359 showTips: true
365 };
360 };
366 if ('rti' in data){
361
367 var traces = [trace1, trace2]
362 var traces = [trace1]
368 }else{
363
369 var traces = [trace1]
370 }
371 Plotly.newPlot('plot-' + i, traces, layout, conf);
364 Plotly.newPlot('plot-' + i, traces, layout, conf);
372 }
365 }
373 }
366 }
374
367
375 plot(obj) {
368 plot(obj) {
376 // this.data = obj;
369 this.data = obj;
377 // add new data to plots and empty buffers
370 // add new data to plots and empty buffers
378 console.log('Plotting...');
371 console.log('Plotting...');
379 var t = new Date(obj.time[0] * 1000);
372 var t = new Date(obj.time[0] * 1000);
380 // This condition is used to change from UTC to LT
373 // This condition is used to change from UTC to LT
381 if (obj.localtime == true){
374 if (obj.metadata.localtime == true){
382 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
375 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
383 }
376 }
384 for (var i = 0; i < this.n; i++) {
377 for (var i = 0; i < this.n; i++) {
385 var div = document.getElementById(this.divs[i]);
378 var div = document.getElementById(this.divs[i]);
386 Plotly.relayout(div, {
379
387 title: 'Ch ' + i + ': ' + obj.noise[i] + 'dB - ' + t.toLocaleString(),
380 if ('titles' in obj.metadata){
381 var title = 'Ch ' + i + ': ' + obj.metadata.titles[i] + ' ' + t.toLocaleString();
382 }else{
383 var title = 'Ch ' + i + ': ' + t.toLocaleString();
384 }
388
385
386 Plotly.relayout(div, {
387 title: title,
389 });
388 });
389
390 Plotly.restyle(div, {
390 Plotly.restyle(div, {
391 z: [obj.spc[i], null],
391 z: [obj['data'][i]],
392 x: [obj.xrange, obj.rti[i]]
392 x: [obj.xrange]
393 }, [0, 1]);
393 }, [0]);
394 }
394 }
395 }
395 }
396
396
@@ -437,10 +437,9 class Pcolor {
437 }
437 }
438 /* In this class is defined all the function to Scatter(noise) plot */
438 /* In this class is defined all the function to Scatter(noise) plot */
439 class Scatter {
439 class Scatter {
440 constructor({ div, data, key, props }) {
440 constructor({ div, data, props }) {
441 this.div = document.getElementById(div);
441 this.div = document.getElementById(div);
442 this.n = 0;
442 this.n = 0;
443 this.key = key;
444 this.wait = false;
443 this.wait = false;
445 this.timer = (props.throttle || 30) * 1000;
444 this.timer = (props.throttle || 30) * 1000;
446 this.lastRan = Date.now();
445 this.lastRan = Date.now();
@@ -448,30 +447,31 class Scatter {
448 this.ybuffer = [];
447 this.ybuffer = [];
449 this.xbuffer = [];
448 this.xbuffer = [];
450 this.props = props;
449 this.props = props;
450 console.log(data);
451 this.setup(data);
451 this.setup(data);
452 }
452 }
453 /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/
453 /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/
454 setup(data) {
454 setup(data) {
455
455
456 this.data = data; //le agrego juan carlos para ver la data en mi consola
456 //this.data = data;
457 var traces = [];
457 var traces = [];
458 this.last = data.time.slice(-1);
458 this.last = data.time.slice(-1);
459 if (data.time.length == 1) {
459 if (data.time.length == 1) {
460 var values = { 'time': data.time, 'data': data[this.key] };
460 var values = { 'time': data.time, 'data': data['data'] };
461 } else {
461 } else {
462 var values = this.fill_gaps(data.time, data[this.key], data.meta.interval, data[this.key].length);
462 var values = this.fill_gaps(data.time, data['data'], data.metadata.interval, data['data'].length);
463 }
463 }
464
464
465 var t = values.time.map(function (x) {
465 var t = values.time.map(function (x) {
466 var a = new Date(x * 1000);
466 var a = new Date(x * 1000);
467 // This condition is used to change from UTC to LT
467 // This condition is used to change from UTC to LT
468 if (data.localtime == true){
468 if (data.metadata.localtime == true){
469 a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 );
469 a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 );
470 }
470 }
471 return a;
471 return a;
472 });
472 });
473
473
474 for (var i = 0; i < data[this.key].length; i++) {
474 for (var i = 0; i < data['data'].length; i++) {
475
475
476 this.n = this.n + 1;
476 this.n = this.n + 1;
477 this.ybuffer.push([]);
477 this.ybuffer.push([]);
@@ -488,7 +488,7 class Scatter {
488 }
488 }
489
489
490 var label;
490 var label;
491 if (data.localtime == true){
491 if (data.metadata.localtime == true){
492 label = "[LT]";
492 label = "[LT]";
493
493
494 }
494 }
@@ -563,7 +563,7 class Scatter {
563 for (var i = 1; i < xBuffer.length; i++) {
563 for (var i = 1; i < xBuffer.length; i++) {
564 var cnt = 0;
564 var cnt = 0;
565 last = x.slice(-1)[0];
565 last = x.slice(-1)[0];
566 console.log(Math.abs(parseFloat(xBuffer[i]) - last) + ' '+ parseFloat(interval));
566 //console.log(Math.abs(parseFloat(xBuffer[i]) - last) + ' '+ parseFloat(interval));
567 while (Math.abs(parseFloat(xBuffer[i]) - last) > 1.5 * parseFloat(interval)) {
567 while (Math.abs(parseFloat(xBuffer[i]) - last) > 1.5 * parseFloat(interval)) {
568 cnt += 1;
568 cnt += 1;
569 last = last + interval;
569 last = last + interval;
@@ -609,15 +609,14 class Scatter {
609 }
609 }
610 //This function just add the last data and is used if previously was used setup()
610 //This function just add the last data and is used if previously was used setup()
611 update(obj) {
611 update(obj) {
612
613 // fill data gaps
612 // fill data gaps
614 var cnt = 0;
613 var cnt = 0;
615 while (Math.abs(parseFloat(obj.time[0]) - this.last ) > 1.5 * parseFloat(obj.interval)) {
614 while (Math.abs(parseFloat(obj.time[0]) - this.last ) > 1.5 * parseFloat(obj.metadata.interval)) {
616 cnt += 1;
615 cnt += 1;
617 this.last += obj.interval;
616 this.last += obj.metadata.interval;
618 var newt = new Date((this.last) * 1000);
617 var newt = new Date((this.last) * 1000);
619 // This condition is used to change from UTC to LT
618 // This condition is used to change from UTC to LT
620 if (obj.localtime == true){
619 if (obj.metadata.localtime == true){
621 newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 );
620 newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 );
622 }
621 }
623 this.xbuffer.push(newt);
622 this.xbuffer.push(newt);
@@ -632,12 +631,12 class Scatter {
632 this.last = parseFloat(obj.time[0]);
631 this.last = parseFloat(obj.time[0]);
633 var t = new Date(obj.time[0] * 1000);
632 var t = new Date(obj.time[0] * 1000);
634 // This condition is used to change from UTC to LT
633 // This condition is used to change from UTC to LT
635 if (obj.localtime == true){
634 if (obj.metadata.localtime == true){
636 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
635 t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 );
637 }
636 }
638 this.xbuffer.push(t);
637 this.xbuffer.push(t);
639 for (var i = 0; i < this.n; i++) {
638 for (var i = 0; i < this.n; i++) {
640 this.ybuffer[i].push(obj[this.key][i][0]);
639 this.ybuffer[i].push(obj['data'][i][0]);
641 }
640 }
642
641
643 Plotly.relayout(this.div, {
642 Plotly.relayout(this.div, {
@@ -10,7 +10,7
10 <div id="card_body_{{exp.code}}"class="card-body">
10 <div id="card_body_{{exp.code}}"class="card-body">
11 <div id="date_{{exp.code}}">Last data: {{exp.date | date:"h:i:s a" }}</div>
11 <div id="date_{{exp.code}}">Last data: {{exp.date | date:"h:i:s a" }}</div>
12 {% for plot in exp.plots %}
12 {% for plot in exp.plots %}
13 <a class="btn btn-outline-{{exp.style}}" href="{% url 'url-plot' exp.code plot %}" role="button">{{plot}}</a>
13 <a class="btn btn-outline-{{exp.style}}" href="{% url 'url-plot' exp.code plot.plot %}" role="button">{{plot.name}}</a>
14 {% endfor %}
14 {% endfor %}
15 </div>
15 </div>
16 </div></div>
16 </div></div>
@@ -3,10 +3,10
3 <div class="p-4 text-igp">
3 <div class="p-4 text-igp">
4 <h3>{{title}} <small> {{subtitle}}</small></h3>
4 <h3>{{title}} <small> {{subtitle}}</small></h3>
5 </div>
5 </div>
6 <div class="justify-content-center">
6 <div class="row justify-content-center">
7 <div id="loader" class="loader mt-5"></div>
7 <div id="loader" class="col-sm-2 loader"></div>
8 </div>
8 </div>
9 <div id="plot" {%if plot == 'spc' %}class="row"{%endif%}></div>
9 <div id="plot" {%if meta.metadata.type == 'pcolor' %}class="row"{%endif%}></div>
10
10
11 {% endblock content %} {% block modal %}
11 {% endblock content %} {% block modal %}
12 <!-- Modal -->
12 <!-- Modal -->
@@ -50,7 +50,6
50
50
51 socket.onmessage = function message(event) {
51 socket.onmessage = function message(event) {
52 var data = JSON.parse(event.data);
52 var data = JSON.parse(event.data);
53 console.log(data);
54 if (data.interval == 0) {
53 if (data.interval == 0) {
55 $("#loader").removeClass("loader").addClass("no-data");
54 $("#loader").removeClass("loader").addClass("no-data");
56 $("#loader").html("No data found");
55 $("#loader").html("No data found");
@@ -73,12 +72,11
73 plt = new {{ fn_plot }} ({
72 plt = new {{ fn_plot }} ({
74 div: 'plot',
73 div: 'plot',
75 data: data,
74 data: data,
76 key: '{{plot}}',
77 props: { throttle: 30, timespan: 12, colormap: 'Jet' },
75 props: { throttle: 30, timespan: 12, colormap: 'Jet' },
78 });
76 });
79 return true;
77 return true;
80 } else {
78 } else {
81 plt.update(data);
79 plt.update(data);
82 return false;
80 return false;
83 }
81 }
84 }
82 }
@@ -6,5 +6,5 urlpatterns = [
6 url(r'^$', main, name='url_main'),
6 url(r'^$', main, name='url_main'),
7 url(r'^tools/$', tools, name='url_tools'),
7 url(r'^tools/$', tools, name='url_tools'),
8 url(r'^reports/$', reports, name='url_reports'),
8 url(r'^reports/$', reports, name='url_reports'),
9 url(r'^(?P<code>[0-9]+)/(?P<plot>[0-9a-z]+)/$', plot, name='url-plot'),
9 url(r'^(?P<code>[0-9]+)/(?P<plot>[-\w]+)/$', plot, name='url-plot'),
10 ]
10 ]
@@ -75,15 +75,15 def main(request):
75 for exp in exps:
75 for exp in exps:
76 dum = {}
76 dum = {}
77 dum['code'] = exp.experiment.code
77 dum['code'] = exp.experiment.code
78 dum['plots'] = [plot.plot for plot in exp.plots()]
78 dum['plots'] = []
79 dum['name'] = exp.experiment.name
79 dum['name'] = exp.experiment.name
80 dt = datetime.now()
80 dt = datetime.now()
81
81
82 t = time.mktime(dt.timetuple())
82 t = time.mktime(dt.timetuple())
83
83
84 if exp.plots()[0]['metadata']['localtime'] == True: #Ask which type of time is coming: LT o UTC
84 if exp.plots()[0]['metadata']['localtime'] == True:
85 t -= 5*60*60
85 t -= 5*60*60
86 # COnditionals to know which state are my clients
86
87 if (t-exp['last_time']) > 10*60:
87 if (t-exp['last_time']) > 10*60:
88 status = 'Offline'
88 status = 'Offline'
89 clase = 'alertas-offline'
89 clase = 'alertas-offline'
@@ -104,7 +104,8 def main(request):
104 dum['class'] = clase
104 dum['class'] = clase
105 dum['style']= style
105 dum['style']= style
106 dum['date']= datetime.utcfromtimestamp(lastDataDate)
106 dum['date']= datetime.utcfromtimestamp(lastDataDate)
107
107 for plot in exp.plots():
108 dum['plots'].append({'plot': plot.plot, 'name': plot.plot.replace('_', ' ').title(), 'id':plot.id})
108 experiments.append(dum)
109 experiments.append(dum)
109
110
110 kwargs['date'] = date
111 kwargs['date'] = date
@@ -145,26 +146,24 def plot(request, code=None, plot=None):
145 kwargs = {
146 kwargs = {
146 'code': code,
147 'code': code,
147 'plot': plot,
148 'plot': plot,
149 'meta':meta,
148 'date': date,
150 'date': date,
149 'id': meta.pk,
151 'id': meta.pk,
150 'realtime': realtime,
152 'realtime': realtime,
151 'menu_list': ['Realtime', exp.name]
153 'menu_list': ['Realtime', exp.name, meta.plot.replace('_', ' ').title()]
152 }
154 }
153 # Logic to show my views
155 # Logic to show my views
154 if plot == 'rti':
156 if meta.metadata['type'] == 'pcolorbuffer':
155 kwargs['setup_form'] = RTISetupForm()
157 kwargs['setup_form'] = RTISetupForm()
156 kwargs['fn_plot'] = 'PcolorBuffer'
158 kwargs['fn_plot'] = 'PcolorBuffer'
157 kwargs['menu_list'].append('RTI plot')
158 return render(request, 'plot.html', kwargs)
159 return render(request, 'plot.html', kwargs)
159 elif plot == 'spc':
160 elif meta.metadata['type'] == 'pcolor':
160 kwargs['setup_form'] = SPCSetupForm()
161 kwargs['setup_form'] = SPCSetupForm()
161 kwargs['fn_plot'] = 'Pcolor'
162 kwargs['fn_plot'] = 'Pcolor'
162 kwargs['menu_list'].append('Spectra plot')
163 return render(request, 'plot.html', kwargs)
163 return render(request, 'plot.html', kwargs)
164 elif plot == 'noise':
164 elif meta.metadata['type'] == 'scatter':
165 kwargs['setup_form'] = ScatterSetupForm()
165 kwargs['setup_form'] = ScatterSetupForm()
166 kwargs['fn_plot'] = 'Scatter'
166 kwargs['fn_plot'] = 'Scatter'
167 kwargs['menu_list'].append('Noise plot')
168 return render(request, 'plot.html', kwargs)
167 return render(request, 'plot.html', kwargs)
169 else:
168 else:
170 return render(request, 'home.html', {})
169 return render(request, 'home.html', {})
@@ -26,6 +26,7 def send(dato):
26 poll.register(socket, zmq.POLLIN)
26 poll.register(socket, zmq.POLLIN)
27 retries = RETRIES
27 retries = RETRIES
28 while True:
28 while True:
29 print(dato['plot'])
29 socket.send_json(dato)
30 socket.send_json(dato)
30 socks = dict(poll.poll(REQUEST_TIMEOUT))
31 socks = dict(poll.poll(REQUEST_TIMEOUT))
31 if socks.get(socket) == zmq.POLLIN:
32 if socks.get(socket) == zmq.POLLIN:
@@ -62,33 +63,36 def main(realtime, code, date=None, interval=30):
62 else:
63 else:
63 dt = date
64 dt = date
64
65
65 data = {
66 'spc': np.round(np.random.rand(4, 60, 100)*5 + 10, 2).tolist(),
67 'rti': np.round(np.random.rand(4, 100)*5 + 10, 2).tolist(),
68 'noise': np.round(np.random.rand(4) + np.array([10,11,12,13]), 2).tolist()
69 }
70
71 while True:
66 while True:
72
67
73 print(('Sending {} - {}'.format(code, dt)))
68 print(('Sending {} - {}'.format(code, dt)))
74
69
70 data = {
71 'pcolor': ('Spectra', np.round(np.random.rand(4, 60, 100)*5 + 10, 2).tolist()),
72 'pcolorbuffer': ('RTI', np.round(np.random.rand(4, 100)*5 + 10, 2).tolist()),
73 'scatter': ('Power noise', np.round(np.random.rand(4, 1) + np.array([[10],[11],[12],[13]]), 2).tolist())
74 }
75
75 dato = {
76 dato = {
76 'time': time.mktime(dt.timetuple()),
77 'time': time.mktime(dt.timetuple()),
77 'metadata':{
78 'metadata':{
78 'yrange': np.arange(80, 120, 40/100.).tolist(),
79 'yrange': np.arange(80, 120, 40/100.).tolist(),
79 'xrange': np.arange(-30, 30).tolist(),
80 'xrange': np.arange(-30, 30).tolist(),
80 'localtime': True,
81 'localtime': True,
81 'interval': interval
82 'interval': interval,
83 'type': '',
82 },
84 },
83 'exp_code': code,
85 'code': code,
84 }
86 }
85
87
86 dt = dt + timedelta(seconds=interval)
88 dt = dt + timedelta(seconds=interval)
87 for plot, d in data.items():
89 for plot, d in data.items():
88 dato['plot'] = plot
90 dato['plot'] = d[0]
89 dato['data'] = d
91 dato['metadata']['type'] = plot
90 t = Thread(target=send, args=(dato, ))
92 dato['data'] = d[1]
91 t.start()
93 send(dato)
94 # t = Thread(target=send, args=(dato, ))
95 # t.start()
92 if realtime:
96 if realtime:
93 time.sleep(interval)
97 time.sleep(interval)
94 else:
98 else:
@@ -43,7 +43,7 def loaddata():
43 #============== funcion para modificar datos en la tabla ==============
43 #============== funcion para modificar datos en la tabla ==============
44 def update(buffer):
44 def update(buffer):
45 dt = datetime.utcfromtimestamp(buffer['time'])
45 dt = datetime.utcfromtimestamp(buffer['time'])
46 exp = Experiment.objects.get(code=buffer['exp_code'])
46 exp = Experiment.objects.get(code=buffer['code'])
47
47
48 detail = ExpDetail.objects(experiment=exp, date=dt.date()).modify(
48 detail = ExpDetail.objects(experiment=exp, date=dt.date()).modify(
49 upsert=True,
49 upsert=True,
@@ -53,7 +53,8 def update(buffer):
53 set__last_time = buffer['time']
53 set__last_time = buffer['time']
54 )
54 )
55
55
56 plot = PlotMeta.objects(exp_detail=detail, plot=buffer['plot']).modify(
56 label = buffer['plot'].replace(' ', '_').lower()
57 plot = PlotMeta.objects(exp_detail=detail, plot=label).modify(
57 upsert=True,
58 upsert=True,
58 new=True,
59 new=True,
59 set__metadata = buffer['metadata']
60 set__metadata = buffer['metadata']
@@ -89,8 +90,6 def check_times():
89
90
90 if plot['metadata']['localtime'] == True:
91 if plot['metadata']['localtime'] == True:
91 t -= 5*60*60
92 t -= 5*60*60
92
93 if plot['metadata']['localtime'] == True:
94 data_time = detail['last_time'] + 5*60*60
93 data_time = detail['last_time'] + 5*60*60
95
94
96 message = {
95 message = {
@@ -100,13 +99,13 def check_times():
100
99
101 if (t-detail['last_time']) > 10*60:
100 if (t-detail['last_time']) > 10*60:
102 value = 'danger'
101 value = 'danger'
103 print(('{} {} {} {} {}'.format(code, t, detail['last_time'], (t-detail['last_time']), 'offline')))
104 elif (t-detail['last_time']) > 5*60:
102 elif (t-detail['last_time']) > 5*60:
105 value = 'warning'
103 value = 'warning'
106 print(('{} {} {} {} {}'.format(code, t, detail['last_time'], (t-detail['last_time']), 'delayed')))
107 else:
104 else:
108 value = 'success'
105 value = 'success'
109
106
107 print(('{} {} {} {} {}'.format(code, t, detail['last_time'], (t-detail['last_time']), value)))
108
110 message['value'] = value
109 message['value'] = value
111
110
112 async_to_sync(channel.group_send)(
111 async_to_sync(channel.group_send)(
@@ -117,7 +116,7 def check_times():
117 }
116 }
118 )
117 )
119
118
120 time.sleep(30)
119 time.sleep(60)
121
120
122 def main():
121 def main():
123 print('Starting ZMQ server...')
122 print('Starting ZMQ server...')
@@ -140,30 +139,27 def main():
140 continue
139 continue
141 if not update(buffer):
140 if not update(buffer):
142 receiver.send_string('ok')
141 receiver.send_string('ok')
142 print('Queeee paso!!!')
143 continue
143 continue
144 # for plot in buffer['data']:
144
145 # dum = buffer.copy()
145 buffer['time'] = [buffer['time']]
146 # dum['time'] = [buffer['time']]
146 group = '{}_{}'.format(
147 # if plot=='noise':
147 buffer['code'],
148 # dum[plot] = [[x] for x in buffer['data'][plot]]
148 buffer['plot'].replace(' ', '_').lower()
149 # elif plot=='spc':
149 )
150 # dum['noise'] = [[x] for x in buffer['data']['noise']]
150 async_to_sync(channel.group_send)(
151 # dum['spc'] = buffer['data']['spc']
151 group,
152 # dum['rti'] = buffer['data']['rti']
152 {
153 # else:
153 'type': 'zmq_message',
154 # dum[plot] = buffer['data'][plot]
154 'message': simplejson.dumps(buffer, ignore_nan=True)
155 # dum.pop('data')
155 }
156 # exp_code = dum.pop('exp_code')
156 )
157 # group = '{}_{}'.format(exp_code, plot)
157
158 # async_to_sync(channel.group_send)(
158 print('Sending to group {}_{} - {} bytes'.format(
159 # group,
159 buffer['code'],
160 # {
160 buffer['plot'].replace(' ', '_').lower(),
161 # 'type': 'zmq_message',
161 len(str(buffer)))
162 # 'message': simplejson.dumps(dum, ignore_nan=True)
162 )
163 # }
164 # )
165
166 # print('Sending to group {}_{} - {} bytes'.format(exp_code, plot, len(str(dum))))
167
163
168 receiver.send_string('ok')
164 receiver.send_string('ok')
169
165
General Comments 0
You need to be logged in to leave comments. Login now