##// END OF EJS Templates
Python 2to3, Spectra (all operations) working
Python 2to3, Spectra (all operations) working

File last commit:

r1167:1f521b07c958
r1167:1f521b07c958
Show More
jroplotter.py
239 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 list(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 list(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