U
    ñad‡h  ã                   @   s~  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZ zd dlmZ W n  ek
rx   d dlmZ Y nX d dlmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZmZ d dlmZmZm Z  d dl!m"Z" dZ#dZ$dZ%dZ&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"„ Z0d#d$„ Z1d%d&„ Z2d'd(„ Z3d)d*„ Z4d+d,„ Z5d-d.„ Z6d/d0„ Z7dS )1é    )Úwith_statementN)Údefaultdict)ÚjoinÚexistsÚdirnameÚrealpath)ÚOrderedDict)ÚqutilsÚqconfig)Úget_aux_out_fpaths)Úcreate_minimap_output_dirÚparse_cs_tag)Úget_chr_lengths_from_fastafile)Úget_assembliesÚcheck_misassembled_blocksÚ	Alignment)Úget_path_to_programÚis_non_empty_fileÚrelpath)ÚCOVERAGE_FACTORz
circos.pngg{®Gáz¤?g¸…ëQ¸®?éPÃ  c           	      C   sž  t |  ¡ ƒ}d}t|dƒ}t|dƒH}|  ¡ D ]8\}}| d dd||dt|ƒdg¡d	 ¡ t||ƒ}q.W 5 Q R X t|d
ƒ}t|dƒ}| d¡ | d¡ tj	r¸|dkr¸| d¡ n2|dkrÌ| d¡ n|dkrà| d¡ n
| d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d ¡ | d!¡ | d"¡ | d#¡ W 5 Q R X |||fS )$Nr   zreference.karyotype.txtÚwú	Úchrú-Ú0ZlgreyÚ
zideogram.confz<ideogram>
z
<spacing>
é   zdefault = 0r
é   zdefault = 0.005r
éd   zdefault = 0.001r
zdefault = 0.0005r
zbreak = 0.005r
z</spacing>
zthickness = 30p
zstroke_thickness = 2
zstroke_color = black
zfill = yes
zradius = 0.85r
úshow_label = no
zlabel_font = default
z-label_radius = dims(ideogram,radius) + 0.05r
zlabel_size = 36
zlabel_parallel = yes
zband_stroke_thickness = 2
zshow_bands = yes
zfill_bands = yes
z</ideogram>)
ÚlenÚkeysr   ÚopenÚitemsÚwriteÚstrÚmaxr
   Z
prokaryote)	Úchr_lengthsÚ
output_dirZnum_chromosomesÚmax_lenÚkaryotype_fpathÚout_fÚnameÚseq_lenÚideogram_fpath© r0   ú0lib/python3.8/site-packages/quast_libs/circos.pyÚcreate_ideogram$   sF    
&


















r2   c              	   C   sæ  t |dƒ}t|dƒÆ}| d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d	¡ | d
¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d dkr¸d| d  }d}nd|  }d}| dt|ƒ d ¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d ¡ | d!¡ | d"¡ | d¡ | d¡ | d¡ | d#¡ | d¡ | d$¡ | d!¡ | d%¡ | d&| ¡ | d¡ | d¡ | d'¡ W 5 Q R X |S )(Nz
ticks.confr   zshow_ticks = yes
zshow_tick_labels = yes
zshow_grid = no
z<ticks>
zskip_first_label = yes
zskip_last_label = no
z%radius = dims(ideogram,radius_outer)
ztick_separation = 2p
z min_label_distance_to_edge = 0p
zlabel_separation = 5p
zlabel_offset = 5p
zlabel_size = 12p
zthickness = 3p
é
   é@B g      ð?ZMbpZkbpzlabel_multiplier = r   z<tick>
zspacing = 1u
zcolor = dgrey
zsize = 12p
r    zformat = %s
z</tick>
zspacing = 5u
zcolor = black
zsize = 18p
zshow_label = yes
zlabel_size = 24p
zspacing = 10u
zsize = 24p
zlabel_size = 32p
zsuffix = " %s"
z</ticks>)r   r#   r%   r&   )Úchrom_unitsr)   Úticks_fpathr,   Zlabel_multiplierÚsuffixr0   r0   r1   Úcreate_ticks_confL   s^    




































