a
    bv<                     @   s   d dl mZ d dlZd dlmZmZ d dlmZ G dd dZG dd dZ	G d	d
 d
Z
G dd dZG dd dZdd Zdd Zd)ddZdd Zdd Zdd Zd*ddZdd  Zd+d!d"Zd#d$ Zd%d& Zd,d'd(ZdS )-    )with_statementN)qconfigqutils)trim_ref_namec                	   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )	AlignmentNc                 C   sv   || _ || _|| _|| _|| _|| _|| _|| _|| _|	| _	|
| _
|| _d| _d| _d| _d| _d| _d| _d| _d S )Nr   F z#000000)namestartendunshifted_startunshifted_endis_rcidystart_in_contigend_in_contigposition_in_refref_nameis_best_setordersimilarmisassembledmisassembliescolorvPositionDelta	ambiguous)selfr   r	   r
   r   r   r   r   r   r   r   r   r    r   A/home/psgendb/BIRCHDEV/pkg/quast-5.2.0/quast_libs/icarus_utils.py__init__   s&    zAlignment.__init__c                 C   s   | j | j S Nr
   r	   r   r   r   r   length*   s    zAlignment.lengthc                 C   s"   | j d t| j d t| j S )N
-)r   strr	   r
   r!   r   r   r   
annotation-   s    zAlignment.annotationc                 C   s   | j | j d S )N   r    r!   r   r   r   center0   s    zAlignment.centerc                 C   sT   |j | j krdS t| j| j }t|j| j tj| koRt|j| j tj| kS )NF)r   absr
   r	   r   contig_len_delta)r   	alignmentZ
contig_lenr   r   r   compare_inexact3   s    zAlignment.compare_inexactc                 C   s   t | j| j| j| j| jfS r   )hashr   r	   r
   r   r   r!   r   r   r   __hash__:   s    zAlignment.__hash__)	NNNNNNNNN)	__name__
__module____qualname__r   r"   r&   r(   r,   r.   r   r   r   r   r      s     
r   c                   @   s   e Zd Zdd ZdS )Arcc                 C   s   || _ || _d S r   )c1c2)r   r3   r4   r   r   r   r   ?   s    zArc.__init__Nr/   r0   r1   r   r   r   r   r   r2   >   s   r2   c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )Assemblyr   c                 C   s   || _ tj| | _g | _g | _i | _d}|D ]}|j|j |k rBq,|d |_	|d7 }|j
}|| jvrrt|| j|< |jr| j| | j| | j| jt| jd  q,d S )Nr   r'      )fpathr   assembly_labels_by_fpathlabel
alignmentsmisassembled_contig_idscontigs_by_idsr
   r	   r   r   Contigr   appendlen)r   contigs_fpathaligned_blocksmin_visualizer_lengthiblockc_idr   r   r   r   E   s$    

zAssembly.__init__c                 C   sX   |  tjk rdS d}|t| jk r>|| j| s>|d7 }q|t| jkrPdS |S d S )Nr   r7   )r"   r   min_similar_contig_sizer@   r;   r,   )r   r+   rD   r   r   r   find^   s    
zAssembly.findc                 C   s   | j D ]z}| j|j|j 7  _|jrL|js<|j|j |_q|j|j |_q| j|j	7  _|jsr|j
|j |_q|j|j |_qd S r   )r;   r   ZoddStepr   r   r   Zcolor_misassembledr   Zcolor_misassembled_similarZgoodStepZcolor_correctZcolor_correct_similar)r   settingsrE   r   r   r   apply_colork   s    
zAssembly.apply_colorc           
         s   j D ]}| jvrq j| }t|j fddd}g }d}d}d}|t|k rl|| }	 j|	 j}t j|	 j j|	 j}|t|d k rt	 j||  j
 j||d   j |jk r j||  j j||d   jkr|d7 }q j||  j
