diff options
Diffstat (limited to 'web/webqtl/pairScan/CategoryGraphPage.py')
-rwxr-xr-x | web/webqtl/pairScan/CategoryGraphPage.py | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/web/webqtl/pairScan/CategoryGraphPage.py b/web/webqtl/pairScan/CategoryGraphPage.py new file mode 100755 index 00000000..696c05ce --- /dev/null +++ b/web/webqtl/pairScan/CategoryGraphPage.py @@ -0,0 +1,199 @@ +# Copyright (C) University of Tennessee Health Science Center, Memphis, TN. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# This program is available from Source Forge: at GeneNetwork Project +# (sourceforge.net/projects/genenetwork/). +# +# Contact Drs. Robert W. Williams and Xiaodong Zhou (2010) +# at rwilliams@uthsc.edu and xzhou15@uthsc.edu +# +# +# +# This module is used by GeneNetwork project (www.genenetwork.org) +# +# Created by GeneNetwork Core Team 2010/08/10 +# +# Last updated by GeneNetwork Core Team 2010/10/20 + +import string +import piddle as pid +from htmlgen import HTMLgen2 as HT + +from utility import Plot +from base.templatePage import templatePage +from utility import webqtlUtil +from base import webqtlConfig + +######################################### +# Category Graph Page +######################################### +class CategoryGraphPage(templatePage): + def __init__(self, fd): + + LRSFullThresh = 30 + LRSInteractThresh = 25 + maxPlotSize = 800 + mainfmName = webqtlUtil.genRandStr("fm_") + + templatePage.__init__(self, fd) + + if not fd.genotype: + fd.readData() + + ##Remove F1 and Parents + fd.genotype = fd.genotype_1 + + plotType = fd.formdata.getvalue('plotType') + self.dict['title'] = '%s Plot' % plotType + main_title = HT.Paragraph("%s Plot" % plotType) + main_title.__setattr__("class","title") + + interval1 = fd.formdata.getvalue('interval1') + interval2 = fd.formdata.getvalue('interval2') + + flanka1, flanka2, chram = string.split(interval1) + flankb1, flankb2, chrbm = string.split(interval2) + + traitValues = string.split(fd.formdata.getvalue('traitValues'), ',') + traitValues = map(webqtlUtil.StringAsFloat, traitValues) + traitStrains = string.split(fd.formdata.getvalue('traitStrains'), ',') + + flankaGeno = [] + flankbGeno = [] + + for chr in fd.genotype: + for locus in chr: + if locus.name in (flanka1, flankb1): + if locus.name == flanka1: + flankaGeno = locus.genotype[:] + else: + flankbGeno = locus.genotype[:] + if flankaGeno and flankbGeno: + break + + flankaDict = {} + flankbDict = {} + for i in range(len(fd.genotype.prgy)): + flankaDict[fd.genotype.prgy[i]] = flankaGeno[i] + flankbDict[fd.genotype.prgy[i]] = flankbGeno[i] + + BB = [] + BD = [] + DB = [] + DD = [] + + iValues = [] + for i in range(len(traitValues)): + if traitValues[i] != None: + iValues.append(traitValues[i]) + thisstrain = traitStrains[i] + try: + a1 = flankaDict[thisstrain] + b1 = flankbDict[thisstrain] + except: + continue + if a1 == -1.0: + if b1 == -1.0: + BB.append((thisstrain, traitValues[i])) + elif b1 == 1.0: + BD.append((thisstrain, traitValues[i])) + elif a1 == 1.0: + if b1 == -1.0: + DB.append((thisstrain, traitValues[i])) + elif b1 == 1.0: + DD.append((thisstrain, traitValues[i])) + else: + pass + + #print BB, BD, DB, DD, max(iValues), min(iValues) + + plotHeight = 400 + plotWidth = 600 + xLeftOffset = 60 + xRightOffset = 40 + yTopOffset = 40 + yBottomOffset = 60 + + canvasHeight = plotHeight + yTopOffset + yBottomOffset + canvasWidth = plotWidth + xLeftOffset + xRightOffset + canvas = pid.PILCanvas(size=(canvasWidth,canvasHeight)) + XXX = [('Mat/Mat', BB), ('Mat/Pat', BD), ('Pat/Mat', DB), ('Pat/Pat', DD)] + XLabel = "Interval 1 / Interval 2" + + if plotType == "Box": + Plot.plotBoxPlot(canvas, XXX, offset=(xLeftOffset, xRightOffset, yTopOffset, yBottomOffset), XLabel = XLabel) + else: + #Could be a separate function, but seems no other uses + max_Y = max(iValues) + min_Y = min(iValues) + scaleY = Plot.detScale(min_Y, max_Y) + Yll = scaleY[0] + Yur = scaleY[1] + nStep = scaleY[2] + stepY = (Yur - Yll)/nStep + stepYPixel = plotHeight/(nStep) + canvas.drawRect(plotWidth+xLeftOffset, plotHeight + yTopOffset, xLeftOffset, yTopOffset) + + ##draw Y Scale + YYY = Yll + YCoord = plotHeight + yTopOffset + scaleFont=pid.Font(ttf="cour",size=11,bold=1) + for i in range(nStep+1): + strY = Plot.cformat(d=YYY, rank=0) + YCoord = max(YCoord, yTopOffset) + canvas.drawLine(xLeftOffset,YCoord,xLeftOffset-5,YCoord) + canvas.drawString(strY, xLeftOffset -30,YCoord +5,font=scaleFont) + YYY += stepY + YCoord -= stepYPixel + + + ##draw X Scale + stepX = plotWidth/len(XXX) + XCoord = xLeftOffset + 0.5*stepX + YCoord = plotHeight + yTopOffset + scaleFont = pid.Font(ttf="tahoma",size=12,bold=0) + labelFont = pid.Font(ttf="tahoma",size=13,bold=0) + for item in XXX: + itemname, itemvalue = item + canvas.drawLine(XCoord, YCoord,XCoord, YCoord+5, color=pid.black) + canvas.drawString(itemname, XCoord - canvas.stringWidth(itemname,font=labelFont)/2.0,YCoord +20,font=labelFont) + itemvalue.sort(webqtlUtil.cmpOrder2) + j = 0 + for item2 in itemvalue: + tstrain, tvalue = item2 + canvas.drawCross(XCoord, plotHeight + yTopOffset - (tvalue-Yll)*plotHeight/(Yur - Yll), color=pid.red,size=5) + if j % 2 == 0: + canvas.drawString(tstrain, XCoord+5, plotHeight + yTopOffset - \ + (tvalue-Yll)*plotHeight/(Yur - Yll) +5, font=scaleFont, color=pid.blue) + else: + canvas.drawString(tstrain, XCoord-canvas.stringWidth(tstrain,font=scaleFont)-5, \ + plotHeight + yTopOffset - (tvalue-Yll)*plotHeight/(Yur - Yll) +5, font=scaleFont, color=pid.blue) + j += 1 + XCoord += stepX + + + labelFont=pid.Font(ttf="verdana",size=18,bold=0) + canvas.drawString(XLabel, xLeftOffset + (plotWidth -canvas.stringWidth(XLabel,font=labelFont))/2.0, YCoord +40, font=labelFont) + canvas.drawString("Value",xLeftOffset-40, YCoord-(plotHeight -canvas.stringWidth("Value",font=labelFont))/2.0, font=labelFont, angle =90) + + + filename= webqtlUtil.genRandStr("Cate_") + canvas.save(webqtlConfig.IMGDIR+filename, format='gif') + img=HT.Image('/image/'+filename+'.gif',border=0) + + TD_LR = HT.TD(height=200,width="100%",bgColor='#eeeeee',valign='top') + TD_LR.append(main_title, HT.Center(img))#, traitValues , len(traitValues), traitStrains, len(traitStrains), len(fd.genotype.prgy)) + #TD_LR.append(main_title, HT.BR(), flanka1, flanka2, chram, HT.BR(), flankb1, flankb2, chrbm) + self.dict['body'] = str(TD_LR) + + + |