o
    RŀgR                     @   sb   d Z ddlZedZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd ZdS )z)Methods for parsing codeml results files.    Nz
-*\d+\.\d+c                 C   sb  d}d}t d}t d}t d}t d}t d}| D ]}	t|	}
dd |
D }||	}|d	ur>|d
|d< q||	}|d	urN|d
|d< ||	}|d	ursg |d< t|d
}t|D ]	}|d 	i  qfd}q||	}|d	ur|d
|d< q||	}|d	ur|d
}|dkr||d< d}nd}d|	v r|r|d |d< q|||fS )zOParse the basic information that should be present in most codeml output files.Fz'.+ \(in paml version (\d+\.\d+[a-z]*).*zModel:\s+(.+)z!\(([0-9]+) genes: separate data\)z"Codon frequenc[a-z\s]{3,7}:\s+(.+)zSite-class models:\s*([^\s]*)c                 S      g | ]}t |qS  float.0valr   r   P/var/www/html/myenv/lib/python3.10/site-packages/Bio/Phylo/PAML/_parse_codeml.py
<listcomp>!       z parse_basics.<locals>.<listcomp>N   versionmodelgenesTzcodon model site-class modelzln Lmaxr   zlnL max)
recompileline_floats_refindallmatchgroupsearchintrangeappend)linesresultsmulti_modelsmulti_genes
version_remodel_renum_genes_recodon_freq_resiteclass_relineline_floats_resline_floatsversion_res	model_resnum_genes_res	num_genesncodon_freq_ressiteclass_ressiteclass_modelr   r   r	   parse_basics   sP   












r0   c                 C   s  i }t d}t d}|d}|s|du rd}dddd	d
ddd| }|r|d }	d}
d}d}t| D ]1\}}||}|rf|
durY|dusJJ t| || | ||	|
d < |}t|d}
d|i}q5t|	|
d  dkrt| |d |}||	|
d < nWd|i}t| |}|||< nId}d}t| D ],\}}||}|r|durt| || | |||< |}t|d}d|di}q||du rt| |d |}|||< t|dkr|d}|rt|dkr||d< |S t|dkr||d< |S )z:Determine which NSsites models are present and parse them.zModel (\d+):\s+(.+)zGene\s+([0-9]+)\s+.+r   N	one-ratior   r                  )r1   NearlyNeutralPositiveSelectiondiscretebetazbeta&w>1M2a_relr   descriptionNSsites)	r   r   get	enumerater   parse_modelr   r   len)r   r   r   r   ns_sitesr!   gene_rer/   current_modelr   current_gene
gene_startmodel_resultsline_numr%   gene_resmodel_startr)   m0r   r   r	   parse_nssitesL   s~   


	




