
    Xf0                        d Z ddlZddlmZ ddlmZ  G d de          Zg dZ ej	        dd	
                    d
 eD                        d          Zd eD             Zd ZddZd Zd Zd Z G d d          Z G d d          ZdS )zxI/O function wrappers for the Newick file format.

See: http://evolution.genetics.washington.edu/phylip/newick_doc.html
    NStringIO)Newickc                       e Zd ZdZdS )NewickErrorzAException raised when Newick object construction cannot continue.N)__name__
__module____qualname____doc__     2lib/python3.11/site-packages/Bio/Phylo/NewickIO.pyr   r      s        KKKKr   r   )	)z\(zopen parens)z\)zclose parens)z[^\s\(\)\[\]\'\:\;\,]+unquoted node label)z+\:\ ?[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?zedge length)z\,comma)z\[(\\.|[^\]])*\]comment)z\'(\\.|[^\'])*\'zquoted node label)z\;	semicolon)z\nnewline(|c              #   &   K   | ]}|d          V  dS )r   Nr   ).0tokens     r   	<genexpr>r   $   s&      #A#AE!H#A#A#A#A#A#Ar   )c                 >    i | ]\  }}|t          j        |          S r   )recompile)r   r   names      r   
<dictcomp>r   %   s(    @@@+%dBJu%%@@@r   c                 6     t          |           j        di |S )zpIterate over the trees in a Newick file handle.

    :returns: generator of Bio.Phylo.Newick.Tree objects.

    r   )Parserparse)handlekwargss     r   r"   r"   ,   s#      6&>>))&)))r   Fc                 <     t          |           j        |fd|i|S )zfWrite a trees in Newick format to the given file handle.

    :returns: number of trees written.

    plain)Writerwrite)treesr#   r&   r$   s       r   r(   r(   5   s*     6%==v==U=f===r   c                     |                                  rt          |           S 	 t          |           S # t          $ r Y d S w xY wN)isdigitintfloat
ValueErrortexts    r   _parse_confidencer2   B   sS    ||~~ 4yyT{{    tts   4 
AAc                 \    d|                      dd                               dd          z  S )Nz[%s][z\[]z\])replacer0   s    r   _format_commentr7   O   s+    T\\#u--55c5AABBr   c                 t    	 | j         }|rt          t          |                    S n# t          $ r Y nw xY wdS )N )r   r7   strAttributeError)clader   s     r   _get_commentr=   S   sZ    1-  	1"3w<<000	1    
 2s   ( 
55c                   L    e Zd ZdZd Zed             Z	 d
dZd ZddZ	d	 Z
dS )r!   z^Parse a Newick tree given a file handle.

    Based on the parser in ``Bio.Nexus.Trees``.
    c                 f    |                     d          dk    rt          d          d|| _        dS )z+Initialize file handle for the Newick Tree.r   r9   z(Newick files must be opened in text modeN)readr/   r#   )selfr#   s     r   __init__zParser.__init__d   s3    ;;q>>RGHHdRr   c                 6    t          |          } | |          S )z8Instantiate the Newick Tree class from the given string.r   )clstreetextr#   s      r   from_stringzParser.from_stringj   s     (##s6{{r   Fc              #     K   || _         || _        || _        d}| j        D ]G}||                                z  }|                    d          r|                     |          V  d}H|r|                     |          V  dS dS )z7Parse the text stream this object was initialized with.r9   ;N)values_are_confidencecomments_are_confidencerootedr#   rstripendswith_parse_tree)rA   rI   rJ   rK   buflines         r   r"   zParser.parsep   s       &;"'>$K 	 	D4;;== C||C   &&s+++++ 	(""3'''''''	( 	(r   c                    t          j        t          |                                          }| j        } |            }|}d}d}d}|D ]k}	|	                                }
|
                    d          r|
dd         |_        <|
                    d          r0|
dd         |_        | j	        rt          |j                  |_        |
dk    r ||          }d}|dz  }|
dk    r8||u r |            }||_        |                     |          } ||          }d}|
d	k    r1|                     |          }|st          d
          |}d}|dz  }|
dk    r nV|
                    d          r0t          |
