about summary refs log tree commit diff
path: root/web/webqtl/genomeGraph/genAllDbResultPage.py
diff options
context:
space:
mode:
Diffstat (limited to 'web/webqtl/genomeGraph/genAllDbResultPage.py')
-rwxr-xr-xweb/webqtl/genomeGraph/genAllDbResultPage.py309
1 files changed, 309 insertions, 0 deletions
diff --git a/web/webqtl/genomeGraph/genAllDbResultPage.py b/web/webqtl/genomeGraph/genAllDbResultPage.py
new file mode 100755
index 00000000..f0663a7c
--- /dev/null
+++ b/web/webqtl/genomeGraph/genAllDbResultPage.py
@@ -0,0 +1,309 @@
+# 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 os
+import time
+
+from htmlgen import HTMLgen2 as HT
+
+from base import webqtlConfig
+from utility import webqtlUtil
+from base.webqtlDataset import webqtlDataset
+from base.templatePage import templatePage
+			
+
+######################################### 
+#      Genome Scan PAGE
+#########################################
+class genAllDbResultPage(templatePage):
+
+	def __init__(self,fd):
+
+		templatePage.__init__(self,fd)
+
+		if not self.openMysql():
+			return
+
+		self.database = fd.formdata.getvalue('database', '')
+		db = webqtlDataset(self.database, self.cursor)
+
+		try:
+			if db.type != "ProbeSet" or not db.id:
+				raise DbNameError
+		except:
+			print 'Content-type: text/html\n'
+			heading = "Download Results"
+			detail = ["Only results of microarray database are available to download."]
+			self.error(heading=heading,detail=detail)
+			self.write()
+			return
+
+
+                #XZ, protect confidential dataset.
+		userExist = None
+                self.cursor.execute('SELECT Id, Name, FullName, confidentiality, AuthorisedUsers FROM ProbeSetFreeze WHERE Name = "%s"' %  self.database)
+                indId, indName, indFullName, indConfid, AuthorisedUsers = self.cursor.fetchall()[0]
+                if indConfid == 1 and userExist == None:
+                    try:
+
+                        userExist = self.userName
+
+                        #for the dataset that confidentiality is 1
+                        #1. 'admin' and 'root' can see all of the dataset
+                        #2. 'user' can see the dataset that AuthorisedUsers contains his id(stored in the Id field of User table)
+                        if webqtlConfig.USERDICT[self.privilege] < webqtlConfig.USERDICT['admin']:
+                            if not AuthorisedUsers:
+                                userExist=None
+                            else:
+                                AuthorisedUsersList=AuthorisedUsers.split(',')
+                                if not AuthorisedUsersList.__contains__(self.userName):
+                                    userExist=None
+                    except:
+                        pass
+
+                    if not userExist:
+                        #Error, Confidential Database
+                        heading = "Correlation Table"
+                        detail = ["The %s database you selected is not open to the public at this time, please go back and select other database." % indFullName]
+                        self.error(heading=heading,detail=detail,error="Confidential Database")
+                        return
+	
+		self.cursor.execute("""
+				Select 
+					InbredSet.Name
+				From
+					ProbeSetFreeze, ProbeFreeze, InbredSet
+				whERE
+					ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id AND
+					ProbeFreeze.InbredSetId = InbredSet.Id AND
+					ProbeSetFreeze.Id = %d
+				""" % db.id)
+		thisRISet = self.cursor.fetchone()[0]
+		if thisRISet =='BXD300':
+			thisRISet = 'BXD'
+
+		#XZ, 06/26/2009: It seems that this query is not neccessary. It doesn't return any result.
+		#XZ: It seems it is just for test purpose. The next try-except block does the real work.
+		#XZ: I think it should be deleted to shorten the response time.	
+		#self.cursor.execute("""
+		#		Select 
+		#			ProbeSet.Name, ProbeSet.symbol, ProbeSet.description, ProbeSet.Chr, ProbeSet.Mb, ProbeSetXRef.Locus, 
+		#			ProbeSetXRef.LRS, ProbeSetXRef.pValue, ProbeSetXRef.additive, ProbeSetXRef.mean
+		#		From
+		#			ProbeSet, ProbeSetXRef
+		#		whERE
+		#			ProbeSetXRef.ProbeSetFreezeId = %d AND
+		#			ProbeSetXRef.ProbeSetId = ProbeSet.Id AND
+		#			ProbeSetXRef.Locus is not NULL 
+		#		Order by
+		#			ProbeSet.name_num
+		#		""" % db.id)
+		
+		filename = os.path.join(webqtlConfig.SECUREDIR, db.name+'.result.xls')
+
+		try:
+			import random234
+			if random.choice(range(10)) == 0:
+				raise "ReCalculate"
+			fp = open(filename, 'rb')
+			text = fp.read()
+			fp.close()
+		except:
+			self.cursor.execute("Select ProbeSetXRef.ProbeSetId from ProbeSetXRef where ProbeSetFreezeId=%d" % db.id)
+			ProbeSetIds = self.cursor.fetchall()
+			self.mouseChrLengthDict, sum = self.readMouseGenome(thisRISet)
+
+			if ProbeSetIds:
+				import reaper
+				markerGMb = {}
+				genotype_1 = reaper.Dataset()
+				genotype_1.read(os.path.join(webqtlConfig.GENODIR, thisRISet + '.geno'))
+				for chr in genotype_1:
+					chrlen = self.mouseChrLengthDict[chr.name]
+					for locus in chr:	
+						markerGMb[locus.name] = [chr.name, locus.Mb, locus.Mb + chrlen]
+				
+				text = []
+				text.append(['ProbeSetId', 'Symbol', 'Description', 'Target Description', 'Chr', 'TMb', 'TGMb', 'Locus', 'LRS', 'Additive', 'pvalue', 'markerChr', 'markerMb', 'markerGMb', 'meanExpression'])
+				ProbeSetIdList = []
+				for ProbeSetId in ProbeSetIds:
+					ProbeSetIdList.append(ProbeSetId[0])
+					if len(ProbeSetIdList)==1000:
+						ProbeSetIdStr = ','.join(map(str, ProbeSetIdList))
+						ProbeSetIdList = []
+
+						cmd = """
+							Select 
+								ProbeSet.Name, ProbeSet.symbol, ProbeSet.description,ProbeSet.Probe_Target_Description,ProbeSet.Chr, ProbeSet.Mb, 
+								ProbeSetXRef.Locus, ProbeSetXRef.LRS, ProbeSetXRef.pValue, 
+								ProbeSetXRef.additive, ProbeSetXRef.mean
+							From
+								ProbeSet, ProbeSetXRef
+							Where
+								ProbeSetXRef.ProbeSetFreezeId = %s AND
+								ProbeSetXRef.ProbeSetId = ProbeSet.Id AND
+								ProbeSetXRef.Locus is not NULL AND
+								ProbeSet.Id in (%s)
+							Order by
+								ProbeSet.name_num
+						""" % (db.id, ProbeSetIdStr)
+
+						self.cursor.execute(cmd)
+						results = self.cursor.fetchall()
+
+						for result in results:
+							_Id, _symbol, _desc,_targetDesc, _chr, _TMb, _marker, _lrs, _pvalue, _additive, _mean = result
+							if _marker == "-":
+								continue
+							if not _additive:
+								_additive = ""
+						
+							try:
+								_TGMb = _TMb + self.mouseChrLengthDict[string.strip(_chr)]
+							except:
+								_TGMb = ""
+
+							result2 = [_Id, _symbol, _desc, _targetDesc, _chr, _TMb, _TGMb, _marker, _lrs, _additive, _pvalue]
+							try:
+								result2 += markerGMb[_marker]
+							except:
+								result2 += ['', '', '']
+							result2 += [_mean]
+							text.append(map(str, result2))
+
+				#XZ, 06/29/2007: This block is dealing with the last several probesets that fall out of the 1000-probeset block. 
+				if ProbeSetIdList:
+					ProbeSetIdStr = ','.join(map(str, ProbeSetIdList))
+
+					cmd = """
+						Select 
+							ProbeSet.Name, ProbeSet.symbol, ProbeSet.description,ProbeSet.Probe_Target_Description, ProbeSet.Chr, ProbeSet.Mb, 
+							ProbeSetXRef.Locus, ProbeSetXRef.LRS, ProbeSetXRef.pValue, 
+							ProbeSetXRef.additive, ProbeSetXRef.mean
+						From
+							ProbeSet, ProbeSetXRef
+						Where
+							ProbeSetXRef.ProbeSetFreezeId = %s AND
+							ProbeSetXRef.ProbeSetId = ProbeSet.Id AND
+							ProbeSetXRef.Locus is not NULL AND
+							ProbeSet.Id in (%s)
+						Order by
+							ProbeSet.name_num
+					""" % (db.id, ProbeSetIdStr)
+
+					self.cursor.execute(cmd)
+					results = self.cursor.fetchall()
+
+					for result in results:
+						_Id, _symbol, _desc, _targetDesc,_chr, _TMb, _marker, _lrs, _pvalue, _additive, _mean = result
+						if _marker == "-":
+							continue
+						if not _additive:
+							_additive = ""
+					
+						try:
+							_TGMb = _TMb + self.mouseChrLengthDict[string.strip(_chr)]
+						except:
+							_TGMb = ""
+
+						result2 = [_Id, _symbol, _desc,_targetDesc,  _chr, _TMb, _TGMb, _marker, _lrs, _additive, _pvalue]
+						try:
+							result2 += markerGMb[_marker]
+						except:
+							result2 += ['', '', '']
+						result2 += [_mean]
+						text.append(map(str, result2))
+
+				
+				import pyXLWriter as xl
+				# Create a new Excel workbook
+				workbook = xl.Writer(filename)
+				worksheet = workbook.add_worksheet()
+				heading = workbook.add_format(align = 'center', bold = 1, size=13, color = 'red')
+				titleStyle = workbook.add_format(align = 'left', bold = 0, size=14, border = 1, border_color="gray")
+
+				worksheet.write([0, 0], "Data source: The GeneNetwork at http://www.genenetwork.org", titleStyle)
+				worksheet.write([1, 0], "Citations: Please see %s/reference.html" % webqtlConfig.PORTADDR, titleStyle)
+				worksheet.write([2, 0], "Database : %s" % db.fullname, 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)
+
+				table_row_start_index = 7
+				nrow = table_row_start_index
+				for row in text:
+				    for ncol, cell in enumerate(row):
+				    	if nrow == table_row_start_index:
+				        	worksheet.write([nrow, ncol], cell.strip(), heading)
+				        	worksheet.set_column([ncol, ncol], 20)
+				    	else:
+				        	worksheet.write([nrow, ncol], cell.strip())
+				    nrow += 1
+
+				worksheet.write([1+nrow, 0], "Funding for The GeneNetwork: NIAAA (U01AA13499, U24AA13513), NIDA, NIMH, and NIAAA (P20-DA21131), NCI MMHCC (U01CA105417), and NCRR (U01NR 105417)", titleStyle)
+				worksheet.write([2+nrow, 0], "PLEASE RETAIN DATA SOURCE INFORMATION WHENEVER POSSIBLE", titleStyle)
+
+				workbook.close()
+								
+				fp = open(filename, 'rb')
+				text = fp.read()
+				fp.close()
+			else:
+				heading = "Download Results"
+				detail = ["Database calculation is not finished."]
+				self.error(heading=heading,detail=detail)
+				return
+				
+		self.content_type = 'application/xls'
+		self.content_disposition = 'attachment; filename=%s' % ('export-%s.xls' % time.strftime("%y-%m-%d-%H-%M"))
+		self.attachment = text
+			
+	def readMouseGenome(self, RISet):
+		ldict = {}
+		lengths = []
+		sum = 0
+		#####################################
+		# Retrieve Chr Length Information
+		#####################################
+		self.cursor.execute("""
+			Select 
+				Chr_Length.Name, Length from Chr_Length, InbredSet 
+			where 
+				Chr_Length.SpeciesId = InbredSet.SpeciesId AND
+				InbredSet.Name = '%s'
+			Order by 
+				OrderId
+			""" % RISet)
+		lengths = self.cursor.fetchall()
+		ldict[lengths[0][0]] = 0
+		prev = lengths[0][1]/1000000.0
+		sum += lengths[0][1]/1000000.0
+		for item in lengths[1:]:
+			ldict[item[0]] = prev
+			prev += item[1]/1000000.0
+			sum += item[1]/1000000.0
+		return ldict, sum