##// END OF EJS Templates
Update plot codes, add meta attribute to dataOut to send metadata to plots
Update plot codes, add meta attribute to dataOut to send metadata to plots

File last commit:

r1014:c5cbd628ce0f merge
r1139:ade57c0ecace
Show More
jroplotter.py
240 lines | 5.7 KiB | text/x-python | PythonLexer
'''
Created on Jul 9, 2014
@author: roj-idl71
'''
import os, sys
import datetime
import numpy
import traceback
from time import sleep
from threading import Lock
# from threading import Thread
import schainpy
import schainpy.admin
from schainpy.model.proc.jroproc_base import Operation
from schainpy.model.serializer.data import obj2Dict, dict2Obj
from jroplot_correlation import *
from jroplot_heispectra import *
from jroplot_parameters import *
from jroplot_spectra import *
from jroplot_voltage import *
class Plotter(Operation):
isConfig = None
name = None
__queue = None
def __init__(self, plotter_name, plotter_queue=None, **kwargs):
Operation.__init__(self, **kwargs)
self.isConfig = False
self.name = plotter_name
self.__queue = plotter_queue
def getSubplots(self):
nrow = self.nplots
ncol = 1
return nrow, ncol
def setup(self, **kwargs):
print "Initializing ..."
def run(self, dataOut, id=None, **kwargs):
"""
Input:
dataOut :
id :
"""
packDict = {}
packDict['id'] = id
packDict['name'] = self.name
packDict['kwargs'] = kwargs
# packDict['data'] = obj2Dict(dataOut)
packDict['data'] = dataOut
self.__queue.put(packDict)
# class PlotManager(Thread):
class PlotManager():
__err = False
__stop = False
__realtime = False
controllerThreadObj = None
plotterList = ['Scope',
'SpectraPlot', 'RTIPlot',
'SpectraCutPlot',
'CrossSpectraPlot', 'CoherenceMap',
'PowerProfilePlot', 'Noise', 'BeaconPhase',
'CorrelationPlot',
'SpectraHeisScope', 'RTIfromSpectraHeis']
def __init__(self, plotter_queue):
# Thread.__init__(self)
# self.setDaemon(True)
self.__queue = plotter_queue
self.__lock = Lock()
self.plotInstanceDict = {}
self.__err = False
self.__stop = False
self.__realtime = False
def __handleError(self, name="", send_email=False):
err = traceback.format_exception(sys.exc_info()[0],
sys.exc_info()[1],
sys.exc_info()[2])
print "***** Error occurred in PlotManager *****"
print "***** [%s]: %s" %(name, err[-1])
message = "\nError ocurred in %s:\n" %name
message += "".join(err)
sys.stderr.write(message)
if not send_email:
return
import socket
subject = "SChain v%s: Error running %s\n" %(schainpy.__version__, name)
subtitle = "%s:\n" %(name)
subtitle += "Hostname: %s\n" %socket.gethostbyname(socket.gethostname())
subtitle += "Working directory: %s\n" %os.path.abspath("./")
# subtitle += "Configuration file: %s\n" %self.filename
subtitle += "Time: %s\n" %str(datetime.datetime.now())
adminObj = schainpy.admin.SchainNotify()
adminObj.sendAlert(message=message,
subject=subject,
subtitle=subtitle)
def run(self):
if self.__queue.empty():
return
if self.__err:
serial_data = self.__queue.get()
self.__queue.task_done()
return
self.__lock.acquire()
# if self.__queue.full():
# for i in range(int(self.__queue.qsize()/2)):
# serial_data = self.__queue.get()
# self.__queue.task_done()
n = int(self.__queue.qsize()/3 + 1)
for i in range(n):
if self.__queue.empty():
break
serial_data = self.__queue.get()
self.__queue.task_done()
plot_id = serial_data['id']
plot_name = serial_data['name']
kwargs = serial_data['kwargs']
# dataDict = serial_data['data']
#
# dataPlot = dict2Obj(dataDict)
dataPlot = serial_data['data']
if plot_id not in self.plotInstanceDict.keys():
className = eval(plot_name)
self.plotInstanceDict[plot_id] = className(**kwargs)
plotter = self.plotInstanceDict[plot_id]
try:
plotter.run(dataPlot, plot_id, **kwargs)
except:
self.__err = True
self.__handleError(plot_name, send_email=True)
break
self.__lock.release()
def isEmpty(self):
return self.__queue.empty()
def stop(self):
self.__lock.acquire()
self.__stop = True
self.__lock.release()
def close(self):
self.__lock.acquire()
for plot_id in self.plotInstanceDict.keys():
plotter = self.plotInstanceDict[plot_id]
plotter.close()
self.__lock.release()
def setController(self, controllerThreadObj):
self.controllerThreadObj = controllerThreadObj
def start(self):
if not self.controllerThreadObj.isRunning():
raise RuntimeError, "controllerThreadObj has not been initialized. Use controllerThreadObj.start() before call this method"
self.join()
def join(self):
#Execute plotter while controller is running
while self.controllerThreadObj.isRunning():
self.run()
self.controllerThreadObj.stop()
#Wait until plotter queue is empty
while not self.isEmpty():
self.run()
self.close()
def isErrorDetected(self):
self.__lock.acquire()
err = self.__err
self.__lock.release()
return err