diff options
Diffstat (limited to 'web/webqtl/collection/BatchSubmitSelectionPage.py')
-rwxr-xr-x | web/webqtl/collection/BatchSubmitSelectionPage.py | 225 |
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 + |