dd                   }| j        r	||_        S||_        \|
dk    rd|
|_        m||k    rt          d| d| d          	 t%          |          }t          d|                                           # t&          $ r Y nw xY w|                     |           |                     |           t)          j        || j                  S )z<Parse the text representation into an Tree object (PRIVATE).Fr   '   r4   r   ,r   zParenthesis mismatch.rH   :N
z
Mismatch, z	 open vs z close parentheses.z%Text after semicolon in Newick tree: )rootrK   )r   finditer	tokenizerstrip	new_cladegroup
startswithr   r   rJ   r2   
confidenceparentprocess_clader   r.   rI   branch_lengthnextStopIterationr   TreerK   )rA   r1   tokensr\   
root_cladecurrent_cladeentering_branch_lengthlp_countrp_countmatchr   r`   value
next_tokens                 r   rN   zParser._parse_tree   s   Y

55N	Y[[
"!& 8	+ 8	+EKKMME$$ 5+%*1R4[""!!#&& 1+(-ad%/ X/@AV/W/WM,# )	- 8 8).&A# !J..!*J+5M(++M:: )	& 1 1).&&#++M:: ?%&=>>> &).&A#!!#&& +eABBi((- 8/4M,,27M//$ &+""xMXMMMMM  
	fJL
8H8H8J8JLL    	 	 	D	 	=))):&&&{
4;????s   3H 
HHNc                 >    t          j                    }|r||_        |S )zGReturn new Newick.Clade, optionally with temporary reference to parent.)r   Clader`   )rA   r`   r<   s      r   r\   zParser.new_clade   s!     	"!ELr   c                    |j         rC| j        s<| j        s5|j        .|j        r't          |j                   |_        |j        d|_         	 |j        }|j                            |           |`|S # t          $ r Y dS w xY w)zERemove node's parent and return it. Final processing of parsed clade.N)	r   rI   rJ   r_   cladesr2   r`   appendr;   )rA   r<   r`   s      r   ra   zParser.process_clade   s     Z	"/	"373O	" !) *  1<<E+!
	\F M  '''M  	 	 	DD	s   A1 1
A?>A?)FFFr+   )r   r	   r
   r   rB   classmethodrF   r"   rN   r\   ra   r   r   r   r!   r!   ^   s         
     [ RW( ( ( ("V@ V@ V@p       r   r!   c                   <    e Zd ZdZd Zd Z	 	 	 	 	 	 	 	 dd
Zd ZdS )r'   z8Based on the writer in Bio.Nexus.Trees (str, to_string).c                     || _         dS )z,Initialize parameter for Tree Writer object.N)r)   )rA   r)   s     r   rB   zWriter.__init__   s    


r   c                 d    d} | j         di |D ]}|                    |dz              |dz  } |S )z-Write this instance's trees to a file handle.r   rW   rS   r   )
to_stringsr(   )rA   r#   r$   counttreestrs        r   r(   zWriter.write  sN    &t0000 	 	GLL4(((QJEEr   FTN      ?%1.2f%1.5fc	           	   #   
  K   |s|rd}|                      ||||||          fd| j        D ]}	|dv r|	                    |dv             |	j                  dz   }
|r|
V  8d|	j        pdd	g}|	j        d
k    r9|                    dt          t          |	j                  d           d           |	j	        r|                    d           |                    |
           d
                    |          V  dS )z1Return an iterable of PAUP-compatible tree lines.Fc                    | j         pd}|rtt          j        t          d         |          }|r%|                                t          |          k     r-d|                    dd                              dd          z  }|                                 r| | d	          z   S fd
| D             }dd                    |           d| |           z    S )z9Convert a node tree to a Newick tree string, recursively.r9   r   z'%s'\z\\rR   z\'T)terminalc              3   .   K   | ]} |          V  d S r+   r   )r   sub	newickizes     r   r   z7Writer.to_strings.<locals>.newickize.<locals>.<genexpr>,  s+      <<sIIcNN<<<<<<r   r   rU   r   )	r   r   rl   
token_dictendlenr6   is_terminaljoin)r<   labelunquoted_labelsubtreesmake_info_stringr   s       r   r   z$Writer.to_strings.<locals>.newickize!  s    J$"E U!#*5J*KU!S!S& UN,>,>,@,@3u::,M,M"U]]4%@%@%H%He%T%TTE  "" R//EEEEE<<<<e<<<Q388H--QQ8H8H8O8O0OQQQr   )leftLEFTrightRIGHT)r   r   )reverserH   treea_tree=rS   z[&W   r5   z[&R] N)_info_factoryr)   	ladderizerX   r   weightrs   roundr.   rK   r   )rA   confidence_as_branch_lengthbranch_length_onlyr&   plain_newickr   max_confidenceformat_confidenceformat_branch_lengthr   rawtreetreeliner   r   s               @@r   rx   zWriter.to_strings	  ss      ' 	*< 	E--' 
 
	R 	R 	R 	R 	R 	R J 	% 	%D>>>	5G(GIIIi	**S0G !6h=H{a EeE$+,>,>&B&B E E EFFF{ ('''OOG$$$((8$$$$$$	% 	%r   c                 N    |rdd}n|rdfd	}n|rdfd	}ndfd	}|S )zEReturn a function that creates a nicely formatted node tag (PRIVATE).Fc                      t          |           S r+   )r=   )r<   r   s     r   r   z.Writer._info_factory.<locals>.make_info_stringM  s    #E***r   c                 r    |rdz  z   t          |           z   S d| j        z  z   t          |           z   S NrV   )r=   r_   )r<   r   r   r   s     r   r   z.Writer._info_factory.<locals>.make_info_stringR  sb     "3n"DDI I    "3e6F"FF,K K  r   c                 >    d| j         z  z   t          |           z   S r   )rb   r=   )r<   r   r   s     r   r   z.Writer._info_factory.<locals>.make_info_string_  s)    .1DDD ''( (r   c                     |st          | d          r| j        dz   | j        pdz  t          |           z   S dz   z   | j        | j        pdfz  t          |           z   S )Nr_   rV   g        )hasattrr_   rb   r=   )r<   r   r   r   s     r   r   z.Writer._info_factory.<locals>.make_info_stringf  s    ,"5,77, '/"66+2s$U++, , .36JJ(+2sO  %U++, ,r   Fr   )rA   r&   r   r   r   r   r   r   s       ``` r   r   zWriter._info_factoryA  s      (	,+ + + + + ) #	,	 	 	 	 	 	 	 	   	,( ( ( ( ( ( (, , , , , , ,  r   )FFFTNr{   r|   r}   )r   r	   r
   r   rB   r(   rx   r   r   r   r   r'   r'      sv        BB     %* !$6% 6% 6% 6%p4  4  4  4  4 r   r'   r   )r   r   ior   	Bio.Phylor   	Exceptionr   rf   r   r   rZ   r   r"   r(   r2   r7   r=   r!   r'   r   r   r   <module>r      s   
 
			            L L L L L) L L L

 

 

 BJD388#A#A&#A#A#AAADDDEE	@@@@@
* * *> > > >
 
 
C C C  U U U U U U U Ux{  {  {  {  {  {  {  {  {  { r   