r8   c                 C   sÊ   t |dƒ}dddg}t|dƒ¢}tƒ }ddlm} |j ¡ D ]&\}}||krTg ||< ||  |¡ q<t| ¡ ƒD ]J\}	\}}
|
D ]8}| 	d  |d	t
| | ƒd
||	t|ƒ   g¡d ¡ q€qpW 5 Q R X |S )Nzhighlights.txtZorangeZpurpleZbluer   r   )Úcontigs_analyzerr   r   zfill_color=r   )r   r#   r   Ú
quast_libsr9   Zref_labels_by_chromosomesr$   ÚappendÚ	enumerater%   r&   r!   )r(   r)   Úhighlights_fpathZcolorsr,   Zchrom_by_refsr9   ÚchromÚrefÚiZchromosomesr0   r0   r1   Úcreate_meta_highlights   s    

BrA   c              	   C   sz  g }t tƒ}t| ƒV}d }d }d }d }d }d }	d }
t|ƒD ](\}}| dd¡ d¡}|dkr¨| d¡}| d¡}| d¡}| d¡}| d	¡}| d
¡}	| d¡}
q<|r¼|d dkr¼q<q<|ràt|ƒdk rà||  | 	¡ ¡ q<|r<t|ƒdkr<t
|| ƒt
|| ƒ|| || ||	 ||
 f\}}}}}}t|||||dkd}||_|jr<| |¡ ||  |¡ q<W 5 Q R X ||fS )Nr   Ú r   r   ZS1ZE1Z	ReferenceZContigZIDYZ	AmbiguousZ
Best_groupZCONTIGé   ÚTrue)r-   ÚstartÚendÚref_nameÚis_best_set)r   Úlistr#   r<   ÚreplaceÚsplitÚindexr!   r;   ÚstripÚintr   Ú	ambiguousrH   )Úreport_fpathÚaligned_blocksÚmisassembled_id_to_structureZreport_fileZ	contig_idZ	start_colZend_colZref_colZ
contig_colZ	ambig_colZbest_colr@   ÚlineZ
split_lineZidy_colrE   rF   rG   Z	ambiguityZis_bestÚblockr0   r0   r1   Úparse_aligner_contig_report   sJ    





  þ
rU   c                 C   s|   g }| D ]D}|r|t  |¡ }t|ƒ\}}|d kr4qt||dd}| |¡ q|rttdd„ |D ƒƒ}t| |ƒj|fS dS d S )NT)Zfilter_localc                 S   s   g | ]}t |ƒ‘qS r0   )r!   )Ú.0rQ   r0   r0   r1   Ú
<listcomp>Ä   s     z$parse_alignments.<locals>.<listcomp>©NN)r	   Úlabel_from_fpath_for_fnamerU   r   r;   r'   r   Ú
assemblies)Úcontigs_fpathsÚcontig_report_fpath_patternZlists_of_aligned_blocksZcontigs_fpathrP   rQ   rR   Zmax_contigsr0   r0   r1   Úparse_alignments·   s    r]   c                 C   s(  t || jd ƒ}|d }t|dƒü}d }| jD ]º}d|_|jrFd|_n|jrRd|_|r°|j|jkr°|j|jkr°t|j	|j	ƒt
|j|jƒ |k r°t
|j	|j	ƒ|_	t|j|jƒ|_q.|rä| d  |jt|j	ƒt|jƒd|j g¡d	 ¡ |}q.| d  |jt|j	ƒt|jƒd|j g¡d	 ¡ W 5 Q R X |S )
Nz.confr   r   ZgreenZredZppurpler   zcolor=r   )r   Úlabelr#   Z
alignmentsZcolorZmisassembledrO   rG   r'   rE   ÚminrF   r%   r&   )ÚassemblyÚref_lenr)   Ú
conf_fpathZmax_gapr,   Z
prev_alignZalignr0   r0   r1   Úcreate_alignment_plotsÊ   s(    
ÿ0:rc   c           	   	   C   s|   g }t | ƒ&}|D ]}| t| ¡ d ƒ¡ qW 5 Q R X t|ƒ}tt|ƒƒtt|ƒƒ }}t|dƒ}t	 
| |¡ ||||fS )Néÿÿÿÿzgc.txt)r#   r;   ÚfloatrK   r!   rN   r_   r'   r   ÚshutilÚcopy)	Úgc_fpathÚdata_dirZ	gc_valuesÚfrS   Ú
max_pointsÚmin_gcÚmax_gcZdst_gc_fpathr0   r0   r1   Úcreate_gc_plotá   s    
"
rn   c                 C   sx  d}| sd |fS t ƒ }t|dƒ}t| ¡ ƒ}t| ƒ¤}d}t|ƒD ]\}	}
|
 ¡ }|
 d¡r¨d}|d dd … }t|d ƒd }|| }dd„ t	|| d ƒD ƒ||< qBt|d ƒ}|| ||   
