Exemplo n.º 1
0
 def _get_block_title(self, block):
     # if self.is_write_block_titles is False then no block titles;
     # if only one taxon set, or attached taxon set mode, unless self.is_write_block_titles
     # is explicitly True, then again, we do not write block titles
     if not self._link_blocks():
         return None
     if block in self._block_title_map:
         return self._block_title_map[block]
     if not block.label:
         title = str(id(block))
     else:
         title = block.label
     idx = 1
     original_title = title
     title = nexusprocessing.escape_nexus_token(
         original_title,
         preserve_spaces=self.preserve_spaces,
         quote_underscores=not self.unquoted_underscores)
     while title in self._title_block_map:
         raw_title = "{}.{}".format(original_title, idx)
         title = nexusprocessing.escape_nexus_token(
             raw_title,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores)
         idx += 1
     self._title_block_map[title] = block
     self._block_title_map[block] = title
     return title
Exemplo n.º 2
0
 def _get_block_title(self, block):
     # if self.is_write_block_titles is False then no block titles;
     # if only one taxon set, or attached taxon set mode, unless self.is_write_block_titles
     # is explicitly True, then again, we do not write block titles
     if not self._link_blocks():
         return None
     if block in self._block_title_map:
         return self._block_title_map[block]
     if not block.label:
         title = str(id(block))
     else:
         title = block.label
     idx = 1
     original_title = title
     title = nexusprocessing.escape_nexus_token(
             original_title,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores)
     while title in self._title_block_map:
         raw_title = "{}.{}".format(original_title, idx)
         title = nexusprocessing.escape_nexus_token(
                 raw_title,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
         idx += 1
     self._title_block_map[title] = block
     self._block_title_map[block] = title
     return title
Exemplo n.º 3
0
 def _write_char_block(self, stream, char_matrix):
     taxon_label_map = collections.OrderedDict()
     for taxon in char_matrix:
         taxon_label_map[taxon] = nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores)
     nchar = max([len(seq) for seq in char_matrix.values()])
     if self.simple:
         stream.write("BEGIN DATA;\n")
         # note that this will only list the number of taxa for
         # which sequences are available
         ntaxstr = "NTAX={}".format(len(taxon_label_map))
     else:
         stream.write("BEGIN CHARACTERS;\n")
         ntaxstr = ""
     self._write_block_title(stream, char_matrix)
     self._write_item_annotations(stream, char_matrix)
     self._write_item_comments(stream, char_matrix)
     self._write_link_to_taxa_block(stream, char_matrix.taxon_namespace)
     stream.write("    DIMENSIONS{} NCHAR={};\n".format(ntaxstr, nchar))
     stream.write("    FORMAT {};\n".format(self._compose_format_terms(char_matrix)))
     stream.write("    MATRIX\n")
     if char_matrix.data_type == "continuous":
         state_value_writer = lambda x : stream.write("{} ".format(self.continuous_character_state_value_format_fn(x)))
     else:
         state_value_writer = lambda x : stream.write("{}".format(self.discrete_character_state_value_format_fn(x)))
     max_label_len = max(len(v) for v in taxon_label_map.values())
     for taxon in char_matrix:
         stream.write("        {taxon_label:{field_len}}    ".format(taxon_label=taxon_label_map[taxon],
             field_len=max_label_len))
         for state in char_matrix[taxon]:
             state_value_writer(state)
         stream.write("\n")
     stream.write("    ;\n")
     stream.write("END;\n\n\n")
     self._write_character_subsets(stream, char_matrix)
Exemplo n.º 4
0
 def _write_char_block(self, stream, char_matrix):
     taxon_label_map = collections.OrderedDict()
     for taxon in char_matrix:
         taxon_label_map[taxon] = nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores)
     nchar = max([len(seq) for seq in char_matrix.values()])
     if self.simple:
         stream.write("BEGIN DATA;\n")
         # note that this will only list the number of taxa for
         # which sequences are available
         ntaxstr = " NTAX={}".format(len(taxon_label_map))
     else:
         stream.write("BEGIN CHARACTERS;\n")
         ntaxstr = ""
     self._write_block_title(stream, char_matrix)
     self._write_item_annotations(stream, char_matrix)
     self._write_item_comments(stream, char_matrix)
     self._write_link_to_taxa_block(stream, char_matrix.taxon_namespace)
     stream.write("    DIMENSIONS{} NCHAR={};\n".format(ntaxstr, nchar))
     stream.write("    FORMAT {};\n".format(self._compose_format_terms(char_matrix)))
     stream.write("    MATRIX\n")
     if char_matrix.data_type == "continuous":
         state_value_writer = lambda x : stream.write("{} ".format(self.continuous_character_state_value_format_fn(x)))
     else:
         state_value_writer = lambda x : stream.write("{}".format(self.discrete_character_state_value_format_fn(x)))
     max_label_len = max(len(v) for v in taxon_label_map.values())
     for taxon in char_matrix:
         stream.write("        {taxon_label:{field_len}}    ".format(taxon_label=taxon_label_map[taxon],
             field_len=max_label_len))
         for state in char_matrix[taxon]:
             state_value_writer(state)
         stream.write("\n")
     stream.write("    ;\n")
     stream.write("END;\n\n\n")
     self._write_character_subsets(stream, char_matrix)
