Exemple #1
0
 def write_trees_block(self, tree_list, stream):
     block = []
     newick_writer = newick.NewickWriter(
             suppress_rooting=self.suppress_rooting,
             suppress_edge_lengths=self.suppress_edge_lengths,
             unquoted_underscores=self.unquoted_underscores,
             preserve_spaces=self.preserve_spaces,
             store_tree_weights=self.store_tree_weights,
             suppress_annotations=self.suppress_annotations,
             annotations_as_nhx=self.annotations_as_nhx,
             suppress_item_comments=self.suppress_item_comments,
             suppress_leaf_taxon_labels=self.suppress_leaf_taxon_labels,
             suppress_leaf_node_labels=self.suppress_leaf_node_labels,
             suppress_internal_taxon_labels=self.suppress_internal_taxon_labels,
             suppress_internal_node_labels=self.suppress_internal_node_labels,
             node_label_element_separator=self.node_label_element_separator,
             node_label_compose_func=self.node_label_compose_func,
             )
     block.append('BEGIN TREES;')
     if self._link_blocks():
         title = self.compose_block_title(tree_list)
         if title:
             block.append('    %s;' % title)
         if tree_list.taxon_set.labels:
             block.append('    LINK TAXA = %s;' % textutils.escape_nexus_token(tree_list.taxon_set.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores))
     for treeidx, tree in enumerate(tree_list):
         if tree.label:
             tree_name = tree.label
         else:
             tree_name = str(treeidx)
         newick_str = newick_writer.compose_tree(tree)
         block.append('    TREE %s = %s' % (textutils.escape_nexus_token(tree_name, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores),
             newick_str))
     block.append('END;\n\n')
     stream.write('\n'.join(block))
 def write_mesquite_association_block(self, out, domain_taxon_set_title=None, range_taxon_set_title=None):
     """
     For debugging purposes ...
     """
     out.write("BEGIN TaxaAssociation;\n")
     if self.label:
         title = self.label
     else:
         title = self.oid
     out.write("    TITLE %s;\n"  % textutils.escape_nexus_token(title))
     if domain_taxon_set_title is None:
         if self.domain_taxon_set.label:
             domain_taxon_set_title = self.domain_taxon_set.label
         else:
             domain_taxon_set_title = self.domain_taxon_set.oid
     if range_taxon_set_title is None:
         if self.range_taxon_set.label:
             range_taxon_set_title = self.range_taxon_set.label
         else:
             range_taxon_set_title = self.range_taxon_set.oid
     out.write("    TAXA %s, %s;\n" % (
         textutils.escape_nexus_token(range_taxon_set_title),
         textutils.escape_nexus_token(domain_taxon_set_title)
         ))
     out.write("    ASSOCIATES\n")
     out.write(self.mesquite_association_rows() + "\n")
     out.write("    ;\n")
     out.write("END;\n")
Exemple #3
0
 def write_mesquite_association_block(self, out, domain_taxon_set_title=None, range_taxon_set_title=None):
     """
     For debugging purposes ...
     """
     out.write("BEGIN TaxaAssociation;\n")
     if self.label:
         title = self.label
     else:
         title = self.oid
     out.write("    TITLE %s;\n"  % textutils.escape_nexus_token(title))
     if domain_taxon_set_title is None:
         if self.domain_taxon_set.label:
             domain_taxon_set_title = self.domain_taxon_set.label
         else:
             domain_taxon_set_title = self.domain_taxon_set.oid
     if range_taxon_set_title is None:
         if self.range_taxon_set.label:
             range_taxon_set_title = self.range_taxon_set.label
         else:
             range_taxon_set_title = self.range_taxon_set.oid
     out.write("    TAXA %s, %s;\n" % (
         textutils.escape_nexus_token(range_taxon_set_title),
         textutils.escape_nexus_token(domain_taxon_set_title)
         ))
     out.write("    ASSOCIATES\n")
     out.write(self.mesquite_association_rows() + "\n")
     out.write("    ;\n")
     out.write("END;\n")
Exemple #4
0
 def mesquite_association_rows(self):
     rows = []
     for rt in self.reverse:
         x1 = textutils.escape_nexus_token(rt.label)
         dt_labels = [dt.label for dt in self.reverse[rt]]
         dt_labels.sort()
         x2 = " ".join([textutils.escape_nexus_token(d) for d in dt_labels])
         rows.append("        %s / %s" % (x1, x2))
     return ",\n".join(rows)
