about summary refs log tree commit diff
path: root/web/webqtl/pairScan/PairPlotPage.py
diff options
context:
space:
mode:
authorroot2012-05-08 18:39:56 -0500
committerroot2012-05-08 18:39:56 -0500
commitea46f42ee640928b92947bfb204c41a482d80937 (patch)
tree9b27a4eb852d12539b543c3efee9d2a47ef470f3 /web/webqtl/pairScan/PairPlotPage.py
parent056b5253fc3857b0444382aa39944f6344dc1ceb (diff)
downloadgenenetwork2-ea46f42ee640928b92947bfb204c41a482d80937.tar.gz
Add all the source codes into the github.
Diffstat (limited to 'web/webqtl/pairScan/PairPlotPage.py')
-rwxr-xr-xweb/webqtl/pairScan/PairPlotPage.py314
1 files changed, 314 insertions, 0 deletions
diff --git a/web/webqtl/pairScan/PairPlotPage.py b/web/webqtl/pairScan/PairPlotPage.py
new file mode 100755
index 00000000..3f72bd74
--- /dev/null
+++ b/web/webqtl/pairScan/PairPlotPage.py
@@ -0,0 +1,314 @@
+# 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
+import os
+
+from htmlgen import HTMLgen2 as HT
+import direct
+
+from utility import Plot
+from base.templatePage import templatePage
+from utility import webqtlUtil
+from base import webqtlConfig
+
+#########################################
+#      PairPlotPage
+#########################################
+class PairPlotPage(templatePage):
+	def __init__(self, fd):
+
+		LRSFullThresh = 30
+		LRSInteractThresh = 25
+		maxPlotSize = 1000
+		mainfmName = webqtlUtil.genRandStr("fm_")
+
+		templatePage.__init__(self, fd)
+
+		self.dict['title'] = 'Pair-Scan Plot'
+
+		if not self.openMysql():
+			return
+
+		TD_LR = HT.TD(height=200,width="100%",bgColor='#eeeeee')
+		vals = fd.formdata.getvalue('idata')
+		vals = map(float,string.split(vals,','))
+		strains = fd.formdata.getvalue('istrain')
+		strains = string.split(strains,',')
+		Chr_A = int(fd.formdata.getvalue('Chr_A'))
+		Chr_B = int(fd.formdata.getvalue('Chr_B'))
+		if len(vals) > webqtlConfig.KMININFORMATIVE:
+			d = direct.exhaust(webqtlConfig.GENODIR, vals, strains, fd.RISet, Chr_A, Chr_B)#XZ, 08/14/2008: add module name webqtlConfig
+			chrsInfo = d[2]
+			longerChrLen = max(chrsInfo[Chr_A][0], chrsInfo[Chr_B][0])
+			shorterChrlen = min(chrsInfo[Chr_A][0], chrsInfo[Chr_B][0])
+
+			plotHeight = int(chrsInfo[Chr_B][0]*maxPlotSize/longerChrLen)
+			plotWidth = int(chrsInfo[Chr_A][0]*maxPlotSize/longerChrLen)
+
+
+			xLeftOffset = 200
+			xRightOffset = 40
+			yTopOffset = 40
+			yBottomOffset = 200
+			colorAreaWidth = 120
+
+			canvasHeight = plotHeight + yTopOffset + yBottomOffset
+			canvasWidth = plotWidth + xLeftOffset + xRightOffset + colorAreaWidth
+
+
+			canvas = pid.PILCanvas(size=(canvasWidth,canvasHeight))
+			plotScale = plotHeight/chrsInfo[Chr_B][0]
+
+			rectInfo = d[1]
+			finecolors = Plot.colorSpectrum(250)
+			finecolors.reverse()
+			#draw LRS Full
+			for item in rectInfo:
+				LRSFull,LRSInteract,LRSa,LRSb,chras,chram,chrae,chrbs,chrbm,chrbe,chra,chrb,flanka,flankb = item
+				if Chr_A > Chr_B:
+					colorIndex = int(LRSFull *250 /LRSFullThresh)
+				else:
+					colorIndex = int(LRSInteract *250 /LRSInteractThresh)
+				if colorIndex >= 250:
+					colorIndex = 249
+				elif colorIndex < 0:
+					colorIndex = 0
+				dcolor = finecolors[colorIndex]
+				if chra != chrb or (abs(chrbe - chrae) > 10 and abs(chrbs - chras) > 10):
+					canvas.drawRect(xLeftOffset+chras*plotScale,yTopOffset+plotHeight- \
+					chrbs*plotScale,xLeftOffset+chrae*plotScale,yTopOffset+plotHeight- \
+					chrbe*plotScale,edgeColor=dcolor,fillColor=dcolor,edgeWidth = 0)
+				elif chrbs >= chras:
+					canvas.drawPolygon([(xLeftOffset+chras*plotScale,yTopOffset+plotHeight-chrbs*plotScale),\
+					(xLeftOffset+chras*plotScale,yTopOffset+plotHeight-chrbe*plotScale),\
+					(xLeftOffset+chrae*plotScale,yTopOffset+plotHeight-chrbe*plotScale)],\
+					edgeColor=dcolor,fillColor=dcolor,edgeWidth = 0,closed =1)
+				else:
+					canvas.drawPolygon([(xLeftOffset+chras*plotScale,yTopOffset+plotHeight-chrbs*plotScale),\
+					(xLeftOffset+chrae*plotScale,yTopOffset+plotHeight-chrbs*plotScale), \
+					(xLeftOffset+chrae*plotScale,yTopOffset+plotHeight-chrbe*plotScale)], \
+					edgeColor=dcolor,fillColor=dcolor,edgeWidth = 0,closed =1)
+
+			labelFont=pid.Font(ttf="verdana",size=24,bold=0)
+			chrName = "chromosome %s" % chrsInfo[Chr_A][1]
+			canvas.drawString(chrName,xLeftOffset + (plotWidth - canvas.stringWidth(chrName,font=labelFont))/2,\
+			yTopOffset+plotHeight+ 170,font=labelFont)
+			chrName = "chromosome %s" % chrsInfo[Chr_B][1]
+			canvas.drawString(chrName, 30, yTopOffset +(canvas.stringWidth(chrName,font=labelFont) + plotHeight)/2,\
+			font=labelFont, angle = 90)
+			if Chr_A == Chr_B:
+				infoStr = "minimum distance = 10 cM"
+				infoStrWidth = canvas.stringWidth(infoStr,font=labelFont)
+				canvas.drawString(infoStr, xLeftOffset + (plotWidth-infoStrWidth*0.707)/2, yTopOffset + \
+				(plotHeight+infoStrWidth*0.707)/2,font=labelFont, angle = 45, color=pid.red)
+
+			labelFont=pid.Font(ttf="verdana",size=12,bold=0)
+			gifmap = HT.Map(name='markerMap')
+
+			lineColor = pid.lightblue
+			#draw ChrA Loci
+			ChrAInfo = d[3]
+			preLpos = -1
+			i = 0
+			for item in ChrAInfo:
+				Lname,Lpos = item
+				if Lpos != preLpos:
+					i += 1
+				preLpos = Lpos
+			stepA = float(plotWidth)/i
+
+			offsetA = -stepA
+			LRectWidth = 10
+			LRectHeight = 3
+			i = 0
+			preLpos = -1
+			for item in ChrAInfo:
+				Lname,Lpos = item
+				if Lpos != preLpos:
+					offsetA += stepA
+					differ = 1
+				else:
+					differ = 0
+				preLpos = Lpos
+				Lpos *= plotScale
+				Zorder = i % 5
+				"""
+				LStrWidth = canvas.stringWidth(Lname,font=labelFont)
+				canvas.drawString(Lname,xLeftOffset+offsetA+4,yTopOffset+plotHeight+140,\
+				font=labelFont,color=pid.blue,angle=90)
+				canvas.drawLine(xLeftOffset+Lpos,yTopOffset+plotHeight,xLeftOffset+offsetA,\
+				yTopOffset+plotHeight+25,color=lineColor)
+				canvas.drawLine(xLeftOffset+offsetA,yTopOffset+plotHeight+25,xLeftOffset+offsetA,\
+				yTopOffset+plotHeight+140-LStrWidth,color=lineColor)
+				COORDS="%d,%d,%d,%d"%(xLeftOffset+offsetA+4,yTopOffset+plotHeight+140,\
+				xLeftOffset+offsetA-6,yTopOffset+plotHeight+140-LStrWidth)
+				"""
+				if differ:
+					canvas.drawLine(xLeftOffset+Lpos,yTopOffset+plotHeight,xLeftOffset+offsetA,\
+					yTopOffset+plotHeight+25,color=lineColor)
+					canvas.drawLine(xLeftOffset+offsetA,yTopOffset+plotHeight+25,xLeftOffset+offsetA,\
+					yTopOffset+plotHeight+80+Zorder*(LRectWidth+3),color=lineColor)
+					rectColor = pid.orange
+				else:
+					canvas.drawLine(xLeftOffset+offsetA, yTopOffset+plotHeight+80+Zorder*(LRectWidth+3)-3,\
+					xLeftOffset+offsetA, yTopOffset+plotHeight+80+Zorder*(LRectWidth+3),color=lineColor)
+					rectColor = pid.deeppink
+				canvas.drawRect(xLeftOffset+offsetA, yTopOffset+plotHeight+80+Zorder*(LRectWidth+3),\
+					xLeftOffset+offsetA-LRectHeight,yTopOffset+plotHeight+80+Zorder*(LRectWidth+3)+LRectWidth,\
+					edgeColor=rectColor,fillColor=rectColor,edgeWidth = 0)
+				COORDS="%d,%d,%d,%d"%(xLeftOffset+offsetA, yTopOffset+plotHeight+80+Zorder*(LRectWidth+3),\
+					xLeftOffset+offsetA-LRectHeight,yTopOffset+plotHeight+80+Zorder*(LRectWidth+3)+LRectWidth)
+				HREF="javascript:showTrait('%s','%s');" % (mainfmName, Lname)
+				Areas=HT.Area(shape='rect',coords=COORDS,href=HREF, title="Locus : " + Lname)
+				gifmap.areas.append(Areas)
+				i += 1
+				#print (i , offsetA, Lname, Lpos, preLpos)
+				#print "<BR>"
+
+			#draw ChrB Loci
+			ChrBInfo = d[4]
+			preLpos = -1
+			i = 0
+			for item in ChrBInfo:
+				Lname,Lpos = item
+				if Lpos != preLpos:
+					i += 1
+				preLpos = Lpos
+			stepB = float(plotHeight)/i
+
+			offsetB = -stepB
+			LRectWidth = 10
+			LRectHeight = 3
+			i = 0
+			preLpos = -1
+			for item in ChrBInfo:
+				Lname,Lpos = item
+				if Lpos != preLpos:
+					offsetB += stepB
+					differ = 1
+				else:
+					differ = 0
+				preLpos = Lpos
+				Lpos *= plotScale
+				Zorder = i % 5
+				Lname,Lpos = item
+				Lpos *= plotScale
+				"""
+				LStrWidth = canvas.stringWidth(Lname,font=labelFont)
+				canvas.drawString(Lname, 45,yTopOffset+plotHeight-offsetB+4,font=labelFont,color=pid.blue)
+				canvas.drawLine(45+LStrWidth,yTopOffset+plotHeight-offsetB,xLeftOffset-25,\
+				yTopOffset+plotHeight-offsetB,color=lineColor)
+				canvas.drawLine(xLeftOffset-25,yTopOffset+plotHeight-offsetB,xLeftOffset,\
+				yTopOffset+plotHeight-Lpos,color=lineColor)
+				COORDS = "%d,%d,%d,%d" %(45,yTopOffset+plotHeight-offsetB+4,45+LStrWidth,\
+				yTopOffset+plotHeight-offsetB-6)
+				"""
+				if differ:
+					canvas.drawLine(xLeftOffset,yTopOffset+plotHeight-Lpos, xLeftOffset-25,\
+					yTopOffset+plotHeight-offsetB,color=lineColor)
+					canvas.drawLine(xLeftOffset -25, yTopOffset+plotHeight-offsetB, \
+					xLeftOffset-80 -Zorder*(LRectWidth+3),yTopOffset+plotHeight-offsetB, color=lineColor)
+					rectColor = pid.orange
+				else:
+					canvas.drawLine(xLeftOffset -80 -Zorder*(LRectWidth+3)+3, yTopOffset+plotHeight-offsetB, \
+					xLeftOffset-80 -Zorder*(LRectWidth+3),yTopOffset+plotHeight-offsetB, color=lineColor)
+					rectColor = pid.deeppink
+				HREF = "javascript:showTrait('%s','%s');" % (mainfmName, Lname)
+				canvas.drawRect(xLeftOffset-80 -Zorder*(LRectWidth+3),yTopOffset+plotHeight-offsetB,\
+					xLeftOffset-80 -Zorder*(LRectWidth+3)-LRectWidth,yTopOffset+plotHeight-offsetB +LRectHeight,\
+					edgeColor=rectColor,fillColor=rectColor,edgeWidth = 0)
+				COORDS="%d,%d,%d,%d"%(xLeftOffset-80 -Zorder*(LRectWidth+3),yTopOffset+plotHeight-offsetB,\
+					xLeftOffset-80 -Zorder*(LRectWidth+3)-LRectWidth,yTopOffset+plotHeight-offsetB +LRectHeight)
+				Areas=HT.Area(shape='rect',coords=COORDS,href=HREF, title="Locus : " + Lname)
+				gifmap.areas.append(Areas)
+				i += 1
+
+			canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight,edgeColor=pid.black)
+
+			#draw spectrum
+			i = 0
+			labelFont=pid.Font(ttf="tahoma",size=14,bold=0)
+			middleoffsetX = 80
+			for dcolor in finecolors:
+				canvas.drawLine(xLeftOffset+ plotWidth +middleoffsetX-15 , plotHeight + yTopOffset - i, \
+				xLeftOffset+ plotWidth +middleoffsetX+15 , plotHeight + yTopOffset - i, color=dcolor)
+				if i % 50 == 0:
+					if Chr_A >= Chr_B:
+						canvas.drawLine(xLeftOffset+ plotWidth +middleoffsetX+15 ,plotHeight + yTopOffset - i, \
+						xLeftOffset+ plotWidth +middleoffsetX+20,plotHeight + yTopOffset - i, color=pid.black)
+						canvas.drawString('%d' % int(LRSFullThresh*i/250.0),xLeftOffset+ plotWidth +middleoffsetX+22,\
+						plotHeight + yTopOffset - i +5, font = labelFont,color=pid.black)
+					if Chr_A <= Chr_B:
+						canvas.drawLine(xLeftOffset+ plotWidth +middleoffsetX-15 ,plotHeight + yTopOffset - i, \
+						xLeftOffset+ plotWidth +middleoffsetX-20,plotHeight + yTopOffset - i, color=pid.black)
+						canvas.drawString('%d' % int(LRSInteractThresh*i/250.0),xLeftOffset+plotWidth+middleoffsetX-40,\
+						plotHeight + yTopOffset - i +5, font = labelFont,color=pid.black)
+				i += 1
+			#draw spectrum label
+			labelFont2=pid.Font(ttf="verdana",size=20,bold=0)
+			if i % 50 == 0:
+				i -= 1
+				if Chr_A >= Chr_B:
+					canvas.drawLine(xLeftOffset+ plotWidth +middleoffsetX+15 ,plotHeight + yTopOffset - i, \
+					xLeftOffset+ plotWidth +middleoffsetX+20,plotHeight + yTopOffset - i, color=pid.black)
+					canvas.drawString('%d' % int(LRSFullThresh*(i+1)/250.0),xLeftOffset+ plotWidth +middleoffsetX+22,\
+					plotHeight + yTopOffset - i +5, font = labelFont,color=pid.black)
+					canvas.drawString('LRS Full',xLeftOffset+ plotWidth +middleoffsetX+50,plotHeight + yTopOffset, \
+					font = labelFont2,color=pid.dimgray,angle=90)
+				if Chr_A <= Chr_B:
+					canvas.drawLine(xLeftOffset+ plotWidth +middleoffsetX-15 ,plotHeight + yTopOffset - i, \
+					xLeftOffset+ plotWidth +middleoffsetX-20,plotHeight + yTopOffset - i, color=pid.black)
+					canvas.drawString('%d' % int(LRSInteractThresh*(i+1)/250.0),xLeftOffset+ plotWidth+middleoffsetX-40,\
+					plotHeight + yTopOffset - i +5, font = labelFont,color=pid.black)
+					canvas.drawString('LRS Interaction',xLeftOffset+ plotWidth +middleoffsetX-50,\
+					plotHeight + yTopOffset, font = labelFont2,color=pid.dimgray,angle=90)
+
+			filename= webqtlUtil.genRandStr("Pair_")
+			canvas.save(webqtlConfig.IMGDIR+filename, format='png')
+			img2=HT.Image('/image/'+filename+'.png',border=0,usemap='#markerMap')
+
+			main_title = HT.Paragraph("Pair-Scan Results: Chromosome Pair")
+			main_title.__setattr__("class","title")
+			form = HT.Form(cgi = os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data', \
+			name=mainfmName, submit=HT.Input(type='hidden'))
+			hddn = {'FormID':'showDatabase','ProbeSetID':'_','database':fd.RISet+"Geno",'CellID':'_','RISet':fd.RISet, 'incparentsf1':'on'}
+			if fd.incparentsf1:
+				hddn['incparentsf1']='ON'
+			for key in hddn.keys():
+				form.append(HT.Input(name=key, value=hddn[key], type='hidden'))
+			form.append(img2,gifmap)
+			TD_LR.append(main_title, HT.Center(form), HT.P())
+		else:
+			heading = "Direct Plot"
+			detail = ['Fewer than %d strain data were entered for %s data set. No statitical analysis has been attempted.'\
+			 % (webqtlConfig.KMININFORMATIVE, fd.RISet)]
+			self.error(heading=heading,detail=detail)
+			return
+		self.dict['body'] = str(TD_LR)
+
+