about summary refs log tree commit diff
path: root/web/webqtl/showTrait/ShowProbeInfoPage.py
diff options
context:
space:
mode:
Diffstat (limited to 'web/webqtl/showTrait/ShowProbeInfoPage.py')
-rwxr-xr-xweb/webqtl/showTrait/ShowProbeInfoPage.py486
1 files changed, 486 insertions, 0 deletions
diff --git a/web/webqtl/showTrait/ShowProbeInfoPage.py b/web/webqtl/showTrait/ShowProbeInfoPage.py
new file mode 100755
index 00000000..989238b4
--- /dev/null
+++ b/web/webqtl/showTrait/ShowProbeInfoPage.py
@@ -0,0 +1,486 @@
+# Copyright (C) University of Tennessee Health Science Center, Memphis, TN.
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License
+# as published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Affero General Public License for more details.
+#
+# This program is available from Source Forge: at GeneNetwork Project
+# (sourceforge.net/projects/genenetwork/).
+#
+# Contact Drs. Robert W. Williams and Xiaodong Zhou (2010)
+# at rwilliams@uthsc.edu and xzhou15@uthsc.edu
+#
+#
+#
+# This module is used by GeneNetwork project (www.genenetwork.org)
+#
+# Created by GeneNetwork Core Team 2010/08/10
+#
+# Last updated by GeneNetwork Core Team 2010/10/20
+
+import string
+import sys,os
+
+import cPickle
+
+import reaper
+from htmlgen import HTMLgen2 as HT
+
+from base import webqtlConfig
+from utility import webqtlUtil
+from dbFunction import webqtlDatabaseFunction
+from base.templatePage import templatePage
+from base.webqtlDataset import webqtlDataset
+from base.webqtlTrait import webqtlTrait
+from utility.THCell import THCell
+from utility.TDCell import TDCell
+
+#########################################
+#      Probe Infomation Page
+#########################################
+
+class ShowProbeInfoPage(templatePage):
+
+	def __init__(self, fd):
+
+		templatePage.__init__(self, fd)
+
+		if not self.openMysql():
+			return
+		
+		fd.readGenotype()
+		TD_LR = HT.TD(height=200,width="100%",bgColor='#eeeeee')
+		self.database = fd.formdata.getfirst('database')
+		self.ProbeSetID = fd.formdata.getfirst('ProbeSetID')
+		self.CellID = fd.formdata.getfirst('CellID')
+		
+		self.db = webqtlDataset(self.database, self.cursor)
+		thisTrait = webqtlTrait(db= self.db, cursor=self.cursor, name=self.ProbeSetID) #, cellid=CellID)
+		thisTrait.retrieveInfo()
+		
+		try:
+			self.cursor.execute('SELECT ProbeFreeze.Name FROM ProbeFreeze,ProbeSetFreeze WHERE ProbeFreeze.Id = ProbeSetFreeze.ProbeFreezeId and ProbeSetFreeze.Name = "%s"' % self.db.name)
+			self.probeDatabase = self.cursor.fetchall()[0][0]
+			self.probeInfoDatabase = 'Probe'
+		except:
+			heading = 'Probe Information'
+			intro = ['Trying to retrieve the probe information for ProbeSet ',HT.Span('%s' % self.ProbeSetID, Class="fwb cdg"),' in Database ',HT.Href(text='%s' % self.db.fullname,url=webqtlConfig.infopagehref % self.database)]
+			detail = ['The information you just requested is not available at this time.']
+			self.error(heading=heading,intro=intro,detail=detail)
+			return
+
+
+		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':'_','RISet':fd.RISet, 'incparentsf1':'on'}
+		if fd.RISet == 'BXD':
+			hddn['parentsf1']='ON'
+			
+		for key in hddn.keys():
+			form.append(HT.Input(name=key, value=hddn[key], type='hidden'))
+
+
+		#Buttons on search page
+		linkinfo ="%s/probeInfo.html" % webqtlConfig.PORTADDR
+		mintmap = "" 
+		probeinfo = HT.Input(type='button' ,name='mintmap',value='Info', onClick="openNewWin('%s');" % linkinfo, Class="button")
+		cormatrix = HT.Href(url="#redirect", onClick="databaseFunc(document.getElementsByName('showDatabase')[0], 'corMatrix');")
+		cormatrix_img = HT.Image("/images/correlation_matrix1_final.jpg", alt="Correlation Matrix and PCA", title="Correlation Matrix and PCA", style="border:none;")
+		cormatrix.append(cormatrix_img)
+		heatmap = HT.Href(url="#redirect", onClick="databaseFunc(document.getElementsByName('showDatabase')[0], 'heatmap');")
+		heatmap_img = HT.Image("/images/heatmap2_final.jpg", name='mintmap', alt="QTL Heat Map and Clustering", title="QTL Heatmap and Clustering", style="border:none;")
+		heatmap.append(heatmap_img)
+		if self.ProbeSetID[-2:] in ('_A', '_B'):
+			thisProbeSetID = self.ProbeSetID[:-2]
+		else:
+			thisProbeSetID = self.ProbeSetID
+		thisurl = 'http://www.ensembl.org/Mus_musculus/featureview?type=AffyProbe&id=%s' % thisProbeSetID
+		verifyButton = HT.Input(type="button",value="Verify Ensembl",onClick= "openNewWin('%s')" % thisurl, 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")
+		selectpm = HT.Input(type='button' ,name='selectall',value='Select PM', onClick="checkPM(this.form);",Class="button")
+		selectmm = HT.Input(type='button' ,name='selectall',value='Select MM', onClick="checkMM(this.form);",Class="button")
+		selectinvert = HT.Input(type='button' ,name='selectinvert',value='Select Invert', onClick="checkInvert(this.form);",Class="button")
+		reset = HT.Input(type='reset',name='',value='Select None',Class="button")
+		chrMenu = HT.Input(type='hidden',name='chromosomes',value='all')
+		probedata = HT.Input(type='hidden',name='probedata',value='all')
+		
+		url_rudi_track = self.getProbeTrackURL(self.probeDatabase, self.ProbeSetID)
+		if url_rudi_track:		
+		   rudi_track = HT.Input(type='button', name='ruditrack', value='Probe Track', onClick="openNewWin('%s')"%url_rudi_track, Class="button")
+		else: rudi_track = None
+		
+		pinfopage = "/probeInfo.html"
+		
+		#updated by NL: 07-22-2011  get chosenStrains
+		_f1, _f12, _mat, _pat = webqtlUtil.ParInfo[fd.RISet]
+		chosenStrains="%s,%s"%(_mat,_pat)
+		tblobj = {}
+		tblobj['header']=[]
+
+		tblobj['header'].append([
+			THCell(HT.TD("", Class="cbrb cw fwb fs13 b1", rowspan=2,nowrap='ON'), sort=0),
+			THCell(HT.TD(HT.Href(target="_PROBEINFO", url=pinfopage+"#probe", text=HT.Span('Probe', Class="cw fwb fs13")), HT.Sup(HT.Italic('1')), Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,nowrap='ON'), text="probe", idx=1), 
+			THCell(HT.TD(HT.Href(text=HT.Span('Sequence', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#Sequence"),HT.Sup(HT.Italic('2')), Class="cbrb cw fwb fs13 b1", align='center',rowspan=2,nowrap='ON'), text="seq", idx=2), 
+			THCell(HT.TD(HT.Href(text=HT.Span('bl2seq', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#bl2seq"),HT.Sup(HT.Italic('3')), Class="cbrb cw fwb fs13 b1", align='center',rowspan=2,nowrap='ON'), sort=0), 
+			THCell(HT.TD(HT.Href(text=HT.Span('Exons', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#Exon"),HT.Sup(HT.Italic('4')), Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,nowrap='ON'), sort=0),
+			THCell(HT.TD(HT.Href(text=HT.Span('Tm °C', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#Tm"),HT.Sup(HT.Italic('5')), Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,nowrap='ON'), text="tm", idx=5),
+			THCell(HT.TD(HT.Href(text=HT.Span('Stacking Energy K', HT.Sub('B'),'T', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#KBT"),HT.Sup(HT.Italic('6')), Class="cbrb cw fwb fs13 b1",align='center',colspan=2,NOWRAP="yes",nowrap='ON'), sort=0),
+			THCell(HT.TD(HT.Href(text=HT.Span('Mean', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#Mean"),HT.Sup(HT.Italic('7')), Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,nowrap='ON'), text="mean", idx=8),
+			THCell(HT.TD(HT.Href(text=HT.Span('Stdev', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#Stdev"),HT.Sup(HT.Italic('8')), Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,nowrap='ON'), text="std", idx=9),
+			THCell(HT.TD(HT.Href(text=HT.Span('Probe h2', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#h2"),HT.Sup(HT.Italic('9')), Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,NOWRAP="yes"), text="h2", idx=10),
+			THCell(HT.TD(HT.Href(text=HT.Span('Probe Location', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#location"), HT.Sup(HT.Italic('10')),Class="cbrb cw fwb fs13 b1",align='center',colspan=3)),
+			THCell(HT.TD(HT.Href(text=HT.Span('SNPs', HT.BR(), '(Across all strains)', Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#snps"), HT.Sup(HT.Italic('11')),Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,NOWRAP="yes")),
+			THCell(HT.TD(HT.Href(text=HT.Span('SNPs', HT.BR(),'(Different alleles only between %s and %s)'%(_mat,_pat), Class="cw fwb fs13"), target="_PROBEINFO", url=pinfopage+"#snps"), HT.Sup(HT.Italic('11')),Class="cbrb cw fwb fs13 b1",align='center',rowspan=2,NOWRAP="yes"))
+
+		])
+		
+		tblobj['header'].append([
+			THCell(HT.TD(HT.Span('GSB', Class="cw fwb fs13"),align='center', Class="cbrb ffl fwb fs13 b1",), text="gsb", idx=6),
+			THCell(HT.TD(HT.Span('NSB', Class="cw fwb fs13"),align='center', Class="cbrb ffl fwb fs13 b1",), text="nsb", idx=7),
+			THCell(HT.TD(HT.Span('Chr', Class="cw fwb fs13"), align='center', Class="cbrb ffl2 fwb fs13 b1",)),
+			THCell(HT.TD(HT.Span('Start', Class="cw fwb fs13"),align='center', Class="cbrb ffl fwb fs13 b1",)),
+			THCell(HT.TD(HT.Span('End', Class="cw fwb fs13"),align='center', Class="cbrb ffl fwb fs13 b1",)),
+		])
+		
+		tblobj['body'] = []
+		
+		blatbutton = ''
+
+		fetchField = ['Probe.Name','Probe.Sequence','Probe.ExonNo','Probe.Tm', 'Probe.E_GSB','Probe.E_NSB', 'ProbeH2.h2', 'ProbeH2.weight']
+
+		query = "SELECT %s FROM (Probe, ProbeSet, ProbeFreeze) left join ProbeH2  on ProbeH2.ProbeId = Probe.Id and ProbeH2.ProbeFreezeId = ProbeFreeze.Id WHERE ProbeSet.Name = '%s' and Probe.ProbeSetId = ProbeSet.Id and ProbeFreeze.Name = '%s' order by Probe.SerialOrder" % (string.join(fetchField,','), self.ProbeSetID, self.probeDatabase)
+		self.cursor.execute(query)
+		results = self.cursor.fetchall()
+		
+		blatsequence = ""
+		
+		# add by NL: get strains' name in SnpPattern database table
+		strainsInSnpPatternDBtable=self.getStrainNameIndexPair()  # after snpBrowserPage.py change to MVC, this function can be removed in this class and called from other class; 
+		allStrainNameList=[v[0] for v in strainsInSnpPatternDBtable]
+			
+		speciesid = webqtlDatabaseFunction.retrieveSpeciesId(cursor=self.cursor,RISet=fd.RISet)
+		for result in results:
+			"""
+			ProbeId, CellID,Sequence,ExonNo,Tm, E_GSB,E_NSB = map(self.nullRecord,result)
+			h2 = ''
+			query = "SELECT h2 FROM ProbeH2 WHERE ProbeFreezeId = '%s' and ProbeId=%s" % (self.probeDatabase, ProbeId)
+			self.cursor.execute(query)
+			results = self.cursor.fetchall()
+			"""
+
+			CellID,Sequence,ExonNo,Tm, E_GSB,E_NSB,h2, weight = map(self.nullRecord,result)
+			
+	
+			Average = ''
+			STDEV = ''
+			mean = -10000.0
+			stdev = -10000.0
+			try:
+				thisTrait.cellid = CellID
+				thisTrait.retrieveData()
+		
+				mean, median, var, stdev, sem, N = reaper.anova(thisTrait.exportInformative()[1])
+			
+				if mean:
+					Average = '%2.2f' % mean
+				if stdev:
+					STDEV = '%2.2f' % stdev
+			except:
+				pass
+
+			if CellID == self.CellID:
+				bkColor = "cbrdull fs11 b1"
+			else:
+				bkColor = "fs11 b1"
+			seqcolor= ''
+			
+			if thisTrait.blatseq:
+				blatsequence = thisTrait.blatseq
+				if int(CellID[-1]) % 2 == 1:
+					seqcolor= 'cdg'
+			else:
+				if int(CellID[-1]) % 2 == 1:
+					seqcolor= 'cdg'
+					blatsequence += string.strip(Sequence)
+						
+			if thisTrait.genbankid  and (int(CellID[-1]) % 2 == 1):
+				probeurl = 'http://www.ncbi.nlm.nih.gov/blast/bl2seq/wblast2.cgi?one=%s&sseq=%s'  % (thisTrait.genbankid, Sequence)
+				probefy1 = HT.Input(type="button",value="Blast",onClick= "openNewWin('%s')" % probeurl, Class="buttonsmaller")
+			else:  
+				probefy1 = ''
+			
+			traitName = str(thisTrait)
+
+			#XZ, Aug 08, 2011: Note that probesets on some affy chips are not name as "xxx_at" (i.e., Affy Mouse Gene 1.0 ST (GPL6246)). 
+			#EnsemblProbeSetID = self.ProbeSetID[0:self.ProbeSetID.index('_at')+3]
+			EnsemblProbeSetID = self.ProbeSetID
+			if '_at' in self.ProbeSetID:
+				EnsemblProbeSetID = self.ProbeSetID[0:self.ProbeSetID.index('_at')+3]
+
+			self.cursor.execute('''
+					SELECT EnsemblProbeLocation.* 
+					FROM EnsemblProbeLocation, EnsemblProbe, EnsemblChip, GeneChipEnsemblXRef, ProbeFreeze
+					WHERE EnsemblProbeLocation.ProbeId=EnsemblProbe.Id and EnsemblProbe.ChipId=GeneChipEnsemblXRef.EnsemblChipId and
+						GeneChipEnsemblXRef.GeneChipId=ProbeFreeze.ChipId and EnsemblProbe.Name=%s and EnsemblProbe.ProbeSet=%s and 
+						ProbeFreeze.Name=%s group by Chr, Start, End'''
+					,(CellID, EnsemblProbeSetID, self.probeDatabase))
+			LocationFields = self.cursor.fetchall()
+
+			Chr=''
+			Start=''
+			End=''
+			if (len(LocationFields)>=1):
+				Chr,Start,End,Strand,MisMatch,ProbeId = map(self.nullRecord,LocationFields[0])
+				Start /= 1000000.0
+				End /= 1000000.0
+			if (len(LocationFields)>1):
+				self.cursor.execute('''
+						SELECT ProbeSet.Chr, ProbeSet.Mb FROM ProbeSet, ProbeFreeze 
+						WHERE ProbeSet.ChipId=ProbeFreeze.ChipId and ProbeSet.Name=%s and ProbeFreeze.Name=%s'''
+						,(self.ProbeSetID, self.probeDatabase))
+				ProbeSetChr, ProbeSetMb = map(self.nullRecord,self.cursor.fetchall()[0])
+					
+				self.cursor.execute('''
+						SELECT EnsemblProbeLocation.*, ABS(EnsemblProbeLocation.Start/1000000-%s) as Mb 
+						FROM EnsemblProbeLocation, EnsemblProbe, EnsemblChip, GeneChipEnsemblXRef, ProbeFreeze
+						WHERE EnsemblProbeLocation.ProbeId=EnsemblProbe.Id and EnsemblProbe.ChipId=GeneChipEnsemblXRef.EnsemblChipId and
+							GeneChipEnsemblXRef.GeneChipId=ProbeFreeze.ChipId and EnsemblProbe.Name=%s and EnsemblProbe.ProbeSet=%s and
+							EnsemblProbeLocation.Chr=%s and ProbeFreeze.Name=%s order by Mb limit 1'''
+						,(ProbeSetMb, CellID, EnsemblProbeSetID, ProbeSetChr, self.probeDatabase))
+				NewLocationFields = self.cursor.fetchall()
+				if (len(NewLocationFields)>0):
+					Chr,Start,End,Strand,MisMatch,ProbeId,Mb = map(self.nullRecord,NewLocationFields[0])
+					Start /= 1000000.0
+					End /= 1000000.0
+					
+			snp_collection = []	
+			snpDiff_collection=[]
+			
+			startIndex=3
+			if Chr != '' and Start != '' and End != '' and speciesid != None:
+									
+				self.cursor.execute('''
+						   SELECT a.SnpName, a.Id, b.* FROM SnpAll a, SnpPattern b
+						   WHERE a.Chromosome=%s and a.Position>=%s and a.Position<=%s 
+						   and a.SpeciesId=%s and a.Id=b.SnpId'''
+							,(Chr, Start, End, speciesid)) #chr,Start, End, 1))							
+				snpresults = self.cursor.fetchall()
+				
+				index1=allStrainNameList.index(_mat) #_mat index in results
+				index2=allStrainNameList.index(_pat) #_pat index in results
+			
+				for v in snpresults:
+					#updated by NL: 07-22-2011  check 'limit to' to get snpBrowser snpresults
+					snp_collection.append(HT.Href(text=v[0], url=os.path.join(webqtlConfig.CGIDIR, 
+							"main.py?FormID=SnpBrowserResultPage&submitStatus=1&customStrain=1")+ "&geneName=%s" % v[0], Class="fs12 fwn", target="_blank"))
+					snp_collection.append(HT.BR())
+					#updated by NL: 07-27-2011  link snp info for different allele only	
+					strain1_allele=v[startIndex+index1]
+					strain2_allele=v[startIndex+index2]
+					
+					if strain1_allele!=strain2_allele:
+						snpDiff_collection.append(HT.Href(text=v[0], url=os.path.join(webqtlConfig.CGIDIR, 
+								"main.py?FormID=SnpBrowserResultPage&submitStatus=1&customStrain=1&diffAlleles=1&chosenStrains=%s"%chosenStrains)+ "&geneName=%s" % v[0], Class="fs12 fwn", target="_blank"))
+						snpDiff_collection.append(HT.BR())
+							
+
+			tr = []	
+			tr.append(TDCell(HT.TD(HT.Input(type="checkbox", Class='checkbox', name="searchResult",value=traitName, onClick="highlight(this)"), align="right", Class=bkColor, nowrap="on"), text=traitName))
+			
+			tr.append(TDCell(HT.TD(HT.Href(text=CellID, url = "javascript:showDatabase2('%s','%s','%s');" % (self.database,self.ProbeSetID,CellID),Class="fs12 fwn"),Class=bkColor), traitName, traitName.upper()))
+			
+			tr.append(TDCell(HT.TD(Sequence, Class=bkColor + " %s ffmono fs14" % seqcolor),Sequence,Sequence.upper()))
+			tr.append(TDCell(HT.TD(probefy1,align='center',Class=bkColor))) 
+			tr.append(TDCell(HT.TD(ExonNo,align='center',Class=bkColor)))
+			
+			try:
+				TmValue = float(Tm)
+			except:
+				TmValue = 0.0
+			tr.append(TDCell(HT.TD(Tm,align='center',Class=bkColor), Tm, TmValue))
+			
+			try:
+				E_GSBValue = float(E_GSB)
+			except:
+				E_GSBValue = -10000.0
+			tr.append(TDCell(HT.TD(E_GSB,align='center',Class=bkColor), E_GSB, E_GSBValue))
+
+			try:
+				E_NSBValue = float(E_NSB)
+			except:
+				E_NSBValue = -10000.0
+			tr.append(TDCell(HT.TD(E_NSB,align='center',Class=bkColor), E_NSB, E_NSBValue))
+			
+			tr.append(TDCell(HT.TD(Average,align='center',Class=bkColor), Average, mean))
+			tr.append(TDCell(HT.TD(STDEV,align='center',Class=bkColor), STDEV, stdev))
+
+			try:
+				h2Value = float(h2)
+			except:
+				h2Value = -10000.0
+			tr.append(TDCell(HT.TD(h2,align='center',Class=bkColor), h2, h2Value))
+
+			tr.append(TDCell(HT.TD(Chr,align='left',Class=bkColor)))
+			tr.append(TDCell(HT.TD(Start,align='left',Class=bkColor)))
+			tr.append(TDCell(HT.TD(End,align='left',Class=bkColor)))
+
+			snp_td = HT.TD(align='left',Class=bkColor)
+			for one_snp_href in snp_collection:
+			    snp_td.append(one_snp_href)
+	
+			tr.append(TDCell(snp_td)) 
+			
+			#07-27-2011:add by NL: show SNP results for different allele only
+			snpDiff_td= HT.TD(align='left', valign='top', Class=bkColor)
+			for one_snpDiff_href in snpDiff_collection:
+			    snpDiff_td.append(one_snpDiff_href)
+			tr.append(TDCell(snpDiff_td))
+			
+			tblobj['body'].append(tr)
+		
+		# import cPickle
+		filename = webqtlUtil.genRandStr("Probe_")
+		objfile = open('%s.obj' % (webqtlConfig.TMPDIR+filename), 'wb')
+		cPickle.dump(tblobj, objfile)
+		objfile.close()
+		# NL, 07/27/2010. genTableObj function has been moved from templatePage.py to webqtlUtil.py;		
+		div = HT.Div(webqtlUtil.genTableObj(tblobj=tblobj, file=filename, sortby=("", ""), tableID = "sortable", addIndex = "1"), Id="sortable")
+
+		#UCSC
+		_Species = webqtlDatabaseFunction.retrieveSpecies(cursor=self.cursor, RISet=fd.RISet)
+		if _Species == "rat":
+			thisurl = webqtlConfig.UCSC_BLAT % ('rat', 'rn3', blatsequence)
+		elif _Species == "mouse":
+			thisurl = webqtlConfig.UCSC_BLAT % ('mouse', 'mm9', blatsequence)
+		else:
+			thisurl = ""
+		if thisurl:	
+			blatbutton = HT.Input(type='button' ,name='blatPM',value='Verify UCSC', onClick="window.open('%s','_blank')" % thisurl,Class="button")
+		else:
+			blatbutton = ""
+		
+		#GenBank
+		genbankSeq = ""
+		if thisTrait.genbankid:
+			self.cursor.execute("SELECT Sequence FROM Genbank WHERE Id = '%s'" % thisTrait.genbankid )
+			genbankSeq = self.cursor.fetchone()
+			if genbankSeq:
+				genbankSeq = genbankSeq[0]
+		
+		if genbankSeq: 
+			if _Species == "rat":
+				thisurl2 = webqtlConfig.UCSC_BLAT % ('rat', 'rn3', genbankSeq)
+			if _Species == "mouse":
+				thisurl2 = webqtlConfig.UCSC_BLAT % ('mouse', 'mm9', genbankSeq)
+		else:
+			thisurl2 = ''
+		if thisurl2:	
+			blatbutton2 = HT.Input(type='button' ,name='blatPM',value='Verify GenBank', onClick="window.open('%s','_blank')" % thisurl2,Class="button")
+		else:
+			blatbutton2 = ""
+		
+		#Snp
+		snpBrowser = ""
+		if thisTrait.symbol and _Species == 'mouse':
+			self.cursor.execute("select geneSymbol from GeneList where geneSymbol = %s", thisTrait.symbol)
+			geneName = self.cursor.fetchone()
+			if geneName:
+				snpurl = os.path.join(webqtlConfig.CGIDIR, "main.py?FormID=snpBrowser") + "&geneName=%s" % geneName[0]	
+			else:
+				if thisTrait.chr and thisTrait.mb:
+					snpurl = os.path.join(webqtlConfig.CGIDIR, "main.py?FormID=snpBrowser") + \
+							"&chr=%s&start=%2.6f&end=%2.6f" % (thisTrait.chr, thisTrait.mb-0.002, thisTrait.mb+0.002)
+				else:
+					snpurl = ""
+
+			if snpurl:
+				snpBrowser = HT.Input(type="button",value="SNP Browser",onClick= \
+						"openNewWin('%s')" % snpurl, Class="button")
+
+			else:
+				snpBrowser = ""
+		#end if
+		
+		heading = HT.Paragraph('Probe Information', Class="title")
+		intro = HT.Paragraph('The table below lists information of all probes of probe set ',HT.Span(self.ProbeSetID, Class="fwb fs13"),' from database ', HT.Span(self.probeDatabase, Class="fwb fs13"), ".")
+		buttons = HT.Paragraph(probedata,probeinfo,heatmap,cormatrix,blatbutton,blatbutton2,verifyButton,snpBrowser, HT.P(),selectall,selectpm,selectmm,selectinvert,reset,addselect)
+		if rudi_track:
+		   buttons.append(rudi_track)	
+		form.append(buttons,div,HT.P())
+	
+		TD_LR.append(heading,intro,form, HT.P())
+		self.dict['basehref'] = ''
+		self.dict['body'] = str(TD_LR)
+		self.dict['title'] = self.db.shortname + ' : ' + self.ProbeSetID +' / Probe Information'
+        # updated by NL, javascript function xmlhttpPost(strURL, div, querystring) and function updatepage(Id, str)
+		# have been moved to dhtml.js
+	   	self.dict['js1'] = ''
+		
+	def nullRecord(self,x):
+		if x or x == 0:
+			return x
+		else:
+			return ""
+			
+##########################
+#   UCSC Probe track by Ridi Albert
+##########################	
+	def convertChipName2Rudi(self, officialName):
+	 rudiName = None
+	 if officialName == 'Hu6800':
+	    rudiName = "ANHuGeneFL"
+	 else:
+	    rudiName = officialName.replace('_','')
+	    rudiName = rudiName.replace('-','')
+	    rudiName = "AN%s"%rudiName
+	 return rudiName
+       
+	def getProbeTrackURL(self, probesetfreeze_id, probeset_id):
+		  try:
+		     self.cursor.execute('SELECT GeneChip.Name, GeneChip.SpeciesId FROM ProbeFreeze,GeneChip WHERE ProbeFreeze.ChipId = GeneChip.Id and ProbeFreeze.Name = "%s"' % probesetfreeze_id)
+		     chipname, species = self.cursor.fetchall()[0]
+		  except:
+		     return  None  
+		  
+		  if not species:
+		     return None
+		       
+		  chipname_in_url = self.convertChipName2Rudi(chipname)
+		  orgs = {1:"mouse", 2:"rat"}
+		  dbs = {1:"mm8", 2:"mm6"}	 	  
+	  
+		  try:
+		  	url = webqtlConfig.UCSC_RUDI_TRACK_URL%(orgs[species], dbs[species],chipname_in_url, probeset_id)
+		  except:
+			url = ''
+	  
+		  return url
+		  
+		  
+	#NL 05-13-2011: get field_names in query			  
+	def getStrainNameIndexPair(self):
+
+		strainNameIndexPair=[]
+		query ='SELECT * FROM SnpPattern limit 1'
+		self.cursor.execute(query)
+
+		num_fields = len(self.cursor.description)
+		field_names = [i[0] for i in self.cursor.description]
+		strainsNameList=field_names[1:]
+		
+		# index for strain name starts from 1
+		for index, name in enumerate(strainsNameList):
+			index=index+1
+			strainNameIndexPair.append((name,index))
+
+		return strainNameIndexPair
+
+		
+