3
b_                 @   s   d dl mZ d dlmZ yd dlmZ W n  ek
rH   d dlmZ Y nX d dlmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZ dd Zd	d
 Zdd ZdddZdddZdd ZdddZdd ZdS )    )join)defaultdict)OrderedDict)qconfigqutils	reporting)
html_saver)	Alignmentget_html_nameformat_long_numbersget_misassembly_for_alignmentparse_misassembly_infoc             C   s>  t t}d}|d7 }|d7 }|d7 }|d7 }|d7 }d}x| D ]}tj|}tj|}	|	jtjj}
|	jtjj	}|	jtjj
}|r|tj| d }tj||}|d| d	 | d
 7 }|d| d t|
 d 7 }|d| d t| d 7 }|d| d	 t| d
 7 }x |D ]}|	j||| |< qW q>W |||fS )N zvar assemblies_links = {};
zvar assemblies_len = {};
zvar assemblies_contigs = {};
z#var assemblies_misassemblies = {};
zvar assemblies_n50 = {};
z.stdoutzassemblies_links["z"] = "z";
zassemblies_len["z"] = z;
zassemblies_contigs["zassemblies_n50[")r   dictr   label_from_fpathr   get	get_fieldFieldsTOTALLENCONTIGSN50label_from_fpath_for_fnamerelpathstr)contigs_fpathsicarus_dirpathstdout_patternnx_marksassemblies_n50assemblies_dataassemblies_contig_size_datacontigs_fpathassembly_labelreportlcontigsn50Zcontig_stdout_fpathnx r(   C/home/psgendb/BIRCHDEV/pkg/quast-5.2.0/quast_libs/icarus_builder.pyget_assemblies_data   s0    



r*   c             C   s0  x(|D ]}t |tr|j|kr0|j|j}	nF|j|krv|j|j |rv||j }
|jd|j d t|
| d  |j}|j}| jdt| d t| d t|j	 d t|j
 d t|j d	 t|j d
 |j d ||j  d  qt|tkrt|\}}| jd| d | d  qW | S )Nzlinks_to_chromosomes["z"] = "z";z{corr_start: z,corr_end: z,start:z,end:z,start_in_contig:z,end_in_contig:z,IDY:z,chr: "z"},z{contig_type: "M", mstype: "z	", msg: ")
isinstancer	   ref_nameindexappendr
   startendr   unshifted_startunshifted_endstart_in_contigend_in_contigidytyper   )data_str	structureref_contigschr_full_namescontig_names_by_refsused_chromosomeslinks_to_chromosomeschr_names_by_idelZnum_chrZother_ref_nameZcorr_el_startZcorr_el_endms_descriptionms_typer(   r(   r)   add_contig_structure_data0   s$    



prB   c
             C   s   g }
|
j d |
j d x|j D ]}|
j d| d  |
j d| d  | | }x|| D ]}|j|krlq\|
j d| d |j d t|j d  d| d |j d	 g}|| |j }t||||||||	}|j d
 |
j| q\W q"W dj|
}
|
S )Nzvar contig_lengths = {};zvar contig_structures = {};zcontig_lengths["z"] = {};zcontig_structures["z"]["z"] = ;z"] = [ z];
)r.   keysnamer   sizerB   extendr   )assemblies_contigschr_to_aligned_blockscontigs_by_assembliesr9   r:   r;   structures_by_labelsr<   r=   r>   Zcontigs_data_strassemblyZused_contigscontigr7   contig_structurer(   r(   r)   get_contigs_structureK   s&    


*


rP   Nc       9         s6  t | |}t|
|d }d}|jd g }g }|	r<|jd d}t }t|dk}|jdt|j  d  |jd	 |jd
|  d  tt}tt}t	 x |j
 D ]}|jd
