diff options
Diffstat (limited to 'web/webqtl/networkGraph/networkGraphPage.py')
-rwxr-xr-x | web/webqtl/networkGraph/networkGraphPage.py | 335 |
1 files changed, 0 insertions, 335 deletions
diff --git a/web/webqtl/networkGraph/networkGraphPage.py b/web/webqtl/networkGraph/networkGraphPage.py deleted file mode 100755 index fb4021f0..00000000 --- a/web/webqtl/networkGraph/networkGraphPage.py +++ /dev/null @@ -1,335 +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 NL 2010/02/11 - -#!/usr/bin/python -# networkGraph.py -# Author: Stephen Pitts -# 6/2/2004 -# -# a script to take a matrix of data from a WebQTL job and generate a -# graph using the neato package from GraphViz -# -# See graphviz for documentation of the parameters -# - - -#from mod_python import apache, util, Cookie -#import cgi -import tempfile -import os -import time -import sys -import cgitb -import string - -from htmlgen import HTMLgen2 as HT - -from base.templatePage import templatePage -import networkGraphUtils -from base import webqtlConfig -from utility import webqtlUtil -from base.webqtlTrait import webqtlTrait -import compareCorrelates.trait as smpTrait -from GraphPage import GraphPage -from networkGraphPageBody import networkGraphPageBody -from correlationMatrix.tissueCorrelationMatrix import tissueCorrelationMatrix - -cgitb.enable() - - -class networkGraphPage(templatePage): - - def __init__(self,fd,InputData=None): - - templatePage.__init__(self, fd) - - if not self.openMysql(): - return - - if not fd.genotype: - fd.readGenotype() - - self.searchResult = fd.formdata.getvalue('searchResult') - - self.tissueProbeSetFeezeId = "1" #XZ, Jan 03, 2010: currently, this dataset is "UTHSC Illumina V6.2 RankInv B6 D2 average CNS GI average (May 08)" - TissueCorrMatrixObject = tissueCorrelationMatrix(tissueProbeSetFreezeId=self.tissueProbeSetFeezeId) - - if type("1") == type(self.searchResult): - self.searchResult = string.split(self.searchResult, '\t') - - if (not self.searchResult or (len(self.searchResult) < 2)): - heading = 'Network Graph' - detail = ['You need to select at least two traits in order to generate Network Graph.'] - self.error(heading=heading,detail=detail) - print 'Content-type: text/html\n' - self.write() - return - - if self.searchResult: - if len(self.searchResult) > webqtlConfig.MAXCORR: - heading = 'Network Graph' - detail = ['In order to display Network Graph properly, Do not select more than %d traits for Network Graph.' % webqtlConfig.MAXCORR] - self.error(heading=heading,detail=detail) - print 'Content-type: text/html\n' - self.write() - return - else: - pass - - 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 = 'Network Graph' - detail = [HT.Font('Error : ',color='red'),HT.Font('Error occurs while retrieving data from database.',color='black')] - self.error(heading=heading,detail=detail) - print 'Content-type: text/html\n' - self.write() - return - - NNN = len(traitList) - - if NNN < 2: - templatePage.__init__(self, fd) - heading = 'Network Graph' - detail = ['You need to select at least two traits in order to generate a Network Graph'] - print 'Content-type: text/html\n' - self.write() - return - else: - pearsonArray = [([0] * (NNN))[:] for i in range(NNN)] - spearmanArray = [([0] * (NNN))[:] for i in range(NNN)] - GeneIdArray = [] - GeneSymbolList = [] #XZ, Jan 03, 2011: holds gene symbols for calculating tissue correlation - traitInfoArray = [] - - i = 0 - nnCorr = len(fd.strainlist) - 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) - pearsonArray[i][j] = corr - pearsonArray[j][i] = corr - elif j == i: - pearsonArray[i][j] = 1.0 - spearmanArray[i][j] = 1.0 - else: - corr,nOverlap = webqtlUtil.calCorrelationRank(traitDataList[i],traitDataList[j],nnCorr) - spearmanArray[i][j] = corr - spearmanArray[j][i] = corr - - GeneId1 = None - tmpSymbol = None - if thisTrait.db.type == 'ProbeSet': - try: - GeneId1 = int(thisTrait.geneid) - except: - GeneId1 = 0 - if thisTrait.symbol: - tmpSymbol = thisTrait.symbol.lower() - GeneIdArray.append(GeneId1) - GeneSymbolList.append(tmpSymbol) - - _traits = [] - _matrix = [] - - for i in range(NNN): - turl = webqtlConfig.CGIDIR + webqtlConfig.SCRIPTFILE + '?FormID=showDatabase&database=%s&ProbeSetID=%s' % (traitList[i].db.name, traitList[i].name) - if traitList[i].cellid: - turl += "&CellID=%s" % traitList[i].cellid - - if traitList[i].db.type == 'ProbeSet': - if traitList[i].symbol: - _symbol = traitList[i].symbol - else: - _symbol = 'unknown' - elif traitList[i].db.type == 'Publish': - _symbol = traitList[i].name - if traitList[i].confidential: - if webqtlUtil.hasAccessToConfidentialPhenotypeTrait(privilege=self.privilege, userName=self.userName, authorized_users=traitList[i].authorized_users): - if traitList[i].post_publication_abbreviation: - _symbol = traitList[i].post_publication_abbreviation - else: - if traitList[i].pre_publication_abbreviation: - _symbol = traitList[i].pre_publication_abbreviation - else: - if traitList[i].post_publication_abbreviation: - _symbol = traitList[i].post_publication_abbreviation - - #XZ, 05/26/2009: Xiaodong add code for Geno data - elif traitList[i].db.type == 'Geno': - _symbol = traitList[i].name - else: - _symbol = traitList[i].description - #####if this trait entered by user - if _symbol.__contains__('entered'): - _symbol = _symbol[:_symbol.index('entered')] - #####if this trait generaged by genenetwork - elif _symbol.__contains__('generated'): - _symbol = _symbol[_symbol.rindex(':')+1:] - - newTrait = smpTrait.Trait(name=str(traitList[i]), href=turl, symbol=_symbol) - newTrait.color = "black" - _traits.append(newTrait) - - for j in range(i+1, NNN): - dataPoint = smpTrait.RawPoint(i, j) - dataPoint.spearman = spearmanArray[i][j] - dataPoint.pearson = pearsonArray[i][j] - - #XZ: get literature correlation info. - if GeneIdArray[i] and GeneIdArray[j]: - if GeneIdArray[i] == GeneIdArray[j]: - dataPoint.literature = 1 - else: - self.cursor.execute("SELECT Value from LCorrRamin3 WHERE (GeneId1 = %d and GeneId2 = %d) or (GeneId1 = %d and GeneId2 = %d)" % (GeneIdArray[i], GeneIdArray[j], GeneIdArray[j], GeneIdArray[i])) - try: - dataPoint.literature = self.cursor.fetchone()[0] - except: - dataPoint.literature = 0 - else: - dataPoint.literature = 0 - - #XZ: get tissue correlation info - if GeneSymbolList[i] and GeneSymbolList[j]: - dataPoint.tissue = 0 - geneSymbolPair = [] - geneSymbolPair.append(GeneSymbolList[i]) - geneSymbolPair.append(GeneSymbolList[j]) - corrArray,pvArray = TissueCorrMatrixObject.getCorrPvArrayForGeneSymbolPair(geneNameLst=geneSymbolPair) - if corrArray[1][0]: - dataPoint.tissue = corrArray[1][0] - else: - dataPoint.tissue = 0 - - _matrix.append(dataPoint) - - OrigDir = os.getcwd() - - sessionfile = fd.formdata.getvalue('session') - - inputFilename = fd.formdata.getvalue('inputFile') - - #If there is no sessionfile generate one and dump all matrix/trait values - if not sessionfile: - filename = webqtlUtil.generate_session() - webqtlUtil.dump_session([_matrix, _traits], os.path.join(webqtlConfig.TMPDIR, filename + '.session')) - sessionfile = filename - - startTime = time.time() - - #Build parameter dictionary used by networkGraphPage class using buildParamDict function - params = networkGraphUtils.buildParamDict(fd, sessionfile) - - nodes = len(_traits) - rawEdges = len(_matrix) - - if params["tune"] == "yes": - params = networkGraphUtils.tuneParamDict(params, nodes, rawEdges) - - matrix = networkGraphUtils.filterDataMatrix(_matrix, params) - - optimalNode = networkGraphUtils.optimalRadialNode(matrix) - - if not inputFilename: - inputFilename = tempfile.mktemp() - - inputFilename = webqtlConfig.IMGDIR + inputFilename.split("/")[2] - - #writes out 4 graph files for exporting - graphFile = "/image/" + networkGraphUtils.writeGraphFile(matrix, _traits, inputFilename, params) - - networkGraphUtils.processDataMatrix(matrix, params) - - edges = 0 - - for edge in matrix: - if edge.value != 0: - edges +=1 - - for trait in _traits: - trait.name = networkGraphUtils.fixLabel(trait.name) - - RootDir = webqtlConfig.IMGDIR - RootDirURL = "/image/" - - - - #This code writes the datafile that the graphviz function runNeato uses to generate the - #"digraph" file that defines the graphs parameters - datafile = networkGraphUtils.writeNeatoFile(matrix=matrix, traits=_traits, filename=inputFilename, GeneIdArray=GeneIdArray, p=params) - - #Generate graph in various file types - layoutfile = networkGraphUtils.runNeato(datafile, "dot", "dot", params["gType"]) # XZ, 09/11/2008: add module name - # ZS 03/04/2010 This second output file (layoutfile_pdf) is rotated by 90 degrees to prevent an issue with pdf output being cut off at the edges - layoutfile_pdf = networkGraphUtils.runNeato(datafile + "_pdf", "dot", "dot", params["gType"]) # ZS 03/04/2010 - pngfile = networkGraphUtils.runNeato(layoutfile, "png", "png", params["gType"]) - mapfile = networkGraphUtils.runNeato(layoutfile, "cmapx", "cmapx", params["gType"])# XZ, 09/11/2008: add module name - giffile = networkGraphUtils.runNeato(layoutfile, "gif", "gif", params["gType"])# XZ, 09/11/2008:add module name - psfile = networkGraphUtils.runNeato(layoutfile_pdf, "ps", "ps", params["gType"])# XZ, 09/11/2008: add module name - pdffile = networkGraphUtils.runPsToPdf(psfile, params["width"], params["height"])# XZ, 09/11/2008: add module name - - #This generates text files in XGGML (standardized graphing language) and plain text - #so the user can create his/her own graphs in a program like Cytoscape - - htmlfile1 = datafile + ".html" - htmlfile2 = datafile + ".graph.html" - - os.chdir(OrigDir) - - #This generates the graph in various image formats - giffile = RootDirURL + giffile - pngfile = RootDirURL + pngfile - pdffile = RootDirURL + pdffile - endTime = time.time() - totalTime = endTime - startTime - - os.chdir(RootDir) - - page2 = GraphPage(giffile, mapfile) - page2.writeToFile(htmlfile2) - - #This generates the HTML for the body of the Network Graph page - page1 = networkGraphPageBody(fd, matrix, _traits, htmlfile2, giffile, pdffile, nodes, edges, rawEdges, totalTime, params, page2.content, graphFile, optimalNode) - - #Adds the javascript colorSel to the body to allow line color selection - self.dict["js1"] = '<SCRIPT SRC="/javascript/colorSel.js"></SCRIPT><BR>' - #self.dict["js1"] += '<SCRIPT SRC="/javascript/networkGraph.js"></SCRIPT>' - - #Set body of current templatePage to body of the templatePage networkGraphPage - self.dict['body'] = page1.dict['body'] - - |