
:>"^2              
   @   s  d  Z  d d l Z d d l m Z d d l m Z Gd d   d e  Z d. d/ d0 d1 d2 d3 d4 d5 d6 g	 Z e j	 d d j
 d d   e D   Z d d   e D Z d d    Z d! d" d#  Z d$ d%   Z d& d'   Z d( d)   Z Gd* d+   d+ e  Z Gd, d-   d- e  Z d S)7zxI/O function wrappers for the Newick file format.

See: http://evolution.genetics.washington.edu/phylip/newick_doc.html
    N)StringIO)Newickc               @   s   e  Z d  Z d Z d S)NewickErrorzAException raised when Newick object construction cannot continue.N)__name__
__module____qualname____doc__ r	   r	   7/tmp/pip-build-ww9dw3qa/biopython/Bio/Phylo/NewickIO.pyr      s   r   \(open parens\)close parens[^\s\(\)\[\]\'\:\;\,]+unquoted node label+\:\ ?[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?edge length\,comma\[(\\.|[^\]])*\]comment\'(\\.|[^\'])*\'quoted node label\;	semicolon\nnewlinez(%s)|c             c   s   |  ] } | d  Vq d S)r   Nr	   ).0tokenr	   r	   r
   	<genexpr>&   s    r    c             C   s(   i  |  ] \ } } t  j |  |  q Sr	   )recompile)r   r   namer	   r	   r
   
<dictcomp>'   s   	 r$   c             K   s   t  |   j |   S)zpIterate over the trees in a Newick file handle.

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

    )Parserparse)handlekwargsr	   r	   r
   r&   .   s    r&   Fc             K   s   t  |   j | d | | S)zfWrite a trees in Newick format to the given file handle.

    :returns: number of trees written.

    plain)Writerwrite)treesr'   r)   r(   r	   r	   r
   r+   7   s    r+   c             C   sA   |  j    r t |   Sy t |   SWn t k
 r< d  SYn Xd  S)N)isdigitintfloat
ValueError)textr	   r	   r
   _parse_confidenceD   s    
r2   c             C   s    d |  j  d d  j  d d  S)Nz[%s][z\[]z\])replace)r1   r	   r	   r
   _format_commentQ   s    r6   c             C   s3   t  |  d  r+ |  j r+ t t |  j   Sd Sd  S)Nr    )hasattrr   r6   str)clader	   r	   r
   _get_commentU   s    r;   c               @   sp   e  Z d  Z d Z d d   Z e d d    Z d d d d d  Z d	 d
   Z d d d  Z	 d d   Z
 d S)r%   z^Parse a Newick tree given a file handle.

    Based on the parser in ``Bio.Nexus.Trees``.
    c             C   s   | |  _  d S)z+Initialize file handle for the Newick Tree.N)r'   )selfr'   r	   r	   r
   __init__b   s    zParser.__init__c             C   s   t  |  } |  |  S)z8Instantiate the Newick Tree class from the given string.)r   )clsZtreetextr'   r	   r	   r
   from_stringf   s    zParser.from_stringFc             c   s   | |  _  | |  _ | |  _ d } d } d } xk |  j D]` } | sd | j |  r^ t d   d } | | j   7} | j d	  r7 |  j |  Vd } q7 W| r |  j |  Vd
 S)z7Parse the text stream this object was initialized with.r7   F   ï   ÿ   þ zThe file or stream you attempted to parse includes unicode byte order marks.  You must convert it to ASCII before it can be parsed.T;N)r@   rA   rB   rC   )	values_are_confidencecomments_are_confidencerootedr'   
startswithr   rstripendswith_parse_tree)r<   rE   rF   rG   bufZunicodeCheckedZunicodeLinesliner	   r	   r
   r&   l   s$    				
zParser.parsec             C   sw  t  j t | j    } |  j } |   } | } d } d } d } x| D]}	 |	 j   }
 |
 j d  r |
 d d  | _ qI |
 j d  r |
 d d  | _ |  j	 rt
 | j  | _ qI |
 d k r | |  } d } | d 7} qI |
 d k r9| | k r|   } | | _ |  j |  } | |  } d } qI |
 d k r|  j |  } | sft d	   | } d } | d 7} qI |
 d
 k rPqI |
 j d  rt |
 d d   } |  j r| | _ q| | _ qI |
 d k rqI |
 | _ qI W| | k s	t d   y& t |  } t d | j     Wn t k
 rCYn X|  j |  |  j |  t j d | d |  j  S)z<Parse the text representation into an Tree object (PRIVATE).Fr   '   r3   (,)zParenthesis mismatch.rD   :N
z.Number of open/close parentheses do not match.z'Text after semicolon in Newick tree: %srootrG   rV   )r!   finditer	tokenizerstrip	new_cladegrouprH   r#   r   rF   r2   
confidenceparentprocess_clader   r/   rE   branch_lengthnextStopIterationr   ZTreerG   )r<   r1   tokensrZ   Z
root_cladeZcurrent_cladeZentering_branch_lengthZlp_countZrp_countmatchr   r]   valueZ
next_tokenr	   r	   r
   rK      sl    							zParser._parse_treeNc             C   s   t  j   } | r | | _ | S)zGReturn new Newick.Clade, optionally with temporary reference to parent.)r   ZClader]   )r<   r]   r:   r	   r	   r
   rZ      s    	zParser.new_cladec             C   s   | j  r^ |  j p |  j r^ | j d k r^ | j r^ t | j   | _ | j d k	 r^ d | _  t | d  r | j } | j j |  | ` | Sd S)zERemove node's parent and return it. Final processing of parsed clade.Nr]   )	r#   rE   rF   r\   Zcladesr2   r8   r]   append)r<   r:   r]   r	   r	   r
   r^      s    				zParser.process_clade)r   r   r   r   r=   classmethodr?   r&   rK   rZ   r^   r	   r	   r	   r
   r%   \   s   Vr%   c            
   @   s^   e  Z d  Z d Z d d   Z d d   Z d d d d d d	 d
 d d d  Z d d   Z d S)r*   z8Based on the writer in Bio.Nexus.Trees (str, to_string).c             C   s   | |  _  d S)z,Initialize parameter for Tree Writer object.N)r,   )r<   r,   r	   r	   r
   r=      s    zWriter.__init__c             K   s?   d } x2 |  j  |   D]! } | j | d  | d 7} q W| S)z-Write this instance's trees to a file handle.r   rT   rO   )
