jroplotter.py
237 lines
| 6.1 KiB
| text/x-python
|
PythonLexer
|
r691 | ''' | |
Created on Jul 9, 2014 | |||
@author: roj-idl71 | |||
''' | |||
|
r732 | import os, sys | |
|
r691 | import datetime | |
import numpy | |||
|
r732 | import traceback | |
|
r691 | ||
|
r698 | from time import sleep | |
from Queue import Queue | |||
|
r707 | from threading import Lock | |
# from threading import Thread | |||
|
r691 | ||
|
r732 | import schainpy | |
import schainpy.admin | |||
|
r698 | from schainpy.model.proc.jroproc_base import Operation | |
from schainpy.model.serializer.data import obj2Dict, dict2Obj | |||
|
r701 | from jroplot_correlation import * | |
from jroplot_heispectra import * | |||
from jroplot_parameters import * | |||
from jroplot_spectra import * | |||
from jroplot_voltage import * | |||
|
r698 | ||
class Plotter(Operation): | |||
|
r691 | ||
isConfig = None | |||
name = None | |||
|
r698 | __queue = None | |
|
r691 | ||
def __init__(self, plotter_name, plotter_queue=None): | |||
|
r698 | Operation.__init__(self) | |
|
r691 | self.isConfig = False | |
self.name = plotter_name | |||
|
r698 | self.__queue = plotter_queue | |
|
r691 | ||
def getSubplots(self): | |||
nrow = self.nplots | |||
ncol = 1 | |||
return nrow, ncol | |||
def setup(self, **kwargs): | |||
print "Initializing ..." | |||
|
r698 | def run(self, dataOut, id=None, **kwargs): | |
|
r691 | ||
""" | |||
Input: | |||
dataOut : | |||
id : | |||
""" | |||
|
r698 | packDict = {} | |
packDict['id'] = id | |||
packDict['name'] = self.name | |||
packDict['kwargs'] = kwargs | |||
packDict['data'] = obj2Dict(dataOut) | |||
self.__queue.put(packDict) | |||
|
r707 | # class PlotManager(Thread): | |
class PlotManager(): | |||
|
r732 | ||
__err = False | |||
|
r698 | __stop = False | |
|
r732 | __realtime = False | |
|
r716 | controllerThreadObj = None | |
|
r698 | ||
|
r732 | plotterList = ['Scope', | |
'SpectraPlot', 'RTIPlot', | |||
|
r775 | 'SpectraCutPlot', | |
|
r732 | 'CrossSpectraPlot', 'CoherenceMap', | |
'PowerProfilePlot', 'Noise', 'BeaconPhase', | |||
'CorrelationPlot', | |||
'SpectraHeisScope','RTIfromSpectraHeis'] | |||
|
r698 | def __init__(self, plotter_queue): | |
|
r707 | # Thread.__init__(self) | |
# self.setDaemon(True) | |||
|
r703 | ||
|
r698 | self.__queue = plotter_queue | |
|
r707 | self.__lock = Lock() | |
|
r698 | ||
self.plotInstanceDict = {} | |||
|
r732 | ||
self.__err = False | |||
|
r698 | self.__stop = False | |
|
r732 | 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) | |||
|
r698 | ||
def run(self): | |||
|
r707 | if self.__queue.empty(): | |
return | |||
|
r732 | if self.__err: | |
serial_data = self.__queue.get() | |||
self.__queue.task_done() | |||
return | |||
|
r707 | 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() | |||
|
r698 | ||
|
r707 | n = int(self.__queue.qsize()/3 + 1) | |
for i in range(n): | |||
|
r698 | ||
|
r716 | if self.__queue.empty(): | |
break | |||
|
r707 | serial_data = self.__queue.get() | |
self.__queue.task_done() | |||
|
r698 | ||
plot_id = serial_data['id'] | |||
plot_name = serial_data['name'] | |||
kwargs = serial_data['kwargs'] | |||
dataDict = serial_data['data'] | |||
dataPlot = dict2Obj(dataDict) | |||
if plot_id not in self.plotInstanceDict.keys(): | |||
className = eval(plot_name) | |||
self.plotInstanceDict[plot_id] = className() | |||
plotter = self.plotInstanceDict[plot_id] | |||
|
r732 | try: | |
plotter.run(dataPlot, plot_id, **kwargs) | |||
except: | |||
self.__err = True | |||
self.__handleError(plot_name, send_email=True) | |||
break | |||
|
r691 | ||
|
r707 | self.__lock.release() | |
|
r710 | ||
def isEmpty(self): | |||
return self.__queue.empty() | |||
|
r698 | def stop(self): | |
|
r691 | ||
|
r707 | 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() | |||
|
r716 | ||
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() | |||
|
r732 | self.close() | |
def isErrorDetected(self): | |||
self.__lock.acquire() | |||
err = self.__err | |||
self.__lock.release() | |||
return err |