3
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   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 )N)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 )N)c1c2)r   r0   r1   r   r   r   r   ?   s    zArc.__init__N)r,   r-   r.   r   r   r   r   r   r/   >   s   r/   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}x|D ]}|j|j |k rDq.|d |_	|d7 }|j
}|| jkrtt|| j|< |jr| jj| | jj| | j| jjt| jd  q.W 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   s^   |j  tjk rdS d}x,|t| jk rB|j| j|  rB|d7 }qW |t| jkrVdS |S d S )Nr3   r   rC   )r   r   min_similar_contig_sizer<   r7   r)   )r   r(   r@   r   r   r   find^   s    "zAssembly.findc             C   s   x| j D ]z}| j|j|j 7  _|jrN|js>|j|j |_q|j|j |_q| j|j	7  _|jst|j
|j |_q|j|j |_qW d S )N)r7   r   ZoddStepr   r   r   Zcolor_misassembledr   Zcolor_misassembled_similarZgoodStepZcolor_correctZcolor_correct_similar)r   settingsrA   r   r   r   apply_colork   s    zAssembly.apply_colorc       
         s  xƈ j D ]}| jkrq
 j| }t|j fddd}g }d}d}d}x*|t|k rx|| }	 j|	 j}t j|	 j j|	 j}xn|t|d k rt	 j||  j
 j||d   j |jk r j||  j j||d   jkr|d7 }qW  j||  j
| |jk r"|d7 }qP|jtd| j||  j
| j||  j
 j||  j| j||  j |d7 }qPW d}xF|t|d k r|jjt|| j ||d  j  |d7 }qW q
W d S )Nc                s   t  j|  j j|  jS )N)minr7   r   r   )x)r   r   r   <lambda>   s    z$Assembly.draw_arcs.<locals>.<lambda>)keyr   r3   r   )r8   r9   sortedr7   r<   r	   rH   r   r   r&   r
   ZmaxBlockGapr   ZminConnectedBlockr;   r   r   arcsr/   r%   )
r   rF   rB   contigZsortedBlocksZjoinedAlignmentsZcurrentStartZcurrentCStartr@   rA   r   )r   r   	draw_arcsz   s8    

