from __future__ import print_function
#import string
from math import *
#import piddle as pid
#import os
import traceback
from pprint import pformat as pf
from corestats import Stats
import reaper
from htmlgen import HTMLgen2 as HT
#from utility import Plot
from utility import webqtlUtil
from base import webqtlConfig
from db import webqtlDatabaseFunction
def basicStatsTable(vals, trait_type=None, cellid=None, heritability=None):
print("basicStatsTable called - len of vals", len(vals))
st = {} # This is the dictionary where we'll put everything for the template
valsOnly = []
dataXZ = vals[:]
for i in range(len(dataXZ)):
valsOnly.append(dataXZ[i][1])
(st['traitmean'],
st['traitmedian'],
st['traitvar'],
st['traitstdev'],
st['traitsem'],
st['N']) = reaper.anova(valsOnly) #ZS: Should convert this from reaper to R in the future
#tbl = HT.TableLite(cellpadding=20, cellspacing=0)
#dataXZ = vals[:]
dataXZ = sorted(vals, webqtlUtil.cmpOrder)
print("data for stats is:", pf(dataXZ))
for num, item in enumerate(dataXZ):
print(" %i - %s" % (num, item))
print(" length:", len(dataXZ))
st['min'] = dataXZ[0][1]
st['max'] = dataXZ[-1][1]
numbers = [x[1] for x in dataXZ]
stats = Stats(numbers)
at75 = stats.percentile(75)
at25 = stats.percentile(25)
print("should get a stack")
traceback.print_stack()
print("Interquartile:", at75 - at25)
#tbl.append(HT.TR(HT.TD("Statistic",align="left", Class="fs14 fwb ffl b1 cw cbrb", width = 180),
# HT.TD("Value", align="right", Class="fs14 fwb ffl b1 cw cbrb", width = 60)))
#tbl.append(HT.TR(HT.TD("N of Samples",align="left", Class="fs13 b1 cbw c222"),
# HT.TD(N,nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
#tbl.append(HT.TR(HT.TD("Mean",align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%2.3f" % traitmean,nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
#tbl.append(HT.TR(HT.TD("Median",align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%2.3f" % traitmedian,nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
##tbl.append(HT.TR(HT.TD("Variance",align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
## HT.TD("%2.3f" % traitvar,nowrap="yes",align="left", Class="fs13 b1 cbw c222")))
#tbl.append(HT.TR(HT.TD("Standard Error (SE)",align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%2.3f" % traitsem,nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
#tbl.append(HT.TR(HT.TD("Standard Deviation (SD)", align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%2.3f" % traitstdev,nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
#tbl.append(HT.TR(HT.TD("Minimum", align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%s" % dataXZ[0][1],nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
#tbl.append(HT.TR(HT.TD("Maximum", align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%s" % dataXZ[-1][1],nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
if (trait_type != None and trait_type == 'ProbeSet'):
#tbl.append(HT.TR(HT.TD("Range (log2)",align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%2.3f" % (dataXZ[-1][1]-dataXZ[0][1]),nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
#tbl.append(HT.TR(HT.TD(HT.Span("Range (fold)"),align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%2.2f" % pow(2.0,(dataXZ[-1][1]-dataXZ[0][1])), nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
#tbl.append(HT.TR(HT.TD(HT.Span(HT.Href(url="/glossary.html#Interquartile", target="_blank", text="Interquartile Range", Class="non_bold")), align="left", Class="fs13 b1 cbw c222",nowrap="yes"),
# HT.TD("%2.2f" % pow(2.0,(dataXZ[int((N-1)*3.0/4.0)][1]-dataXZ[int((N-1)/4.0)][1])), nowrap="yes", Class="fs13 b1 cbw c222"), align="right"))
st['range_log2'] = dataXZ[-1][1]-dataXZ[0][1]
st['range_fold'] = pow(2.0, (dataXZ[-1][1]-dataXZ[0][1]))
st['interquartile'] = pow(2.0, (dataXZ[int((st['N']-1)*3.0/4.0)][1]-dataXZ[int((st['N']-1)/4.0)][1]))
#XZ, 04/01/2009: don't try to get H2 value for probe.
if not cellid:
if heritability:
# This field needs to still be put into the Jinja2 template
st['heritability'] = heritability
#tbl.append(HT.TR(HT.TD(HT.Span("Heritability"),align="center", Class="fs13 b1 cbw c222",nowrap="yes"),HT.TD("%s" % heritability, nowrap="yes",align="center", Class="fs13 b1 cbw c222")))
# Lei Yan
# 2008/12/19
return st
def plotNormalProbability(vals=None, RISet='', title=None, showstrains=0, specialStrains=[None], size=(750,500)):
dataXZ = vals[:]
dataXZ.sort(webqtlUtil.cmpOrder)
dataLabel = []
dataX = map(lambda X: X[1], dataXZ)
showLabel = showstrains
if len(dataXZ) > 50:
showLabel = 0
for item in dataXZ:
strainName = webqtlUtil.genShortStrainName(RISet=RISet, input_strainName=item[0])
dataLabel.append(strainName)
dataY=Plot.U(len(dataX))
dataZ=map(Plot.inverseCumul,dataY)
c = pid.PILCanvas(size=(750,500))
Plot.plotXY(c, dataZ, dataX, dataLabel = dataLabel, XLabel='Expected Z score', connectdot=0, YLabel='Trait value', title=title, specialCases=specialStrains, showLabel = showLabel)
filename= webqtlUtil.genRandStr("nP_")
c.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif')
img=HT.Image('/image/'+filename+'.gif',border=0)
return img
def plotBoxPlot(vals):
valsOnly = []
dataXZ = vals[:]
for i in range(len(dataXZ)):
valsOnly.append(dataXZ[i][1])
plotHeight = 320
plotWidth = 220
xLeftOffset = 60
xRightOffset = 40
yTopOffset = 40
yBottomOffset = 60
canvasHeight = plotHeight + yTopOffset + yBottomOffset
canvasWidth = plotWidth + xLeftOffset + xRightOffset
canvas = pid.PILCanvas(size=(canvasWidth,canvasHeight))
XXX = [('', valsOnly[:])]
Plot.plotBoxPlot(canvas, XXX, offset=(xLeftOffset, xRightOffset, yTopOffset, yBottomOffset), XLabel= "Trait")
filename= webqtlUtil.genRandStr("Box_")
canvas.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif')
img=HT.Image('/image/'+filename+'.gif',border=0)
plotLink = HT.Span("More about ", HT.Href(text="Box Plots", url="http://davidmlane.com/hyperstat/A37797.html", target="_blank", Class="fs13"))
return img, plotLink
def plotBarGraph(identification='', RISet='', vals=None, type="name"):
this_identification = "unnamed trait"
if identification:
this_identification = identification
if type=="rank":
dataXZ = vals[:]
dataXZ.sort(webqtlUtil.cmpOrder)
title='%s' % this_identification
else:
dataXZ = vals[:]
title='%s' % this_identification
tvals = []
tnames = []
tvars = []
for i in range(len(dataXZ)):
tvals.append(dataXZ[i][1])
tnames.append(webqtlUtil.genShortStrainName(RISet=RISet, input_strainName=dataXZ[i][0]))
tvars.append(dataXZ[i][2])
nnStrain = len(tnames)
sLabel = 1
###determine bar width and space width
if nnStrain < 20:
sw = 4
elif nnStrain < 40:
sw = 3
else:
sw = 2
### 700 is the default plot width minus Xoffsets for 40 strains
defaultWidth = 650
if nnStrain > 40:
defaultWidth += (nnStrain-40)*10
defaultOffset = 100
bw = int(0.5+(defaultWidth - (nnStrain-1.0)*sw)/nnStrain)
if bw < 10:
bw = 10
plotWidth = (nnStrain-1)*sw + nnStrain*bw + defaultOffset
plotHeight = 500
#print [plotWidth, plotHeight, bw, sw, nnStrain]
c = pid.PILCanvas(size=(plotWidth,plotHeight))
Plot.plotBarText(c, tvals, tnames, variance=tvars, YLabel='Value', title=title, sLabel = sLabel, barSpace = sw)
filename= webqtlUtil.genRandStr("Bar_")
c.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif')
img=HT.Image('/image/'+filename+'.gif',border=0)
return img