diff --git a/wsgi_isttok_archive.py b/wsgi_isttok_archive.py new file mode 100644 index 0000000..87e28f6 --- /dev/null +++ b/wsgi_isttok_archive.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- +""" +Created on Thu Feb 8 16:34:35 2018 + +@author: joao_loureiro +""" + +import epics +import time +import os + +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +import matplotlib.ticker as mtick + +import mpld3 +from mpld3 import plugins, utils + +import numpy as np +import MySQLdb + +os.environ['EPICS_CA_ADDR_LIST']= '192.168.1.110 192.168.1.152' +os.environ['EPICS_CA_AUTO_ADDR_LIST']= 'NO' + +class HelloWorld(mpld3.plugins.PluginBase): # inherit from PluginBase + """Hello World plugin""" + + JAVASCRIPT = """ + mpld3.register_plugin("helloworld", HelloWorld); + HelloWorld.prototype = Object.create(mpld3.Plugin.prototype); + HelloWorld.prototype.constructor = HelloWorld; + function HelloWorld(fig, props){ + mpld3.Plugin.call(this, fig, props); + }; + + HelloWorld.prototype.draw = function(){ + // FIXME: this is a very brittle way to select the y-axis element + var ax = this.fig.axes[0].elements[1]; + + // see https://github.com/mbostock/d3/wiki/Formatting#d3_format + // for d3js formating documentation + ax.axis.tickFormat(d3.format(",.3e")); + + // TODO: use a function for tick values that + // updates when values pan and zoom + //ax.axis.tickValues([1,100,1000]); + + // HACK: use reset to redraw figure + this.fig.reset(); + } + """ + def __init__(self): + self.dict_ = {"type": "helloworld"} + +style_tooltip = """ + +""" + +def text_with_tooltip(text, tooltip): + html = '
'+text+'\n'\ + ' '+tooltip+'
' + return html + + +def application(environ,start_response): + status = '200 OK' + valuePrimary1 = epics.caget('ISTTOK:central:RPump1-Pressure') + valuePrimary2 = epics.caget('ISTTOK:central:RPump2-Pressure') + valueChamber1 = epics.caget('ISTTOK:central:VVessel-Pressure') + valueTMPadmission = epics.caget('ISTTOK:central:TMPump1-PressureAdmission') + now = time.ctime() + # Open database connection + db = MySQLdb.connect(host = "192.168.1.152",user = "report", passwd="$report", db = "archive") + # prepare a cursor object using cursor() method + cursor = db.cursor() + + # 19 | ISTTOK:central:VVessel-Pressure + sql_chamber ="SELECT `smpl_time`, `float_val` FROM `sample` WHERE `channel_id` = 19 ORDER BY `smpl_time` DESC LIMIT 250;" + # 21 | ISTTOK:central:RPump1-Pressure + sql_primary ="SELECT `smpl_time`, `float_val` FROM `sample` WHERE `channel_id` = 21 ORDER BY `smpl_time` DESC LIMIT 250;" + # Execute the SQL command + cursor.execute(sql_chamber) + # Fetch all the rows in a list of lists. + results = cursor.fetchall() + + data_chamber = [] + for row in results: + data_chamber.append([row[0],row[1]]) + + # Execute the SQL command + cursor.execute(sql_primary) + # Fetch all the rows in a list of lists. + results = cursor.fetchall() + + data_primary = [] + for row in results: + data_primary.append([row[0],row[1]]) + + # disconnect from server + db.close() + # + data_chamber = np.array(data_chamber) + data_primary = np.array(data_primary) + fig,axr = plt.subplots(1, sharex=True) + + axr.plot(data_chamber[:,0],data_chamber[:,1]) + axr.plot(data_primary[:,0],data_primary[:,1]) + axr.legend(['Tokamak Chamber', 'Primary pump'], loc =2) + axr.set_xlabel('Time', fontsize = 15) + axr.set_ylabel('Pressure [mbar]', fontsize = 15) + axr.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.3e')) + fig.set_size_inches(12,5, forward=True) + fig.tight_layout() + ax_fmt = HelloWorld() + mpld3.plugins.connect(fig, ax_fmt) + html2 = mpld3.fig_to_html(fig) + html = '\n' \ + '' \ + 'ISTTOK EPICS WSGI Page' \ + '\n' \ + '\n' \ + '
'+style_tooltip+'
\n'\ + '
\n' \ + 'mod_wsgi EPICS ISTTOK info Page\n' \ + '
\n' \ + '
\n' \ + ' '+text_with_tooltip('Primary pump 1 pressure: '+ '{0:.3e}'.format(valuePrimary1)+ ' mBar','ISTTOK:vacuum:Pressure_Primary1')+'\n' \ + '
\n' \ + '
\n' \ + ' '+text_with_tooltip('Turbopump 1 admission pressure: '+ '{0:.3e}'.format(valueTMPadmission)+ ' mBar','ISTTOK:vacuum:Pressure_TMP_admission')+'\n' \ + '
\n' \ + '
\n' \ + ' '+text_with_tooltip('Tokamak Vessel pressure: '+ '{0:.3e}'.format(valueChamber1)+ ' mBar','ISTTOK:vacuum:Pressure_Chamber1')+'\n' \ + '
\n' \ + '
\n' \ + 'Current Time: ' +now+ '\n' \ + '
\n'+html2 +'
\n' \ + '\n' \ + '\n' + response_header = [('Content-type','text/html')] + start_response(status,response_header) + html = bytes(html, encoding= 'utf-8') + return [html] + +#'
\n'+html2.encode('utf8')+'
\n' \