|
|
'''
|
|
|
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
|
|
|
|