
    {Tio2                     >   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	j                  d
 eD               d      ZeD  ci c]  \  } }| ej                  |        c}} Zd ZddZd Zd Zd Z G d d      Z G d d      Zyc c}} w )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y)NewickErrorzAException raised when Newick object construction cannot continue.N)__name__
__module____qualname____doc__     E/home/agent/.local/lib/python3.12/site-packages/Bio/Phylo/NewickIO.pyr   r      s    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      yw)r   Nr   ).0tokens     r   	<genexpr>r   $   s     #AE!H#As   )c                 8     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   c                 >     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                 n    | j                         rt        |       S 	 t        |       S # t        $ r Y y w xY wN)isdigitintfloat
ValueErrortexts    r   _parse_confidencer-   B   s8    ||~4yT{  s   
( 	44c                 L    d| j                  dd      j                  dd      z  S )Nz[%s][z\[]z\])replacer+   s    r   _format_commentr2   O   s%    T\\#u-55c5ABBr   c                 h    	 | j                   }|rt        t        |            S y# t        $ r Y yw xY w)N )r   r2   strAttributeError)clader   s     r   _get_commentr8   S   s@    1-- "3w<00   s   % 	11c                   D    e Zd ZdZd Zed        Z	 d	dZd Zd
dZ	d Z
y)r   z^Parse a Newick tree given a file handle.

    Based on the parser in ``Bio.Nexus.Trees``.
    c                 R    |j                  d      dk7  rt        d      d|| _        y)z+Initialize file handle for the Newick Tree.r   r4   z(Newick files must be opened in text modeN)readr*   r   )selfr   s     r   __init__zParser.__init__d   s'    ;;q>RGHdRr   c                 (    t        |      } | |      S )z8Instantiate the Newick Tree class from the given string.r   )clstreetextr   s      r   from_stringzParser.from_stringj   s     (#6{r   c              #      K   || _         || _        || _        d}| j                  D ]<  }||j	                         z  }|j                  d      s(| j                  |       d}> |r| j                  |       yyw)z7Parse the text stream this object was initialized with.r4   ;N)values_are_confidencecomments_are_confidencerootedr   rstripendswith_parse_tree)r<   rD   rE   rF   buflines         r   r   zParser.parsep   s      &;"'>$KK 	D4;;= C||C &&s++		
 ""3'' s   AA<.A<c                 t   t        j                  t        |j                               }| j                  } |       }|}d}d}d}|D ]_  }	|	j                         }
|
j                  d      r0|j                  s|
dd |_        <|xj                  |
dd z  c_        U|
j                  d      r2|
dd |_        | j                  s}t        |j                        |_        |
dk(  r ||      }d}|dz  }|
d	k(  r.||u r |       }||_        | j                  |      } ||      }d}|
d
k(  r)| j                  |      }|st        d      |}d}|dz  }|
dk(  r nN|
j                  d      r,t        |
dd       }| j                   r	||_        I||_        R|
dk(  rY|
|_        b ||k7  rt        d| d| d      	 t%        |      }t        d|j                                # t&        $ r Y nw xY w| j                  |       | j                  |       t)        j*                  || j,                        S )z<Parse the text representation into an Tree object (PRIVATE).Fr   '   Nr/   r   ,r   zParenthesis mismatch.rC   :
z
Mismatch, z	 open vs z close parentheses.z%Text after semicolon in Newick tree: )rootrF   )refinditer	tokenizerstrip	new_cladegroup
startswithnamer   rE   r-   
confidenceparentprocess_clader   r)   rD   branch_lengthnextStopIterationr   TreerF   )r<   r,   tokensrX   
root_cladecurrent_cladeentering_branch_lengthlp_countrp_countmatchr   r]   value
next_tokens                 r   rI   zParser._parse_tree   s^   Y

5NN	[
"!& ?	+EKKME$$))).qM&
 "&&%*4&!!#&(-a%///@AVAV/WM,# )- 8).&A# !J.!*J+5M(++M: )& 1).&#++M:%&=>> &).&A#!!#&eABi(--/4M,27M/$ &+"?	+B xXJiz9LM 
	fJ7
8H8H8J7KL   		 	=):&{{
4;;??s   'G( (	G43G4Nc                 @    t        j                         }|r||_        |S )zGReturn new Newick.Clade, optionally with temporary reference to parent.)r   Clader]   )r<   r]   r7   s      r   rX   zParser.new_clade   s    !ELr   c                 J   |j                   r]| j                  sQ| j                  sE|j                  9|j                  r-t        |j                         |_        |j                  d|_         	 |j                  }|j                  j                  |       |`|S # t        $ r Y yw xY w)zERemove node's parent and return it. Final processing of parsed clade.N)	r[   rD   rE   r\   cladesr-   r]   appendr6   )r<   r7   r]   s      r   r^   zParser.process_clade   s     ZZ//43O3O!!)0<E+!
	\\F MM  'M  		s   +B 	B"!B")FFFr&   )r   r	   r
   r   r=   classmethodrA   r   rI   rX   r^   r   r   r   r   r   ^   s>    
   RW("]@~r   r   c                   :    e Zd ZdZd Zd Z	 	 	 	 	 	 	 	 ddZd Zy)r"   z8Based on the writer in Bio.Nexus.Trees (str, to_string).c                     || _         y)z,Initialize parameter for Tree Writer object.N)r$   )r<   r$   s     r   r=   zWriter.__init__  s	    
