B
    b0              	   @   s   d Z ddlZddlmZ ddlmZ G dd deZddd	d
dddddg	Ze	dd
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G d!d" d"ZG d#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               @   s   e Zd ZdZdS )NewickErrorzAException raised when Newick object construction cannot continue.N)__name__
__module____qualname____doc__ r	   r	   1lib/python3.7/site-packages/Bio/Phylo/NewickIO.pyr      s   r   )z\(zopen parens)z\)zclose parens)z[^\s\(\)\[\]\'\:\;\,]+zunquoted node label)z+\:\ ?[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?zedge length)z\,Zcomma)z\[(\\.|[^\]])*\]comment)z\'(\\.|[^\'])*\'zquoted node label)z\;Z	semicolon)z\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 ||qS r	   )recompile)r   r   namer	   r	   r
   
<dictcomp>'   s    r   c             K   s   t | jf |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|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   r	   r	   r
   r   7   s    r   c             C   s2   |   rt| S yt| S  tk
r,   d S X d S )N)isdigitintfloat
ValueError)textr	   r	   r
   _parse_confidenceD   s    r"   c             C   s   d|  dd dd S )Nz[%s][z\[]z\])replace)r!   r	   r	   r
   _format_commentQ   s    r&   c             C   s4   y
| j }W n tk
r   Y nX |r0tt|S dS )N )r   AttributeErrorr&   str)clader   r	   r	   r
   _get_commentU   s    
r+   c               @   sH   e Zd ZdZdd Zedd Z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dkrtdd|| _dS )z+Initialize file handle for the Newick Tree.r   r'   z(Newick files must be opened in text modeN)readr    r   )selfr   r	   r	   r
   __init__f   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_stringl   s    zParser.from_stringFc             c   s`   || _ || _|| _d}x4| jD ]*}|| 7 }|dr| |V  d}qW |r\| |V  dS )z7Parse the text stream this object was initialized with.r'   ;N)values_are_confidencecomments_are_confidencerootedr   rstripendswith_parse_tree)r-   r2   r3   r4   Zbufliner	   r	   r
   r   r   s    
zParser.parsec             C   s  t t| }| j}| }|}d}d}d}x4|D ]*}	|	 }
|
dr\|
dd |_q4|
dr|
dd |_| j	rt
|j|_q4|
dkr||}d}|d7 }q4|
dkr||kr| }||_| |}||}d}q4|
d	kr| |}|std
|}d}|d7 }q4|
dkrP q4|
drNt|
dd }| jrF||_n||_q4|
dkrZq4|
|_q4W ||ksvtdyt|}td|  W n tk
r   Y nX | | | | tj|| jdS )z<Parse the text representation into an Tree object (PRIVATE).Fr   '   r#   (,)zParenthesis mismatch.r1   :N
z.Number of open/close parentheses do not match.z'Text after semicolon in Newick tree: %s)rootr4   )r   finditer	tokenizerstrip	new_cladegroup
startswithr   r   r3   r"   
confidenceparentprocess_clader   r   r2   branch_lengthnextStopIterationr   ZTreer4   )r-   r!   tokensrE   Z
root_cladeZcurrent_cladeZentering_branch_lengthZlp_countZrp_countmatchr   rI   valueZ
next_tokenr	   r	   r
   r7      sl    












zParser._parse_treeNc             C   s   t  }|r||_|S )zGReturn new Newick.Clade, optionally with temporary reference to parent.)r   ZCladerI   )r-   rI   r*   r	   r	   r
   rE      s    zParser.new_cladec             C   sv   |j r>| js>| js>|jdkr>|jr>t|j |_|jdk	r>d|_ y
|j}W n tk
r\   Y nX |j| |`|S dS )zERemove node's parent and return it. Final processing of parsed clade.N)	r   r2   r3   rH   Zcladesr"   rI   r(   append)r-   r*   rI   r	   r	   r
   rJ      s    


zParser.process_clade)FFF)N)r   r   r   r   r.   classmethodr0   r   r7   rE   rJ   r	   r	   r	   r
   r   `   s   
V
r   c               @   s2   e Zd ZdZdd Zdd Z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   s4   d}x*| j f |D ]}||d  |d7 }qW |S )z-Write this instance's trees to a file handle.r   r@   r:   )
to_stringsr   )r-   r   r   countZtreestrr	   r	   r
   r     s
    zWriter.writeFTN      ?%1.2f%1.5fc	             #   s   |s|rd}|  ||||||  fddx| jD ]}	|dkrR|	j|dkd |	jd }
|rl|
V  q6d|	jpvd	d
g}|	jdkr|dtt|	jd  |	j	r|d ||
 d
|V  q6W dS )z1Return an iterable of PAUP-compatible tree lines.Fc                s   | j pd}|rJttd |}|r2| t|k rJd|dddd }|  rb| | dd	 S fd
d| D }dd|| |  f S dS )z9Convert a node tree to a Newick tree string, recursively.r'   zunquoted node labelz'%s'\z\\r9   z\'T)terminalc             3   s   | ]} |V  qd S )Nr	   )r   sub)	newickizer	   r
   r   ,  s    z7Writer.to_strings.<locals>.newickize.<locals>.<genexpr>z(%s)%sr=   N)	r   r   rO   
token_dictendlenr%   Zis_terminaljoin)r*   ZlabelZunquoted_labelZsubtrees)make_info_stringr[   r	   r
   r[   !  s    
z$Writer.to_strings.<locals>.newickize)leftZLEFTrightRIGHT)rb   rc   )reverser1   treeZa_tree=r:   z[&W%s]   z[&R] N)_info_factoryr   	ladderizerA   r   ZweightrQ   roundr   r4   r_   )r-   confidence_as_branch_lengthbranch_length_onlyr   Zplain_newickrj   max_confidenceformat_confidenceformat_branch_lengthre   ZrawtreeZtreeliner	   )r`   r[   r
   rS   	  s0    


zWriter.to_stringsc                sN   |rddd}n:|r&dfdd	}n$|r: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*   rY   r	   r	   r
   r`   M  s    z.Writer._info_factory.<locals>.make_info_stringc                s2   |rd   t |  S d | j  t |  S d S )Nr?   )r+   rH   )r*   rY   )ro   rn   r	   r
   r`   R  s
    c                s   d | j   t|  S )Nr?   )rK   r+   )r*   rY   )rp   r	   r
   r`   _  s    c                sZ   |st | dr| jd kr2d  | jp&d t|  S d   | j| jpHdf t|  S d S )NrH   r?   g        )hasattrrH   rK   r+   )r*   rY   )rp   ro   r	   r
   r`   f  s    




)F)F)F)Fr	   )r-   r   rl   rm   rn   ro   rp   r`   r	   )rp   ro   rn   r
   ri   A  s    
zWriter._info_factory)FFFTNrU   rV   rW   )r   r   r   r   r.   r   rS   ri   r	   r	   r	   r
   r      s   
       
/r   )F)r   r   ior   Z	Bio.Phylor   	Exceptionr   rN   r   r_   rC   r\   r   r   r"   r&   r+   r   r   r	   r	   r	   r
   <module>   s.   	
 