rL   c                 C   s  i }d}d}d}d}d}t d}t d}	t d}
| D ]B}t|}dd |D }|	|}|
|}d|v rT|rT|d	 |d
< t d|}|durSt|d}qt||krc|sc| |d< qd|v rjd}q|r{t||kr{| |d< d}qd|v r|r|d	 |d< q||durd|v sd|v r|r| |d< d}q|r| |d< d}q|r| |d< d}q| |d< qd|v rd}qd|v rd}qd|v rd}qd|v r|r|	d	d ||d< qd|v r|r|d	 |d < qd!|v r|r|d	 |d"< qd#|v r|r||d"< qd$|v r6tt d%|d}|
d&du r(i |d&< |d	 |d d'|d& |< qd(|v rE|rE|d	 |d)< qd*|v rT|rT|d	 |d+< q|d	d, d-ksf|d	d. d/krot|}||d0< q|d	d, d1kr|
d0}t||}||d0< qd2|v rt d3|}|r|
d0}t|d}t|||}||d0< q|d	d4 d5kr|
d0}td||}||d0< q|d	d4 d6kr|
d0}td||}||d0< q|durA|rA|d}|
d7du ri |d7< |  dd }t|d	  t|d  t|d,  t|d8  t|d9  t|d:  t|d;  t|d<  d=|d7 |< q|r`g }|D ]}||d	 t|d f qH|t| q|rh||d>< |S )?z,Parse an individual NSsites model's results.FNz^\([\w #:',.()]*\);\s*$z\s+(\d+\.\.\d+)[\s+\d+\.\d+]+z"(?<!\S)([a-z]\d?)\s*=\s+(\d+\.\d+)c                 S   r   r   r   r   r   r   r	   r
      r   zparse_model.<locals>.<listcomp>z
lnL(ntime:r   lnLz!lnL\(ntime:\s+\d+\s+np:\s+(\d+)\)r   zparameter listzSEs for parameters:TSEsztree length =ztree length:#zdS treezdN treez
omega treetreezdS tree:zdN tree:z w ratios as labels for TreeView:z	rates forg      ?rateszkappa (ts/tv)kappazomega (dN/dS)omegaz	w (dN/dS)zgene # zgene # (\d+)r   )rS   rT   ztree length for dNdNztree length for dSdSr2   zp:
   
proportionzsite classeszw:zbranch type zbranch type (\d)   zforeground wzbackground wbranchesr3            r4   )tNSrT   rU   rV   zN*dNzS*dS
parameters)r   r   r   r   r   r   r   rA   stripinsertr>   parse_siteclass_proportionsparse_siteclass_omegasparse_clademodelcparse_branch_site_asplitr   r   updatedict)r   r   ra   SEs_flagdS_tree_flagdN_tree_flagw_tree_flag
num_paramstree_re	branch_remodel_params_rer%   r&   r'   
branch_resmodel_paramsnp_resgene_numsite_classesbranch_typebranch_type_nobranchparamsfloat_model_paramsparamr   r   r	   r@      s   









$










r@   c                 C   s.   i }| rt t| D ]
}d| | i||< q
|S )zFind proportion of alignment assigned to each class.

    For models which have multiple site classes, find the proportion of the
    alignment assigned to each class.
    rX   )r   rA   )r'   rw   r,   r   r   r	   rd   R  s
   rd   c                 C   sF   t d| }|rt|dkrdS tt|D ]
}|| || d< q|S )zFind omega estimate for each class.

    For models which have multiple site classes, find the omega estimated
    for each class.
    z\d{1,3}\.\d{5}r   NrT   )r   r   rA   r   )r%   rw   r'   r,   r   r   r	   re   _  s   re   c                 C   s\   |rt |dkr
dS tt |D ]}|| ddu r!i || d< || || d | < q|S )z,Parse results specific to the clade model C.r   Nbranch typesrA   r   r>   )ry   r'   rw   r,   r   r   r	   rf   r  s   rf   c                 C   sv   |rt |dkr
dS tt |D ](}|| ddu r!i || d< | r.|| || d d< q|| || d d< q|S )z2Parse results specific to the branch site A model.r   Nr~   
foreground
backgroundr   )r   r'   rw   r,   r   r   r	   rg   }  s   rg   c           
   
   C   s8  t d}i }d}d}| D ]}t|}dd |D }||}	|	r<|	d}|	d}||vr4i ||< ||vr<i ||< t|dkr_|dur_|dur_d|d i|| |< || | || |< qt|d	kr|dur|dur|| | |d |d |d |d
 |d |d d || | || |< q|r||d< |S )z(Parse results from pairwise comparisons.z\d+ \((.+)\) ... \d+ \((.+)\)Nc                 S   r   r   r   r   r   r   r	   r
     r   z"parse_pairwise.<locals>.<listcomp>r   r2   rM   r   r]   r3   r[   r\   )r^   r`   r_   rT   rU   rV   pairwise)r   r   r   r   r   r   rA   ri   )
r   r   pair_rer   seq1seq2r%   r&   r'   pair_resr   r   r	   parse_pairwise  sB   
	




r   c                 C   sr  i }g }d}d}t d}| D ]}t|}dd |D }	d|v r&d}d}nd|v r.d}d}||}
|
r|s9|r|
d }||vrI|| |r~|d	d
u rVi |d	< i |d	 |< t	t
|	D ]}|	| |d	 | || < |	| |d	 ||  |< qbq|dd
u ri |d< i |d |< t	t
|	D ]}|	| |d | || < |	| |d ||  |< qq|r||d< |S )z+Parse amino acid sequence distance results.Fz(.+)\s{5,15}c                 S   r   r   r   r   r   r   r	   r
     r   z#parse_distances.<locals>.<listcomp>zAA distancesTzML distances of aa seqs.r   rawNml	distances)r   r   r   r   r   r   rb   r   r>   r   rA   )r   r   r   	sequencesraw_aa_distances_flagml_aa_distances_flagmatrix_row_rer%   r&   r'   matrix_row_resseq_nameir   r   r	   parse_distances  sJ   



r   )__doc__r   r   r   r0   rL   r@   rd   re   rf   rg   r   r   r   r   r   r	   <module>   s   
=P 7-