| |jk r|d7 }qH|td| j||  j
| j||  j
 j||  j| j||  j |d7 }qHd}|t|d k r|jt||  ||d    |d7 }qpqd S )Nc                    s   t  j|  j j|  jS r   )minr;   r   r   )xr!   r   r   <lambda>       z$Assembly.draw_arcs.<locals>.<lambda>)keyr   r7   r   )r<   r=   sortedr;   r@   r	   rL   r   r   r)   r
   ZmaxBlockGapr   ZminConnectedBlockr?   r   r   arcsr2   r(   )
r   rJ   rF   contigZsortedBlocksZjoinedAlignmentsZcurrentStartZcurrentCStartrD   rE   r   r!   r   	draw_arcsz   sH    

$

$
&zAssembly.draw_arcsN)r   )r/   r0   r1   r   rI   rK   rT   r   r   r   r   r6   D   s   
r6   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )
Assembliesr   c                 C   s:   g | _ || _t|D ] \}}| j t||| | qd S r   )
assembliesmax_pos	enumerater?   r6   )r   contigs_fpathslists_of_aligned_blocksrW   Zmin_visualized_lengthrD   c_fpathr   r   r   r      s    
zAssemblies.__init__c           	      C   sd  t dt| jD ]L}d}t dt| j| jD ]*}| j| j| }|jsNq0|jrd|jd d }q0d}dd t dt| jD }|||< t dt| jD ]N}||krq| j| |}|dkr|j| j| j| jkr|||< |d7 }q|t	t| jk rq0t dt| jD ]@}|| }|dkr(qd| j| j| _|| j| j| _q|d d }q0qd S )Nr   r7   r'   c                 S   s   g | ]}d qS )rG   r   ).0Zjjr   r   r   
<listcomp>   rO   z+Assemblies.find_similar.<locals>.<listcomp>rG   T)
ranger@   rV   r;   r   r   r   rI   r   get_similar_threshold)	r   rD   r   Z	block_numrE   totalZsim_block_ids_within_asmjZblock_idr   r   r   find_similar   s@    

zAssemblies.find_similarc                 C   s   | j D ]}|| qd S r   )rV   rT   r   rJ   ar   r   r   rT      s    
zAssemblies.draw_arcsc                 C   s   | j D ]}|| qd S r   )rV   rK   rc   r   r   r   apply_colors   s    
zAssemblies.apply_colorsc                 C   s<   d}| j D ]&}|jt|jd  j}||k r
|}q
|| _|S )Nr   r7   )rV   r;   r@   r
   rW   )r   rW   ZasmZasm_max_posr   r   r   find_max_pos   s    
