# 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)
# user can search correlation value and P-Value by inputting one pair gene symbols or multiple gene symbols.
# Created by GeneNetwork Core Team 2010/07/07
# Last updated by NL, 2011/03/25
from htmlgen import HTMLgen2 as HT
import os
import sys
import time
import string
import pyXLWriter as xl
import cPickle
from base.templatePage import templatePage
from base import webqtlConfig
from base.webqtlTrait import webqtlTrait
from correlationMatrix.tissueCorrelationMatrix import tissueCorrelationMatrix
from utility import webqtlUtil
from utility.THCell import THCell
from utility.TDCell import TDCell
#########################################
# Tissue Correlation Page
#########################################
class TissueCorrelationPage(templatePage):
def __init__(self, fd):
templatePage.__init__(self, fd)
if not self.openMysql():
return
#read input fields
self.action = fd.formdata.getvalue("action", "").strip()
self.geneSymbols = fd.formdata.getvalue("geneSymbols","").strip()
self.tissueProbeSetFeezeId = fd.formdata.getvalue("tissueProbeSetFeezeId", "").strip()
self.recordReturnNum = fd.formdata.getvalue("recordReturnNum", "0").strip()
self.calculateMethod = fd.formdata.getvalue("calculateMethod", "0").strip()
TissueCorrMatrixObject = tissueCorrelationMatrix(tissueProbeSetFreezeId=self.tissueProbeSetFeezeId)
if not self.geneSymbols:
# default page
Heading = HT.Paragraph("Tissue Correlation", Class="title")
Intro = HT.Blockquote("This function computes correlations between transcript expression across different organs and tissues.")
Intro.append(HT.BR(),"Select a data set from the pull-down menu and then compute correlations.")
formName='searchTissueCorrelation'
form = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), target='_blank',enctype='multipart/form-data', name= formName, submit=HT.Input(type='hidden'))
form.append(HT.Input(type="hidden", name="FormID", value=""))
form.append(HT.Input(type="hidden", name="action", value="disp"))
# added by NL 10/12/2010, retreive dataSet info from TissueProbeSetFreeze to get all TissueProbeSetFreezeId, datasetName and FullName
tissProbeSetFreezeIds,dataSetNames,dataSetfullNames = TissueCorrMatrixObject.getTissueDataSet()
dataSetList=[]
for i in range(len(tissProbeSetFreezeIds)):
dataSetList.append((dataSetfullNames[i], tissProbeSetFreezeIds[i]))
dataSetMenu = HT.Select(dataSetList,name="tissueProbeSetFeezeId")
InfoFile =HT.Input(type="button", Class="button", value=" Info ", onClick="tissueDatasetInfo(this.form.tissueProbeSetFeezeId,%s);"%(dataSetNames))
form.append(HT.Strong(" "),dataSetMenu,InfoFile,HT.BR());
form.append(HT.BR(),HT.Strong(" Please enter only one gene symbol/ENTREZ gene Id per line."),HT.BR(),HT.Strong(" "),HT.Textarea(name="geneSymbols", rows=10, cols=50, text=""),HT.BR(),HT.BR())
# calculate method radio button
calculateMethodMenu =HT.Input(type="radio", name="calculateMethod", value="0", checked="checked")
calculateMethodMenu1 =HT.Input(type="radio", name="calculateMethod", value="1")
# record Return method dropdown menu
recordReturnMenu = HT.Select(name="recordReturnNum")
recordReturnMenu.append(('Top 100','0'))
recordReturnMenu.append(('Top 200','1'))
recordReturnMenu.append(('Top 500','2'))
recordReturnMenu.append(('Top 1000','3'))
recordReturnMenu.append(('Top 2000','4'))
recordReturnMenu.append(('All','5'))
# working for input symbol has only one;
form.append(HT.Strong(" "),HT.Span("Return:", Class="ffl fwb fs12"),HT.Strong(" "),recordReturnMenu,HT.BR());
form.append(HT.BR(),HT.Strong(" "),'Pearson',calculateMethodMenu," "*3,'Spearman Rank',calculateMethodMenu1,HT.BR(),HT.BR());
form.append(HT.Strong(" "),HT.Input(type="button", value=" Compute ", Class="button",onClick="selectFormIdForTissueCorr('%s');"%formName))
form.append(HT.Strong(" "),HT.Input(type="button", Class="button", value=" Make Default ", onClick = "makeTissueCorrDefault(this.form);"))
TD_LR = HT.TD(height=200,width="100%",bgcolor='#eeeeee',align="left")
TD_LR.append(Heading,Intro,form)
self.content_type = 'text/html'
self.dict['js1'] = '
'
# get tissueProbesetFreezeId from cookie
self.dict['js2'] = 'onload ="getTissueCorrDefault(\'searchTissueCorrelation\');"'
self.dict['body'] = str(TD_LR)
self.dict['title'] = "Tissue Correlation"
elif self.action == 'disp':
TissueCount =TissueCorrMatrixObject.getTissueCountofCurrentDataset()
# add by NL for first Note part in the tissue correlation page. 2010-12-23
note =""
dataSetName=""
datasetFullName=""
dataSetName, datasetFullName= TissueCorrMatrixObject.getFullnameofCurrentDataset()
noteURL = "../dbdoc/"+ dataSetName+".html"
noteText = " was used to compute expression correlation across %s samples of tissues and organs. ["%TissueCount
# dataset download
datasetURL = "../dbdoc/"+ dataSetName+".xls"
datasetDownload =HT.Href(text="Download experiment data",url=datasetURL,Class='fs13',target="_blank")
note = HT.Blockquote(HT.Href(text=datasetFullName,url=noteURL,Class='fs13',target="_blank"),noteText, datasetDownload,"]",HT.BR())
geneSymbolLst = [] # gene Symbol list
geneSymbolLst = TissueCorrMatrixObject.getGeneSymbolLst(self.geneSymbols)
symbolCount = len(geneSymbolLst)
# The input symbol limit is 100.
heading = "Tissue Correlation"
if symbolCount > 100:
detail = ['The Gene symbols you have input are more than 100. Please limit them to 100.']
self.error(heading=heading,detail=detail)
return
elif symbolCount==0:
detail = ['No Gene Symbol was input. No Tissue Correlation matrix generated.' ]
self.error(heading=heading,detail=detail)
return
else:
# search result page
# The input symbols should be no less than 1.
self.content_type = 'text/html'
if symbolCount == 1:
self.displaySingleSymbolResultPage(primaryGeneSymbol=geneSymbolLst[0],datasetFullName=datasetFullName,tProbeSetFreezeId=self.tissueProbeSetFeezeId, TissueCorrMatrixObject =TissueCorrMatrixObject,recordReturnNum=self.recordReturnNum,method=self.calculateMethod, note=note,TissueCount =TissueCount)
else:
self.displayMultiSymbolsResultPage(geneSymbolLst=geneSymbolLst, symbolCount=symbolCount, tProbeSetFreezeId=self.tissueProbeSetFeezeId,TissueCorrMatrixObject =TissueCorrMatrixObject,note=note,TissueCount =TissueCount)
else:
heading = "Tissue Correlation"
detail = ['There\'s something wrong with input gene symbol(s), or the value of parameter [action] is not right.' ]
self.error(heading=heading,detail=detail)
return
#############################
# functions
#############################
# result page when input symbol has only one
def displaySingleSymbolResultPage(self,primaryGeneSymbol=None, datasetFullName=None,tProbeSetFreezeId=None, TissueCorrMatrixObject =None,recordReturnNum=None,method=None,note=None,TissueCount =None):
formName = webqtlUtil.genRandStr("fm_")
form = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data',name= formName, submit=HT.Input(type='hidden'))
# the following hidden elements are required parameter in Class(PlotCorrelationPage). So we need to define them here.
form.append(HT.Input(type="hidden", name="action", value="disp"))
form.append(HT.Input(type="hidden", name="FormID", value="dispSingleTissueCorrelation"))
form.append(HT.Input(type="hidden", name="X_geneSymbol", value=""))
form.append(HT.Input(type="hidden", name="Y_geneSymbol", value=""))
form.append(HT.Input(type="hidden", name="ProbeSetID", value=""))
# RISet is not using in Tissue correlation, but is a required parameter in Class(PlotCorrelationPage). So we set dummy value(BXD).
form.append(HT.Input(type="hidden", name="RISet", value="BXD"))
form.append(HT.Input(type="hidden", name="ShowLine", value="1"))
form.append(HT.Input(type="hidden", name="TissueProbeSetFreezeId", value=tProbeSetFreezeId))
form.append(HT.Input(type="hidden", name="rankOrder", value=0))
traitList =[]
try:
symbolCorrDict, symbolPvalueDict = TissueCorrMatrixObject.calculateCorrOfAllTissueTrait(primaryTraitSymbol=primaryGeneSymbol,method=method)
except:
heading = "Tissue Correlation"
detail = ['Please use the official NCBI gene symbol.' ]
self.error(heading=heading,detail=detail)
return
symbolList0,geneIdDict,dataIdDict,ChrDict,MbDict,descDict,pTargetDescDict=TissueCorrMatrixObject.getTissueProbeSetXRefInfo(GeneNameLst=[])
# In case, upper case and lower case issue of symbol, mappedByTargetList function will update input geneSymbolLst based on database search result
tempPrimaryGeneSymbol =self.mappedByTargetList(primaryList=symbolList0,targetList=[primaryGeneSymbol])
primaryGeneSymbol =tempPrimaryGeneSymbol[0]
returnNum = self.getReturnNum(recordReturnNum)
symbolListSorted=[]
symbolList=[]
# get key(list) of symbolCorrDict(dict) based on sorting symbolCorrDict(dict) by its' value in desc order
symbolListSorted=sorted(symbolCorrDict, key=symbolCorrDict.get, reverse=True)
symbolList = self.mappedByTargetList(primaryList=symbolList0,targetList=symbolListSorted)
if returnNum==None:
returnNum =len(symbolList0)
IntroReturnNum ="All %d "%returnNum
else:
IntroReturnNum ="The Top %d" %returnNum
symbolList = symbolList[:returnNum]
pageTable = HT.TableLite(cellSpacing=0,cellPadding=0,width="100%", border=0, align="Left")
##############
# Excel file #
##############
filename= webqtlUtil.genRandStr("Corr_")
xlsUrl = HT.Input(type='button', value = 'Download Table', onClick= "location.href='/tmp/%s.xls'" % filename, Class='button')
# Create a new Excel workbook
workbook = xl.Writer('%s.xls' % (webqtlConfig.TMPDIR+filename))
headingStyle = workbook.add_format(align = 'center', bold = 1, border = 1, size=13, fg_color = 0x1E, color="white")
#There are 6 lines of header in this file.
worksheet = self.createExcelFileWithTitleAndFooter(workbook=workbook, datasetName=datasetFullName, returnNumber=returnNum)
newrow = 6
pageTable.append(HT.TR(HT.TD(xlsUrl,height=40)))
# get header part of result table and export excel file
tblobj = {}
tblobj['header'], worksheet = self.getTableHeader( method=method, worksheet=worksheet, newrow=newrow, headingStyle=headingStyle)
newrow += 1
# get body part of result table and export excel file
tblobj['body'], worksheet = self.getTableBody(symbolCorrDict=symbolCorrDict, symbolPvalueDict=symbolPvalueDict,symbolList=symbolList,geneIdDict=geneIdDict,ChrDict=ChrDict,MbDict=MbDict,descDict=descDict,pTargetDescDict=pTargetDescDict,primarySymbol=primaryGeneSymbol,TissueCount=TissueCount, formName=formName, worksheet=worksheet, newrow=newrow,method=method)
workbook.close()
# creat object for result table for sort function
objfile = open('%s.obj' % (webqtlConfig.TMPDIR+filename), 'wb')
cPickle.dump(tblobj, objfile)
objfile.close()
sortby = ("tissuecorr", "down")
div = HT.Div(webqtlUtil.genTableObj(tblobj=tblobj, file=filename, sortby=sortby, tableID = "sortable", addIndex = "1"), Id="sortable")
if method =="0":
IntroMethod="Pearson\'s r "
else:
IntroMethod="Spearman\'s rho "
Intro = HT.Blockquote('%s correlations ranked by the %s are displayed.' % (IntroReturnNum,IntroMethod),
' You can resort this list using the small arrowheads in the top row.')
Intro.append(HT.BR(),' Click the correlation values to generate scatter plots. Select the symbol to open NCBI Entrez.')
pageTable.append(HT.TR(HT.TD(div)))
form.append(HT.P(), HT.P(),pageTable)
corrHeading = HT.Paragraph('Tissue Correlation Table', Class="title")
TD_LR = HT.TD(height=200,width="100%",bgcolor='#eeeeee',align="left")
TD_LR.append(corrHeading,note,Intro, form, HT.P())
self.dict['body'] = str(TD_LR)
self.dict['js1'] = '
'
self.dict['title'] = 'Tissue Correlation Result'
return
# result page when input symbols are more than 1
def displayMultiSymbolsResultPage(self, geneSymbolLst=None, symbolCount=None, tProbeSetFreezeId=None,TissueCorrMatrixObject=None,note=None,TissueCount =None):
formName = webqtlUtil.genRandStr("fm_")
form = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data',name= formName, submit=HT.Input(type='hidden'))
# the following hidden elements are required parameter in Class(PlotCorrelationPage). So we need to define them here.
form.append(HT.Input(type="hidden", name="action", value="disp"))
form.append(HT.Input(type="hidden", name="FormID", value="dispMultiTissueCorrelation"))
form.append(HT.Input(type="hidden", name="X_geneSymbol", value=""))
form.append(HT.Input(type="hidden", name="Y_geneSymbol", value=""))
form.append(HT.Input(type="hidden", name="ProbeSetID", value=""))
# RISet is not using in Tissue correlation, but is a required parameter in Class(PlotCorrelationPage). So we set dummy value(BXD).
form.append(HT.Input(type="hidden", name="RISet", value="BXD"))
form.append(HT.Input(type="hidden", name="ShowLine", value="1"))
form.append(HT.Input(type="hidden", name="TissueProbeSetFreezeId", value=tProbeSetFreezeId))
form.append(HT.Input(type="hidden", name="rankOrder", value=0))
# updated by NL, 2011-01-06, build multi list for later use to descrease access to db again
symbolList,geneIdDict,dataIdDict,ChrDict,MbDict,descDict,pTargetDescDict = TissueCorrMatrixObject.getTissueProbeSetXRefInfo(GeneNameLst=geneSymbolLst)
# In case, upper case and lower case issue of symbol, mappedByTargetList function will update input geneSymbolLst based on database search result
geneSymbolLst =self.mappedByTargetList(primaryList=symbolList,targetList=geneSymbolLst)
# Added by NL, 2011-01-06, get all shortNames, verboseNames, verboseNames2, verboseNames3, exportArray
# for Short Label, Long Label, Export functions
geneIdLst,shortNames, verboseNames, verboseNames2, verboseNames3, exportArray = self.getAllLabelsInfo(geneSymbolList =geneSymbolLst, geneIdDict=geneIdDict,ChrDict=ChrDict, MbDict=MbDict, descDict=descDict, pTargetDescDict=pTargetDescDict)
heading = "Tissue Correlation Matrix"
#get correlation value and p value based on Gene Symbols list, and return the values in corrArray and pvArray seperately
corrArray,pvArray = TissueCorrMatrixObject.getTissueCorrPvArray(geneNameLst=geneSymbolLst,dataIdDict=dataIdDict)
# in the matrix table, top right corner displays Spearman Rank Correlation's Values and P-Values for each pair of geneSymbols;
# left bottom displays Pearson Correlation values and P-Vlues for each pair of geneSymbols.
tissueCorrMatrixHeading = HT.Paragraph(heading,Class="title")
tcmTable = HT.TableLite(Class="collap", border=0, cellspacing=1, cellpadding=5, width='100%')
row1 = HT.TR(HT.TD(Class="fs14 fwb ffl b1 cw cbrb"),HT.TD('Spearman Rank Correlation (rho)' , Class="fs14 fwb ffl b1 cw cbrb", colspan= symbolCount+2,align="center"))
col1 = HT.TR(HT.TD("P e a r s o n r", rowspan= symbolCount+1,Class="fs14 fwb ffl b1 cw cbrb", width=10,align="center"),HT.TD("Gene Symbol",Class="fs13 fwb cb b1", width=300))
for i in range(symbolCount):
GeneSymbol=geneSymbolLst[i].strip()
geneId = geneIdLst[i]
if geneId!=0:
_url="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids=%s" % geneId
curURL = HT.Href(text=GeneSymbol,url=_url,Class='fs13',target="_blank")
else:
curURL = GeneSymbol
col1.append(HT.TD(curURL,Class="b1", align="center"))
tcmTable.append(row1,col1)
# to decide to whether to show note for "*" or not
flag = 0
for i in range(symbolCount):
GeneSymbol=geneSymbolLst[i].strip()
geneId = geneIdLst[i]
newrow = HT.TR()
newrow.append(HT.Input(name="Symbol", value=GeneSymbol, type='hidden'))
if geneId!=0:
_url="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids=%s" %geneId
geneIdURL = HT.Href(text="%s "%GeneSymbol,url=_url,Class="b1",target="_blank")
else:
# flag =1 will show note for "*"
flag = 1
geneIdURL =HT.Italic("%s"%GeneSymbol,HT.Font('*', color='red'))
newrow.append(HT.TD(geneIdURL,shortNames[i],verboseNames[i],verboseNames2[i],verboseNames3[i], Class="b1", align="left",NOWRAP="ON"))
for j in range(symbolCount):
GeneSymbol2=geneSymbolLst[j].strip()
corr = corrArray[i][j]
pValue = pvArray[i][j]
Color=''
if j==i:
newrow.append(HT.TD(HT.Font(HT.Italic("n"),HT.BR(),str(TissueCount),Class="fs11 fwn b1",align="center", color="000000"), bgColor='#cccccc', align="center", Class="b1", NOWRAP="ON"))
exportArray[i+1][j+1] = '%d/%d' % (TissueCount,TissueCount)
else:
if corr:
corr = float(corr)
tCorr = "%2.3f" % corr
pValue = float(pValue)
tPV = "%2.3f" % pValue
# updated by NL, based on Rob's requirement: delete p value, 2010-02-14
# set color for cells by correlationValue
if corr > 0.7:
fontcolor="red"
elif corr > 0.5:
fontcolor="#FF6600"
elif corr < -0.7:
fontcolor="blue"
elif corr < -0.5:
fontcolor="#009900"
else:
fontcolor ="#000000"
# set label for cells
# if rank is equal to 0, pearson correlation plot will be the first one;
# if rank is equal to 1, spearman ran correlation plot will be the first one.
if j>i:
exportArray[i+1][j+1] =tCorr+"/"+tPV
rank =1
elif j
var allCorrelations = %s;
"""
exportScript = exportScript % str(exportArray)
self.dict['js1'] = exportScript+'
'
TD_LR = HT.TD(colspan=2,width="100%",bgcolor="#eeeeee")
TD_LR.append(tissueCorrMatrixHeading,note,Intro,form,HT.P())
self.dict['body'] = str(TD_LR)
self.dict['title'] = 'Tissue Correlation Result'
return
# Added by NL, 2011-01-06, get all shortNames, verboseNames, verboseNames2, verboseNames3, exportArray
# for Short Label, Long Label, Export functions
def getAllLabelsInfo(self, geneSymbolList=None,geneIdDict=None,ChrDict=None,MbDict=None,descDict=None,pTargetDescDict=None):
symbolCount= len(geneSymbolList)
geneIdLst =[]
exportArray = [([0] * (symbolCount+1))[:] for i in range(symbolCount+1)]
exportArray[0][0] = 'Tissue Correlation'
shortNames = []
verboseNames = []
verboseNames2 = []
verboseNames3 = []
# added by NL, 2010-12-21, build DIV and array for short label, long label and export functions
for i, geneSymbolItem in enumerate(geneSymbolList):
geneSymbol =geneSymbolItem.lower()
_shortName =HT.Italic("%s" %geneSymbolItem)
_verboseName =''
_verboseName2 = ''
_verboseName3 = ''
if geneIdDict.has_key(geneSymbol):
geneIdLst.append(geneIdDict[geneSymbol])
else:
geneIdLst.append(0)
if ChrDict.has_key(geneSymbol) and MbDict.has_key(geneSymbol):
_verboseName = ' on Chr %s @ %s Mb' % (ChrDict[geneSymbol],MbDict[geneSymbol])
if descDict.has_key(geneSymbol):
_verboseName2 = '%s' % (descDict[geneSymbol])
if pTargetDescDict.has_key(geneSymbol):
_verboseName3 = '%s' % (pTargetDescDict[geneSymbol])
shortName = HT.Div(id="shortName_" + str(i), style="display:none")
shortName.append('Symbol: ')
shortName.append(_shortName)
shortNames.append(shortName)
verboseName = HT.Div(id="verboseName_" + str(i), style="display:none")
verboseName.append(_shortName)
verboseName.append(_verboseName)
verboseNames.append(verboseName)
verboseName2 = HT.Div(id="verboseName2_" + str(i), style="display:none")
verboseName2.append(_verboseName2)
verboseNames2.append(verboseName2)
verboseName3 = HT.Div(id="verboseName3_" + str(i), style="display:none")
verboseName3.append(_verboseName3)
verboseNames3.append(verboseName3)
# exportTissueText in webqtl.js is using '/' as delimilator; add '/', otherwise the last letter in geneSymbol will missing
exportArray[i+1][0] =geneSymbolItem+ '/' + geneSymbolItem + '/' +geneSymbolItem + ':' + str(_verboseName) + ' : ' + str(_verboseName2) + ' : ' + str(_verboseName3)
exportArray[0][i+1] =geneSymbolItem+ '/'
return geneIdLst,shortNames, verboseNames, verboseNames2, verboseNames3, exportArray
########################################################################
# functions for display and download when input symbol has only one #
########################################################################
# build header and footer parts for export excel file
def createExcelFileWithTitleAndFooter(self, workbook=None, datasetName=None,returnNumber=None):
worksheet = workbook.add_worksheet()
titleStyle = workbook.add_format(align = 'left', bold = 0, size=14, border = 1, border_color="gray")
##Write title Info
worksheet.write([1, 0], "Citations: Please see %s/reference.html" % webqtlConfig.PORTADDR, titleStyle)
worksheet.write([2, 0], "Dataset : %s" % datasetName, titleStyle)
worksheet.write([3, 0], "Date : %s" % time.strftime("%B %d, %Y", time.gmtime()), titleStyle)
worksheet.write([4, 0], "Time : %s GMT" % time.strftime("%H:%M ", time.gmtime()), titleStyle)
worksheet.write([5, 0], "Status of data ownership: Possibly unpublished data; please see %s/statusandContact.html for details on sources, ownership, and usage of these data." % webqtlConfig.PORTADDR, titleStyle)
#Write footer info
worksheet.write([8 + returnNumber, 0], "Funding for The GeneNetwork: NIAAA (U01AA13499, U24AA13513), NIDA, NIMH, and NIAAA (P20-DA21131), NCI MMHCC (U01CA105417), and NCRR (U01NR 105417)", titleStyle)
worksheet.write([9 + returnNumber, 0], "PLEASE RETAIN DATA SOURCE INFORMATION WHENEVER POSSIBLE", titleStyle)
return worksheet
# build header of table when input symbol has only one
def getTableHeader(self, method='0', worksheet=None, newrow=None, headingStyle=None):
tblobj_header = []
exportList=[]
header=[]
header = [THCell(HT.TD(' ', Class="fs13 fwb ffl b1 cw cbrb",nowrap='ON'), sort=0),
THCell(HT.TD('Symbol',HT.BR(),HT.BR(), Class="fs13 fwb ffl b1 cw cbrb"), text="symbol", idx=1),
THCell(HT.TD('Description',HT.BR(),HT.BR(), Class="fs13 fwb ffl b1 cw cbrb"), text="desc", idx=2),
THCell(HT.TD('Location',HT.BR(),'Chr and Mb ', Class="fs13 fwb ffl b1 cw cbrb"), text="location", idx=3),
THCell(HT.TD('N Cases',HT.BR(),HT.BR(), Class="fs13 fwb ffl b1 cw cbrb",nowrap='ON'), text="nstr", idx=4)]
if method =="0":# Pearson Correlation
header.append( THCell(HT.TD(HT.Href(
text = HT.Span(' r ', HT.Sup(' ?', style="color:#f00"),HT.BR(),HT.BR(), Class="fs13 fwb ffl cw"),
target = '_blank',
url = "/correlationAnnotation.html#tissue_r"),
Class="fs13 fwb ffl b1 cw cbrb", nowrap='ON'), text="tissuecorr", idx=5))
header.append( THCell(HT.TD(HT.Href(
text = HT.Span(' p(r) ', HT.Sup(' ?', style="color:#f00"),HT.BR(),HT.BR(), Class="fs13 fwb ffl cw"),
target = '_blank',
url = "/correlationAnnotation.html#tissue_p_r"),
Class="fs13 fwb ffl b1 cw cbrb", nowrap='ON'), text="tissuepvalue", idx=6))
exportList =[ 'Gene ID', 'Symbol', 'Description', 'Location', 'N Cases', ' r ', ' p(r) ']
else:# Spearman Correlation
header.append( THCell(HT.TD(HT.Href(
text = HT.Span(' rho ', HT.Sup(' ?', style="color:#f00"),HT.BR(),HT.BR(), Class="fs13 fwb ffl cw"),
target = '_blank',
url = "/correlationAnnotation.html#tissue_rho"),
Class="fs13 fwb ffl b1 cw cbrb", nowrap='ON'), text="tissuecorr", idx=5))
header.append( THCell(HT.TD(HT.Href(
text = HT.Span('p(rho)', HT.Sup(' ?', style="color:#f00"),HT.BR(), HT.BR(),Class="fs13 fwb ffl cw"),
target = '_blank',
url = "/correlationAnnotation.html#tissue_p_rho"),
Class="fs13 fwb ffl b1 cw cbrb", nowrap='ON'), text="tissuepvalue", idx=6))
exportList = ['Gene ID', 'Symbol', 'Description', 'Location', 'N Cases','rho', ' p(rho) ']
# build header of excel for download function
for ncol, item in enumerate(exportList):
worksheet.write([newrow, ncol], item, headingStyle)
worksheet.set_column([ncol, ncol], 2*len(item))
tblobj_header.append(header)
return tblobj_header, worksheet
# build body of table when input symbol has only one
def getTableBody(self, symbolCorrDict={}, symbolPvalueDict={},symbolList=[],geneIdDict={},ChrDict={},MbDict={},descDict={},pTargetDescDict={},primarySymbol=None, TissueCount=None,formName=None, worksheet=None, newrow=None,method="0"):
tblobj_body = []
for symbolItem in symbolList:
symbol =symbolItem.lower()
if symbol:
pass
else:
symbol ="N/A"
if geneIdDict.has_key(symbol) and geneIdDict[symbol]:
geneId = geneIdDict[symbol]
ncbiUrl = HT.Href(text="NCBI",target='_blank',url=webqtlConfig.NCBI_LOCUSID % geneIdDict[symbol], Class="fs10 fwn")
else:
geneId ="N/A"
symbolItem =symbolItem.replace('"','') # some symbol is saved in ["symbol"]format
ncbiUrl = HT.Href(text="NCBI",target='_blank',url="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?CMD=search&DB=gene&term=%s" % symbol, Class="fs10 fwn")
_Species="mouse"
similarTraitUrl = "%s?cmd=sch&gene=%s&alias=1&species=%s" % (os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), symbolItem, _Species)
gnUrl = HT.Href(text="GN",target='_blank',url=similarTraitUrl, Class="fs10 fwn")
tr = []
# updated by NL, 04/25/2011: add checkbox and highlight function
# first column of table
# updated by NL. 12-7-2011
tr.append(TDCell(HT.TD(HT.Input(type="checkbox", Class="checkbox", name="tissueResult",value=symbol, onClick="highlight(this)"), align='right',Class="fs12 fwn b1 c222 fsI",nowrap='ON'),symbol,symbol))
# updated by NL, 04/26/2011: add GN and NCBI links
#gene symbol (symbol column)
tr.append(TDCell(HT.TD(HT.Italic(symbolItem), HT.BR(),gnUrl,"  |  ", ncbiUrl, Class="fs12 fwn b1 c222"),symbolItem, symbolItem))
#description and probe target description(description column)
description_string=''
if descDict.has_key(symbol):
description_string = str(descDict[symbol]).strip()
if pTargetDescDict.has_key(symbol):
target_string = str(pTargetDescDict[symbol]).strip()
description_display = ''
if len(description_string) > 1 and description_string != 'None':
description_display = description_string
else:
description_display = symbolItem
if len(description_display) > 1 and description_display != 'N/A' and len(target_string) > 1 and target_string != 'None':
description_display = description_display + '; ' + target_string.strip()
tr.append(TDCell(HT.TD(description_display, Class="fs12 fwn b1 c222"), description_display, description_display))
#trait_location_value is used for sorting (location column)
trait_location_repr = 'N/A'
trait_location_value = 1000000
if ChrDict.has_key(symbol) and MbDict.has_key(symbol):
if ChrDict[symbol] and MbDict[symbol]:
mb = float(MbDict[symbol])
try:
trait_location_value = int(ChrDict[symbol])*1000 + mb
except:
if ChrDict[symbol].upper() == 'X':
trait_location_value = 20*1000 + mb
else:
trait_location_value = ord(str(ChrDict[symbol]).upper()[0])*1000 + mb
trait_location_repr = 'Chr%s: %.6f' % (ChrDict[symbol], mb )
else:
trait_location_repr="N/A"
trait_location_value ="N/A"
tr.append(TDCell(HT.TD(trait_location_repr, Class="fs12 fwn b1 c222", nowrap="on"), trait_location_repr, trait_location_value))
# number of overlaped cases (N Case column)
tr.append(TDCell(HT.TD(TissueCount, Class="fs12 fwn ffl b1 c222", align='right'),TissueCount,TissueCount))
#tissue correlation (Tissue r column)
TCorr = 0.0
TCorrStr = "N/A"
if symbolCorrDict.has_key(symbol):
TCorr = symbolCorrDict[symbol]
TCorrStr = "%2.3f" % TCorr
symbol2 =symbolItem.replace('"','') # some symbol is saved in "symbol" format
# add a new parameter rankOrder for js function 'showTissueCorrPlot'
rankOrder = int(method)
TCorrPlotURL = "javascript:showTissueCorrPlot('%s','%s','%s',%d)" %(formName, primarySymbol, symbol2,rankOrder)
tr.append(TDCell(HT.TD(HT.Href(text=TCorrStr, url=TCorrPlotURL, Class="fs12 fwn ff1"), Class="fs12 fwn ff1 b1 c222", align='right'), TCorrStr, abs(TCorr)))
else:
tr.append(TDCell(HT.TD(TCorrStr, Class="fs12 fwn b1 c222", align='right'), TCorrStr, abs(TCorr)))
#p value of tissue correlation (Tissue p(r) column)
TPValue = 1.0
TPValueStr = "N/A"
if symbolPvalueDict.has_key(symbol):
TPValue = symbolPvalueDict[symbol]
#TPValueStr = "%2.3f" % TPValue
TPValueStr=webqtlUtil.SciFloat(TPValue)
tr.append(TDCell(HT.TD(TPValueStr, Class="fs12 fwn b1 c222", align='right'), TPValueStr, TPValue))
tblobj_body.append(tr)
# build body(records) of excel for download function
for ncol, item in enumerate([geneId, symbolItem, description_display, trait_location_repr,TissueCount, TCorr, TPValue]):
worksheet.write([newrow, ncol], item)
newrow += 1
return tblobj_body, worksheet
# get return number of records when input symbol has only one
def getReturnNum(self,recordReturnNum="0"):
if recordReturnNum=="0":
returnNum=100
elif recordReturnNum=="1":
returnNum=200
elif recordReturnNum=="2":
returnNum=500
elif recordReturnNum=="3":
returnNum=1000
elif recordReturnNum=="4":
returnNum=2000
elif recordReturnNum=="5":
returnNum= None
return returnNum
# map list based on the order of target List
# if item.lower() exist in both lists, then compare the difference of item's original value of two lists
# if not equal, then replace the item in targetList by using the item in primaryList(list from database)
def mappedByTargetList(self,primaryList=[],targetList=[]):
tempPrimaryList =[x.lower() for x in primaryList]
testTargetList =[y.lower() for y in targetList]
for i, item in enumerate(tempPrimaryList):
if item in testTargetList:
index = testTargetList.index(item)
if primaryList[i]!=targetList[index]:
targetList[index]= primaryList[i]
return targetList