Exemple #5
0
 def write_char_block(self, char_matrix, stream):
     nexus = []
     taxlabels = [textutils.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) for taxon in char_matrix.taxon_set]
     max_label_len = max([len(label) for label in taxlabels])
     nchar = max([len(seq) for seq in char_matrix.values()])
     if self.simple:
         nexus.append('BEGIN DATA;')
         ntaxstr = "NTAX=%d" % len(taxlabels)
     else:
         nexus.append('BEGIN CHARACTERS;')
         ntaxstr = ""
     if self._link_blocks():
         title = self.compose_block_title(char_matrix)
         if title:
             nexus.append('    %s;' % title)
         if char_matrix.taxon_set.label:
             nexus.append('    LINK TAXA = %s;' % textutils.escape_nexus_token(char_matrix.taxon_set.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores))
     nexus.append('    DIMENSIONS %s NCHAR=%d;' % (ntaxstr, nchar))
     nexus.append('    FORMAT %s;' % self.compose_format_terms(char_matrix))
     nexus.append('    MATRIX')
     state_string_map = {}
     if isinstance(char_matrix, dataobject.ContinuousCharacterMatrix):
         for taxon in char_matrix.taxon_set:
             seq = " ".join([str(v) for v in char_matrix[taxon]])
             nexus.append('%s    %s' % (textutils.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores).ljust(max_label_len), seq))
     else:
         for taxon in char_matrix.taxon_set:
             seq_vec = char_matrix[taxon]
             seq = StringIO()
             for cell in seq_vec:
                 state = cell.value
                 assert state is not None, "Undefined state encountered in character sequence."
                 try:
                     seq.write(state_string_map[state])
                 except:
                     if state.symbol is not None:
                         state_string_map[state] = state.symbol
                     elif state.multistate == dataobject.StateAlphabetElement.AMBIGUOUS_STATE:
                         state_string_map[state] = "{%s}" % ("".join(state.fundamental_symbols))
                     elif state.multistate == dataobject.StateAlphabetElement.POLYMORPHIC_STATE:
                         state_string_map[state] = "(%s)" % ("".join(state.fundamental_symbols))
                     else:
                         raise Exception("Could not match character state to symbol: '%s'." % state)
                     seq.write(state_string_map[state])
             nexus.append('%s    %s' % (textutils.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores).ljust(max_label_len), seq.getvalue()))
     nexus.append('    ;')
     nexus.append('END;\n\n')
     if hasattr(char_matrix, "character_subsets"):
         nexus.append('BEGIN SETS;')
         for label, char_set in char_matrix.character_subsets.items():
             label = textutils.escape_nexus_token(char_set.label,
                     preserve_spaces=self.preserve_spaces,
                     quote_underscores=not self.unquoted_underscores)
             pos = " ".join(str(c+1) for c in char_set.character_indices)
             nexus.append('    charset %s = %s;\n' % (label, pos))
         nexus.append('END;\n\n')
     stream.write('\n'.join(nexus))
 def mesquite_association_rows(self):
     rows = []
     for rt in self.reverse:
         x1 = textutils.escape_nexus_token(rt.label)
         dt_labels = [dt.label for dt in self.reverse[rt]]
         dt_labels.sort()
         x2 = " ".join([textutils.escape_nexus_token(d) for d in dt_labels])
         rows.append("        %s / %s" % (x1, x2))
     return ",\n".join(rows)
 def write_taxa_block(self, taxon_set, stream):
     block = []
     block.append("BEGIN TAXA;")
     if not self.suppress_annotations:
         block.append(nexustokenizer.format_annotation_as_comments(taxon_set, nhx=self.annotations_as_nhx))
     if self._link_blocks():
         title = self.compose_block_title(taxon_set)
         if title:
             block.append("    %s;" % title)
     block.append("    DIMENSIONS NTAX=%d;" % len(taxon_set))
     block.append("    TAXLABELS")
     for taxon in taxon_set:
         if self.suppress_annotations:
             annotation_str = ""
         else:
             annotation_str = " " + nexustokenizer.format_annotation_as_comments(taxon, nhx=self.annotations_as_nhx)
         block.append(
             "        %s%s"
             % (
                 textutils.escape_nexus_token(
                     taxon.label,
                     preserve_spaces=self.preserve_spaces,
                     quote_underscores=not self.unquoted_underscores,
                 ),
                 annotation_str,
             )
         )
     block.append("  ;")
     block.append("END;\n\n")
     stream.write("\n".join(block))
