#!/var/www/html/compbio/BNW_1.3/bnw-env/bin/python3
import os
import sys
import math
#sys.path.append('/home/jziebart/.local/bin')
#sys.path.append('/home/jziebart/.local/lib')
import plotly
import plotly.graph_objs as go
import csv
import string
def mean_stdev(y):
mean = sum(y)
mean = sum(y)/len(y)
stdev = 0
for yi in y:
stdev = stdev + (yi - mean)**2
stdev = stdev/(len(y)-1)
stdev = math.sqrt(stdev)
return mean,stdev;
def standardize(y):
mean,stdev = mean_stdev(y)
ystd = []
for yi in y:
yi = (yi - mean)/stdev
ystd.append(yi)
return ystd
netID = sys.argv[-1]
outfile = netID+"violin_plotly_evidence.html"
filename=netID+"continuous_input.txt"
f=open(filename,"r")
#Read the first line to get the variable names
line=f.readline()
#line = map(string.strip,line.strip().split("\t"))
varNames = line.strip().split("\t")
#varNames = line
line=f.readline()
#line = map(string.strip,line.strip().split("\t"))
line = line.strip().split("\t")
for i in range(len(line)):
line[i] = int(line[i])
cd_types = line
cNames = []
for i in range(len(varNames)):
if cd_types[i] == 1:
cNames.append(varNames[i])
#Get the variables with evidence
evfile=netID+"varname.txt"
evf=open(evfile,"r")
line=evf.readline()
#ev_vars = map(string.strip,line.strip().split("\t"))
ev_vars = line.strip().split("\t")
keepVars = []
for i in cNames:
if i not in ev_vars:
keepVars.append(i)
#Read in original data
data = []
line = f.readline()
while line:
#line = map(string.strip,line.strip().split("\t"))
line = line.strip().split("\t")
temp = []
for i in range(len(varNames)):
if cd_types[i] == 1:
temp.append(float(line[i]))
data.append(temp)
line = f.readline()
#Read in data for violin plots
filename2=netID+"violin_evidence.txt"
f2=open(filename2,"r")
line = f2.readline()
pdf_varName = []
pdf_data = []
while line:
line = line.strip()
if line == "Data for new node":
line = f2.readline()
pdf_varName.append(line.strip())
line = f2.readline()
pdf_data.append([line.strip()])
else:
pdf_data[-1].append(float(line.strip()))
line = f2.readline()
layout = go.Layout(
title="Distributions considering evidence",
titlefont=dict(
family='Arial, sans-serif',
size=24,
color='black'
),
title_xref="paper",
title_x=0.5,
title_xanchor="center",
title_yanchor="middle",
yaxis=dict(title="Distributions of standardized data"),
legend=dict(orientation='h'),
margin=dict(t=40,l=70,b=40)
)
fig = go.Figure(layout=layout)
icount = 0
for i in range(len(keepVars)):
for j in range(len(cNames)):
if keepVars[i] == cNames[j]:
idata = j
break
for j in range(len(pdf_varName)):
if keepVars[i] == pdf_varName[j]:
ipdf = j
break
y = []
for j in range(len(data)):
y.append(data[j][idata])
y_stand = standardize(y)
#Add traces to violin plot
if icount == 0:
fig.add_trace(go.Violin(y=y_stand,x0=cNames[idata],side='negative',legendgroup='Data',name='Fit to original data',fillcolor='blue',line=dict(color='blue'),hoverinfo='none',points='all',scalegroup=cNames[idata]))
fig.add_trace(go.Violin(y=pdf_data[ipdf],x0=cNames[idata],side='positive',legendgroup='Network parameters considering evidence',name='Network parameters considering evidence',fillcolor='orange',line=dict(color='orange'),hoverinfo='none',points=False,scalegroup=cNames[idata]))
icount = 1
else:
fig.add_trace(go.Violin(y=y_stand,x0=cNames[idata],side='negative',legendgroup='Data',name='Data',fillcolor='blue',line=dict(color='blue'),showlegend=False,hoverinfo='none',points='all',scalegroup=cNames[idata]))
fig.add_trace(go.Violin(y=pdf_data[ipdf],x0=cNames[idata],side='positive',legendgroup='Network parameters considering evidence',name='Network parameters considering evidence',fillcolor='orange',line=dict(color='orange'),showlegend=False,hoverinfo='none',points=False,scalegroup=cNames[idata]))
plotly.offline.plot(fig,filename=outfile)