def get_orthologs_between_two_species_table(self, taxid1, taxid2, csth=0.5, elth=1): """Return formatted orthology table between two species """ #convert species names into taxid if not str(taxid1).isdigit(): if not taxid1 in self.name2taxid: return "Species %s have not been found!" % taxid1 taxid1 = self.name2taxid[taxid1] if not str(taxid2).isdigit(): if not taxid2 in self.name2taxid: return "Species %s have not been found!" % taxid2 taxid2 = self.name2taxid[taxid2] htypetxt = "ortholog" #add short species info ADD protein counts etc header = self._get_genome_info(taxid1) header += self._get_genome_info(taxid2) #get orthologs orthologs = self.get_orthologs_between_two_species(taxid1, taxid2) ##THIS IS MESSY BUT WORKING! ocount = sum(len(o) for o in orthologs.itervalues()) p2count = {} for o in filter(lambda x: len(x) == 1, orthologs.itervalues()): p = o[0][0] if p not in p2count: p2count[p] = 1 else: p2count[p] += 1 for o in filter(lambda x: len(x) > 1, orthologs.itervalues()): for oi in o: p = oi[0] if p in p2count: p2count[p] += 1 ocount_one2one = sum(c for p, c in p2count.iteritems() if c == 1) header += "<b> %s orthologs of which %s are one-to-one.</b>" % ( locale.format("%d", ocount, grouping=True), locale.format("%d", ocount_one2one, grouping=True)) #get orthologs otable = orthologyTable() #add header colnames = ("<i>%s</i>"%self.get_spname(taxid1, 1), \ "<i>%s</i>"%self.get_spname(taxid2, 1), \ "CS", "EL", "Trees")+ self.TREES_REPOSITORIES_NAMES widths = (120, 120, 0, 0, 0) + (0, ) * len(self.TREES_REPOSITORIES_NAMES) for cell, width in zip(colnames, widths): cell_class = td_flag = "" if width: td_flag = 'width="%s"' % width otable.add_cell(0, cell, cell_class, td_flag) #populate table row_index = 1 for i, (prot1data, odata) in enumerate(orthologs.iteritems()): #(metaid1, extid1) metaid1 = int(prot1data.split('_')[0]) extid1 = "_".join(prot1data.split('_')[1:]) td_flag = 'rowspan="%s"' % len(odata) cell_class = None #use metaid if not external id if not extid1 or extid1 == "None": extid1 = self.id2str(metaid1, 0, 0) #ortholog - popup on scroll over if self.return_html: protid1 = self.SEQLINKOR % (metaid1, metaid1, extid1, metaid1) else: protid1 = self.id2str(metaid1) otable.add_cell(row_index, protid1, cell_class, td_flag) #even or odd species row if i % 2: otable.tr_classes[row_index] = "even_row" else: otable.tr_classes[row_index] = "odd_row" for metaid2, extid2, cs, el, trees, css in odata: #use metaid if not external id if not extid2: extid2 = self.id2str(metaid2, 0, 0) #ortholog - popup on scroll over if self.return_html: protid2 = self.SEQLINKOR % (metaid2, metaid2, extid2, metaid2) trees = self._add_link("%s|%s"%(self.id2str(metaid1), self.id2str(metaid2)), \ self.db['metaphors'][3], trees) else: protid2 = self.id2str(metaid2) #protid2, CS, EL & trees otable.add_cells(row_index, (protid2, "%.3f" % cs, el, trees)) #tree repository signals for signal in css: cell = cell_class = "" if signal: extcs, exttrees = signal if exttrees > 1: cell = "%.2f/%s" % (extcs, exttrees) if extcs >= self.csth: cell_class = "agreement" else: cell_class = "disagreement" otable.add_cell(row_index, cell, cell_class) row_index += 1 #return html-formatted if self.return_html: return header + otable.asHTML() + self.LEGEND #OrthoXML to ADD #TXT else: return otable.asTXT()
def get_orthologs_table(self, protid): """Return HTML or TXT formatted orthologs table""" htypetxt = "ortholog" #get metaid metaid = self.get_metaid(protid) ##catch wrong protein ids here if not metaid: return "Your query produced no hits!" #add short protein info header = self.get_protein_info(metaid, 2) #get orthologs orthologs = self.get_orthologs(metaid) if not orthologs: return header + "<b>No %ss have been found.</b>" % htypetxt header += "<b>%s %ss in %s species</b>\n"%(sum(len(o) for o in orthologs.itervalues()), \ htypetxt, len(orthologs)) out = [] otable = orthologyTable() #add header colnames = ("Target species", "Co-%ss"%htypetxt, "%ss"%htypetxt.capitalize(), \ "CS", "EL", "Trees")+ self.TREES_REPOSITORIES_NAMES widths = (180, 120, 120, 0, 0, 0) + (0, ) * len(self.TREES_REPOSITORIES_NAMES) for cell, width in zip(colnames, widths): cell_class = td_flag = "" if width: td_flag = 'width="%s"' % width otable.add_cell(0, cell, cell_class, td_flag) #populate table row_index = 1 taxids = sorted([t for t in orthologs if t in self.species], key=lambda x: self.species[x][1]) for i, taxid in enumerate(taxids, 1): td_flag = 'rowspan="%s"' % len(orthologs[taxid]) spname = self.species[taxid][1] cell_class = None otable.add_cell(row_index, spname, cell_class, td_flag) #even or odd species row if i % 2: otable.tr_classes[row_index] = "even_row" else: otable.tr_classes[row_index] = "odd_row" #add orthologs for j, (metaid2, extid2, cs, el, trees, css, coorths) in enumerate(orthologs[taxid], 1): #use metaid if not external id if not extid2: extid2 = self.id2str(metaid2, 0, 0) #co-orthology information coorthologs = self.id2str(metaid, 0, 0) + " " + \ " ".join(self.id2str(coid, 0, 0) for coid, cocs in coorths) #collapse co-orthologs if too many if self.return_html and coorths: coorthologs = """ <a onClick="javascript:togglecomments(\'i%s_j%s\')"> %s co-%ss</a> <div id="i%s_j%s" class="commenthidden">%s</div> </a>""" % (i, j, len(coorths) + 1, htypetxt, i, j, coorthologs) otable.add_cell(row_index, coorthologs) #ortholog - popup on scroll over if self.return_html: #protid2 = self._add_link(extid2, self.db['metaphors'][4]) protid2 = self.SEQLINKOR % (metaid2, metaid2, extid2, metaid2) trees = self._add_link("%s|%s"%(self.id2str(metaid), self.id2str(metaid2)), \ self.db['metaphors'][3], trees) else: protid2 = self.id2str(metaid2) #protid2, CS, EL & trees otable.add_cells(row_index, (protid2, "%.3f" % cs, el, trees)) #tree repository signals for signal in css: cell = cell_class = "" if signal: extcs, exttrees = signal if exttrees > 1: cell = "%.2f/%s" % (extcs, exttrees) if extcs >= self.csth: cell_class = "agreement" else: cell_class = "disagreement" otable.add_cell(row_index, cell, cell_class) row_index += 1 #return html-formatted if self.return_html: return header + otable.asHTML() + self.LEGEND #OrthoXML to ADD #TXT else: return otable.asTXT()
def get_trees(self, ids): """Return trees for protein IDs.""" out = [] if type(ids) is str: ids = ids.split() #get internal ids metaids = [self.id2int(x) for x in ids if x and self.id2int(x)] if not metaids: return "Your query was not recognised!" cmd = """SELECT name, www, protein_link, tree_link, extid, treeid FROM protid2treeid WHERE protid=%s""" % metaids[0] for i, metaid in enumerate(metaids): out.append(self.get_protein_info(metaid, 3)) #limit by common with other metaids if i: cmd += " AND treeid IN (SELECT treeid FROM protid2treeid WHERE protid=%s)" % metaid #remove repeats cmd += " GROUP BY treeid" results = self._fetch(cmd) ##format output if len(metaids) > 1: text = "<b><table><tr><td>Selected proteins are together %s</table></b>" out.append(text % self.get_tree_info(metaids).lower()) if not results: return "".join(out) #process db2trees = {} for dbname, www, protein_link, tree_link, extid, treeid in results: dblink = self._add_link('', www, dbname) #add db if dblink not in db2trees: db2trees[dblink] = {} #add extid extid = self._add_link(extid, protein_link) if extid not in db2trees[dblink]: db2trees[dblink][extid] = [] #add trees db2trees[dblink][extid].append(self._add_link(treeid, tree_link)) #get html table = orthologyTable() #add header colnames = ("Database", "No. of trees", "External ID", "Trees") widths = (80, 80, 120, 0) for cell, width in zip(colnames, widths): cell_class = td_flag = "" if width: td_flag = 'width="%s"' % width table.add_cell(0, cell, cell_class, td_flag) row_index = 1 for i, db in enumerate(sorted(db2trees), 1): td_flag = 'rowspan="%s"' % len(db2trees[db]) #even or odd species row if i % 2: table.tr_classes[i] = "even_row" else: table.tr_classes[i] = "odd_row" #add db & tree count cell cell_class = None table.add_cell(row_index, db, cell_class, td_flag) table.add_cell(row_index, sum(len(x) for x in db2trees[db].itervalues()), cell_class, td_flag) #add extid & trees for extid, trees in sorted(db2trees[db].iteritems()): table.add_cell(row_index, extid) table.add_cell( row_index, "<div id='scrollcell'>" + ", ".join(sorted(trees)) + "</div>") row_index += 1 if self.return_html: return "<br />".join(out) + table.asHTML() else: return "\n#".join(out) + table.asTXT()
def get_orthologs_between_two_species_table(self, taxid1, taxid2, csth=0.5, elth=1): """Return formatted orthology table between two species """ #convert species names into taxid if not str(taxid1).isdigit(): if not taxid1 in self.name2taxid: return "Species %s have not been found!"%taxid1 taxid1 = self.name2taxid[taxid1] if not str(taxid2).isdigit(): if not taxid2 in self.name2taxid: return "Species %s have not been found!"%taxid2 taxid2 = self.name2taxid[taxid2] htypetxt = "ortholog" #add short species info ADD protein counts etc header = self._get_genome_info(taxid1) header += self._get_genome_info(taxid2) #get orthologs orthologs = self.get_orthologs_between_two_species(taxid1, taxid2) ##THIS IS MESSY BUT WORKING! ocount = sum(len(o) for o in orthologs.itervalues()) p2count = {} for o in filter(lambda x: len(x)==1, orthologs.itervalues()): p = o[0][0] if p not in p2count: p2count[p] = 1 else: p2count[p] += 1 for o in filter(lambda x: len(x)>1, orthologs.itervalues()): for oi in o: p = oi[0] if p in p2count: p2count[p] += 1 ocount_one2one = sum(c for p, c in p2count.iteritems() if c==1) header += "<b> %s orthologs of which %s are one-to-one.</b>"%(locale.format("%d", ocount, grouping=True), locale.format("%d", ocount_one2one, grouping=True)) #get orthologs otable = orthologyTable() #add header colnames = ("<i>%s</i>"%self.get_spname(taxid1, 1), \ "<i>%s</i>"%self.get_spname(taxid2, 1), \ "CS", "EL", "Trees")+ self.TREES_REPOSITORIES_NAMES widths = (120, 120, 0, 0, 0) + (0,)*len(self.TREES_REPOSITORIES_NAMES) for cell, width in zip(colnames, widths): cell_class = td_flag = "" if width: td_flag = 'width="%s"'%width otable.add_cell(0, cell, cell_class, td_flag) #populate table row_index = 1 for i, (prot1data, odata) in enumerate(orthologs.iteritems()): #(metaid1, extid1) metaid1 = int(prot1data.split('_')[0]) extid1 = "_".join(prot1data.split('_')[1:]) td_flag = 'rowspan="%s"' % len(odata) cell_class = None #use metaid if not external id if not extid1 or extid1=="None": extid1 = self.id2str(metaid1, 0, 0) #ortholog - popup on scroll over if self.return_html: protid1 = self.SEQLINKOR % (metaid1, metaid1, extid1, metaid1) else: protid1 = self.id2str(metaid1) otable.add_cell(row_index, protid1, cell_class, td_flag) #even or odd species row if i%2: otable.tr_classes[row_index] = "even_row" else: otable.tr_classes[row_index] = "odd_row" for metaid2, extid2, cs, el, trees, css in odata: #use metaid if not external id if not extid2: extid2 = self.id2str(metaid2, 0, 0) #ortholog - popup on scroll over if self.return_html: protid2 = self.SEQLINKOR % (metaid2, metaid2, extid2, metaid2) trees = self._add_link("%s|%s"%(self.id2str(metaid1), self.id2str(metaid2)), \ self.db['metaphors'][3], trees) else: protid2 = self.id2str(metaid2) #protid2, CS, EL & trees otable.add_cells(row_index, (protid2, "%.3f"%cs, el, trees)) #tree repository signals for signal in css: cell = cell_class = "" if signal: extcs, exttrees = signal if exttrees>1: cell = "%.2f/%s" % (extcs, exttrees) if extcs >= self.csth: cell_class = "agreement" else: cell_class = "disagreement" otable.add_cell(row_index, cell, cell_class) row_index += 1 #return html-formatted if self.return_html: return header + otable.asHTML() + self.LEGEND #OrthoXML to ADD #TXT else: return otable.asTXT()
def get_orthologs_table(self, protid): """Return HTML or TXT formatted orthologs table""" htypetxt = "ortholog" #get metaid metaid = self.get_metaid(protid) ##catch wrong protein ids here if not metaid: return "Your query produced no hits!" #add short protein info header = self.get_protein_info(metaid, 2) #get orthologs orthologs = self.get_orthologs(metaid) if not orthologs: return header+"<b>No %ss have been found.</b>"%htypetxt header += "<b>%s %ss in %s species</b>\n"%(sum(len(o) for o in orthologs.itervalues()), \ htypetxt, len(orthologs)) out = [] otable = orthologyTable() #add header colnames = ("Target species", "Co-%ss"%htypetxt, "%ss"%htypetxt.capitalize(), \ "CS", "EL", "Trees")+ self.TREES_REPOSITORIES_NAMES widths = (180, 120, 120, 0, 0, 0) + (0,)*len(self.TREES_REPOSITORIES_NAMES) for cell, width in zip(colnames, widths): cell_class = td_flag = "" if width: td_flag = 'width="%s"'%width otable.add_cell(0, cell, cell_class, td_flag) #populate table row_index = 1 taxids = sorted([t for t in orthologs if t in self.species], key=lambda x: self.species[x][1]) for i, taxid in enumerate(taxids, 1): td_flag = 'rowspan="%s"' % len(orthologs[taxid]) spname = self.species[taxid][1] cell_class = None otable.add_cell(row_index, spname, cell_class, td_flag) #even or odd species row if i%2: otable.tr_classes[row_index] = "even_row" else: otable.tr_classes[row_index] = "odd_row" #add orthologs for j, (metaid2, extid2, cs, el, trees, css, coorths) in enumerate(orthologs[taxid], 1): #use metaid if not external id if not extid2: extid2 = self.id2str(metaid2, 0, 0) #co-orthology information coorthologs = self.id2str(metaid, 0, 0) + " " + \ " ".join(self.id2str(coid, 0, 0) for coid, cocs in coorths) #collapse co-orthologs if too many if self.return_html and coorths: coorthologs = """ <a onClick="javascript:togglecomments(\'i%s_j%s\')"> %s co-%ss</a> <div id="i%s_j%s" class="commenthidden">%s</div> </a>""" % (i, j, len(coorths)+1, htypetxt, i, j, coorthologs) otable.add_cell(row_index, coorthologs) #ortholog - popup on scroll over if self.return_html: #protid2 = self._add_link(extid2, self.db['metaphors'][4]) protid2 = self.SEQLINKOR % (metaid2, metaid2, extid2, metaid2) trees = self._add_link("%s|%s"%(self.id2str(metaid), self.id2str(metaid2)), \ self.db['metaphors'][3], trees) else: protid2 = self.id2str(metaid2) #protid2, CS, EL & trees otable.add_cells(row_index, (protid2, "%.3f"%cs, el, trees)) #tree repository signals for signal in css: cell = cell_class = "" if signal: extcs, exttrees = signal if exttrees>1: cell = "%.2f/%s" % (extcs, exttrees) if extcs >= self.csth: cell_class = "agreement" else: cell_class = "disagreement" otable.add_cell(row_index, cell, cell_class) row_index += 1 #return html-formatted if self.return_html: return header + otable.asHTML() + self.LEGEND #OrthoXML to ADD #TXT else: return otable.asTXT()
def get_trees(self, ids): """Return trees for protein IDs.""" out = [] if type(ids) is str: ids = ids.split() #get internal ids metaids = [self.id2int(x) for x in ids if x and self.id2int(x)] if not metaids: return "Your query was not recognised!" cmd = """SELECT name, www, protein_link, tree_link, extid, treeid FROM protid2treeid WHERE protid=%s"""%metaids[0] for i, metaid in enumerate(metaids): out.append(self.get_protein_info(metaid, 3)) #limit by common with other metaids if i: cmd += " AND treeid IN (SELECT treeid FROM protid2treeid WHERE protid=%s)"%metaid #remove repeats cmd += " GROUP BY treeid" results = self._fetch(cmd) ##format output if len(metaids)>1: text = "<b><table><tr><td>Selected proteins are together %s</table></b>" out.append(text%self.get_tree_info(metaids).lower()) if not results: return "".join(out) #process db2trees = {} for dbname, www, protein_link, tree_link, extid, treeid in results: dblink = self._add_link('', www, dbname) #add db if dblink not in db2trees: db2trees[dblink] = {} #add extid extid = self._add_link(extid, protein_link) if extid not in db2trees[dblink]: db2trees[dblink][extid] = [] #add trees db2trees[dblink][extid].append(self._add_link(treeid, tree_link)) #get html table = orthologyTable() #add header colnames = ("Database", "No. of trees", "External ID", "Trees") widths = (80, 80, 120, 0) for cell, width in zip(colnames, widths): cell_class = td_flag = "" if width: td_flag = 'width="%s"'%width table.add_cell(0, cell, cell_class, td_flag) row_index = 1 for i, db in enumerate(sorted(db2trees), 1): td_flag = 'rowspan="%s"' % len(db2trees[db]) #even or odd species row if i%2: table.tr_classes[i] = "even_row" else: table.tr_classes[i] = "odd_row" #add db & tree count cell cell_class = None table.add_cell(row_index, db, cell_class, td_flag) table.add_cell(row_index, sum(len(x) for x in db2trees[db].itervalues()), cell_class, td_flag) #add extid & trees for extid, trees in sorted(db2trees[db].iteritems()): table.add_cell(row_index, extid) table.add_cell(row_index, "<div id='scrollcell'>"+", ".join(sorted(trees))+"</div>") row_index += 1 if self.return_html: return "<br />".join(out) + table.asHTML() else: return "\n#".join(out) + table.asTXT()