Exemple #8
0
 def write_taxa_block(self, taxon_set, stream):
     block = []
     block.append('BEGIN TAXA;')
     if not self.suppress_annotations:
         block.append(
             nexustokenizer.format_annotation_as_comments(
                 taxon_set, nhx=self.annotations_as_nhx))
     if self._link_blocks():
         title = self.compose_block_title(taxon_set)
         if title:
             block.append('    %s;' % title)
     block.append('    DIMENSIONS NTAX=%d;' % len(taxon_set))
     block.append('    TAXLABELS')
     for taxon in taxon_set:
         if self.suppress_annotations:
             annotation_str = ""
         else:
             annotation_str = " " + nexustokenizer.format_annotation_as_comments(
                 taxon, nhx=self.annotations_as_nhx)
         block.append('        %s%s' % (textutils.escape_nexus_token(
             taxon.label,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores),
                                        annotation_str))
     block.append('  ;')
     block.append('END;\n\n')
     stream.write('\n'.join(block))
Exemple #9
0
 def write_trees_block(self, tree_list, stream):
     block = []
     newick_writer = newick.NewickWriter(
         suppress_rooting=self.suppress_rooting,
         suppress_edge_lengths=self.suppress_edge_lengths,
         unquoted_underscores=self.unquoted_underscores,
         preserve_spaces=self.preserve_spaces,
         store_tree_weights=self.store_tree_weights,
         suppress_annotations=self.suppress_annotations,
         annotations_as_nhx=self.annotations_as_nhx,
         suppress_item_comments=self.suppress_item_comments,
         suppress_leaf_taxon_labels=self.suppress_leaf_taxon_labels,
         suppress_leaf_node_labels=self.suppress_leaf_node_labels,
         suppress_internal_taxon_labels=self.suppress_internal_taxon_labels,
         suppress_internal_node_labels=self.suppress_internal_node_labels,
         node_label_element_separator=self.node_label_element_separator,
         node_label_compose_func=self.node_label_compose_func,
         edge_label_compose_func=self.edge_label_compose_func,
     )
     block.append('BEGIN TREES;')
     if not self.suppress_annotations:
         block.append(
             nexustokenizer.format_annotation_as_comments(
                 tree_list, nhx=self.annotations_as_nhx))
     if self._link_blocks():
         title = self.compose_block_title(tree_list)
         if title:
             block.append('    %s;' % title)
         if tree_list.taxon_set.labels:
             block.append(
                 '    LINK TAXA = %s;' % textutils.escape_nexus_token(
                     tree_list.taxon_set.label,
                     preserve_spaces=self.preserve_spaces,
                     quote_underscores=not self.unquoted_underscores))
     for treeidx, tree in enumerate(tree_list):
         if tree.label:
             tree_name = tree.label
         else:
             tree_name = str(treeidx)
         newick_str = newick_writer.compose_tree(tree)
         block.append('    TREE %s = %s' % (textutils.escape_nexus_token(
             tree_name,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores), newick_str))
     block.append('END;\n\n')
     stream.write('\n'.join(block))
Exemple #10
0
 def choose_display_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_func:
         tag = self.node_label_compose_func(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(str(node.taxon.label))
             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(str(node.taxon.label))
             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 ""  # nada
     if tag:
         tag = textutils.escape_nexus_token(
             tag, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores
         )
         return tag
     else:
         return ""
Exemple #11
0
 def compose_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 ""
     if not block.label:
         block.label = block.oid
     if block.label:
         return "TITLE %s" % textutils.escape_nexus_token(block.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores)
     else:
         return ""
Exemple #12
0
 def write_taxa_block(self, taxon_set, stream):
     block = []
     block.append('BEGIN TAXA;')
     if self._link_blocks():
         title = self.compose_block_title(taxon_set)
         if title:
             block.append('    %s;' % title)
     block.append('    DIMENSIONS NTAX=%d;' % len(taxon_set))
     block.append('    TAXLABELS')
     for taxon in taxon_set:
         block.append('        %s' % textutils.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores))
     block.append('  ;')
     block.append('END;\n\n')
     stream.write('\n'.join(block))