r   c                 j    d} | j                   di |D ]  }|j                  |dz          |dz  } |S )z-Write this instance's trees to a file handle.r   rR   rN   r   )
to_stringsr#   )r<   r   r   counttreestrs        r   r#   zWriter.write  sD    &t00 	GLL4(QJE	 r   Nc	           	   #     K   |s|rd}| j                  ||||||      fd| j                  D ]  }	|dv r|	j                  |dv         |	j                        dz   }
|r|
 7d|	j                  xs dd	g}|	j
                  d
k7  r2|j                  dt        t        |	j
                        d       d       |	j                  r|j                  d       |j                  |
       dj                  |        yw)z1Return an iterable of PAUP-compatible tree lines.Fc                 X   | j                   xs d}|rPt        j                  t        d   |      }|r|j	                         t        |      k  rd|j                  dd      z  }| j                         r| | d      z   S fd| D        }d	d
j                  |       d| |       z    S )z9Convert a node tree to a Newick tree string, recursively.r4   r   z'%s'rM   z''T)terminalc              3   .   K   | ]  } |        y wr&   r   )r   sub	newickizes     r   r   z7Writer.to_strings.<locals>.newickize.<locals>.<genexpr>3  s     <sIcN<s   r   rP   r   )	r[   rT   ri   
token_dictendlenr1   is_terminaljoin)r7   labelunquoted_labelsubtreesmake_info_stringr}   s       r   r}   z$Writer.to_strings.<locals>.newickize(  s    JJ$"E!#*5J*KU!S&N,>,>,@3u:,M"U]]3%==E  "/EEE<e<388H-.a8H8O0O/PQQr   )leftLEFTrightRIGHT)r   r   )reverserC   treea_tree=rN   z[&W   r0   z[&R] N)_info_factoryr$   	ladderizerS   r[   weightrp   roundr)   rF   r   )r<   confidence_as_branch_lengthbranch_length_onlyr!   plain_newickr   max_confidenceformat_confidenceformat_branch_lengthr   rawtreetreeliner   r}   s               @@r   ru   zWriter.to_strings  s     '*<E--' 
	R JJ 	%D>>	5G(GI		*S0G!6h=H{{a#eE$++,>&B%C1 EF{{'OOG$((8$$	%s   C>Dc                 T    |rdd}|S |r	dfd	}|S |rdfd	}|S dfd	}|S )zEReturn a function that creates a nicely formatted node tag (PRIVATE).c                     t        |       S r&   )r8   )r7   rz   s     r   r   z.Writer._info_factory.<locals>.make_info_stringT  s    #E**r   c                 l    |rdz  z   t        |       z   S d| j                  z  z   t        |       z   S )NrQ   )r8   r\   )r7   rz   r   r   s     r   r   z.Writer._info_factory.<locals>.make_info_stringY  sT    "3n"DDI    "3e6F6F"FF,K  r   c                 H    d| j                   xs dz  z   t        |       z   S )NrQ           )r_   r8   )r7   rz   r   s     r   r   z.Writer._info_factory.<locals>.make_info_stringf  s.    .%2E2E2LMM '( (r   c                     |st        | d      r| j                  "dz   | j                  xs dz  t        |       z   S dz   z   | j                  | j                  xs dfz  t        |       z   S )Nr\   rQ   r   )hasattrr\   r_   r8   )r7   rz   r   r   s     r   r   z.Writer._info_factory.<locals>.make_info_stringm  s    "5,7''/"66++2s$U+, , .36JJ((++2sO  %U+, ,r   Fr   )r<   r!   r   r   r   r   r   r   s       ``` r   r   zWriter._info_factoryH  sI     +P  K )	F  1  (,  ,  r   )FFFTNg      ?z%1.2fz%1.5f)r   r	   r
   r   r=   r#   ru   r   r   r   r   r"   r"     s4    B %* !$6%p4 r   r"   r   )r   rT   ior   	Bio.Phylor   	Exceptionr   rc   compiler   rV   r~   r   r#   r-   r2   r8   r   r"   )r   r[   s   00r   <module>r      s   
 
  L) L

 BJJ388#A&#AAB!DE	9?@+%dJBJJu%%@
*>
C\ \F{  { y As   B