Пример #1
0
 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()
Пример #2
0
  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()
Пример #3
0
    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()
Пример #4
0
 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()               
Пример #5
0
  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()
Пример #6
0
    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()