|¡ |t7 }qBW 5 Q R X t|d	ƒ‚}| ¡ D ]r\}}t|ƒD ]`\}}|r t|ƒt|ƒ nd}| d
 |t|| ƒt|d | ƒt|ƒg¡d ¡ |d7 }qqòW 5 Q R X ||fS )Nr   zcoverage.txtú#r   c                 S   s   g | ]}g ‘qS r0   r0   )rV   r@   r0   r0   r1   rW   þ   s     z(create_coverage_plot.<locals>.<listcomp>é   rd   r   r   r   )Údictr   rI   Úvaluesr#   r<   rK   Ú
startswithrN   Úranger;   r   r$   Úsumr!   r%   r&   )Ú	cov_fpathÚwindow_sizer(   r)   rk   Zcov_by_chromÚcov_data_fpathrj   ÚposrL   rS   Zfsr>   Zchrom_orderZ	chrom_lenZdepthr,   Z
depth_listr@   ZdepthsZ	avg_depthr0   r0   r1   Úcreate_coverage_plotí   s4    


 4rz   c                    s  t  | j¡}t|dtjƒ}tt|ƒ|ƒ}t|ƒ\}}	}}t|	ƒrFtj	sJd S t||d ƒ}
t
‡ ‡fdd„ƒ}t|	ƒ¬}|D ] }t| d¡d  ¡ d ƒ}| ¡ d  ¡ }| ¡ d  ¡ }|}t|ƒD ]T}t|ƒd	 }| d
¡r|| t|ƒˆ   d	7  < |d	7 }qÂ| d¡sÂ||7 }qÂqxW 5 Q R X t|
dƒæ}| ¡ D ]Ö\}}d\}}t|ƒD ]\}}|dkrp|d	 ˆ }nn|rš| d |t|ƒt|ƒdg¡d ¡ | d |t|ˆ ƒt|d	 ˆ ƒt|ƒg¡d ¡ |d	 ˆ }d }qP|r8| d |t|ƒt|ƒdg¡d ¡ q8W 5 Q R X |
S )Nz..z.mismatches.txtc                      s   dgˆ ˆ d  S ©Nr   r   r0   r0   ©ra   rw   r0   r1   Ú<lambda>  ó    z(create_mismatches_plot.<locals>.<lambda>ú|r   é   rd   r   Ú*ú+r   )r   r   r   r   r   )r	   rY   Zfpathr   r
   Z detailed_contigs_reports_dirnamer   r   r   Z	show_snpsr   r#   rN   rK   rM   r   r!   rs   r$   r<   r%   r&   )r`   rw   ra   Zroot_dirr)   Zassembly_labelZaligner_dirpathZcoords_basenameÚ_Zcoords_filtered_fpathZmismatches_fpathZmismatch_density_by_chromZcoords_filerS   Ús1r>   ZcigarZref_posÚopZn_basesr,   Zdensity_listrE   rF   r@   Údensityr0   r|   r1   Úcreate_mismatches_plot  sF    