Exemplo n.º 5
0
 def _write_character_subsets(self, stream, char_matrix):
     if not hasattr(char_matrix, "character_subsets") or not char_matrix.character_subsets:
         return
     stream.write("BEGIN SETS;\n")
     for label, char_set in char_matrix.character_subsets.items():
         label = nexusprocessing.escape_nexus_token(char_set.label,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
         ranges = nexusprocessing.group_ranges(char_set.character_indices)
         pos = " ".join("-".join(str(c+1) for c in r) for r in ranges)
         stream.write("    charset {} = {};\n".format(label, pos))
     stream.write("END;\n\n\n")
Exemplo n.º 6
0
 def _write_character_subsets(self, stream, char_matrix):
     if not hasattr(char_matrix, "character_subsets") or not char_matrix.character_subsets:
         return
     stream.write("BEGIN SETS;\n")
     for label, char_set in char_matrix.character_subsets.items():
         label = nexusprocessing.escape_nexus_token(char_set.label,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
         ranges = nexusprocessing.group_ranges(char_set.character_indices)
         pos = " ".join("-".join(str(c+1) for c in r) for r in ranges)
         stream.write("    charset {} = {};\n".format(label, pos))
     stream.write("END;\n\n\n")
Exemplo n.º 7
0
 def _render_node_tag(self, node):
     """
     Based on current settings, the attributes of a node, and
     whether or not the node is a leaf, returns an appropriate tag.
     """
     tag = None
     if self.node_label_compose_fn:
         tag = self.node_label_compose_fn(node)
     else:
         tag_parts = []
         is_leaf = len(node.child_nodes()) == 0
         if is_leaf:
             if hasattr(node, 'taxon') \
                     and node.taxon \
                     and node.taxon.label is not None \
                     and not self.suppress_leaf_taxon_labels:
                 tag_parts.append(self._get_taxon_tree_token(node.taxon))
             if hasattr(node, 'label') \
                     and node.label \
                     and node.label is not None \
                     and not self.suppress_leaf_node_labels:
                 tag_parts.append(str(node.label))
             if len(tag_parts) > 0:
                 tag = self.node_label_element_separator.join(tag_parts)
             else:
                 return ""  # anonymous leaf
         else:
             if hasattr(node, 'taxon') \
                     and node.taxon \
                     and node.taxon.label is not None \
                     and not self.suppress_internal_taxon_labels:
                 tag_parts.append(self._get_taxon_tree_token(node.taxon))
             if hasattr(node, 'label') \
                     and node.label \
                     and node.label is not None \
                     and not self.suppress_internal_node_labels:
                 tag_parts.append(str(node.label))
             if len(tag_parts) > 0:
                 tag = self.node_label_element_separator.join(tag_parts)
             else:
                 return ""
     if tag:
         tag = nexusprocessing.escape_nexus_token(
             tag,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores)
         return tag
     else:
         return ""
Exemplo n.º 8
0
 def _write_taxa_block(self, stream, taxon_namespace):
     stream.write("BEGIN TAXA;\n")
     self._write_block_title(stream, taxon_namespace)
     self._write_item_annotations(stream, taxon_namespace)
     self._write_item_comments(stream, taxon_namespace)
     stream.write("    DIMENSIONS NTAX={};\n".format(len(taxon_namespace)))
     stream.write("    TAXLABELS\n")
     for taxon in taxon_namespace:
         stream.write("        {}\n".format(
             nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores),
             ))
         self._write_item_annotations(stream, taxon)
         self._write_item_comments(stream, taxon)
     stream.write("  ;\n")
     stream.write("END;\n\n")
Exemplo n.º 9
0
 def _render_node_tag(self, node):
     """
     Based on current settings, the attributes of a node, and
     whether or not the node is a leaf, returns an appropriate tag.
     """
     tag = None
     if self.node_label_compose_fn:
         tag = self.node_label_compose_fn(node)
     else:
         tag_parts = []
         is_leaf = len(node.child_nodes()) == 0
         if is_leaf:
             if hasattr(node, 'taxon') \
                     and node.taxon \
                     and node.taxon.label is not None \
                     and not self.suppress_leaf_taxon_labels:
                 tag_parts.append(self._get_taxon_tree_token(node.taxon))
             if hasattr(node, 'label') \
                     and node.label \
                     and node.label is not None \
                     and not self.suppress_leaf_node_labels:
                 tag_parts.append(str(node.label))
             if len(tag_parts) > 0:
                 tag = self.node_label_element_separator.join(tag_parts)
             else:
                 return "" # anonymous leaf
         else:
             if hasattr(node, 'taxon') \
                     and node.taxon \
                     and node.taxon.label is not None \
                     and not self.suppress_internal_taxon_labels:
                 tag_parts.append(self._get_taxon_tree_token(node.taxon))
             if hasattr(node, 'label') \
                     and node.label \
                     and node.label is not None \
                     and not self.suppress_internal_node_labels:
                 tag_parts.append(str(node.label))
             if len(tag_parts) > 0:
                 tag = self.node_label_element_separator.join(tag_parts)
             else:
                 return ""
     if tag:
         tag = nexusprocessing.escape_nexus_token(tag,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
         return tag
     else:
         return ""
Exemplo n.º 10
0
 def _write_taxa_block(self, stream, taxon_namespace):
     stream.write("BEGIN TAXA;\n")
     self._write_block_title(stream, taxon_namespace)
     self._write_item_annotations(stream, taxon_namespace)
     self._write_item_comments(stream, taxon_namespace)
     taxon_to_include = self._get_taxa_to_include(taxon_namespace)
     stream.write("    DIMENSIONS NTAX={};\n".format(len(taxon_to_include)))
     stream.write("    TAXLABELS\n")
     for taxon in taxon_to_include:
         stream.write("        {}\n".format(
             nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores),
             ))
         self._write_item_annotations(stream, taxon)
         self._write_item_comments(stream, taxon)
     stream.write("  ;\n")
     stream.write("END;\n\n")
Exemplo n.º 11
0
 def _write_trees_block(self, stream, tree_list):
     stream.write("BEGIN TREES;\n")
     self._write_block_title(stream, tree_list)
     self._write_item_annotations(stream, tree_list)
     self._write_item_comments(stream, tree_list)
     self._write_link_to_taxa_block(stream, tree_list.taxon_namespace)
     self._set_and_write_translate_block(stream, tree_list.taxon_namespace)
     for tree_idx, tree in enumerate(tree_list):
         if tree.label:
             tree_name = tree.label
         else:
             tree_name = str(tree_idx+1)
         tree_name = nexusprocessing.escape_nexus_token(
                 tree_name,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
         stream.write("    TREE {} = ".format(tree_name))
         self._newick_writer._write_tree(stream, tree)
         stream.write("\n")
     stream.write("END;\n\n")
Exemplo n.º 12
0
 def _write_trees_block(self, stream, tree_list):
     stream.write("BEGIN TREES;\n")
     self._write_block_title(stream, tree_list)
     self._write_item_annotations(stream, tree_list)
     self._write_item_comments(stream, tree_list)
     self._write_link_to_taxa_block(stream, tree_list.taxon_namespace)
     self._set_and_write_translate_block(stream, tree_list.taxon_namespace)
     for tree_idx, tree in enumerate(tree_list):
         if tree.label:
             tree_name = tree.label
         else:
             tree_name = str(tree_idx + 1)
         tree_name = nexusprocessing.escape_nexus_token(
             tree_name,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores)
         stream.write("    TREE {} = ".format(tree_name))
         self._newick_writer._write_tree(stream, tree)
         stream.write("\n")
     stream.write("END;\n\n")
Exemplo n.º 13
0
 def _set_and_write_translate_block(self, stream, taxon_namespace):
     if not self.translate_tree_taxa:
         self._newick_writer.taxon_token_map = None
         return
     if self.translate_tree_taxa is True:
         m = {}
         for taxon_idx, t in enumerate(taxon_namespace):
             m[t] = str(taxon_namespace.accession_index(t)+1)
             # m[t] = str(taxon_idx)
         self._newick_writer.taxon_token_map = m
     else:
         self._newick_writer.taxon_token_map = dict(self.translate_tree_taxa)
     stream.write("        Translate\n")
     statement = []
     for taxon in taxon_namespace:
         label = nexusprocessing.escape_nexus_token(str(taxon.label),
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
         statement.append("             {} {}".format(self._newick_writer.taxon_token_map[taxon], label))
     statement = ",\n".join(statement)
     stream.write("{}\n             ;\n".format(statement))
Exemplo n.º 14
0
 def _set_and_write_translate_block(self, stream, taxon_namespace):
     if not self.translate_tree_taxa:
         self._newick_writer.taxon_token_map = None
         return
     if self.translate_tree_taxa is True:
         m = {}
         for taxon_idx, t in enumerate(taxon_namespace):
             m[t] = str(taxon_namespace.accession_index(t)+1)
             # m[t] = str(taxon_idx)
         self._newick_writer.taxon_token_map = m
     else:
         self._newick_writer.taxon_token_map = dict(self.translate_tree_taxa)
     stream.write("        Translate\n")
     statement = []
     for taxon in taxon_namespace:
         label = nexusprocessing.escape_nexus_token(str(taxon.label),
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
         statement.append("             {} {}".format(self._newick_writer.taxon_token_map[taxon], label))
     statement = ",\n".join(statement)
     stream.write("{}\n             ;\n".format(statement))