to_stringsr+   )r<   r'   r(   countZtreestrr	   r	   r
   r+     s
    zWriter.writeFTNg      ?z%1.2fz%1.5fc	             #   s  | s | r d } |  j  | | | | | |       f d d    x |  j D] }	 | d k rw |	 j d | d k   |	 j  d	 }
 | r |
 VqO d
 |	 j p d d g } |	 j d k r | j d t t |	 j  d   |	 j	 r | j d  | j |
  d j
 |  VqO Wd S)z1Return an iterable of PAUP-compatible tree lines.Fc                s   |  j  p d } | rl t j t d |  } | sJ | j   t |  k  rl d | j d d  j d d  } |  j   r |   |  d d	 S f d
 d   |  D } d d j |  |   |   f Sd S)z9Convert a node tree to a Newick tree string, recursively.r7   zunquoted node labelz'%s'\z\\rN   z\'terminalTc             3   s   |  ] }   |  Vq d  S)Nr	   )r   sub)	newickizer	   r
   r    /  s    z7Writer.to_strings.<locals>.newickize.<locals>.<genexpr>z(%s)%srQ   N)	r#   r!   rc   
token_dictendlenr5   Zis_terminaljoin)r:   labelZunquoted_labelZsubtrees)make_info_stringrl   r	   r
   rl   $  s    "z$Writer.to_strings.<locals>.newickizeleftLEFTrightRIGHTreverserD   treeZa_tree=rO   z[&W%s]   z[&R] N)zleftzLEFTrightRIGHT)r|   r}   )_info_factoryr,   	ladderizerU   r#   Zweightre   roundr/   rG   rp   )r<   confidence_as_branch_lengthbranch_length_onlyr)   Zplain_newickr   max_confidenceformat_confidenceformat_branch_lengthrx   ZrawtreeZtreeliner	   )rr   rl   r
   rg     s0    	#	zWriter.to_stringsc                ss   | r d d d  } nW | r9 d   f d d  } n6 | rW d   f d d  } n d    f d d  } | S)zEReturn a function that creates a nicely formatted node tag (PRIVATE).Fc             S   s
   t  |   S)N)r;   )r:   rj   r	   r	   r
   rr   P  s    z.Writer._info_factory.<locals>.make_info_stringc                s9   | r d    t  |   Sd   |  j t  |   Sd  S)NrS   )r;   r\   )r:   rj   )r   r   r	   r
   rr   U  s
    c                s   d   |  j  t |   S)NrS   )r_   r;   )r:   rj   )r   r	   r
   rr   b  s    c                st   | s% t  |  d  s% |  j d  k rD d   |  j p8 d t |   S d   |  j |  j pa d f t |   Sd  S)Nr\   rS   g        )r8   r\   r_   r;   )r:   rj   )r   r   r	   r
   rr   i  s    r	   )r<   r)   r   r   r   r   r   rr   r	   )r   r   r   r
   r~   D  s    
zWriter._info_factory)r   r   r   r   r=   r+   rg   r~   r	   r	   r	   r
   r*      s   
/r*   )r   r   )r   r   )r   r   )r   r   )r   zcomma)r   zcomment)r   r   )r   r   )r   znewline)r   r!   Z	Bio._py3kr   Z	Bio.Phylor   	Exceptionr   rb   r"   rp   rX   rm   r&   r+   r2   r6   r;   objectr%   r*   r	   r	   r	   r
   <module>   s,   	)	