$42r‡   c                    s’  g }d}| s||fS | D ]n}t ||jd ƒ}t|jƒdkr>qd}t‡ ‡fdd„ƒ}	t|dƒ}
|jD ]’}|jr„|j|jkr„|jn|j}||jkrž|j| nd }|s¨qht	|j
ˆ t|jˆ d t|	| ƒƒƒD ](}|t|	| ƒk rÐ|	| |  d7  < qÐqh|	 ¡ D ]Z\}}t|ƒD ]F\}}|
 d  |t|ˆ ƒt|d ˆ ƒt|ƒg¡d ¡ |d7 }qqW 5 Q R X t|ƒr~| |¡ t||ƒ}q||fS )	Nr   z.txtc                      s   dgˆ ˆ d  S r{   r0   r0   r|   r0   r1   r}   A  r~   z#create_genes_plot.<locals>.<lambda>r   r   r   r   )r   Úkindr!   Úregion_listr   r#   Z
chromosomeZchr_names_dictZseqnamert   rE   r_   rF   r$   r<   r%   r&   r   r;   r'   )Úfeatures_containersrw   ra   r)   Úfeature_fpathsrk   Úfeature_containerÚfeature_fpathZ
num_pointsZgene_density_by_chromr,   Zregionr>   r@   Zgene_density_listr†   r0   r|   r1   Úcreate_genes_plot5  s:    

ÿ,4

rŽ   c              
   C   sT   t |dƒ}t|dƒ6}|  ¡ D ]&\}}| d  |dt|ƒg¡d ¡ qW 5 Q R X |S )Nz
genome.txtr   r   r   r   )r   r#   r$   r%   r&   )r(   r)   Zgenome_fpathr,   r-   r.   r0   r0   r1   Úcreate_genome_fileV  s
    
*r   c              	   C   s  t |dƒ}g }d}t|ƒD ]*\}}	| dt|d ƒ |f¡ |d7 }q|D ]*}
t|
jƒdkrJ| |
j|f¡ |d7 }qJ|rˆ| d|f¡ t|dƒ4}| t	|  
¡ ƒd d d  d	d
„ |D ƒ¡ ¡ W 5 Q R X t |dƒ}t|dƒ}| dt||ƒ d ¡ W 5 Q R X ||fS )Nz
labels.txtr   r`   r   Zcoverager   z
	0	0	null	ú,c                 S   s   g | ]\}}d ||f ‘qS )z
track%d=%sr0   )rV   r^   r@   r0   r0   r1   rW   m  s     z!create_labels.<locals>.<listcomp>z
label.confzRz = 10
type = text
label_size = 30p
label_font = bold
label_parallel = yes
file = zÍ
r0 = eval(sprintf("%fr+5p", conf(conf(., track_idx)_pos)))
r1 = eval(sprintf("%fr+500p", conf(conf(., track_idx)_pos)))
<rules>
<rule>
condition = 1
value = eval(var(conf(., track_idx)))
</rule>
</rules>
)r   r<   r;   r&   r!   r‰   rˆ   r#   r%   rI   r"   r   )r(   rZ   rŠ   Úcoverage_fpathr)   Zlabels_txt_fpathÚtrack_labelsÚplot_idxr@   r`   rŒ   r,   Zlabels_conf_fpathr0   r0   r1   Úcreate_labels^  s,    


8
ûûr”   c                 C   s@   | dkrd}n.| dkrd}n | dkr*d}n| dkr8d}nd	}|S )
Ni eÍi N  i £áé'  i áõiˆ  r4   éè  r   r0   r|   r0   r0   r1   Úset_window_size  s    r—   c           
   	   C   s¸   t |dƒ}t|dƒš}| dtjr&dnd||f ¡ tjrD| d¡ | d¡ t| ƒD ] \}}	| d|d	 |	jf ¡ qV| d
