about summary refs log tree commit diff
path: root/web/webqtl/heatmap
diff options
context:
space:
mode:
authorzsloan2015-03-27 20:28:51 +0000
committerzsloan2015-03-27 20:28:51 +0000
commitd0911a04958a04042da02a334ccc528dae79cc17 (patch)
tree3c48e2e937c1dbeaf00a5697c87ed251afa5c8f1 /web/webqtl/heatmap
parenta840ad18e1fe3db98a359a159e9b9b72367a2839 (diff)
downloadgenenetwork2-d0911a04958a04042da02a334ccc528dae79cc17.tar.gz
Removed everything from 'web' directory except genofiles and renamed the directory to 'genotype_files'
Diffstat (limited to 'web/webqtl/heatmap')
-rwxr-xr-xweb/webqtl/heatmap/Heatmap.py437
-rwxr-xr-xweb/webqtl/heatmap/__init__.py0
-rwxr-xr-xweb/webqtl/heatmap/heatmapPage.py116
-rwxr-xr-xweb/webqtl/heatmap/heatmapPage_GN.py522
-rwxr-xr-xweb/webqtl/heatmap/slink.py141
5 files changed, 0 insertions, 1216 deletions
diff --git a/web/webqtl/heatmap/Heatmap.py b/web/webqtl/heatmap/Heatmap.py
deleted file mode 100755
index c4543cee..00000000
--- a/web/webqtl/heatmap/Heatmap.py
+++ /dev/null
@@ -1,437 +0,0 @@
-# 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 os
-import string
-import piddle as pid
-import cPickle
-
-from base import webqtlConfig
-from base.webqtlTrait import webqtlTrait
-from dbFunction import webqtlDatabaseFunction
-from utility import webqtlUtil 
-from utility import Plot
-import slink
-
-
-# XZ, 09/09/2008: After adding several traits to collection, click "QTL Heatmap" button,
-# XZ, 09/09/2008: This class will generate what you see.
-#########################################
-#      QTL heatmap Page
-#########################################
-class Heatmap:
-
-        def __init__(self, fd=None, searchResult=None, colorScheme=None, userPrivilege=None, userName=None):
-                cursor = webqtlDatabaseFunction.getCursor()
-                if (not cursor):
-                        return
-                targetDescriptionChecked = fd.formdata.getvalue('targetDescriptionCheck', '')
-                clusterChecked = fd.formdata.getvalue('clusterCheck', '')
-                sessionfile = fd.formdata.getvalue("session")
-                genotype = fd.genotype
-                strainlist = fd.strainlist
-                ppolar = fd.ppolar
-                mpolar = fd.mpolar
-                traitList = []
-                traitDataList = []
-                for item in searchResult:
-                        thisTrait = webqtlTrait(fullname=item, cursor=cursor)
-                        thisTrait.retrieveInfo()
-                        thisTrait.retrieveData(fd.strainlist)
-                        traitList.append(thisTrait)
-                        traitDataList.append(thisTrait.exportData(fd.strainlist))
-                self.buildCanvas(colorScheme=colorScheme, targetDescriptionChecked=targetDescriptionChecked, clusterChecked=clusterChecked, sessionfile=sessionfile, genotype=genotype, strainlist=strainlist, ppolar=ppolar, mpolar=mpolar, traitList=traitList, traitDataList=traitDataList, userPrivilege=userPrivilege, userName=userName)
-
-       	def buildCanvas(self, colorScheme='', targetDescriptionChecked='', clusterChecked='', sessionfile='', genotype=None, strainlist=None, ppolar=None, mpolar=None, traitList=None, traitDataList=None, userPrivilege=None, userName=None):
-                labelFont = pid.Font(ttf="tahoma",size=14,bold=0)
-                topHeight = 0
-       	       	NNN = len(traitList)
-       	       	#XZ: It's necessory to define canvas here
-                canvas = pid.PILCanvas(size=(80+NNN*20,880))
-                names = map(webqtlTrait.displayName, traitList)
-                #XZ, 7/29/2009: create trait display and find max strWidth
-                strWidth = 0
-                for j in range(len(names)):
-                        thisTrait = traitList[j]
-                        if targetDescriptionChecked:
-                            if thisTrait.db.type == 'ProbeSet':
-                                if thisTrait.probe_target_description:
-                                        names[j] += ' [%s at Chr %s @ %2.3fMB, %s]' % (thisTrait.symbol, thisTrait.chr, thisTrait.mb, thisTrait.probe_target_description)
-                                else:
-                                        names[j] += ' [%s at Chr %s @ %2.3fMB]' % (thisTrait.symbol, thisTrait.chr, thisTrait.mb)
-                            elif thisTrait.db.type == 'Geno':
-                                names[j] += ' [Chr %s @ %2.3fMB]' % (thisTrait.chr, thisTrait.mb)
-                            elif thisTrait.db.type == 'Publish':
-                                if thisTrait.confidential:
-                                    if webqtlUtil.hasAccessToConfidentialPhenotypeTrait(privilege=userPrivilege, userName=userName, authorized_users=thisTrait.authorized_users):
-                                        if thisTrait.post_publication_abbreviation:
-                                            names[j] += ' [%s]' % (thisTrait.post_publication_abbreviation)
-                                    else:
-                                        if thisTrait.pre_publication_abbreviation:
-                                            names[j] += ' [%s]' % (thisTrait.pre_publication_abbreviation)
-                                else:
-                                    if thisTrait.post_publication_abbreviation:
-                                        names[j] += ' [%s]' % (thisTrait.post_publication_abbreviation)
-                            else:
-                                pass
-
-                        i = canvas.stringWidth(names[j], font=labelFont)
-                        if i > strWidth:
-                                strWidth = i
-
-                width = NNN*20
-                xoffset = 40
-                yoffset = 40
-                cellHeight = 3
-                nLoci = reduce(lambda x,y: x+y, map(lambda x: len(x),genotype),0)
-
-                if nLoci > 2000:
-                        cellHeight = 1
-                elif nLoci > 1000:
-                        cellHeight = 2
-                elif nLoci < 200:
-                        cellHeight = 10
-                else:
-                        pass
-
-                pos = range(NNN)
-                neworder = []
-                BWs = Plot.BWSpectrum()
-                colors100 = Plot.colorSpectrum()
-                colors = Plot.colorSpectrum(130)
-                finecolors = Plot.colorSpectrum(250)
-                colors100.reverse()
-                colors.reverse()
-                finecolors.reverse()
-
-                scaleFont=pid.Font(ttf="tahoma",size=10,bold=0)
-				
-                if not clusterChecked: #XZ: this part is for original order
-                        for i in range(len(names)):
-                                neworder.append((xoffset+20*(i+1), i))
-
-                        canvas = pid.PILCanvas(size=(80+NNN*20+240,80+ topHeight +5+5+strWidth+nLoci*cellHeight+80+20*cellHeight))
-
-                        self.drawTraitNameBottom(canvas,names,yoffset,neworder,strWidth,topHeight,labelFont)
-                else: #XZ: this part is to cluster traits
-                        topHeight = 400
-                        canvas = pid.PILCanvas(size=(80+NNN*20+240,80+ topHeight +5+5+strWidth+nLoci*cellHeight+80+20*cellHeight))
-
-                        corArray = [([0] * (NNN))[:] for i in range(NNN)]
-
-                        nnCorr = len(strainlist)
-
-                        #XZ, 08/04/2009: I commented out pearsonArray, spearmanArray
-                        for i, thisTrait in enumerate(traitList):
-                            names1 = [thisTrait.db.name, thisTrait.name, thisTrait.cellid]
-                            for j, thisTrait2 in enumerate(traitList):
-                                    names2 = [thisTrait2.db.name, thisTrait2.name, thisTrait2.cellid]
-                                    if j < i:
-                                            corr,nOverlap = webqtlUtil.calCorrelation(traitDataList[i], traitDataList[j],nnCorr)
-                                            if (1-corr) < 0:
-                                                    distance = 0.0
-                                            else:
-                                                    distance = 1-corr
-                                            corArray[i][j] = distance
-                                            corArray[j][i] = distance
-                                    elif j == i:
-                                            corArray[i][j] = 0.0
-                                    else:
-                                            pass
-
-                        #XZ, 7/29/2009: The parameter d has info of cluster (group member and distance). The format of d is tricky. Print it out to see it's format.
-                        d = slink.slink(corArray)
-
-                        #XZ, 7/29/2009: Attention: The 'neworder' is changed by the 'draw' function
-                        #XZ, 7/30/2009: Only toppos[1][0] and top[1][1] are used later. Then what toppos[0] is used for? 
-                        toppos = self.draw(canvas,names,d,xoffset,yoffset,neworder,topHeight)
-                        self.drawTraitNameTop(canvas,names,yoffset,neworder,strWidth,topHeight,labelFont)
-
-                        #XZ, 7/29/2009: draw the top vertical line
-                        canvas.drawLine(toppos[1][0],toppos[1][1],toppos[1][0],yoffset)
-
-                        #XZ: draw string 'distance = 1-r'
-                        canvas.drawString('distance = 1-r',neworder[-1][0] + 50, topHeight*3/4,font=labelFont,angle=90)
-
-                        #draw Scale
-                        scaleFont=pid.Font(ttf="tahoma",size=10,bold=0)
-                        x = neworder[-1][0]
-                        canvas.drawLine(x+5, topHeight+yoffset, x+5, yoffset, color=pid.black)
-                        y = 0
-                        while y <=2:
-                                canvas.drawLine(x+5, topHeight*y/2.0+yoffset, x+10, topHeight*y/2.0+yoffset)
-                                canvas.drawString('%2.1f' % (2-y), x+12, topHeight*y/2.0+yoffset, font=scaleFont)
-                                y += 0.5
-
-
-                chrname = 0
-                chrnameFont=pid.Font(ttf="tahoma",size=24,bold=0)
-                Ncol = 0
-
-                nearestMarkers = self.getNearestMarker(traitList, genotype)
-
-                # import cPickle
-                if sessionfile:
-                        fp = open(os.path.join(webqtlConfig.TMPDIR, sessionfile + '.session'), 'rb')
-                        permData = cPickle.load(fp)
-                        fp.close()
-                else:
-                        permData = {}
-
-                areas = []
-				#XZ, 7/31/2009: This for loop is to generate the heatmap
-                #XZ: draw trait by trait instead of marker by marker
-                for order in neworder:
-                        #startHeight = 40+400+5+5+strWidth
-                        startHeight = topHeight + 40+5+5+strWidth
-                        startWidth = order[0]-5
-                        if Ncol and Ncol % 5 == 0:
-                                drawStartPixel = 8
-                        else:
-                                drawStartPixel = 9
-
-                        tempVal = traitDataList[order[1]]
-                        _vals = []
-                        _strains = [] 
-                        for i in range(len(strainlist)):
-                                if tempVal[i] != None:
-                                        _strains.append(strainlist[i])
-                                        _vals.append(tempVal[i])
-
-                        qtlresult = genotype.regression(strains = _strains, trait = _vals)
-
-                        if sessionfile:
-                                LRSArray = permData[str(traitList[order[1]])]
-                        else:
-                                LRSArray = genotype.permutation(strains = _strains, trait = _vals, nperm = 1000)
-                                permData[str(traitList[order[1]])] = LRSArray
-
-                        sugLRS = LRSArray[369]
-                        sigLRS = LRSArray[949]
-                        prechr = 0
-                        chrstart = 0
-                        nearest = nearestMarkers[order[1]]
-                        midpoint = []
-
-                        for item in qtlresult:
-                                if item.lrs > webqtlConfig.MAXLRS:
-                                        adjustlrs = webqtlConfig.MAXLRS
-                                else:
-                                        adjustlrs = item.lrs
-
-                                if item.locus.chr != prechr:
-                                        if prechr:
-                                                canvas.drawRect(startWidth-drawStartPixel, startHeight, startWidth+10, startHeight+3,edgeColor=pid.white, edgeWidth=0, fillColor=pid.white)
-                                                startHeight+= 3
-                                                if not chrname:
-                                                        canvas.drawString(prechr,xoffset-20,(chrstart+startHeight)/2,font = chrnameFont,color=pid.dimgray)
-                                        prechr = item.locus.chr
-                                        chrstart = startHeight
-                                if colorScheme == '0':
-                                        if adjustlrs <= sugLRS:
-                                                colorIndex = int(65*adjustlrs/sugLRS)
-                                        else:
-                                                colorIndex = int(65 + 35*(adjustlrs-sugLRS)/(sigLRS-sugLRS))
-                                        if colorIndex > 99:
-                                                colorIndex = 99
-                                        colorIndex = colors100[colorIndex]
-                                elif colorScheme == '1':
-                                        sugLRS = LRSArray[369]/2.0
-                                        if adjustlrs <= sugLRS:
-                                                colorIndex = BWs[20+int(50*adjustlrs/sugLRS)]
-                                        else:
-                                                if item.additive > 0:
-                                                        colorIndex = int(80 + 50*(adjustlrs-sugLRS)/(sigLRS-sugLRS))
-                                                else:
-                                                        colorIndex = int(50 - 50*(adjustlrs-sugLRS)/(sigLRS-sugLRS))
-                                                if colorIndex > 129:
-                                                        colorIndex = 129
-                                                if colorIndex < 0:
-                                                        colorIndex = 0
-                                                colorIndex = colors[colorIndex]
-                                elif colorScheme == '2':
-                                        if item.additive > 0:
-                                                colorIndex = int(150 + 100*(adjustlrs/sigLRS))
-                                        else:
-                                                colorIndex = int(100 - 100*(adjustlrs/sigLRS))
-                                        if colorIndex > 249:
-                                                colorIndex = 249
-                                        if colorIndex < 0:
-                                                        colorIndex = 0
-                                        colorIndex = finecolors[colorIndex]
-                                else:
-                                        colorIndex = pid.white
-
-                                if startHeight > 1:
-                                        canvas.drawRect(startWidth-drawStartPixel, startHeight, startWidth+10, startHeight+cellHeight,edgeColor=colorIndex, edgeWidth=0, fillColor=colorIndex)
-                                else:
-                                        canvas.drawLine(startWidth-drawStartPixel, startHeight, startWidth+10, startHeight, Color=colorIndex)
-
-                                if item.locus.name == nearest:
-                                        midpoint = [startWidth,startHeight-5]
-                                startHeight+=cellHeight
-
-                        #XZ, map link to trait name and band
-                        COORDS = "%d,%d,%d,%d" %(startWidth-drawStartPixel,topHeight+40,startWidth+10,startHeight)
-                        HREF = "javascript:showDatabase2('%s','%s','%s');" % (traitList[order[1]].db.name, traitList[order[1]].name, traitList[order[1]].cellid)
-                        area = (COORDS, HREF, '%s' % names[order[1]])
-                        areas.append(area)
-
-                        if midpoint:
-                                traitPixel = ((midpoint[0],midpoint[1]),(midpoint[0]-6,midpoint[1]+12),(midpoint[0]+6,midpoint[1]+12))
-                                canvas.drawPolygon(traitPixel,edgeColor=pid.black,fillColor=pid.orange,closed=1)
-
-                        if not chrname:
-                                canvas.drawString(prechr,xoffset-20,(chrstart+startHeight)/2,font = chrnameFont,color=pid.dimgray)
-                        chrname = 1
-                        Ncol += 1
-
-
-                #draw Spectrum
-                startSpect = neworder[-1][0] + 30
-                startHeight = topHeight + 40+5+5+strWidth
-
-                if colorScheme == '0':
-                        for i in range(100):
-                                canvas.drawLine(startSpect+i,startHeight+20,startSpect+i,startHeight+40,color=colors100[i])
-                        scaleFont=pid.Font(ttf="tahoma",size=10,bold=0)
-                        canvas.drawLine(startSpect,startHeight+45,startSpect,startHeight+39,color=pid.black)
-                        canvas.drawString('LRS = 0',startSpect,startHeight+55,font=scaleFont)
-                        canvas.drawLine(startSpect+64,startHeight+45,startSpect+64,startHeight+39,color=pid.black)
-                        canvas.drawString('Suggestive LRS',startSpect+64,startHeight+55,font=scaleFont)
-                        canvas.drawLine(startSpect+99,startHeight+45,startSpect+99,startHeight+39,color=pid.black)
-                        canvas.drawString('Significant LRS',startSpect+105,startHeight+40,font=scaleFont)
-                elif colorScheme == '1':
-                        for i in range(50):
-                                canvas.drawLine(startSpect+i,startHeight,startSpect+i,startHeight+40,color=BWs[20+i])
-                        for i in range(50,100):
-                                canvas.drawLine(startSpect+i,startHeight,startSpect+i,startHeight+20,color=colors[100-i])
-                                canvas.drawLine(startSpect+i,startHeight+20,startSpect+i,startHeight+40,color=colors[30+i])
-
-                        canvas.drawLine(startSpect,startHeight+45,startSpect,startHeight+39,color=pid.black)
-                        canvas.drawString('LRS = 0',startSpect,startHeight+60,font=scaleFont)
-                        canvas.drawLine(startSpect+50,startHeight+45,startSpect+50,startHeight+39,color=pid.black)
-                        canvas.drawString('0.5*Suggestive LRS',startSpect+50,startHeight+ 60,font=scaleFont)
-                        canvas.drawLine(startSpect+99,startHeight+45,startSpect+99,startHeight+39,color=pid.black)
-                        canvas.drawString('Significant LRS',startSpect+105,startHeight+50,font=scaleFont)
-                        textFont=pid.Font(ttf="verdana",size=18,bold=0)
-                        canvas.drawString('%s +' % ppolar,startSpect+120,startHeight+ 35,font=textFont,color=pid.red)
-                        canvas.drawString('%s +' % mpolar,startSpect+120,startHeight+ 15,font=textFont,color=pid.blue)
-                elif colorScheme == '2':
-                        for i in range(100):
-                                canvas.drawLine(startSpect+i,startHeight,startSpect+i,startHeight+20,color=finecolors[100-i])
-                                canvas.drawLine(startSpect+i,startHeight+20,startSpect+i,startHeight+40,color=finecolors[150+i])
-
-                        canvas.drawLine(startSpect,startHeight+45,startSpect,startHeight+39,color=pid.black)
-                        canvas.drawString('LRS = 0',startSpect,startHeight+60,font=scaleFont)
-                        canvas.drawLine(startSpect+99,startHeight+45,startSpect+99,startHeight+39,color=pid.black)
-                        canvas.drawString('Significant LRS',startSpect+105,startHeight+50,font=scaleFont)
-                        textFont=pid.Font(ttf="verdana",size=18,bold=0)
-                        canvas.drawString('%s +' % ppolar,startSpect+120,startHeight+ 35,font=textFont,color=pid.red)
-                        canvas.drawString('%s +' % mpolar,startSpect+120,startHeight+ 15,font=textFont,color=pid.blue)
-						
-                filename= webqtlUtil.genRandStr("Heatmap_")
-                canvas.save(webqtlConfig.IMGDIR+filename, format='png')
-                if not sessionfile:
-                        sessionfile = webqtlUtil.generate_session()
-                        webqtlUtil.dump_session(permData, os.path.join(webqtlConfig.TMPDIR, sessionfile +'.session'))
-                self.filename=filename
-                self.areas=areas
-                self.sessionfile=sessionfile
-        
-        def getResult(self):
-                return self.filename, self.areas, self.sessionfile
-
-        #XZ, 7/31/2009: This function put the order of traits into parameter neworder,
-        #XZ: return the position of the top vertical line of the hierarchical tree, draw the hierarchical tree.
-        def draw(self,canvas,names,d,xoffset,yoffset,neworder,topHeight):
-                maxDistance = topHeight
-                fontoffset = 4    #XZ, 7/31/2009: used only for drawing tree
-                if type(d[0]) == type(1) and type(d[1]) == type(1):
-                        neworder.append((xoffset+20,d[0]))
-                        neworder.append((xoffset+40,d[1]))
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(xoffset+20-fontoffset,maxDistance+yoffset,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(xoffset+40-fontoffset,maxDistance+yoffset,xoffset+40-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(xoffset+40-fontoffset,maxDistance+yoffset-height,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        return (40,(xoffset+30-fontoffset,maxDistance-height+yoffset))
-                elif type(d[0]) == type(1):
-                        neworder.append((xoffset+20,d[0]))
-                        d2 = self.draw(canvas,names,d[1],xoffset+20,yoffset,neworder,topHeight)
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(xoffset+20-fontoffset,maxDistance+yoffset,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(d2[1][0],d2[1][1],d2[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d2[1][0],maxDistance-height+yoffset,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        return (20+d2[0],((d2[1][0]+xoffset+20-fontoffset)/2,maxDistance-height+yoffset))
-                elif type(d[1]) == type(1):
-                        d1 = self.draw(canvas,names,d[0],xoffset,yoffset,neworder,topHeight)
-                        neworder.append((xoffset+d1[0]+20,d[1]))
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(xoffset+d1[0]+20-fontoffset,maxDistance+yoffset,xoffset+d1[0]+20-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],d1[1][1],d1[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],maxDistance-height+yoffset,xoffset+d1[0]+20-fontoffset,maxDistance-height+yoffset)
-                        return (d1[0]+20,((d1[1][0]+xoffset+d1[0]+20-fontoffset)/2,maxDistance-height+yoffset))
-                else:
-                        d1 = self.draw(canvas,names,d[0],xoffset,yoffset,neworder,topHeight)
-                        d2 = self.draw(canvas,names,d[1],xoffset+d1[0],yoffset,neworder,topHeight)
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(d2[1][0],d2[1][1],d2[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],d1[1][1],d1[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],maxDistance-height+yoffset,d2[1][0],maxDistance-height+yoffset)
-                        return (d1[0]+d2[0],((d1[1][0]+d2[1][0])/2,maxDistance-height+yoffset))
-
-        #XZ, 7/31/2009: dras trait names
-        def drawTraitNameBottom (self,canvas,names,yoffset,neworder,strWidth,topHeight,labelFont):
-                maxDistance = topHeight
-                for oneOrder in neworder:
-                        canvas.drawString(names[oneOrder[1]],oneOrder[0]-5,maxDistance+yoffset+5+strWidth-canvas.stringWidth(names[oneOrder[1]],font=labelFont),font=labelFont,color=pid.black,angle=270)
-
-        def drawTraitNameTop (self,canvas,names,yoffset,neworder,strWidth,topHeight,labelFont):
-                maxDistance = topHeight
-                for oneOrder in neworder:
-                        canvas.drawString(names[oneOrder[1]],oneOrder[0]-5,maxDistance+yoffset+5,font=labelFont,color=pid.black,angle=270)
-
-
-        def getNearestMarker(self, traitList, genotype):
-                out = []
-                if not genotype.Mbmap:
-                        return [None]* len(traitList)
-                for item in traitList:
-                        try:
-                                nearest = None
-                                for _chr in genotype:
-                                        if _chr.name != item.chr:
-                                                continue
-                                        distance = 1e30
-                                        for _locus in _chr:
-                                                if abs(_locus.Mb-item.mb) < distance:
-                                                        distance = abs(_locus.Mb-item.mb)
-                                                        nearest = _locus.name
-                                out.append(nearest)
-                        except:
-                                out.append(None)
-
-                return out
diff --git a/web/webqtl/heatmap/__init__.py b/web/webqtl/heatmap/__init__.py
deleted file mode 100755
index e69de29b..00000000
--- a/web/webqtl/heatmap/__init__.py
+++ /dev/null
diff --git a/web/webqtl/heatmap/heatmapPage.py b/web/webqtl/heatmap/heatmapPage.py
deleted file mode 100755
index b407b0c8..00000000
--- a/web/webqtl/heatmap/heatmapPage.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# 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 os
-import string
-from htmlgen import HTMLgen2 as HT
-
-from base.templatePage import templatePage
-from base import webqtlConfig
-from heatmap.Heatmap import Heatmap
-
-
-# XZ, 09/09/2008: After adding several traits to collection, click "QTL Heatmap" button,
-# XZ, 09/09/2008: This class will generate what you see.
-#########################################
-#      QTL heatmap Page
-#########################################
-class heatmapPage(templatePage):
-
-        def __init__(self,fd):
-
-                templatePage.__init__(self, fd)
-
-                if not self.openMysql():
-                        return
-                if not fd.genotype:
-                        fd.readGenotype()
-
-                searchResult = fd.formdata.getvalue('searchResult')
-                if not searchResult:
-                        heading = 'QTL Heatmap'
-                        detail = ['You need to select at least two traits in order to generate QTL heatmap.']
-                        self.error(heading=heading,detail=detail)
-                        return
-                if type("1") == type(searchResult):
-                        searchResult = string.split(searchResult,'\t')
-                if searchResult:
-                        if len(searchResult) > webqtlConfig.MAXCORR:
-                                heading = 'QTL Heatmap'
-                                detail = ['In order to display the QTL heat map properly, do not select more than %d traits for analysis.' % webqtlConfig.MAXCORR]
-                                self.error(heading=heading,detail=detail)
-                                return
-                else:
-                        heading = 'QTL Heatmap'
-                        detail = [HT.Font('Error : ',color='red'),HT.Font('Error occurs while retrieving data from database.',color='black')]
-                        self.error(heading=heading,detail=detail)
-                        return
-                self.dict['title'] = 'QTL heatmap'
-                NNN = len(searchResult)
-                if NNN == 0:
-                        heading = "QTL Heatmap"
-                        detail = ['No trait was selected for %s data set. No QTL heatmap was generated.' % fd.RISet]
-                        self.error(heading=heading,detail=detail)
-                        return
-                elif NNN < 2:
-                        heading = 'QTL Heatmap'
-                        detail = ['You need to select at least two traits in order to generate QTL heatmap.']
-                        self.error(heading=heading,detail=detail)
-                        return
-                else:
-                        colorScheme = fd.formdata.getvalue('colorScheme')
-                        if not colorScheme:
-                                colorScheme = '1'
-                        heatmapObject = Heatmap(fd=fd, searchResult=searchResult, colorScheme=colorScheme, userPrivilege=self.privilege, userName=self.userName)
-                        filename, areas, sessionfile = heatmapObject.getResult()
-                        gifmap = HT.Map(name='traitMap')
-                        for area in areas:
-                                Areas = HT.Area(shape='rect', coords=area[0], href=area[1], title=area[2])
-                                gifmap.areas.append(Areas)
-                        img2=HT.Image('/image/'+filename+'.png',border=0,usemap='#traitMap')
-                        imgUrl = 'Right-click or control-click on the link to download this graph as a <a href="/image/%s.png" class="normalsize" target="_blank">PNG file</a>' % filename
-                        form = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data', name='showDatabase', submit=HT.Input(type='hidden'))
-                        hddn = {'FormID':'showDatabase','ProbeSetID':'_','database':fd.RISet+"Geno",'CellID':'_','RISet':fd.RISet,'searchResult':string.join(searchResult,'\t')}
-                        if fd.incparentsf1:
-                                hddn['incparentsf1']='ON'
-                        for key in hddn.keys():
-                                form.append(HT.Input(name=key, value=hddn[key], type='hidden'))
-                        heatmapButton = HT.Input(type='button' ,name='mintmap',value='Redraw QTL Heatmap', onClick="databaseFunc(this.form,'heatmap');",Class="button")
-                        spects = {'0':'Single Spectrum','1':'Grey + Blue + Red','2':'Blue + Red'}
-                        schemeMenu = HT.Select(name='colorScheme')
-                        schemeMenu.append(('Single Spectrum',0))
-                        schemeMenu.append(('Grey + Blue + Red',1))
-                        schemeMenu.append(('Blue + Red',2))
-                        schemeMenu.selected.append(spects[colorScheme])
-                        clusterCheck= HT.Input(type='checkbox', Class='checkbox', name='clusterCheck',checked=0)
-                        targetDescriptionCheck = HT.Input(type='checkbox', Class='checkbox', name='targetDescriptionCheck',checked=0)
-                        form.append(gifmap,schemeMenu, heatmapButton, HT.P(), clusterCheck, '  Cluster traits  ', targetDescriptionCheck, '  Add description', HT.P(),img2, HT.P(), imgUrl)
-                        form.append(HT.Input(name='session', value=sessionfile, type='hidden'))
-                        heatmapHelp = HT.Input(type='button' ,name='heatmapHelpButton',value='Info', onClick="openNewWin('/heatmap.html');",Class="button")
-                        heatmapHeading = HT.Paragraph('QTL Heatmap ', heatmapHelp, Class="title")
-                        TD_LR = HT.TD(colspan=2,height=200,width="100%",bgColor='#eeeeee')
-                        TD_LR.append(heatmapHeading, HT.P(),HT.P(),HT.P(),HT.P(),HT.P(),form)
-                        self.dict['body'] = str(TD_LR)
diff --git a/web/webqtl/heatmap/heatmapPage_GN.py b/web/webqtl/heatmap/heatmapPage_GN.py
deleted file mode 100755
index abc5d8aa..00000000
--- a/web/webqtl/heatmap/heatmapPage_GN.py
+++ /dev/null
@@ -1,522 +0,0 @@
-# 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 os
-import string
-import piddle as pid
-import cPickle
-from htmlgen import HTMLgen2 as HT
-
-from base.templatePage import templatePage
-from base import webqtlConfig
-from base.webqtlTrait import webqtlTrait
-from utility import webqtlUtil 
-from utility import Plot
-import slink
-
-
-# XZ, 09/09/2008: After adding several traits to collection, click "QTL Heatmap" button,
-# XZ, 09/09/2008: This class will generate what you see.
-#########################################
-#      QTL heatmap Page
-#########################################
-class heatmapPage(templatePage):
-
-        labelFont=pid.Font(ttf="tahoma",size=14,bold=0)
-
-        topHeight = 0
-
-        def __init__(self,fd):
-
-                templatePage.__init__(self, fd)
-
-                if not self.openMysql():
-                        return
-                if not fd.genotype:
-                        fd.readGenotype()
-
-
-                self.searchResult = fd.formdata.getvalue('searchResult')
-
-                if not self.searchResult:
-                        templatePage.__init__(self, fd)
-                        heading = 'QTL Heatmap'
-                        detail = ['You need to select at least two traits in order to generate correlation matrix.']
-                        self.error(heading=heading,detail=detail)
-                        return
-                if type("1") == type(self.searchResult):
-                        self.searchResult = string.split(self.searchResult,'\t')
-
-
-                if self.searchResult:
-                        if len(self.searchResult) > webqtlConfig.MAXCORR:
-                                heading = 'QTL Heatmap'
-                                detail = ['In order to display the QTL heat map properly, do not select more than %d traits for analysis.' % webqtlConfig.MAXCORR]
-                                self.error(heading=heading,detail=detail)
-                                return
-
-                        traitList = []
-                        traitDataList = []
-                        for item in self.searchResult:
-                                thisTrait = webqtlTrait(fullname=item, cursor=self.cursor)
-                                thisTrait.retrieveInfo()
-                                thisTrait.retrieveData(fd.strainlist)
-                                traitList.append(thisTrait)
-                                traitDataList.append(thisTrait.exportData(fd.strainlist))
-                else:
-                        heading = 'QTL Heatmap'
-                        detail = [HT.Font('Error : ',color='red'),HT.Font('Error occurs while retrieving data from database.',color='black')]
-                        self.error(heading=heading,detail=detail)
-                        return
-
-                self.colorScheme = fd.formdata.getvalue('colorScheme')
-                if not self.colorScheme:
-                        self.colorScheme = '1'
-
-                self.dict['title'] = 'QTL heatmap'
-
-                NNN = len(traitList)
-
-                if NNN == 0:
-                        heading = "QTL Heatmap"
-                        detail = ['No trait was selected for %s data set. No QTL heatmap was generated.' % fd.RISet]
-                        self.error(heading=heading,detail=detail)
-                        return
-                elif NNN < 2:
-                        templatePage.__init__(self, fd)
-                        heading = 'QTL Heatmap'
-                        detail = ['You need to select at least two traits in order to generate QTL heatmap.']
-                        self.error(heading=heading,detail=detail)
-                        return
-                else:
-                        #XZ: It's necessory to define canvas here
-                        canvas = pid.PILCanvas(size=(80+NNN*20,880))
-
-                        names = map(webqtlTrait.displayName, traitList)
-
-                        self.targetDescriptionChecked = fd.formdata.getvalue('targetDescriptionCheck', '')
-
-                        #XZ, 7/29/2009: create trait display and find max strWidth
-                        strWidth = 0
-                        for j in range(len(names)):
-                                thisTrait = traitList[j]
-
-                                if self.targetDescriptionChecked:
-                                    if thisTrait.db.type == 'ProbeSet':
-                                        if thisTrait.probe_target_description:
-                                                names[j] += ' [%s at Chr %s @ %2.3fMB, %s]' % (thisTrait.symbol, thisTrait.chr, thisTrait.mb, thisTrait.probe_target_description)
-                                        else:
-                                                names[j] += ' [%s at Chr %s @ %2.3fMB]' % (thisTrait.symbol, thisTrait.chr, thisTrait.mb)
-                                    elif thisTrait.db.type == 'Geno':
-                                        names[j] += ' [Chr %s @ %2.3fMB]' % (thisTrait.chr, thisTrait.mb)
-                                    elif thisTrait.db.type == 'Publish':
-                                        if thisTrait.abbreviation:
-                                            names[j] += ' [%s]' % (thisTrait.abbreviation)
-                                        else:
-                                            pass
-                                    else:
-                                        pass
-
-                                i = canvas.stringWidth(names[j],font=self.labelFont)
-                                if i > strWidth:
-                                        strWidth = i
-
-                        width = NNN*20
-                        xoffset = 40
-                        yoffset = 40
-                        cellHeight = 3
-                        nLoci = reduce(lambda x,y: x+y, map(lambda x: len(x),fd.genotype),0)
-
-                        if nLoci > 2000:
-                                cellHeight = 1
-                        elif nLoci > 1000:
-                                cellHeight = 2
-                        elif nLoci < 200:
-                                cellHeight = 10
-                        else:
-                                pass
-
-                        pos = range(NNN)
-                        neworder = []
-                        BWs = Plot.BWSpectrum()
-                        colors100 = Plot.colorSpectrum()
-                        colors = Plot.colorSpectrum(130)
-                        finecolors = Plot.colorSpectrum(250)
-                        colors100.reverse()
-                        colors.reverse()
-                        finecolors.reverse()
-
-                        scaleFont=pid.Font(ttf="tahoma",size=10,bold=0)
-
-                        self.clusterChecked = fd.formdata.getvalue('clusterCheck', '')
-
-
-                        if not self.clusterChecked: #XZ: this part is for original order
-                                for i in range(len(names)):
-                                        neworder.append((xoffset+20*(i+1), i))
-
-                                canvas = pid.PILCanvas(size=(80+NNN*20+240,80+ self.topHeight +5+5+strWidth+nLoci*cellHeight+80+20*cellHeight))
-
-                                self.drawTraitNameBottom(canvas,names,yoffset,neworder,strWidth)
-                        else: #XZ: this part is to cluster traits
-                                self.topHeight = 400
-                                canvas = pid.PILCanvas(size=(80+NNN*20+240,80+ self.topHeight +5+5+strWidth+nLoci*cellHeight+80+20*cellHeight))
-
-                                corArray = [([0] * (NNN))[:] for i in range(NNN)]
-
-                                nnCorr = len(fd.strainlist)
-
-                                #XZ, 08/04/2009: I commented out pearsonArray, spearmanArray
-                                for i, thisTrait in enumerate(traitList):
-                                    names1 = [thisTrait.db.name, thisTrait.name, thisTrait.cellid]
-                                    for j, thisTrait2 in enumerate(traitList):
-                                            names2 = [thisTrait2.db.name, thisTrait2.name, thisTrait2.cellid]
-                                            if j < i:
-                                                    corr,nOverlap = webqtlUtil.calCorrelation(traitDataList[i],traitDataList[j],nnCorr)
-                                                    if (1-corr) < 0:
-                                                            distance = 0.0
-                                                    else:
-                                                            distance = 1-corr
-                                                    corArray[i][j] = distance
-                                                    corArray[j][i] = distance
-                                            elif j == i:
-                                                    corArray[i][j] = 0.0
-                                            else:
-                                                    pass
-
-                                #XZ, 7/29/2009: The parameter d has info of cluster (group member and distance). The format of d is tricky. Print it out to see it's format.
-                                d = slink.slink(corArray)
-
-                                #XZ, 7/29/2009: Attention: The 'neworder' is changed by the 'draw' function
-                                #XZ, 7/30/2009: Only toppos[1][0] and top[1][1] are used later. Then what toppos[0] is used for? 
-                                toppos = self.draw(canvas,names,d,xoffset,yoffset,neworder)
-                                self.drawTraitNameTop(canvas,names,yoffset,neworder,strWidth)
-
-                                #XZ, 7/29/2009: draw the top vertical line
-                                canvas.drawLine(toppos[1][0],toppos[1][1],toppos[1][0],yoffset)
-
-                                #XZ: draw string 'distance = 1-r'
-                                canvas.drawString('distance = 1-r',neworder[-1][0] + 50, self.topHeight*3/4,font=self.labelFont,angle=90)
-
-                                #draw Scale
-                                scaleFont=pid.Font(ttf="tahoma",size=10,bold=0)
-                                x = neworder[-1][0]
-                                canvas.drawLine(x+5, self.topHeight+yoffset, x+5, yoffset, color=pid.black)
-                                y = 0
-                                while y <=2:
-                                        canvas.drawLine(x+5, self.topHeight*y/2.0+yoffset, x+10, self.topHeight*y/2.0+yoffset)
-                                        canvas.drawString('%2.1f' % (2-y), x+12, self.topHeight*y/2.0+yoffset, font=scaleFont)
-                                        y += 0.5
-
-
-                        chrname = 0
-                        chrnameFont=pid.Font(ttf="tahoma",size=24,bold=0)
-                        Ncol = 0
-
-                        gifmap = HT.Map(name='traitMap')
-
-                        nearestMarkers = self.getNearestMarker(traitList, fd.genotype)
-
-                        # import cPickle
-                        sessionfile = fd.formdata.getvalue("session")
-
-                        if sessionfile:
-                                fp = open(os.path.join(webqtlConfig.TMPDIR, sessionfile + '.session'), 'rb')
-                                permData = cPickle.load(fp)
-                                fp.close()
-                        else:
-                                permData = {}
-
-                        #XZ, 7/31/2009: This for loop is to generate the heatmap
-                        #XZ: draw trait by trait instead of marker by marker
-                        for order in neworder:
-                                #startHeight = 40+400+5+5+strWidth
-                                startHeight = self.topHeight + 40+5+5+strWidth
-                                startWidth = order[0]-5
-                                if Ncol and Ncol % 5 == 0:
-                                        drawStartPixel = 8
-                                else:
-                                        drawStartPixel = 9
-
-                                tempVal = traitDataList[order[1]]
-                                _vals = []
-                                _strains = [] 
-                                for i in range(len(fd.strainlist)):
-                                        if tempVal[i] != None:
-                                                _strains.append(fd.strainlist[i])
-                                                _vals.append(tempVal[i])
-
-                                qtlresult = fd.genotype.regression(strains = _strains, trait = _vals)
-
-                                if sessionfile:
-                                        LRSArray = permData[str(traitList[order[1]])]
-                                else:
-                                        LRSArray = fd.genotype.permutation(strains = _strains, trait = _vals, nperm = 1000)
-                                        permData[str(traitList[order[1]])] = LRSArray
-
-                                sugLRS = LRSArray[369]
-                                sigLRS = LRSArray[949]
-                                prechr = 0
-                                chrstart = 0
-                                nearest = nearestMarkers[order[1]]
-                                midpoint = []
-
-                                for item in qtlresult:
-                                        if item.lrs > webqtlConfig.MAXLRS:
-                                                adjustlrs = webqtlConfig.MAXLRS
-                                        else:
-                                                adjustlrs = item.lrs
-
-                                        if item.locus.chr != prechr:
-                                                if prechr:
-                                                        canvas.drawRect(startWidth-drawStartPixel, startHeight, startWidth+10, startHeight+3,edgeColor=pid.white, edgeWidth=0, fillColor=pid.white)
-                                                        startHeight+= 3
-                                                        if not chrname:
-                                                                canvas.drawString(prechr,xoffset-20,(chrstart+startHeight)/2,font = chrnameFont,color=pid.dimgray)
-                                                prechr = item.locus.chr
-                                                chrstart = startHeight
-                                        if self.colorScheme == '0':
-                                                if adjustlrs <= sugLRS:
-                                                        colorIndex = int(65*adjustlrs/sugLRS)
-                                                else:
-                                                        colorIndex = int(65 + 35*(adjustlrs-sugLRS)/(sigLRS-sugLRS))
-                                                if colorIndex > 99:
-                                                        colorIndex = 99
-                                                colorIndex = colors100[colorIndex]
-                                        elif self.colorScheme == '1':
-                                                sugLRS = LRSArray[369]/2.0
-                                                if adjustlrs <= sugLRS:
-                                                        colorIndex = BWs[20+int(50*adjustlrs/sugLRS)]
-                                                else:
-                                                        if item.additive > 0:
-                                                                colorIndex = int(80 + 50*(adjustlrs-sugLRS)/(sigLRS-sugLRS))
-                                                        else:
-                                                                colorIndex = int(50 - 50*(adjustlrs-sugLRS)/(sigLRS-sugLRS))
-                                                        if colorIndex > 129:
-                                                                colorIndex = 129
-                                                        if colorIndex < 0:
-                                                                colorIndex = 0
-                                                        colorIndex = colors[colorIndex]
-                                        elif self.colorScheme == '2':
-                                                if item.additive > 0:
-                                                        colorIndex = int(150 + 100*(adjustlrs/sigLRS))
-                                                else:
-                                                        colorIndex = int(100 - 100*(adjustlrs/sigLRS))
-                                                if colorIndex > 249:
-                                                        colorIndex = 249
-                                                if colorIndex < 0:
-                                                                colorIndex = 0
-                                                colorIndex = finecolors[colorIndex]
-                                        else:
-                                                colorIndex = pid.white
-
-                                        if startHeight > 1:
-                                                canvas.drawRect(startWidth-drawStartPixel, startHeight, startWidth+10, startHeight+cellHeight,edgeColor=colorIndex, edgeWidth=0, fillColor=colorIndex)
-                                        else:
-                                                canvas.drawLine(startWidth-drawStartPixel, startHeight, startWidth+10, startHeight, Color=colorIndex)
-
-                                        if item.locus.name == nearest:
-                                                midpoint = [startWidth,startHeight-5]
-                                        startHeight+=cellHeight
-
-                                #XZ, map link to trait name and band
-                                COORDS = "%d,%d,%d,%d" %(startWidth-drawStartPixel,self.topHeight+40,startWidth+10,startHeight)
-                                HREF = "javascript:showDatabase2('%s','%s','%s');" % (traitList[order[1]].db.name, traitList[order[1]].name, traitList[order[1]].cellid)
-                                Areas = HT.Area(shape='rect',coords=COORDS,href=HREF, title='%s' % names[order[1]])
-                                gifmap.areas.append(Areas)
-
-                                if midpoint:
-                                        traitPixel = ((midpoint[0],midpoint[1]),(midpoint[0]-6,midpoint[1]+12),(midpoint[0]+6,midpoint[1]+12))
-                                        canvas.drawPolygon(traitPixel,edgeColor=pid.black,fillColor=pid.orange,closed=1)
-
-                                if not chrname:
-                                        canvas.drawString(prechr,xoffset-20,(chrstart+startHeight)/2,font = chrnameFont,color=pid.dimgray)
-                                chrname = 1
-                                Ncol += 1
-
-
-                        #draw Spectrum
-                        startSpect = neworder[-1][0] + 30
-                        startHeight = self.topHeight + 40+5+5+strWidth
-
-                        if self.colorScheme == '0':
-                                for i in range(100):
-                                        canvas.drawLine(startSpect+i,startHeight+20,startSpect+i,startHeight+40,color=colors100[i])
-                                scaleFont=pid.Font(ttf="tahoma",size=10,bold=0)
-                                canvas.drawLine(startSpect,startHeight+45,startSpect,startHeight+39,color=pid.black)
-                                canvas.drawString('LRS = 0',startSpect,startHeight+55,font=scaleFont)
-                                canvas.drawLine(startSpect+64,startHeight+45,startSpect+64,startHeight+39,color=pid.black)
-                                canvas.drawString('Suggestive LRS',startSpect+64,startHeight+55,font=scaleFont)
-                                canvas.drawLine(startSpect+99,startHeight+45,startSpect+99,startHeight+39,color=pid.black)
-                                canvas.drawString('Significant LRS',startSpect+105,startHeight+40,font=scaleFont)
-                        elif self.colorScheme == '1':
-                                for i in range(50):
-                                        canvas.drawLine(startSpect+i,startHeight,startSpect+i,startHeight+40,color=BWs[20+i])
-                                for i in range(50,100):
-                                        canvas.drawLine(startSpect+i,startHeight,startSpect+i,startHeight+20,color=colors[100-i])
-                                        canvas.drawLine(startSpect+i,startHeight+20,startSpect+i,startHeight+40,color=colors[30+i])
-
-                                canvas.drawLine(startSpect,startHeight+45,startSpect,startHeight+39,color=pid.black)
-                                canvas.drawString('LRS = 0',startSpect,startHeight+60,font=scaleFont)
-                                canvas.drawLine(startSpect+50,startHeight+45,startSpect+50,startHeight+39,color=pid.black)
-                                canvas.drawString('0.5*Suggestive LRS',startSpect+50,startHeight+ 60,font=scaleFont)
-                                canvas.drawLine(startSpect+99,startHeight+45,startSpect+99,startHeight+39,color=pid.black)
-                                canvas.drawString('Significant LRS',startSpect+105,startHeight+50,font=scaleFont)
-                                textFont=pid.Font(ttf="verdana",size=18,bold=0)
-                                canvas.drawString('%s +' % fd.ppolar,startSpect+120,startHeight+ 35,font=textFont,color=pid.red)
-                                canvas.drawString('%s +' % fd.mpolar,startSpect+120,startHeight+ 15,font=textFont,color=pid.blue)
-                        elif self.colorScheme == '2':
-                                for i in range(100):
-                                        canvas.drawLine(startSpect+i,startHeight,startSpect+i,startHeight+20,color=finecolors[100-i])
-                                        canvas.drawLine(startSpect+i,startHeight+20,startSpect+i,startHeight+40,color=finecolors[150+i])
-
-                                canvas.drawLine(startSpect,startHeight+45,startSpect,startHeight+39,color=pid.black)
-                                canvas.drawString('LRS = 0',startSpect,startHeight+60,font=scaleFont)
-                                canvas.drawLine(startSpect+99,startHeight+45,startSpect+99,startHeight+39,color=pid.black)
-                                canvas.drawString('Significant LRS',startSpect+105,startHeight+50,font=scaleFont)
-                                textFont=pid.Font(ttf="verdana",size=18,bold=0)
-                                canvas.drawString('%s +' % fd.ppolar,startSpect+120,startHeight+ 35,font=textFont,color=pid.red)
-                                canvas.drawString('%s +' % fd.mpolar,startSpect+120,startHeight+ 15,font=textFont,color=pid.blue)
-
-
-                        filename= webqtlUtil.genRandStr("Heatmap_")
-                        canvas.save(webqtlConfig.IMGDIR+filename, format='png')
-                        img2=HT.Image('/image/'+filename+'.png',border=0,usemap='#traitMap')
-                        imgUrl = 'Right-click or control-click on the link to download this graph as a <a href="/image/%s.png" class="normalsize" target="_blank">PNG file</a>' % filename
-
-                        form = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data', name='showDatabase', submit=HT.Input(type='hidden'))
-                        hddn = {'FormID':'showDatabase','ProbeSetID':'_','database':fd.RISet+"Geno",'CellID':'_','RISet':fd.RISet,'searchResult':string.join(self.searchResult,'\t')}
-                        if fd.incparentsf1:
-                                hddn['incparentsf1']='ON'
-                        for key in hddn.keys():
-                                form.append(HT.Input(name=key, value=hddn[key], type='hidden'))
-
-                        heatmap = HT.Input(type='button' ,name='mintmap',value='Redraw QTL Heatmap', onClick="databaseFunc(this.form,'heatmap');",Class="button")
-                        spects = {'0':'Single Spectrum','1':'Grey + Blue + Red','2':'Blue + Red'}
-                        schemeMenu = HT.Select(name='colorScheme')
-                        schemeMenu.append(('Single Spectrum',0))
-                        schemeMenu.append(('Grey + Blue + Red',1))
-                        schemeMenu.append(('Blue + Red',2))
-                        schemeMenu.selected.append(spects[self.colorScheme])
-
-                        clusterCheck= HT.Input(type='checkbox', Class='checkbox', name='clusterCheck',checked=0)
-                        targetDescriptionCheck = HT.Input(type='checkbox', Class='checkbox', name='targetDescriptionCheck',checked=0)
-
-                        form.append(gifmap,schemeMenu, heatmap, HT.P(), clusterCheck, '  Cluster traits  ', targetDescriptionCheck, '  Add description', HT.P(),img2, HT.P(), imgUrl)
-
-                        if not sessionfile:
-                                filename = webqtlUtil.generate_session()
-                                webqtlUtil.dump_session(permData, os.path.join(webqtlConfig.TMPDIR, filename +'.session'))
-                                sessionfile=filename
-
-                        form.append(HT.Input(name='session', value=sessionfile, type='hidden'))
-
-                        heatmapHelp = HT.Input(type='button' ,name='heatmapHelpButton',value='Info', onClick="openNewWin('/heatmap.html');",Class="button")
-
-                        heatmapHeading = HT.Paragraph('QTL Heatmap ', heatmapHelp, Class="title")
-
-                        TD_LR = HT.TD(colspan=2,height=200,width="100%",bgColor='#eeeeee')
-                        TD_LR.append(heatmapHeading, HT.P(),HT.P(),HT.P(),HT.P(),HT.P(),form)
-
-                        self.dict['body'] = str(TD_LR)
-
-        #XZ, 7/31/2009: This function put the order of traits into parameter neworder,
-        #XZ: return the position of the top vertical line of the hierarchical tree, draw the hierarchical tree.
-        def draw(self,canvas,names,d,xoffset,yoffset,neworder):
-                maxDistance = self.topHeight
-                fontoffset = 4    #XZ, 7/31/2009: used only for drawing tree
-
-                if type(d[0]) == type(1) and type(d[1]) == type(1):
-                        neworder.append((xoffset+20,d[0]))
-                        neworder.append((xoffset+40,d[1]))
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(xoffset+20-fontoffset,maxDistance+yoffset,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(xoffset+40-fontoffset,maxDistance+yoffset,xoffset+40-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(xoffset+40-fontoffset,maxDistance+yoffset-height,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        return (40,(xoffset+30-fontoffset,maxDistance-height+yoffset))
-                elif type(d[0]) == type(1):
-                        neworder.append((xoffset+20,d[0]))
-                        d2 = self.draw(canvas,names,d[1],xoffset+20,yoffset,neworder)
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(xoffset+20-fontoffset,maxDistance+yoffset,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(d2[1][0],d2[1][1],d2[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d2[1][0],maxDistance-height+yoffset,xoffset+20-fontoffset,maxDistance-height+yoffset)
-                        return (20+d2[0],((d2[1][0]+xoffset+20-fontoffset)/2,maxDistance-height+yoffset))
-                elif type(d[1]) == type(1):
-                        d1 = self.draw(canvas,names,d[0],xoffset,yoffset,neworder)
-                        neworder.append((xoffset+d1[0]+20,d[1]))
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(xoffset+d1[0]+20-fontoffset,maxDistance+yoffset,xoffset+d1[0]+20-fontoffset,maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],d1[1][1],d1[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],maxDistance-height+yoffset,xoffset+d1[0]+20-fontoffset,maxDistance-height+yoffset)
-                        return (d1[0]+20,((d1[1][0]+xoffset+d1[0]+20-fontoffset)/2,maxDistance-height+yoffset))
-                else:
-                        d1 = self.draw(canvas,names,d[0],xoffset,yoffset,neworder)
-                        d2 = self.draw(canvas,names,d[1],xoffset+d1[0],yoffset,neworder)
-                        height = d[2]*maxDistance/2
-                        canvas.drawLine(d2[1][0],d2[1][1],d2[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],d1[1][1],d1[1][0],maxDistance-height+yoffset)
-                        canvas.drawLine(d1[1][0],maxDistance-height+yoffset,d2[1][0],maxDistance-height+yoffset)
-                        return (d1[0]+d2[0],((d1[1][0]+d2[1][0])/2,maxDistance-height+yoffset))
-
-        #XZ, 7/31/2009: dras trait names
-        def drawTraitNameBottom (self,canvas,names,yoffset,neworder,strWidth):
-                maxDistance = self.topHeight
-
-                for oneOrder in neworder:
-                        canvas.drawString(names[oneOrder[1]],oneOrder[0]-5,maxDistance+yoffset+5+strWidth-canvas.stringWidth(names[oneOrder[1]],font=self.labelFont),font=self.labelFont,color=pid.black,angle=270)
-
-        def drawTraitNameTop (self,canvas,names,yoffset,neworder,strWidth):
-                maxDistance = self.topHeight
-
-                for oneOrder in neworder:
-                        canvas.drawString(names[oneOrder[1]],oneOrder[0]-5,maxDistance+yoffset+5,font=self.labelFont,color=pid.black,angle=270)
-
-
-        def getNearestMarker(self,traitList, genotype):
-                out = []
-                if not genotype.Mbmap:
-                        return [None]* len(traitList)
-                for item in traitList:
-                        try:
-                                nearest = None
-                                for _chr in genotype:
-                                        if _chr.name != item.chr:
-                                                continue
-                                        distance = 1e30
-                                        for _locus in _chr:
-                                                if abs(_locus.Mb-item.mb) < distance:
-                                                        distance = abs(_locus.Mb-item.mb)
-                                                        nearest = _locus.name
-                                out.append(nearest)
-                        except:
-                                out.append(None)
-
-                return out
-
-
-
-
diff --git a/web/webqtl/heatmap/slink.py b/web/webqtl/heatmap/slink.py
deleted file mode 100755
index 3de41de4..00000000
--- a/web/webqtl/heatmap/slink.py
+++ /dev/null
@@ -1,141 +0,0 @@
-# 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
-
-#--Only imported by correlationPage.py.
-#
-#Functions:
-#slink(lists) -- the only function called outside of this file.
-#nearest(lists,i,j) -- some sort of recursive function.
-#printarray(array,n) -- prints n elements of the given array
-#this is a myseterious piece of code in GN that Kev Adler and Rob Williams do not understand.
-#but is used in some way by the Traits Correlation function
-#Kev and Rob suspect that the d2 matrix below is unused 
-#We do not understand the signifance of "d" but Kev suspects it is unimportant
-#These comments by Kev and Rob: May 23, 2008
-
-d = [[0,9,3,6,11],[9,0,7,5,10],[3,7,0,9,2],[6,5,9,0,8],[11,10,2,8,0]]
-d2 = [[0,9,5.5,6,11],[9,0,7,5,10],[5.5,7,0,9,2],[6,5,9,0,3],[11,10,2,3,0]]
-
-def nearest(lists,i,j):
-	if type(i) == type(1) and type(j) == type(1):
-		return lists[i][j]
-	elif type(i) == type(1):
-		dist = 1e10
-		for itemj in j[:-1]:
-			d = nearest(lists,i,itemj)
-			if dist > d:
-				dist = d
-	elif type(j) == type(1):
-		dist = 1e10
-		for itemi in i[:-1]:
-			d = nearest(lists,itemi,j)
-			if dist > d:
-				dist = d
-	else:
-		dist = 1e10
-		for itemi in i[:-1]:
-			for itemj in j[:-1]:
-				d = nearest(lists,itemi,itemj)
-				if dist > d:
-					dist = d
-	return dist
-
-def printarray(array,n):
-	print "\n"
-	for i in range(n):
-		print array[i][:n]
-	print "\n"
-
-def slink(lists):
-	try:
-		if type(lists) != type([]) and type(lists) != type(()):
-			raise 'FormatError'
-		else:
-			size = len(lists)
-			for item in lists:
-				if type(item) != type([]) and type(item) != type(()):
-					raise 'FormatError'
-				else:
-					if len(item) != size:
-						raise 'LengthError'
-			for i in range(size):
-				if lists[i][i] != 0:
-					raise 'ValueError'
-				for j in range(0,i):
-					if lists[i][j] < 0:
-						raise 'ValueError'
-					if lists[i][j] != lists[j][i]:
-						raise 'MirrorError'
-	except 'FormatError':
-		print "the format of the list is incorrect!"
-		return []
-	except 'LengthError':
-		print "the list is not a square list!"
-		return []
-	except 'MirrorError':
-		print "the list is not symmetric!"
-		return []
-	except 'ValueError':
-		print "the distance is negative value!"
-		return []
-	except:
-		print "Unknown Error"
-		return [] 
-	listindex = range(size)
-	listindexcopy = range(size) 
-	listscopy = []
-	for i in range(size):
-		listscopy.append(lists[i][:])
-	initSize = size
-	candidate = []
-	while initSize >2:
-		mindist = 1e10
-		for i in range(initSize):
-			for j in range(i+1,initSize):
-				if listscopy[i][j] < mindist:
-					mindist =  listscopy[i][j]
-					candidate=[[i,j]]
-				elif listscopy[i][j] == mindist:
-					mindist =  listscopy[i][j]
-					candidate.append([i,j])
-				else:
-					pass
-		newmem = (listindexcopy[candidate[0][0]],listindexcopy[candidate[0][1]],mindist)
-		listindexcopy.pop(candidate[0][1])
-		listindexcopy[candidate[0][0]] = newmem
-		
-		initSize -= 1
-		for i in range(initSize):
-			for j in range(i+1,initSize):
-				listscopy[i][j] = nearest(lists,listindexcopy[i],listindexcopy[j])
-				listscopy[j][i] = listscopy[i][j]
-		#print listindexcopy
-		#printarray(listscopy,initSize)
-	listindexcopy.append(nearest(lists,listindexcopy[0],listindexcopy[1]))
-	return listindexcopy
-	
-	
-