&($$&zAssembly.draw_arcsN)r   )r,   r-   r.   r   rE   rG   rO   r   r   r   r   r2   D   s   
r2   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 | _ || _x,t|D ] \}}| j jt||| | qW d S )N)
assembliesmax_pos	enumerater;   r2   )r   contigs_fpathslists_of_aligned_blocksrR   Zmin_visualized_lengthr@   c_fpathr   r   r   r      s    
zAssemblies.__init__c       	      C   sz  xrt dt| jD ]\}d}xPt dt| j| jD ]4}| j| j| }|jsVq8|jrl|jd d }q8d}dd t dt| jD }|||< xbt dt| jD ]N}||krq| j| j|}|dkr|j| j| j| jkr|||< |d7 }qW |t	t| jk rq8xTt dt| jD ]@}|| }|dkr8qd| j| j| _|| j| j| _qW |d d }q8W qW d S )	Nr   r3   r$   c             S   s   g | ]}dqS )r3   rC   r   ).0Zjjr   r   r   
<listcomp>   s    z+Assemblies.find_similar.<locals>.<listcomp>TrC   rC   )
ranger<   rQ   r7   r   r   r   rE   r   get_similar_threshold)	r   r@   r   Z	block_numrA   totalZsim_block_ids_within_asmjZblock_idr   r   r   find_similar   s<     
zAssemblies.find_similarc             C   s   x| j D ]}|j| qW d S )N)rQ   rO   )r   rF   ar   r   r   rO      s    zAssemblies.draw_arcsc             C   s   x| j D ]}|j| qW d S )N)rQ   rG   )r   rF   r^   r   r   r   apply_colors   s    zAssemblies.apply_colorsc             C   s@   d}x0| j D ]&}|jt|jd  j}||k r|}qW || _|S )Nr   r3   )rQ   r7   r<   r
   rR   )r   rR   ZasmZasm_max_posr   r   r   find_max_pos   s    zAssemblies.find_max_posN)r   )r,   r-   r.   r   r]   rO   r_   r`   r   r   r   r   rP      s
   
	'rP   c               @   s   e Zd ZdddZdS )r:   Nr   c             C   s(   || _ || _g | _|| _g | _g | _d S )N)r   sizer7   contig_typerM   genes)r   r   ra   rb   r   r   r   r      s    zContig.__init__)Nr   )r,   r-   r.   r   r   r   r   r   r:      s   r:   c             C   s   | dkrdS | d S )Nr$   r3   r   )r[   r   r   r   rZ      s    rZ   c             C   s$   dj tdd ttt| D S )Nr   c             S   s*   g | ]"\}}||r |d   r dnd qS )    r   r   )rW   r@   rI   r   r   r   rX      s    z'format_long_numbers.<locals>.<listcomp>)joinreversedrS   r"   )numberr   r   r   format_long_numbers   s    ri   Tc             C   s*   d}t | |||}|r&|d k	r&|j  |S )Nr   )rP   r]   )rT   rU   Zvirtual_genome_sizer]   r?   rQ   r   r   r   get_assemblies   s    rj   c             C   s   t jj| st j|  d S )N)ospathexistsmakedirs)Zoutput_dir_pathr   r   r   make_output_dir
  s    ro   c       
      C   s   g }|j d| d  |j d| d  ||  rt|trB||  n|}|j |d |  d t| d  |j |d |  d  d}xBt||  D ]2\}}	|d d	kr|j | d}|t|	d
 7 }qW |j | |d d d d |d< |S )Nzvar z = {};z["z"] = ;z"] = [ r   d   r   ,r3   z];rC   rC   rC   )r;   
isinstancedictr"   rS   )
chrZcov_dataZcov_data_nameZ	max_depthZmax_depth_namedataZchr_max_depthliner@   er   r   r   format_cov_data  s     "

ry   c             C   s   t |dkrtjS t| S )Nr3   )r<   r   one_alignment_viewer_namer   )ru   chr_full_namesr   r   r   get_html_name"  s    r|   Fc             C   s   |r t j}tjjt j|d }ntjjt jt| d }| jdd}d}	t|dkrl| d d }
|}	|
d }dd ||  D }t	|d	 ||  t|  }||  }|||||	fS )
Nz.html_re   r   F   z...c             S   s   g | ]}|d k	r|qS )Nr   )rW   Zaligned_lenr   r   r   rX   4  s    z#get_info_by_chr.<locals>.<listcomp>g      Y@)
r   rz   rk   rl   rf   icarus_dirnamer   replacer<   sum)ru   Zaligned_bases_by_chrZ	chr_sizesrT   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 }n\t|j tjk rXt| dkrXtj|g}n0t | }x$t	t| D ]}|| | | < qpW |fS )Nc                s"   g | ]}| kr j |p|qS r   )add)rW   ref)
added_refsr   r   rX   =  s    z$group_references.<locals>.<listcomp>c                s   g | ]} | qS r   r   )rW   rN   )r   r   r   rX   =  s    r3   )
setr   valuesr   MAX_SIZE_FOR_COMB_PLOTr<   r   name_from_fpathrt   rY   )Z	chr_namesr   Zchromosomes_length	ref_fpathr{   r@   r   )r   r   r   group_references:  s    "r   c       	      C   s   x| D ]}|j sq||j }x8t|D ],\}}t|tr&|j|jkr&|j|jkr&P q&W d}t||d  tkr||d  j	dd j
 }t||rd}|d t|k rt||d  tkr||d  j	dd j
 }t||rd}||_qW | S )NFr3   rr   r   T)r   r   rS   rs   r   r	   r
   typer"   splitstripis_misassembly_realr<   r   )	r>   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|ks&d|ks&d|kr,d}n<t|shd|kr@d	S d|krNd}nd|krZd}|jdd }||fS )
Nreallocalfakeindelskipunknown:r3   )r   r   )r   large_genomer   r   )ZmisassemblyZms_descriptionms_typer   r   r   parse_misassembly_info`  s    r   c             C   sp  d}g }xDt | D ]8\}}t|tr|j|jkr|j|jkr|j|jkrP qW d}t| |d  tkr| |d  jdd j	 }t
|}|rd|krd}|j| |j|jk r|d7 }n|d7 }|s|jd d}|d t| k ot| |d  tkrX| |d  jdd j	 }t
|}|rXd|kr.d}|j| |j|jk rP|d
7 }n|d7 }|sh|jd ||fS )Nr   Fr3   rr   r   r   LRrp   z;Rz;L)rS   rs   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  sD    
$






r   c             C   s    |rd| krdS d| kod| kS )Nr   Fr   r   r   )r   r   r   r   r   r     s    r   )NT)F)F)F)
__future__r   rk   
quast_libsr   r   Z quast_libs.html_saver.html_saverr   r   r/   r2   rP   r:   rZ   ri   rj   ro   ry   r|   r   r   r   r   r   r   r   r   r   r   <module>
   s(   ,_E



'