3
:>"^…2  ã            
   @   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/d0d1d2d3d4d5d6g	Zej	ddj
dd„ eD ƒƒ ƒZdd„ eD ƒZdd „ Zd7d"d#„Zd$d%„ Zd&d'„ Zd(d)„ ZG d*d+„ d+eƒZG d,d-„ d-eƒZdS )8zxI/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	   úb/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.5/site-packages/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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   | j ƒ 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    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   s&   t | dƒr| jrtt| jƒƒS dS d S )Nr   Ú )Úhasattrr   r6   Ústr)Úclader	   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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}xN| jD ]D}|sD|j|ƒr@tdƒ‚d}||jƒ 7 }|jd	ƒr&| j|ƒV  d}q&W |r~| j|ƒV  d
S )z7Parse the text stream this object was initialized with.r7   Fõ   Ã¯õ   Ã¿õ   Ã¾ú zƒThe 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   sÐ  t jt|jƒ ƒ}| j}|ƒ }|}d}d}d}x6|D ],}	|	jƒ }
|
jdƒr\|
dd… |_q4|
jdƒrˆ|
dd… |_| j	r†t
|jƒ|_q4|
dkr¦||ƒ}d}|d7 }q4|
dkrÚ||krÂ|ƒ }||_| j|ƒ}||ƒ}d}q4|
dkr| j|ƒ}| sütd	ƒ‚|}d}|d7 }q4|
d
krP q4|
jdƒrPt|
dd… ƒ}| jrH||_n||_q4|
dkr\q4|
|_q4W ||ksxtdƒ‚yt|ƒ}td|jƒ  ƒ‚W n tk
rª   Y nX | j|ƒ | j|ƒ tj|| jd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   Ú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   ÚClader]   )r<   r]   r:   r	   r	   r
   rZ   ß   s    zParser.new_cladec             C   sh   |j r@| jp| j r@|jdkr@|jr@t|j ƒ|_|jdk	r@d|_ t|dƒrd|j}|jj|ƒ |`|S dS )zERemove node's parent and return it. Final processing of parsed clade.Nr]   )	r#   rE   rF   r\   Úcladesr2   r8   r]   Úappend)r<   r:   r]   r	   r	   r
   r^   æ   s    


zParser.process_clade)FFF)N)r   r   r   r   r=   Úclassmethodr?   r&   rK   rZ   r^   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 ]}|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.writeFTNç      ð?ú%1.2fú%1.5fc	             #   sÎ   |s|rd}| j ||||||ƒ‰ ‡ ‡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 |jdtt|	jƒdƒ ƒ |	j	r°|jdƒ |j|
ƒ dj
|ƒV  q6W dS )z1Return an iterable of PAUP-compatible tree lines.Fc                s”   | j pd}|rLtjtd |ƒ}| s4|jƒ t|ƒk rLd|jddƒjddƒ }| jƒ rd|ˆ | dd	 S ‡fd
d„| D ƒ}ddj|ƒ|ˆ | ƒ f S dS )z9Convert a node tree to a Newick tree string, recursively.r7   zunquoted node labelz'%s'ú\z\\rN   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)%srQ   N)	r#   r!   rd   Ú
token_dictÚendÚlenr5   Úis_terminalÚjoin)r:   ZlabelZunquoted_labelZsubtrees)Úmake_info_stringrr   r	   r
   rr   $  s    
z$Writer.to_strings.<locals>.newickizeÚleftÚLEFTÚrightÚRIGHT)ÚreverserD   ÚtreeZa_treeú=rO   z[&W%s]é   z[&R]ú N)ry   rz   r{   r|   )r{   r|   )Ú_info_factoryr,   Ú	ladderizerU   r#   Zweightrh   Úroundr/   rG   rw   )r<   Úconfidence_as_branch_lengthÚbranch_length_onlyr)   Zplain_newickrƒ   Úmax_confidenceÚformat_confidenceÚformat_branch_lengthr~   ZrawtreeZtreeliner	   )rx   rr   r
   rj     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:   rp   r	   r	   r
   rx   P  s    z.Writer._info_factory.<locals>.make_info_stringc                s2   |rdˆ ˆ  t | ƒ S dˆ | j  t | ƒ S d S )NrS   )r;   r\   )r:   rp   )rˆ   r‡   r	   r
   rx   U  s
    c                s   dˆ | j   t| ƒ S )NrS   )r_   r;   )r:   rp   )r‰   r	   r
   rx   b  s    c                s\   |st | dƒ s| jd kr4dˆ  | jp(d t| ƒ S ˆd ˆ  | j| jpJdf t| ƒ S d S )Nr\   rS   g        )r8   r\   r_   r;   )r:   rp   )r‰   rˆ   r	   r
   rx   i  s    



)F)F)F)Fr	   )r<   r)   r…   r†   r‡   rˆ   r‰   rx   r	   )r‰   rˆ   r‡   r
   r‚   D  s    
zWriter._info_factory)FFFTNrl   rm   rn   )r   r   r   r   r=   r+   rj   r‚   r	   r	   r	   r
   r*   ý   s   
       
/r*   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )F)r   r!   Ú	Bio._py3kr   Ú	Bio.Phylor   Ú	Exceptionr   rc   r"   rw   rX   rs   r&   r+   r2   r6   r;   Úobjectr%   r*   r	   r	   r	   r
   Ú<module>   s.   	
 "