o
    Rŀg0                     @   s   d Z ddlZddlmZ ddlmZ G dd deZg dZe	dd	
d
d eD  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
   F/var/www/html/myenv/lib/python3.10/site-packages/Bio/Phylo/NewickIO.pyr      s    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                 c   s    | ]}|d  V  qdS )r   Nr
   ).0tokenr
   r
   r   	<genexpr>$       r   )c                 C   s   i | ]
\}}|t |qS r
   )recompile)r   r   namer
   r
   r   
<dictcomp>%   s    r   c                 K   s   t | jdi |S )zpIterate over the trees in a Newick file handle.

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

    Nr
   )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"   5   s   r"   c                 C   s0   |   rt| S zt| W S  ty   Y d S w N)isdigitintfloat
ValueErrortextr
   r
   r   _parse_confidenceB   s   
r+   c                 C   s   d|  dd dd S )Nz[%s][z\[]z\])replacer)   r
   r
   r   _format_commentO   s   r/   c                 C   s4   z| j }W n
 ty   Y dS w |rtt|S dS )N )r   AttributeErrorr/   str)clader   r
   r
   r   _get_commentS   s   
r4   c                   @   sJ   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   r0   z(Newick files must be opened in text modeN)readr(   r   )selfr   r
   r
   r   __init__d   s   

zParser.__init__c                 C   s   t |}| |S )z8Instantiate the Newick Tree class from the given string.r   )clstreetextr   r
   r
   r   from_stringj   s   zParser.from_stringFc                 c   sb    || _ || _|| _d}| jD ]}|| 7 }|dr$| |V  d}q|r/| |V  dS dS )z7Parse the text stream this object was initialized with.r0   ;N)values_are_confidencecomments_are_confidencerootedr   rstripendswith_parse_tree)r6   r<   r=   r>   bufliner
   r
   r   r   p   s   

zParser.parsec                 C   s  t t| }| j}| }|}d}d}d}|D ]}	|	 }
|
dr+|
dd |_q|
drA|
dd |_| j	r@t
|j|_q|
dkrP||}d}|d7 }q|
dkrj||u r^| }||_| |}||}d}q|
d	kr| |}|sytd
|}d}|d7 }q|
dkr n!|
drt|
dd }| jr||_q||_q|
dkrq|
|_q||krtd| d| dzt|}td|   ty   Y nw | | | | tj|| jdS )z<Parse the text representation into an Tree object (PRIVATE).Fr   '   r,   r   ,r   zParenthesis mismatch.r;   :N
z
Mismatch, z	 open vs z close parentheses.z%Text after semicolon in Newick tree: )rootr>   )r   finditer	tokenizerstrip	new_cladegroup
startswithr   r   r=   r+   
confidenceparentprocess_clader   r'   r<   branch_lengthnextStopIterationr   Treer>   )r6   r*   tokensrN   
root_cladecurrent_cladeentering_branch_lengthlp_countrp_countmatchr   rR   value
next_tokenr
   r
   r   rA      sv   








zParser._parse_treeNc                 C   s   t  }|r	||_|S )zGReturn new Newick.Clade, optionally with temporary reference to parent.)r   CladerR   )r6   rR   r3   r
   r
   r   rN      s   zParser.new_cladec                 C   sr   |j r| js| js|jdu r|jrt|j |_|jdurd|_ z|j}W n
 ty.   Y dS w |j| |`|S )zERemove node's parent and return it. Final processing of parsed clade.N)	r   r<   r=   rQ   cladesr+   rR   r1   append)r6   r3   rR   r
   r
   r   rS      s(   


zParser.process_clade)FFFr$   )r   r   r   r	   r7   classmethodr:   r   rA   rN   rS   r
   r
   r
   r   r   ^   s    


Xr   c                   @   sB   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#   )r6   r#   r
   r
   r   r7      s   
zWriter.__init__c                 K   s4   d}| j di |D ]}||d  |d7 }q
|S )z-Write this instance's trees to a file handle.r   rI   rE   Nr
   )
to_stringsr"   )r6   r   r   counttreestrr
   r
   r   r"     s
   
zWriter.writeFTN      ?%1.2f%1.5fc	                 #   s    |s|rd}|  ||||||  fdd| jD ]J}	|dv r)|	j|dv d |	jd }
|r6|
V  qd|	jp;d	d
g}|	jdkrR|dtt|	jd d |	j	rZ|d ||
 d
|V  qdS )z1Return an iterable of PAUP-compatible tree lines.Fc                    s   | j pd}|r%ttd |}|r| t|k r%d|dddd }|  r1| | dd	 S fd
d| D }dd| d| |   S )z9Convert a node tree to a Newick tree string, recursively.r0   r   z'%s'\z\\rD   z\'T)terminalc                 3   s    | ]} |V  qd S r$   r
   )r   sub)	newickizer
   r   r   ,  r   z7Writer.to_strings.<locals>.newickize.<locals>.<genexpr>r   rG   r   )	r   r   r^   
token_dictendlenr.   is_terminaljoin)r3   labelunquoted_labelsubtreesmake_info_stringrn   r
   r   rn   !  s   
z$Writer.to_strings.<locals>.newickize)leftLEFTrightRIGHT)r{   r|   )reverser;   treea_tree=rE   z[&W   r-   z[&R] N)_info_factoryr#   	ladderizerJ   r   weightrc   roundr'   r>   rs   )r6   confidence_as_branch_lengthbranch_length_onlyr    plain_newickr   max_confidenceformat_confidenceformat_branch_lengthr~   rawtreetreeliner
   rw   r   re   	  s6   	



zWriter.to_stringsc                    sT   |r	ddd}|S |rdfdd	}|S |r d fdd	}|S d fdd	}|S )	zEReturn a function that creates a nicely formatted node tag (PRIVATE).Fc                 S   s   t | S r$   )r4   r3   rl   r
   r
   r   rx   M  s   z.Writer._info_factory.<locals>.make_info_stringc                    s.   |rd   t |  S d | j  t |  S NrH   )r4   rQ   r   )r   r   r
   r   rx   R  s   c                    s   d | j   t|  S r   )rT   r4   r   )r   r
   r   rx   _  s   c                    sV   |st | dr| jd u rd  | jpd t|  S d   | j| jp$df t|  S )NrQ   rH   g        )hasattrrQ   rT   r4   r   )r   r   r
   r   rx   f  s    

NFr
   )r6   r    r   r   r   r   r   rx   r
   )r   r   r   r   r   A  s   

(#zWriter._info_factory)FFFTNrh   ri   rj   )r   r   r   r	   r7   r"   re   r   r
   r
   r
   r   r!      s    

8r!   r   )r	   r   ior   	Bio.Phylor   	Exceptionr   rX   r   rs   rL   ro   r   r"   r+   r/   r4   r   r!   r
   r
   r
   r   <module>   s    	"
	 