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")
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_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 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))
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))
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))
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 ""
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 ""
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 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 ""
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 ""
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()
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_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; """)