zAssemblies.find_max_posN)r   )r/   r0   r1   r   rb   rT   re   rf   r   r   r   r   rU      s    
'rU   c                   @   s   e Zd ZdddZdS )r>   Nr   c                 C   s(   || _ || _g | _|| _g | _g | _d S r   )r   sizer;   contig_typerR   genes)r   r   rg   rh   r   r   r   r      s    zContig.__init__)Nr   r5   r   r   r   r   r>      s   r>   c                 C   s   | dkrdS | d S )Nr'   r7   r   )r`   r   r   r   r_      s    r_   c                 C   s$   d tdd ttt| D S )Nr   c                 S   s(   g | ] \}}||r|d  sdnd qS )    r   r   )r\   rD   rM   r   r   r   r]      rO   z'format_long_numbers.<locals>.<listcomp>)joinreversedrX   r%   )numberr   r   r   format_long_numbers   s    ro   Tc                 C   s*   d}t | |||}|r&|d ur&|  |S )Nr   )rU   rb   )rY   rZ   Zvirtual_genome_sizerb   rC   rV   r   r   r   get_assemblies   s    rp   c                 C   s   t j| st |  d S r   )ospathexistsmakedirs)Zoutput_dir_pathr   r   r   make_output_dir
  s    ru   c           
      C   s   g }| d| d  | d| d  ||  rt|trB||  n|}| |d |  d t| d  | |d |  d  d}t||  D ]2\}}	|d d	kr| | d}|t|	d
 7 }q| | |d d d d |d< |S )Nzvar z = {};z["z"] = ;z"] = [ r   d   r   ,rG   z];)r?   
isinstancedictr%   rX   )
chrZcov_dataZcov_data_name	max_depthZmax_depth_namedataZchr_max_depthlinerD   er   r   r   format_cov_data  s     "

r   c                 C   s   t |dkrtjS t| S )Nr7   )r@   r   one_alignment_viewer_namer   )r{   chr_full_namesr   r   r   get_html_name"  s    r   Fc                 C   s   |r t j}tjt j|d }ntjt jt| d }| dd}d}	t|dkrl| d d }
|}	|
d }dd ||  D }t	|d	 ||  t|  }||  }|||||	fS )
Nz.html_rk   r   F   z...c                 S   s   g | ]}|d ur|qS r   r   )r\   Zaligned_lenr   r   r   r]   4  rO   z#get_info_by_chr.<locals>.<listcomp>g      Y@)
r   r   rq   rr   rl   icarus_dirnamer   replacer@   sum)r{   Zaligned_bases_by_chrZ	chr_sizesrY   contig_names_by_refsZone_chromosomeZ	html_nameZchr_linkchr_nameZtooltipZ
short_namealigned_lengthsZ
chr_genomeZchr_sizer   r   r   get_info_by_chr(  s    r   c                    s   r,t    fddfdd| D D }nXt| tjk rXt| dkrXt|g}n,t | }t	t| D ]}|| | | < qn|fS )Nc                    s"   g | ]}| vr  |p|qS r   )add)r\   ref)
added_refsr   r   r]   =  s   z$group_references.<locals>.<listcomp>c                    s   g | ]} | qS r   r   )r\   rS   )r   r   r   r]   =  rO   r7   )
setr   valuesr   MAX_SIZE_FOR_COMB_PLOTr@   r   name_from_fpathrz   r^   )Z	chr_namesr   Zchromosomes_length	ref_fpathr   rD   r   )r   r   r   group_references:  s    "r   c           	      C   s   | D ]}|j sq||j }t|D ].\}}t|tr"|j|jkr"|j|jkr" qRq"d}t||d  tkr||d  	dd 
 }t||rd}|d t|k rt||d  tkr||d  	dd 
 }t||rd}||_q| S )NFr7   rx   r   T)r   r   rX   ry   r   r	   r
   typer%   splitstripis_misassembly_realr@   r   )	rB   misassembled_id_to_structurefilter_localr+   contig_structurenum_alignmentelr   misassembly_typer   r   r   check_misassembled_blocksI  s*    



r   c                 C   sp   | }d}t jr,d|v s&d|v s&d|v r,d}n<t|shd|v r@dS d|v rNd}nd|v rZd}|dd	 }||fS )
Nreallocalfakeindelskipunknown)r   r   :r7   )r   large_genomer   r   )ZmisassemblyZms_descriptionms_typer   r   r   parse_misassembly_info`  s    r   c                 C   sp  d}g }t | D ]:\}}t|tr|j|jkr|j|jkr|j|jkr qLqd}t| |d  tkr| |d  dd 	 }t
|}|rd|v rd}|| |j|jk r|d7 }n|d7 }|s|d d}|d t| k rXt| |d  tkrX| |d  dd 	 }t
|}|rXd|v r.d}|| |j|jk rP|d	7 }n|d
7 }|sh|d ||fS )Nr   Fr7   rx   r   r   LRz;Rz;L)rX   ry   r   r	   r
   r   r   r%   r   r   r   r?   r   r@   )r   r+   Zmisassembled_endsr   r   r   is_misassemblyr   r   r   r   get_misassembly_for_alignmentp  sF    
$






r   c                 C   s    |rd| v rdS d| vod| vS )Nr   Fr   r   r   )r   r   r   r   r   r     s    r   )NT)F)F)F)
__future__r   rq   
quast_libsr   r   Z quast_libs.html_saver.html_saverr   r   r2   r6   rU   r>   r_   ro   rp   ru   r   r   r   r   r   r   r   r   r   r   r   r   <module>
   s(   ,_E



'