Exemple #13
0
 def choose_display_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_func:
         tag = self.node_label_compose_func(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(str(node.taxon.label))
             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(str(node.taxon.label))
             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 ""  # nada
     if tag:
         tag = textutils.escape_nexus_token(
             tag,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores)
         return tag
     else:
         return ""
Exemple #14
0
 def compose_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 ""
     if not block.label:
         block.label = block.oid
     if block.label:
         return "TITLE %s" % textutils.escape_nexus_token(
             block.label,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores)
     else:
         return ""
Exemple #15
0
 def write_taxa_block(self, taxon_set, stream):
     block = []
     block.append('BEGIN TAXA;')
     if self._link_blocks():
         title = self.compose_block_title(taxon_set)
         if title:
             block.append('    %s;' % title)
     block.append('    DIMENSIONS NTAX=%d;' % len(taxon_set))
     block.append('    TAXLABELS')
     for taxon in taxon_set:
         block.append('        %s' % textutils.escape_nexus_token(
             taxon.label,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores))
     block.append('  ;')
     block.append('END;\n\n')
     stream.write('\n'.join(block))
def write_as_nexus(stream, patterns, label):
    global LAST_COMMAND
    stream.write("\n[!%s ]\n" % label)
    p = patterns[0]
    num_chars = len(patterns)
    num_areas = len(p)
    if num_areas < len(AREA_NAME_LIST):
        warn(
            '%d labels were found in the labels file, but only %d areas were read in the input NEXUS files'
            % (len(AREA_NAME_LIST), num_areas))
    elif num_areas > len(AREA_NAME_LIST):
        warn(
            'Only %d labels were found in the labels file, but %d areas were read in the input NEXUS files'
            % (len(AREA_NAME_LIST), num_areas))
    stream.write("""Begin Data;
    Dimensions ntax = %d nchar = %d;
    Format datatype=standard symbols="012" ;
    Matrix \n""" % (num_areas, num_chars))
    for area_ind in range(num_areas):
        if AREA_NAME_LIST:
            try:
                name = AREA_NAME_LIST[area_ind]
            except:
                name = 'unlabelled area ' + str(1 + area_ind)
        else:
            name = "area%d" % area_ind
        name = escape_nexus_token(name)
        padding = ' ' * (col_width - len(name))
        stream.write("%s%s" % (name, padding))
        for p in patterns:
            stream.write(" %s" % str(p[area_ind]))
        stream.write("\n")
    if num_areas > 11:
        search = "HSearch"
    else:
        search = "BAndB"
    stream.write(""";
End;
Begin Paup;
    typeset * o = ord : 1-. ;
    %s ;
    SaveTrees from =1 to=100 file = %s.tre;
    %s
End;
""" % (search, label, LAST_COMMAND))
    stream.flush()
def write_as_nexus(stream, patterns, label):
    global LAST_COMMAND
    stream.write("\n[!%s ]\n" % label)
    p = patterns[0]
    num_chars = len(patterns)
    num_areas = len(p)
    if num_areas < len(AREA_NAME_LIST):
        warn('%d labels were found in the labels file, but only %d areas were read in the input NEXUS files' % (
                    len(AREA_NAME_LIST),
                    num_areas))
    elif num_areas > len(AREA_NAME_LIST):
        warn('Only %d labels were found in the labels file, but %d areas were read in the input NEXUS files' % (
                    len(AREA_NAME_LIST),
                    num_areas))
    stream.write("""Begin Data;
    Dimensions ntax = %d nchar = %d;
    Format datatype=standard symbols="012" ;
    Matrix \n""" % (num_areas, num_chars))
    for area_ind in range(num_areas):
        if AREA_NAME_LIST:
            try:
                name = AREA_NAME_LIST[area_ind]
            except:
                name = 'unlabelled area ' + str(1 + area_ind)
        else:
            name = "area%d" % area_ind
        name = escape_nexus_token(name)
        padding = ' ' * (col_width - len(name))
        stream.write("%s%s" % (name, padding))
        for p in patterns:
            stream.write(" %s" % str(p[area_ind]))
        stream.write("\n")
    if num_areas > 11:
        search = "HSearch"
    else:
        search = "BAndB"
    stream.write(""";
End;
Begin Paup;
    typeset * o = ord : 1-. ;
    %s ;
    SaveTrees from =1 to=100 file = %s.tre;
    %s
End;
""" % (search, label, LAST_COMMAND))
    stream.flush()
Exemple #18
0
 def write_taxa_block(self, taxon_set, stream):
     block = []
     block.append("BEGIN TAXA;")
     if self._link_blocks():
         title = self.compose_block_title(taxon_set)
         if title:
             block.append("    %s;" % title)
     block.append("    DIMENSIONS NTAX=%d;" % len(taxon_set))
     block.append("    TAXLABELS")
     for taxon in taxon_set:
         block.append(
             "        %s"
             % textutils.escape_nexus_token(
                 taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores
             )
         )
     block.append("  ;")
     block.append("END;\n\n")
     stream.write("\n".join(block))
Exemple #19
0
 def write_char_block(self, char_matrix, stream):
     nexus = []
     taxlabels = [
         textutils.escape_nexus_token(
             taxon.label,
             preserve_spaces=self.preserve_spaces,
             quote_underscores=not self.unquoted_underscores)
         for taxon in char_matrix.taxon_set
     ]
     max_label_len = max([len(label) for label in taxlabels])
     nchar = max([len(seq) for seq in char_matrix.values()])
     if self.simple:
         nexus.append('BEGIN DATA;')
         ntaxstr = "NTAX=%d" % len(taxlabels)
     else:
         nexus.append('BEGIN CHARACTERS;')
         ntaxstr = ""
     if self._link_blocks():
         title = self.compose_block_title(char_matrix)
         if title:
             nexus.append('    %s;' % title)
         if char_matrix.taxon_set.label:
             nexus.append(
                 '    LINK TAXA = %s;' % textutils.escape_nexus_token(
                     char_matrix.taxon_set.label,
                     preserve_spaces=self.preserve_spaces,
                     quote_underscores=not self.unquoted_underscores))
     nexus.append('    DIMENSIONS %s NCHAR=%d;' % (ntaxstr, nchar))
     nexus.append('    FORMAT %s;' % self.compose_format_terms(char_matrix))
     nexus.append('    MATRIX')
     state_string_map = {}
     if isinstance(char_matrix, dataobject.ContinuousCharacterMatrix):
         for taxon in char_matrix.taxon_set:
             seq = " ".join([str(v) for v in char_matrix[taxon]])
             nexus.append('%s    %s' % (textutils.escape_nexus_token(
                 taxon.label,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores).ljust(
                     max_label_len), seq))
     else:
         for taxon in char_matrix.taxon_set:
             try:
                 seq_vec = char_matrix[taxon]
             except KeyError:
                 continue
             seq = StringIO()
             for cell in seq_vec:
                 state = cell.value
                 assert state is not None, "Undefined state encountered in character sequence."
                 try:
                     seq.write(state_string_map[state])
                 except:
                     if state.symbol is not None:
                         state_string_map[state] = state.symbol
                     elif state.multistate == dataobject.StateAlphabetElement.AMBIGUOUS_STATE:
                         state_string_map[state] = "{%s}" % ("".join(
                             state.fundamental_symbols))
                     elif state.multistate == dataobject.StateAlphabetElement.POLYMORPHIC_STATE:
                         state_string_map[state] = "(%s)" % ("".join(
                             state.fundamental_symbols))
                     else:
                         raise Exception(
                             "Could not match character state to symbol: '%s'."
                             % state)
                     seq.write(state_string_map[state])
             nexus.append('%s    %s' % (textutils.escape_nexus_token(
                 taxon.label,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores).ljust(
                     max_label_len), seq.getvalue()))
     nexus.append('    ;')
     nexus.append('END;\n\n')
     if hasattr(char_matrix, "character_subsets"):
         nexus.append('BEGIN SETS;')
         for label, char_set in char_matrix.character_subsets.items():
             label = textutils.escape_nexus_token(
                 char_set.label,
                 preserve_spaces=self.preserve_spaces,
                 quote_underscores=not self.unquoted_underscores)
             pos = " ".join(str(c + 1) for c in char_set.character_indices)
             nexus.append('    charset %s = %s;\n' % (label, pos))
         nexus.append('END;\n\n')
     stream.write('\n'.join(nexus))
                    if i in split:
                        stream.write('1')
                    else:
                        stream.write('0')
            else:
                stream.write('?'*len(split_list))
                        
    output.write("""#NEXUS
    Begin Data;
    Dimensions ntax = %d nchar = %d;
    Format datatype=standard symbols="01" Missing = ?;
    Matrix \n""" % (number_of_taxon + 1, branch_counter))

    escaped_names = []
    max_name_length = len('roottaxon')
    for t in taxon_set:
        name = t.label.split('@')[0]
        escaped_names.append(escape_nexus_token(name))
        max_name_length = max(max_name_length, len(escaped_names[-1]))
    fmt = '%%-%ds %%s\n' %(max_name_length)
    for i,stream in enumerate(code_list):
        #esc_names,ottoid = escaped_names[i].split('@')
        #output.write(fmt %(esc_names,stream.getvalue()))
        output.write(fmt %(escaped_names[i],stream.getvalue()))
    output.write(fmt %('roottaxon','0'*branch_counter))    
    output.write(""";
    END;
    """)