|  d | d  tt|< t	dd || D }xt|D ]\}}||| krtt}t|| | dd d}d}g }tjsxb|D ]X} || jkrx$|D ]}!| j|!jkr`|!j| j dkr`||! jd| j d t| j d t| j d t| j d t| j d t| j d t| j d || j  d  ||  jd|!j d t|!j d t|!j d t|!j d t|!j d t|!j d t|!j d ||!j  d  q`W |j|  n| g}t|| j}qFW xF|D ]<} ||  t| j| j d 7  < || j| j || j }"d}#| jrf|d7 }t|"| j | \}$}%d|$kr.d| _d}%d}#n*x(|$D ] }&|&r4| |&  d7  < q4W dj|$| _n|| j jd kr|d}#d}%g }'t | j| jt| j| j }(})x|| j j!D ]}*|(|*j  k o|)k n  s|(|*j  k o|)k n  rt| j| j|*j|(  }+t | j| j|*j|)  },d!t|*j d t|*j d" t|+ d# t|, d$ }-|'j|- qW |jd%| j d& t| j d# t| j d t| j d t| j d' | j d( |% d)  | j"r|dI  d*7  < | j#r|dJ  d+7  < | j$r|dK  d,7  < |#r$|dL  d-7  < |j| j ||  rb|jd. |jd/j||   |jd0 tj%r|jd1d/j|' d0  |rtj&d2kr|jd3 t'||| j | j |||	|||}|dM d dN d4 |dO< |dP d5 |dQ< qW qW |dR d dS d6 |dT< || }.t|| }/| d7 d8 }0t(| j) | d9  d8 |0 | d9  }1|d:| d; t|. d< 7 }|d=| d; t|/ d< 7 }|d>| d? t|1 d@ t|0 dA 7 }qW |r|j*| |r|j*| |r|jdBtjr ttj+nttj, d  |j*| dCdDdEd9d7g}2tj-s<|2j.d9 t/ }3xB|2D ]:d9krZdnd8 t( fdFd|j
 D |3< qHW t(|3j) |3d7  }4g }5xJ|3j0 D ]>\}6}7|6dkrЈd7kr|7dG7 }7|5j|7t|6f qW t1||||||	||||
}8|	r|jdj| dHj|}|||8||5||fS )UNz.htmlr   zvar links_to_chromosomes;zlinks_to_chromosomes = {};r      zvar oneHtml = rC   zvar contig_data = {};zcontig_data["z"] = {};z"]["z"] = [ c             s   s   | ]}|j |fV  qd S )N)rF   ).0rN   r(   r(   r)   	<genexpr>}   s    z5prepare_alignment_data_for_one_ref.<locals>.<genexpr>c             S   s   | j S )N)r/   )xr(   r(   r)   <lambda>   s    z4prepare_alignment_data_for_one_ref.<locals>.<lambda>)keyd   z	{contig:"z",corr_start: z,corr_end: z,start:z,end:z,start_in_contig:z,end_in_contig:z,chr: "z"}FunknownTZcorrect_unalignedz{start:z,corr_start:z
,corr_end:}z{name:"z",corr_start:z,misassemblies:"z",mis_ends:""z,similar:"True"z,ambiguous:"True"z,is_best:"True"z,more_unaligned:"True"z,overlaps:[ ,]z,genes:[allz,ambiguous_alignments:[ z],z},z];local   zinterspecies translocationzassemblies_len["z"] = z;
zassemblies_contigs["zassemblies_misassemblies["z"] = "+z";
zvar gc_window_size = 
relocationtranslocation	inversionc             3   s   | ]}|    V  qd S )Nr(   )rR   rM   )factorrA   ms_typesr(   r)   rS      s    srD   rg   rg   rg   rg   rg   rg   rg   rg   rg   rg   rg   )2r
   r   r.   setlenr   lowerr   intr   rE   	enumeratelistsortedr   large_genomer/   rF   r0   r1   r2   r3   r4   r,   maxabsaddlabelmisassembledr   misassembliescontig_typemingenessimilar	ambiguousis_best_setgene_findingambiguity_usagerB   sumvaluesrH   GC_window_size_largeGC_window_sizeis_combined_refremover   itemsrP   )9chrr:   r>   r9   r7   rJ   rL   rK   ambiguity_alignments_by_labelsr;   output_dir_pathcov_data_strphysical_cov_data_strgc_data_str	html_namealignment_viewer_fpathadditional_assemblies_datar=   r<   num_misassembliesaligned_assembliesZis_one_htmlZassemblies_lenrI   rM   r%   Z
num_contig
ref_contigZoverlapped_contigs
alignmentsprev_endZprev_alignments	alignment
prev_alignrO   Zcontig_more_unalignedru   misassembled_endsmisassemblyrx   r3   r4   geneZ
corr_startZcorr_endZ	gene_infoassembly_lenZassembly_contigsZlocal_misassembliesZext_misassembliesZmisassemblies_typesZms_counts_by_typeZtotal_ms_countms_selectorsms_countms_namecontigs_structure_strr(   )rd   rA   re   r)   "prepare_alignment_data_for_one_refb   s    



 rx 


<8Z




0*

&


(
r   FTc                s$  | |j  }g  d }xL|D ]D}|| | |j kr|d t|ksR||d  j |j kr j| qW dj  dd |jD } r fdd|D } rd  d nd |	 s rg }|o||kr|| }x||j D ]}t|trr|jd	|j d
 t|j	 d t|j
 d t|j d t|j d t|j d t|j d t|j  d |j d |j d  qt|tkrt|\}}|jd| d | d  qW |
r|j rd|_d|j d t|j    d |j d dj| d tjrddj| d nd d }||||fS )NrQ   z, c             S   s,   g | ]$}d t |j d t |j d qS )z{start:z,end:rY   )r   r/   r0   )rR   r   r(   r(   r)   
<listcomp>	  s    zadd_contig.<locals>.<listcomp>c                s   g | ]}| kr|qS r(   r(   )rR   r'   )marksr(   r)   r     s    z
, marks: "rZ   r   z	{contig:"z",corr_start: z,corr_end: z,start:z,end:z,start_in_contig:z,end_in_contig:z,size:z,IDY:z,chr:"z"},z{contig_type: "M", mstype: "z	", msg: "Z	unalignedz{name:"z",size:z,contig_type: "z",structure:[r\   z,genes:[r[   z},)rG   ri   r.   r   rx   rF   r+   r	   r   r/   r0   r1   r2   r3   r4   r5   r,   r6   r   rv   r   r|   )
cum_lengthrN   not_used_nxr   rM   r%   Zcontig_size_linesnumrL   only_nxhas_aligned_contigsZ
end_contigalignr'   rx   r8   Zassembly_structurer?   r@   rA   r(   )r   r)   
add_contig   s6    

$
Zr   c             C   s  g }|j d t|dk}|sr|j d xH|D ]@}	|	}
|rJ|	|krJ||	 }
t|
|}
|j d|	 d |
 d  q.W dg}|j d g }d	}tj}d
}|j }x| D ]}|j d| d  d	}t| | dd dd}tt|tj}||d  j	}dd |D }t|tjkrd}xPt
|D ]D\}}||kr4P t||||||||||d
\}}}}|j | q W t|tjkr|}tdd ||d  D }||7 }dd ||d  D }tt|| d t| d t| d }|j d| d t| d tjrddj| d nd   |r|t|k rxNt
||d  D ]:\}}|sRP t||||||||| |dd!
\}}}}qBW t||}|d) d d* d" |d+< qW d#j|}|d$dj| d" 7 }|d%t| d& 7 }|d't| d( 7 }|d#j| }||fS ),Nzvar links_to_chromosomes;rQ   zlinks_to_chromosomes = {};zlinks_to_chromosomes["z"] = "z";zvar contig_data = {};zvar chromosome;r   Fzcontig_data["z"] = [ c             S   s   | j S )N)rG   )rT   r(   r(   r)   rU   8  s    z"get_contigs_data.<locals>.<lambda>T)rV   reversec             S   s   g | ]}|qS r(   r(   )rR   r'   r(   r(   r)   r   ;  s    z$get_contigs_data.<locals>.<listcomp>)r   c             s   s   | ]}|j V  qd S )N)rG   )rR   r   r(   r(   r)   rS   H  s    z#get_contigs_data.<locals>.<genexpr>c             S   s8   g | ]0}|j D ]$}d t|j d t|j d qqS )z{start:z,end:rY   )rx   r   r/   r0   )rR   rN   r   r(   r(   r)   r   J  s    z hidden contigs shorter than z bp (total length: z bp)z{name:"z", size:z, contig_type:"short_contigs"z,genes:[r[   z]},z},)r   z];

rD   zvar contigLines = [zvar contigs_total_len = z;
zvar minContigSize = rC   rg   rg   rg   )r.   ri   r
   r   
min_contigr   rn   rw   max_contigs_num_for_size_viewerrG   rl   r   r~   r   r   r|   r   rp   )rK   r   r   rL   r;   	ref_namesr:   Zadditional_dataZone_htmlr,   chr_namecontigs_sizes_strZcontigs_sizes_lines	total_lenZmin_contig_sizetoo_many_contigsr   rM   r   r%   Zlast_contig_numZcontig_thresholdr   ir   r   r   Zremained_lenZremained_genesZremained_contigs_nameZcontig_viewer_datar(   r(   r)   get_contigs_data!  sr    







,"
$

r   r   c             C   sF  t jtj}t }d|  d }dj|}|d| d 7 }tj| krn|} | dtt| t|dkrfdnd	 7 } | j	d
d} ||	 | | | | |
 }d|d< | |d< d| d |d< g |d< x,|D ]$\}}}|||d}|d j
| qW t j||| t j|| d t j||d d t j||d d t j||d ddd d S )Nzchromosome = "z";
z","zvar chrContigs = ["z"];
z (rQ   z	 entries)z entry)_ zContig alignment viewertitle	referencez<script type="text/javascript">z	</script>dataZmisassemblies_checkboxes)rA   r   r   r,   Zdata_alignmentsZms_selectorF)as_text)r   get_real_pathr   icarus_viewers_template_fnamer   r   alignment_viewer_part_namer   ri   replacer.   save_icarus_htmlsave_icarus_data)r   r9   r,   json_output_dirr   r7   r   ref_datafeatures_datar   r   r   Zalignment_viewer_template_fpath	data_dictZchr_datachromosomesall_datarA   r   r   Zcheckboxr(   r(   r)   save_alignment_data_for_one_refa  s,    

(r   c             C   s   t jtj}t| tj}t }d|d< d|d< |rRttj|d< t j	||d d d| d |d< t j	||d d	 t j
||| d S )
NzContig size viewerr   TZsize_viewerZnum_contigs_warningz<script type="text/javascript">z	</script>r   Z
data_sizes)r   r   r   r   r   contig_size_viewer_fnamer   r   r   r   r   )output_all_files_dir_pathr   r   r   Zcontig_size_template_fpathZcontig_size_viewer_fpathr   r(   r(   r)   save_contig_size_html{  s    r   )NNNNNN)FT)r   r   r   r   r   )Zos.pathr   collectionsr   r   ImportError%quast_libs.site_packages.ordered_dict
quast_libsr   r   r   quast_libs.html_saverr   quast_libs.icarus_utilsr	   r
   r   r   r   r*   rB   rP   r   r   r   r   r   r(   r(   r(   r)   <module>	   s&     
 
!A