¡ |r| d¡ |rª| d|r¢dnd ¡ W 5 Q R X |S )Nz
legend.txtr   zn1) The outer circle represents reference sequence%s with GC (%%) heatmap [from %d%% (white) to %d%% (black)].
ÚsrB   z=Color bars help to distinguish between different references.
z
2) Assembly tracks:
z	assembly%d - %s
r   zjAssembly tracks are combined with mismatches visualization: higher columns indicate larger mismatch rate.
zK
3) User-provided genes. A darker color indicates higher density of genes.
z:
%d) The inner circle represents read coverage histogram.
é   é   )r   r#   r%   r
   Úis_combined_refr<   r^   )
rZ   rl   rm   rŠ   r‘   r)   Zlegend_fpathr,   r@   r`   r0   r0   r1   Úcreate_legend  s     
ÿ



 rœ   c           '   	      sP  t ˆdƒ‰ tˆ ƒst ˆ ¡ t| ƒ}t|ˆ ƒ\}	}
}|	dkrBd}n|	dkrPd}nd}t|ˆ ƒ}t| ¡ ƒ‰t	ˆƒ‰t
||ƒ\}}‡ ‡fdd„|D ƒ}|sœd S t|ˆ ƒ\}}}}t|ˆˆˆ ƒ\}}‡ ‡‡‡fdd„|D ƒ}t|ˆ|ˆ ƒ\}}tt||||gƒ}t||||ˆ ƒ\}}t ˆd	ƒ}d
}d}tgt|ƒ }|rPt|d< |tgt|ƒ 7 }|rht|d< | t¡ t|d< t|dƒ´} |  d¡ |  dt|ˆƒ ¡ |  dt|ˆƒ ¡ |  dt|
ˆƒ ¡ |  d| ¡ |  d¡ |  dttƒ d ¡ tt|ƒƒD ],}!|  d|!|f ¡ |t8 }|||! 8 }qþ|  dt|ƒ|f ¡ |  d¡ |  dˆ ¡ |  dt ¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d ¡ tjr|  d!¡ t|ˆ ƒ}"|  d"¡ |  dt|"ˆƒ ¡ |  d#¡ |  d$¡ |  d%¡ |  d&¡ |  dt d'd(ƒ ¡ |  d)| ¡ |  d*t| ¡ ƒ ¡ |  d+¡ |  d,¡ |D ]@\}#}!|  d-¡ |  d.|! ¡ |  dt|ˆƒ ¡ |  d/¡ qjt |ƒD ]\}!}$|  d-¡ |  d0¡ |  d1¡ |  d2¡ |  d3¡ |  dt|$ˆƒ ¡ |  d4t|ƒ d5 ¡ |  d6t|ƒ d7 ¡ |  d/¡ |rÀ||! rÀ|  d-¡ |  d8¡ |  d9¡ |  d:¡ |  dt||! ˆƒ ¡ |  d4t|ƒ d5 ¡ |  d6t|ƒ d7 ¡ |  d/¡ |d;7 }q´|D ]v}%|  d-¡ |  d<¡ |  dt|%ˆƒ ¡ |  d=¡ |  d4t|ƒ d5 ¡ |  d6t|ƒ d7 ¡ |  d/¡ |d;7 }qÐ|rÈ|  d-¡ |  d8¡ |  d9¡ |  dt|ˆƒ ¡ |  d>¡ |  d4t|ƒ d5 ¡ |  d6t|ƒ d7 ¡ |  d/¡ |d;7 }|  d-¡ |  d<¡ |  dt|ˆƒ ¡ |  d?¡ |  d@¡ |  dA¡ |  dB¡ |  d/¡ |  dC¡ W 5 Q R X t!|||||ˆƒ}&||&fS )DNÚdatar4   i † r•   r–   c                    s   g | ]}t |ˆˆ ƒ‘qS r0   )rc   ©rV   r`   )ri   ra   r0   r1   rW   ´  s     zcreate_conf.<locals>.<listcomp>c                    s   g | ]}t |ˆˆˆˆ ƒ‘qS r0   )r‡   rž   ©ri   r)   ra   rw   r0   r1   rW   º  s     zcircos.confgffffffî?r   rd   r   z+<<include etc/colors_fonts_patterns.conf>>
z<<include %s>>
zkaryotype = %s
zchromosomes_units = %d
z"chromosomes_display_default = yes
ztrack_width = r   ztrack%d_pos = %f
z<image>
z	dir = %s
z
file = %s
z
png = yes
z	svg = no
zradius = 1500p
zangle_offset = -90
zauto_alpha_colors = yes
zauto_alpha_steps = 5
zbackground = white
z	</image>
z<highlights>
z<highlight>
zr0 = 1r - 50p
zr1 = 1r - 30p
z</highlight>
z</highlights>
Úetczhousekeeping.confzmax_points_per_track* = %d
zmax_ideograms* = %d
z<plots>
zlayers_overflow = collapse
z<plot>
ztrack_idx = track%d
z</plot>
ztype = tile
zthickness = 50p
zstroke_thickness = 0
zlayers = 1
z$r0 = eval(sprintf("%.3fr",conf(trackz_pos) - conf(track_width)))
z$r1 = eval(sprintf("%.3fr",conf(trackz_pos)))
ztype = histogram
zthickness = 1
zfill_color = vlyellow
r   ztype = heatmap
zcolor = ylorbr-9
zfill_color = vlblue
zcolor = greys-6
zscale_log_base = 1.5
zr0 = 1r - 29p
zr1 = 1r - 1p
z	</plots>
)"r   r   ÚosÚmakedirsr   r2   r8   ru   rr   r—   r]   rn   rŽ   rz   r'   Ú
MAX_POINTSr”   ÚTRACK_INTERVALr!   ÚBIG_TRACK_INTERVALr;   r#   r%   r   r&   ÚTRACK_WIDTHrt   Úcircos_png_fnamer
   r›   rA   r"   r<   rœ   )'Ú	ref_fpathr[   r\   r)   rh   rŠ   rv   Úloggerr(   r*   r+   r/   r5   r6   rZ   Zcontig_pointsZalignments_fpathsrl   rm   Z	gc_pointsr‹   Zgene_pointsZmismatches_fpathsrx   Z
