diff options
author | root | 2012-05-08 18:39:56 -0500 |
---|---|---|
committer | root | 2012-05-08 18:39:56 -0500 |
commit | ea46f42ee640928b92947bfb204c41a482d80937 (patch) | |
tree | 9b27a4eb852d12539b543c3efee9d2a47ef470f3 /web/webqtl/correlationMatrix/CorrelationMatrixPage.py | |
parent | 056b5253fc3857b0444382aa39944f6344dc1ceb (diff) | |
download | genenetwork2-ea46f42ee640928b92947bfb204c41a482d80937.tar.gz |
Add all the source codes into the github.
Diffstat (limited to 'web/webqtl/correlationMatrix/CorrelationMatrixPage.py')
-rwxr-xr-x | web/webqtl/correlationMatrix/CorrelationMatrixPage.py | 595 |
1 files changed, 595 insertions, 0 deletions
diff --git a/web/webqtl/correlationMatrix/CorrelationMatrixPage.py b/web/webqtl/correlationMatrix/CorrelationMatrixPage.py new file mode 100755 index 00000000..a01111f5 --- /dev/null +++ b/web/webqtl/correlationMatrix/CorrelationMatrixPage.py @@ -0,0 +1,595 @@ +# 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 2011/02/14 + +import os +import string +from htmlgen import HTMLgen2 as HT +import sys +import time +import numarray +import numarray.linear_algebra as la +import piddle as pid +import math + +from base.templatePage import templatePage +from base import webqtlConfig +from base.webqtlTrait import webqtlTrait +from utility import webqtlUtil +from utility import Plot + + + +# XZ, 09/09/2008: After adding several traits to collection, click "Correlation Matrix" button, +# XZ, 09/09/2008: This class will generate what you see. +######################################### +# Correlation Matrix Page +######################################### + +class CorrelationMatrixPage(templatePage): + + def __init__(self,fd,InputData=None): + + templatePage.__init__(self, fd) + + self.dict['title'] = 'Correlation Matrix' + + if not self.openMysql(): + return + + if not fd.genotype: + fd.readGenotype() + fd.strainlist = fd.f1list + fd.strainlist + + #self.searchResult = fd.formdata.getvalue('searchResult') + self.oldSearchResult = fd.formdata.getvalue('oldSearchResult') + + if self.oldSearchResult: + try: + self.searchResult = fd.formdata.getvalue('oldSearchResult') + except: + self.searchResult = fd.formdata.getvalue('searchResult') + + else: + self.searchResult = fd.formdata.getvalue('searchResult') + + if not self.searchResult: + heading = 'Correlation Matrix' + 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 = [self.searchResult] + + if self.searchResult: + #testvals,names,dbInfos = self.getAllSearchResult(fd,self.searchResult) + if len(self.searchResult) > webqtlConfig.MAXCORR: + heading = 'Correlation Matrix' + detail = ['In order to display Correlation Matrix properly, Do not select more than %d traits for Correlation Matrix.' % webqtlConfig.MAXCORR] + self.error(heading=heading,detail=detail) + return + + #XZ, 7/22/2009: this block is not necessary + #elif len(self.searchResult) > 40: + # noPCA = 1 + #else: + # noPCA = 0 + + 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 = 'Correlation Matrix' + detail = [HT.Font('Error : ',color='red'),HT.Font('Error occurs while retrieving data FROM database.',color='black')] + self.error(heading=heading,detail=detail) + return + + NNN = len(traitList) + + if NNN == 0: + heading = "Correlation Matrix" + detail = ['No trait was selected for %s data set. No matrix generated.' % self.data.RISet] + self.error(heading=heading,detail=detail) + return + elif NNN < 2: + heading = 'Correlation Matrix' + detail = ['You need to select at least two traits in order to generate correlation matrix.'] + self.error(heading=heading,detail=detail) + return + else: + + + + corArray = [([0] * (NNN+1))[:] for i in range(NNN+1)] + pearsonArray = [([0] * (NNN))[:] for i in range(NNN)] + spearmanArray = [([0] * (NNN))[:] for i in range(NNN)] + corArray[0][0] = 'Correlation' + TD_LR = HT.TD(colspan=2,width="100%",bgColor='#eeeeee') + 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':'_', + 'CellID':'_','ProbeSetID2':'_','database2':'_','CellID2':'_', + 'newNames':fd.formdata.getvalue("newNames", "_"), + 'RISet':fd.RISet,'ShowStrains':'ON','ShowLine':'ON', 'rankOrder':'_', + "allstrainlist":string.join(fd.strainlist, " "), 'traitList':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')) + + for item in self.searchResult: + form.append(HT.Input(name='oldSearchResult', value=str(item), type='hidden')) + + traiturls = [] + traiturls2 = [] + shortNames = [] + verboseNames = [] + verboseNames2 = [] + verboseNames3 = [] + abbreviation = '' + + #dbInfo.ProbeSetID = ProbeSetID + #dbInfo.CellID = CellID + for i, thisTrait in enumerate(traitList): + _url = "javascript:showDatabase2('%s','%s','%s');" % (thisTrait.db.name, thisTrait.name, thisTrait.cellid) + #_text = 'Trait%d: ' % (i+1)+str(thisTrait) + _text = 'Trait %d: ' % (i+1)+thisTrait.displayName() + + if thisTrait.db.type == 'Geno': + _shortName = 'Genotype' + abbreviation = 'Genotype' + _verboseName = 'Locus %s' % (thisTrait.name) + _verboseName2 = 'Chr %s @ %s Mb' % (thisTrait.chr, '%2.3f' % thisTrait.mb) + _verboseName3 = '' + elif thisTrait.db.type == 'Publish': + if thisTrait.post_publication_abbreviation: + AbbreviationString = thisTrait.post_publication_abbreviation + else: + AbbreviationString = '' + if thisTrait.confidential: + if not webqtlUtil.hasAccessToConfidentialPhenotypeTrait(privilege=self.privilege, userName=self.userName, authorized_users=thisTrait.authorized_users): + if thisTrait.pre_publication_abbreviation: + AbbreviationString = thisTrait.pre_publication_abbreviation + else: + AbbreviationString = '' + _shortName = 'Phenotype: %s' % (AbbreviationString) + _verboseName2 = '' + _verboseName3 = '' + if thisTrait.pubmed_id: + _verboseName = 'PubMed %d: ' % thisTrait.pubmed_id + else: + _verboseName = 'Unpublished ' + _verboseName += 'RecordID/%s' % (thisTrait.name) + PhenotypeString = thisTrait.post_publication_description + if thisTrait.confidential: + if not webqtlUtil.hasAccessToConfidentialPhenotypeTrait(privilege=self.privilege, userName=self.userName, authorized_users=thisTrait.authorized_users): + PhenotypeString = thisTrait.pre_publication_description + _verboseName2 = 'Phenotype: %s' % (PhenotypeString) + if thisTrait.authors: + a1 = string.split(thisTrait.authors,',')[0] + while a1[0] == '"' or a1[0] == "'" : + a1 = a1[1:] + _verboseName += ' by ' + _verboseName += HT.Italic('%s, and colleagues' % (a1)) + elif thisTrait.db.type == 'Temp': + abbreviation = '' + _shortName = thisTrait.name + if thisTrait.description: + _verboseName = thisTrait.description + else: + _verboseName = 'Temp' + _verboseName2 = '' + _verboseName3 = '' + else: + abbreviation = thisTrait.symbol + _shortName = 'Symbol: %s ' % thisTrait.symbol + _verboseName = thisTrait.symbol + _verboseName2 = '' + _verboseName3 = '' + if thisTrait.chr and thisTrait.mb: + _verboseName += ' on Chr %s @ %s Mb' % (thisTrait.chr,thisTrait.mb) + if thisTrait.description: + _verboseName2 = '%s' % (thisTrait.description) + if thisTrait.probe_target_description: + _verboseName3 = '%s' % (thisTrait.probe_target_description) + + cururl = HT.Href(text=_text, url=_url,Class='fs12') + cururl2 = HT.Href(text='Trait%d' % (i+1),url=_url,Class='fs12') + traiturls.append(cururl) + traiturls2.append(cururl2) + shortName = HT.Div(id="shortName_" + str(i), style="display:none") + shortName.append(_shortName) + shortNames.append(shortName) + verboseName = HT.Div(id="verboseName_" + str(i), style="display:none") + 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) + + + + corArray[i+1][0] = 'Trait%d: ' % (i+1)+str(thisTrait) + '/' + str(thisTrait) + ': ' + abbreviation + '/' + str(thisTrait) + ': ' + str(_verboseName) + ' : ' + str(_verboseName2) + ' : ' + str(_verboseName3) + corArray[0][i+1] = 'Trait%d: ' % (i+1)+str(thisTrait) + + corMatrixHeading = HT.Paragraph('Correlation Matrix', Class="title") + + tbl = 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= NNN+1,align="center") + ) + row2 = HT.TR( + HT.TD("P e a r s o n r", rowspan= NNN+1,Class="fs14 fwb ffl b1 cw cbrb", width=10,align="center"), + HT.TD(Class="b1", width=300)) + for i in range(NNN): + row2.append(HT.TD(traiturls2[i], Class="b1", align="center")) + tbl.append(row1,row2) + + nOverlapTrait =9999 + nnCorr = len(fd.strainlist) + for i, thisTrait in enumerate(traitList): + newrow = HT.TR() + newrow.append(HT.TD(traiturls[i], shortNames[i], verboseNames[i], verboseNames2[i], + verboseNames3[i], Class="b1")) + 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) + + rank = fd.formdata.getvalue("rankOrder", "0") + + if nOverlap < nOverlapTrait: + nOverlapTrait = nOverlap + 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" + + pearsonArray[i][j] = corr + pearsonArray[j][i] = corr + if corr!= 0.0: + corArray[i+1][j+1] = '%2.3f/%d' % (corr,nOverlap) + thisurl = HT.Href(text=HT.Font('%2.3f'% corr,HT.BR(),'%d' % nOverlap ,color=fontcolor, Class="fs11 fwn"),url = "javascript:showCorrelationPlot2(db='%s',ProbeSetID='%s',CellID='%s',db2='%s',ProbeSetID2='%s',CellID2='%s',rank='%s')" % (names1[0], names1[1], names1[2], names2[0], names2[1], names2[2], rank)) + else: + corArray[i+1][j+1] = '---/%d' % nOverlap + thisurl = HT.Font('---',HT.BR(), '%d' % nOverlap) + + newrow.append(HT.TD(thisurl,Class="b1",NOWRAP="ON",align="middle")) + elif j == i: + corr,nOverlap = webqtlUtil.calCorrelation(traitDataList[i],traitDataList[j],nnCorr) + pearsonArray[i][j] = 1.0 + spearmanArray[i][j] = 1.0 + corArray[i+1][j+1] = '%2.3f/%d' % (corr,nOverlap) + nOverlap = webqtlUtil.calCorrelation(traitDataList[i],traitDataList[j],nnCorr)[1] + newrow.append(HT.TD(HT.Href(text=HT.Font(HT.Italic("n"),HT.BR(),str(nOverlap),Class="fs11 fwn b1",align="center", color="000000"), url="javascript:showDatabase2('%s','%s','%s')" % (thisTrait.db.name, thisTrait.name, thisTrait.cellid)), bgColor='#cccccc', align="center", Class="b1", NOWRAP="ON")) + else: + corr,nOverlap = webqtlUtil.calCorrelationRank(traitDataList[i],traitDataList[j],nnCorr) + + rank = fd.formdata.getvalue("rankOrder", "1") + + 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" + spearmanArray[i][j] = corr + spearmanArray[j][i] = corr + if corr!= 0.0: + corArray[i+1][j+1] = '%2.3f/%d' % (corr,nOverlap) + thisurl = HT.Href(text=HT.Font('%2.3f'% corr,HT.BR(),'%d' % nOverlap ,color=fontcolor, Class="fs11 fwn"),url = "javascript:showCorrelationPlot2(db='%s',ProbeSetID='%s',CellID='%s',db2='%s',ProbeSetID2='%s',CellID2='%s',rank='%s')" % (names1[0], names1[1], names1[2], names2[0], names2[1], names2[2], rank)) + else: + corArray[i+1][j+1] = '---/%d' % nOverlap + thisurl = HT.Span('---',HT.BR(), '%d' % nOverlap, Class="fs11 fwn") + newrow.append(HT.TD(thisurl,Class="b1", NOWRAP="ON",align="middle")) + tbl.append(newrow) + + info = HT.Blockquote('Lower left cells list Pearson product-moment correlations; upper right cells list Spearman rank order correlations. Each cell also contains the n of cases. Values higher than 0.7 are displayed in ',HT.Font('red', color='red'),'; those between 0.5 and 0.7 in ',HT.Font('orange', color='#FF6600'),'; Values lower than -0.7 are in ',HT.Font('blue', color='blue'),'; between -0.5 and -0.7 in ',HT.Font('green', color='#009900'),'. Select any cell to generate a scatter plot. Select trait labels for more information.', Class="fs13 fwn") + + exportbutton = HT.Input(type='button', name='export', value='Export', onClick="exportText(allCorrelations);",Class="button") + shortButton = HT.Input(type='button' ,name='dispShort',value=' Short Labels ', onClick="displayShortName();",Class="button") + verboseButton = HT.Input(type='button' ,name='dispVerbose',value=' Long Labels ', onClick="displayVerboseName();", Class="button") + form.append(HT.Blockquote(tbl,HT.P(),shortButton,verboseButton,exportbutton)) + TD_LR.append(corMatrixHeading,info,form,HT.P()) + + #if noPCA: + # TD_LR.append(HT.Blockquote('No PCA is computed if more than 32 traits are selected.')) + + #print corArray + exportScript = """ + <SCRIPT language=JavaScript> + var allCorrelations = %s; + </SCRIPT> + + """ + exportScript = exportScript % str(corArray) + self.dict['js1'] = exportScript+'<SCRIPT SRC="/javascript/correlationMatrix.js"></SCRIPT><BR>' + self.dict['body'] = str(TD_LR) + + #don't calculate PCA while number exceed 32 + #if noPCA: + # return + + #XZ, 7/22/2009: deal with PCA stuff + #Only for Array Data + + if NNN > 2: + + traitname = map(lambda X:str(X.name), traitList) + + #generate eigenvalues + + # import sys + sys.argv=[" "] + # import numarray + # import numarray.linear_algebra as la + #spearmanEigen = eigenvectors(array(spearmanArray)) + pearsonEigen = la.eigenvectors(numarray.array(pearsonArray)) + #spearmanEigenValue,spearmanEigenVectors = self.sortEigenVectors(spearmanEigen) + pearsonEigenValue,pearsonEigenVectors = self.sortEigenVectors(pearsonEigen) + + + """ + for i in range(len(pearsonEigenValue)): + if type(pearsonEigenValue[i]).__name__ == 'complex': + pearsonEigenValue[i] = pearsonEigenValue[i].real + for i in range(len(pearsonEigenVectors)): + for j in range(len(pearsonEigenVectors[i])): + if type(pearsonEigenVectors[i][j]).__name__ == 'complex': + pearsonEigenVectors[i][j] = pearsonEigenVectors[i][j].real + if type(pearsonEigenVectors[i][j]).__name__ == 'complex': + pearsonEigenVectors[i][j] = pearsonEigenVectors[i][j].real + """ + + if type(pearsonEigenValue[0]).__name__ == 'complex': + pass + else: + traitHeading = HT.Paragraph('PCA Traits',align='left', Class="title") + + tbl2 = self.calcPCATraits(traitDataList=traitDataList, nnCorr=nnCorr, NNN=NNN, pearsonEigenValue=pearsonEigenValue, + pearsonEigenVectors=pearsonEigenVectors, form=form, fd=fd) + #Buttons on search page + #mintmap = HT.Input(type='button' ,name='mintmap',value='Multiple Mapping', onClick="databaseFunc(this.form,'showIntMap');",Class="button") + addselect = HT.Input(type='button' ,name='addselect',value='Add to Collection', onClick="addRmvSelection('%s', this.form, 'addToSelection');" % fd.RISet,Class="button") + selectall = HT.Input(type='button' ,name='selectall',value='Select All', onClick="checkAll(this.form);",Class="button") + reset = HT.Input(type='reset',name='',value='Select None',Class="button") + updateNames = HT.Input(type='button', name='updateNames',value='Update Trait Names', onClick="editPCAName(this.form);", Class="button") + chrMenu = HT.Input(type='hidden',name='chromosomes',value='all') + + """ + #need to be refined + if fd.genotype.Mbmap: + scaleMenu = HT.Select(name='scale') + scaleMenu.append(tuple(["Genetic Map",'morgan'])) + scaleMenu.append(tuple(["Physical Map",'physic'])) + else: + scaleMenu = "" + """ + + tbl2.append(HT.TR(HT.TD(HT.P(),chrMenu,updateNames,selectall,reset,addselect,colspan=3))) + form.append(HT.P(),traitHeading,HT.Blockquote(tbl2)) + + plotHeading1 = HT.Paragraph('Scree Plot', Class="title") + TD_LR.append(plotHeading1) + img1 = self.screePlot(NNN=NNN, pearsonEigenValue=pearsonEigenValue) + + TD_LR.append(HT.Blockquote(img1)) + + plotHeading2 = HT.Paragraph('Factor Loadings Plot', Class="title") + TD_LR.append(plotHeading2) + img2 = self.factorLoadingsPlot(pearsonEigenVectors=pearsonEigenVectors, traitList=traitList) + + TD_LR.append(HT.Blockquote(img2)) + + self.dict['body'] = str(TD_LR) + + def screePlot(self, NNN=0, pearsonEigenValue=None): + + c1 = pid.PILCanvas(size=(700,500)) + Plot.plotXY(canvas=c1, dataX=range(1,NNN+1), dataY=pearsonEigenValue, rank=0, labelColor=pid.blue,plotColor=pid.red, symbolColor=pid.blue, XLabel='Factor Number', connectdot=1,YLabel='Percent of Total Variance %', title='Pearson\'s R Scree Plot') + filename= webqtlUtil.genRandStr("Scree_") + c1.save(webqtlConfig.IMGDIR+filename, format='gif') + img=HT.Image('/image/'+filename+'.gif',border=0) + + return img + + def factorLoadingsPlot(self, pearsonEigenVectors=None, traitList=None): + + traitname = map(lambda X:str(X.name), traitList) + c2 = pid.PILCanvas(size=(700,500)) + Plot.plotXY(c2, pearsonEigenVectors[0],pearsonEigenVectors[1], 0, dataLabel = traitname, labelColor=pid.blue, plotColor=pid.red, symbolColor=pid.blue,XLabel='Factor (1)', connectdot=1, YLabel='Factor (2)', title='Factor Loadings Plot (Pearson)', loadingPlot=1) + filename= webqtlUtil.genRandStr("FacL_") + c2.save(webqtlConfig.IMGDIR+filename, format='gif') + img = HT.Image('/image/'+filename+'.gif',border=0) + + return img + + def calcPCATraits(self, traitDataList=None, nnCorr=0, NNN=0, pearsonEigenValue=None, pearsonEigenVectors=None, form=None, fd=None): + """ + This function currently returns the html to be displayed instead of the traits themselves. Need to fix later. + """ + + detailInfo = string.split(self.searchResult[0],':') + + self.sameProbeSet = 'yes' + for item in self.searchResult[1:]: + detailInfo2 = string.split(item,':') + if detailInfo[0] != detailInfo2[0] or detailInfo[1] != detailInfo2[1]: + self.sameProbeSet = None + break + + for item in traitDataList: + if len(item) != nnCorr: + return + infoStrains = [] + infoStrainsPos = [] + dataArray = [[] for i in range(NNN)] + + for i in range(len(traitDataList[0])): + currentStrain = 1 + for j in range(NNN): + if not traitDataList[j][i]: + currentStrain = 0 + break + if currentStrain == 1: + infoStrains.append(fd.strainlist[i]) + infoStrainsPos.append(i) + for j in range(NNN): + dataArray[j].append(traitDataList[j][i]) + + + self.cursor.execute('delete Temp, TempData FROM Temp, TempData WHERE Temp.DataId = TempData.Id and UNIX_TIMESTAMP()-UNIX_TIMESTAMP(CreateTime)>%d;' % webqtlConfig.MAXLIFE) + + StrainIds = [] + for item in infoStrains: + self.cursor.execute('SELECT Strain.Id FROM Strain,StrainXRef, InbredSet WHERE Strain.Name="%s" and Strain.Id = StrainXRef.StrainId and StrainXRef.InbredSetId = InbredSet.Id and InbredSet.Name = "%s"' % (item, fd.RISet)) + StrainIds.append('%d' % self.cursor.fetchone()[0]) + + """ + #minimal 12 overlapping strains + if len(dataArray[0]) < 12: + form.append(HT.P(),traitHeading,HT.Blockquote(HT.Paragraph('The number of overlapping strains is less than 12, no PCA scores computed.',align='left'))) + self.dict['body'] = str(TD_LR) + return + """ + dataArray = self.zScore(dataArray) + dataArray = numarray.array(dataArray) + dataArray2 = numarray.dot(pearsonEigenVectors,dataArray) + + tbl2 = HT.TableLite(cellSpacing=2,cellPadding=0,border=0, width="100%") + + ct0 = time.localtime(time.time()) + ct = time.strftime("%B/%d %H:%M:%S",ct0) + if self.sameProbeSet: + newDescription = 'PCA Traits generated at %s from %s' % (ct,detailInfo[1]) + else: + newDescription = 'PCA Traits generated at %s from traits selected' % ct + + + j = 1 + self.cursor.execute('SELECT Id FROM InbredSet WHERE Name = "%s"' % fd.RISet) + InbredSetId = self.cursor.fetchall()[0][0] + user_ip = fd.remote_ip + if fd.formdata.getvalue("newNames"): + newNames = fd.formdata.getvalue("newNames").split(",") + else: + newNames = 0 + + for item in dataArray2: + if pearsonEigenValue[j-1] < 100.0/NNN: + break + + if (newNames == 0): + description = '%s : PC%02d' % (newDescription, j) + else: + description = '%s : %s' % (newDescription, newNames[j-1]) + + self.cursor.execute('SELECT max(id) FROM TempData') + try: + DataId = self.cursor.fetchall()[0][0] + 1 + except: + DataId = 1 + newProbeSetID = webqtlUtil.genRandStr("PCA_Tmp_") + self.cursor.execute('insert into Temp(Name,description, createtime,DataId,InbredSetId,IP) values(%s,%s,Now(),%s,%s,%s)' ,(newProbeSetID, description, DataId,InbredSetId,user_ip)) + + k = 0 + for StrainId in StrainIds: + self.cursor.execute('insert into TempData(Id, StrainId, value) values(%s,%s,%s)' % (DataId, StrainId, item[k]*(-1.0))) + k += 1 + setDescription = HT.Div(id="pcaTrait%s" % j) + descriptionLink = HT.Href(text=description, url="javascript:showDatabase2('Temp','%s','')" % newProbeSetID, Class="fwn") + descriptionEdit = HT.Input(type='text', value='', name='editName%s' % j) + + #onBlur='editPDAName(this.form, %s);' % j + + setDescription.append(descriptionLink) + setDescription.append(descriptionEdit) + + traitName = "%s:%s" % ('Temp',newProbeSetID) + tbl2.append(HT.TR(HT.TD("%d."%j,align="right",valign="top"),HT.TD(HT.Input(type="checkbox", Class="checkbox", name="searchResult",value=traitName),valign="top",width=50),HT.TD(setDescription))) + j += 1 + + return tbl2 + + def zScore(self,dataArray): + NN = len(dataArray[0]) + if NN < 10: + return dataArray + else: + i = 0 + for data in dataArray: + N = len(data) + S = reduce(lambda x,y: x+y, data, 0.) + SS = reduce(lambda x,y: x+y*y, data, 0.) + mean = S/N + var = SS - S*S/N + stdev = math.sqrt(var/(N-1)) + data2 = map(lambda x:(x-mean)/stdev,data) + dataArray[i] = data2 + i += 1 + return dataArray + + def sortEigenVectors(self,vector): + try: + eigenValues = vector[0].tolist() + eigenVectors = vector[1].tolist() + combines = [] + i = 0 + for item in eigenValues: + combines.append([eigenValues[i],eigenVectors[i]]) + i += 1 + combines.sort(webqtlUtil.cmpEigenValue) + A = [] + B = [] + for item in combines: + A.append(item[0]) + B.append(item[1]) + sum = reduce(lambda x,y: x+y, A, 0.0) + A = map(lambda x:x*100.0/sum, A) + return [A,B] + except: + return [] + |