about summary refs log tree commit diff
path: root/web/webqtl/collection/BatchSubmitSelectionPage.py
diff options
context:
space:
mode:
authorroot2012-05-08 18:39:56 -0500
committerroot2012-05-08 18:39:56 -0500
commitea46f42ee640928b92947bfb204c41a482d80937 (patch)
tree9b27a4eb852d12539b543c3efee9d2a47ef470f3 /web/webqtl/collection/BatchSubmitSelectionPage.py
parent056b5253fc3857b0444382aa39944f6344dc1ceb (diff)
downloadgenenetwork2-ea46f42ee640928b92947bfb204c41a482d80937.tar.gz
Add all the source codes into the github.
Diffstat (limited to 'web/webqtl/collection/BatchSubmitSelectionPage.py')
-rwxr-xr-xweb/webqtl/collection/BatchSubmitSelectionPage.py225
1 files changed, 225 insertions, 0 deletions
diff --git a/web/webqtl/collection/BatchSubmitSelectionPage.py b/web/webqtl/collection/BatchSubmitSelectionPage.py
new file mode 100755
index 00000000..743606b2
--- /dev/null
+++ b/web/webqtl/collection/BatchSubmitSelectionPage.py
@@ -0,0 +1,225 @@
+# 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
+
+#BatchSubmitSelectionPage.py
+
+import string
+import time
+
+from base import webqtlConfig
+from base.templatePage import templatePage
+from utility import webqtlUtil
+from AddToSelectionPage import AddToSelectionPage
+	
+
+#########################################
+#     batch submission result Page
+#########################################
+class BatchSubmitSelectionPage(AddToSelectionPage):
+
+	def __init__(self, fd):
+
+		templatePage.__init__(self, fd)
+
+		if not self.openMysql():
+			return
+		if not fd.genotype:
+			fd.readGenotype()
+		
+		heading = 'Batch Submission'
+		
+		self.batchDataFile = fd.formdata.getvalue('batchdatafile')
+		if not self.batchDataFile:
+			templatePage.__init__(self, fd)
+			detail = ['The file you choose to import from doesn\'t exist.']
+			self.error(heading=heading,detail=detail)
+			return
+		self.batchDataFile = string.replace(self.batchDataFile, '\r', '\n')
+		self.batchDataFile = string.replace(self.batchDataFile, '\n\n', '\n')
+		self.batchDataFile = string.split(self.batchDataFile, '\n')
+		self.batchDataFile = map(string.strip, self.batchDataFile)
+		
+		traitNames, strainNames, traitValues, SE, NStrain = self.parseDataFile()
+		strainIds = []
+		
+		#print 'Content-type: text/html\n'
+		#print len(traitNames), len(strainNames) , len(strainIds), len(traitValues) , len(SE), "<BR><BR>", len(NStrain)
+		#return
+		
+		try:
+			
+			if not traitNames or not strainNames or not traitValues or len(traitNames) != len(traitValues) or len(traitNames) != len(SE) or len(traitNames) != len(NStrain):
+				raise 'ValueError'
+			for item in traitValues:
+				if len(strainNames) != len(item):
+					raise 'ValueError'
+			for item in SE:
+				if len(strainNames) != len(item):
+					raise 'ValueError'
+			for item in NStrain:
+				if len(strainNames) != len(item):
+					raise 'ValueError'
+			for item in strainNames:
+ 				self.cursor.execute('''Select 
+ 								Strain.Id 
+ 							from Strain, StrainXRef,InbredSet 
+ 							where 
+ 								Strain.Name = "%s" AND
+ 								StrainXRef.StrainId = Strain.Id AND
+ 								StrainXRef.InbredSetId = InbredSet.Id AND
+ 								InbredSet.Name = "%s"
+ 							''' % (item, fd.RISet))
+ 				strainId = self.cursor.fetchone()[0]
+ 				strainIds.append(strainId)
+ 		except:
+			templatePage.__init__(self, fd)
+			detail = ['The format of the file is incorrect, or it contains unknown strains.']
+			self.error(heading=heading,detail=detail)
+			return
+		
+		self.searchResult = []	
+		self.addToTable(traitNames, strainNames,strainIds, traitValues,SE, NStrain, fd)
+		
+		if self.genSelection(fd=fd):
+			self.writeHTML(fd)
+	
+	def parseDataFile(self):
+		rchSartPos = 0
+		header = []
+		traits = []
+		data = []
+		se = []
+		nstrain = []
+		strains = []
+		
+		if 1:
+			for line in  self.batchDataFile:
+				line = line.strip()
+				if line == '' or line[0] == '#':
+					continue
+					
+				columns = string.split(line, '\t')
+				columns = map(string.strip, columns)
+				
+				if rchSartPos == 'column':
+					strains.append(columns[0])
+					tdata = map(webqtlUtil.StringAsFloat,columns[1:])
+					for j, item in enumerate(tdata):
+						if  posIdx[j][0] == 'data':
+							data[posIdx[j][1]].append(item)
+						elif  posIdx[j][0] == 'n':
+							if item != None:
+								nstrain[posIdx[j][1]].append(int(item))
+							else:
+								nstrain[posIdx[j][1]].append(item)
+						else:
+							se[posIdx[j][1]].append(item)
+							
+				elif rchSartPos == 'row':
+					if columns[0].lower() == 'se':
+						se.append(map(webqtlUtil.StringAsFloat,columns[1:]))
+					elif columns[0].lower() == 'n':
+						nstrain.append(map(webqtlUtil.IntAsFloat,columns[1:]))
+					else:
+						while (len(data) > len(se)):
+							se.append([None] * len(data[-1]))
+						while (len(data) > len(nstrain)):
+							nstrain.append([None] * len(data[-1]))
+						header.append(columns[0])
+						data.append(map(webqtlUtil.StringAsFloat,columns[1:]))
+ 				elif columns[0] == '@format=column':
+					rchSartPos = 'column'
+					posIdx = []
+					j = 0
+					for item in columns[1:]:
+						#assign column type
+						if string.lower(item) == 'se':
+							posIdx.append(('se',j-1))
+						elif string.lower(item) == 'n':
+							posIdx.append(('n',j-1))
+						else:
+							header.append(item)
+							posIdx.append(('data',j))
+							j += 1
+					
+					for i in range(len(header)):
+						data.append([])
+						se.append([])
+						nstrain.append([])
+ 				elif columns[0] == '@format=row':
+					rchSartPos = 'row'
+					strains = columns[1:]
+				else:
+					pass
+			#modify
+			for i in range(len(se)):
+				if se[i] == []:
+					se[i] = [None] * len(data[-1])
+			for i in range(len(nstrain)):
+				if nstrain[i] == []:
+					nstrain[i] = [None] * len(data[-1])
+			if len(data) > len(se):
+				se.append([None] * len(data[-1]))
+			if len(data) > len(nstrain):
+				nstrain.append([None] * len(data[-1]))
+			
+			return header,strains,data,se, nstrain
+		else:
+			return [],[],[],[], []
+
+
+	#XZ, add items to self.searchResult	
+	def addToTable(self, traitNames, strainNames,strainIds, traitValues, SE, NStrain, fd):
+		self.cursor.execute('delete Temp, TempData from Temp, TempData where Temp.DataId = TempData.Id and UNIX_TIMESTAMP()-UNIX_TIMESTAMP(CreateTime)>%d;' % webqtlConfig.MAXLIFE)
+		
+		i = 0
+		for trait in traitNames:
+			ct0 = time.localtime(time.time())
+			ct = time.strftime("%B/%d %H:%M:%S",ct0)
+			if trait == '':
+				trait = "Unnamed Trait"
+			user_ip = fd.remote_ip
+			newDescription = '%s entered at %s from IP %s' % (trait,ct,user_ip)
+			newProbeSetID = webqtlUtil.genRandStr('Usr_TMP_')
+			
+			self.cursor.execute('SelecT max(id) from TempData')
+			try:
+				DataId = self.cursor.fetchall()[0][0] + 1
+			except:
+				DataId = 1
+			
+			self.cursor.execute('Select Id  from InbredSet where Name = "%s"' % fd.RISet)
+			InbredSetId = self.cursor.fetchall()[0][0]
+					
+			self.cursor.execute('insert into Temp(Name,description, createtime,DataId,InbredSetId,IP) values(%s,%s,Now(),%s,%s,%s)' ,(newProbeSetID, newDescription, DataId,InbredSetId,user_ip))
+			
+			for k in range(len(traitValues[i])):
+				if traitValues[i][k] != None:
+					self.cursor.execute('insert into TempData(Id, StrainId, value, SE, NStrain) values(%s, %s, %s, %s, %s)' , (DataId, strainIds[k], traitValues[i][k],SE[i][k],NStrain[i][k]))
+			
+			self.searchResult.append('Temp::%s'	% newProbeSetID)
+			i += 1
+