cov_pointsrk   Zlabels_fpathr’   rb   Zradiusr“   Ztrack_intervalsr,   r@   r=   r^   Zalignments_confr   Úcircos_legend_fpathr0   rŸ   r1   Úcreate_conf¢  sþ    




















































r«   c              	   C   sÔ   t |ƒst |¡ t| |||||||ƒ\}}	tdƒ}
|
sV| d| d |	 d ¡ dS |
d|g}t|dƒ}t|dƒ}t|tƒ}tj	|t
|d	ƒt
|d	ƒd
}|dkr²t|ƒr²||	fS | d| d | d ¡ dS d S )NZcircoszØCircos is not installed!
If you want to create Circos plots, install Circos as described at http://circos.ca/tutorials/lessons/configuration/distribution_and_installation and run the following command:
	circos -conf z
The plot legend is saved to r   rX   z-confz
circos.logz
circos.errr   )ÚstdoutÚstderrr   z&  Circos diagram was not created. See z and z for details)r   r¡   r¢   r«   r   Zwarningr   r§   r	   Zcall_subprocessr#   r   )r¨   r[   r\   rh   rŠ   rv   r)   r©   rb   rª   Zcircos_execZcmdlineZ	log_fpathZ	err_fpathZcircos_png_fpathZreturn_coder0   r0   r1   Údo-  s0    
þþýý



r®   )8Z
__future__r   r¡   Úrerf   Úcollectionsr   Úos.pathr   r   r   r   r   ÚImportErrorZ%quast_libs.site_packages.ordered_dictr:   r	   r
   Z!quast_libs.ca_utils.align_contigsr   Zquast_libs.ca_utils.miscr   r   Zquast_libs.fastaparserr   Zquast_libs.icarus_utilsr   r   r   Zquast_libs.qutilsr   r   r   Zquast_libs.reads_analyzerr   r§   r¦   r¤   r¥   r£   r2   r8   rA   rU   r]   rc   rn   rz   r‡   rŽ   r   r”   r—   rœ   r«   r®   r0   r0   r0   r1   Ú<module>   sL   (3( (!# 