3
bh                 @   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 y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{Gz?gQ?iP  c       	      C   s  t | j }d}t|d}t|dL}xD| j D ]8\}}|jdjdd||dt|dgd	  t||}q0W W d Q R X t|d
}t|d}|jd |jd tj	r|dkr|jd n2|dkr|jd n|dkr|jd n
|jd |jd |jd |jd |jd |jd |jd |jd |jd |jd |jd |jd |jd |jd  |jd! |jd" |jd# W d 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
z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
   
prokaryote)	chr_lengths
output_dirZnum_chromosomesmax_lenkaryotype_fpathout_fnameseq_lenideogram_fpath r/   ;/home/psgendb/BIRCHDEV/pkg/quast-5.2.0/quast_libs/circos.pycreate_ideogram$   sF    
&


















r1   c             C   s  t |d}t|d}|jd |jd |jd |jd |jd |jd |jd	 |jd
 |jd |jd |jd |jd |jd | d d(krd| d  }d}nd|  }d}|jdt| d  |jd |jd |jd |jd |jd |jd |jd |jd |jd |jd |jd  |jd! |jd" |jd |jd |jd |jd# |jd |jd$ |jd! |jd% |jd&|  |jd |jd |jd' W d 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

      g      ?ZMbpZkbpzlabel_multiplier = r   z<tick>
zspacing = 1u
zcolor = dgrey
zsize = 12p
zshow_label = no
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>i@B )r   r!   r#   r$   )chrom_unitsr(   ticks_fpathr+   Zlabel_multipliersuffixr/   r/   r0   create_ticks_confL   s^    




































r7   c             C   s   t |d}dddg}t|d}t }ddlm} x4|jj D ]&\}}||krVg ||< || j| q>W x^t|j D ]N\}	\}}
x@|
D ]8}|j	dj |d	t
| | d
||	t|   gd  qW qvW W d Q R X |S )Nzhighlights.txtZorangeZpurpleZbluer   r   )contigs_analyzerr   r   zfill_color=r   )r   r!   r   
quast_libsr8   ref_labels_by_chromosomesr"   append	enumerater#   r$   r   )r'   r(   highlights_fpathcolorsr+   Zchrom_by_refsr8   chromrefiZchromosomesr/   r/   r0   create_meta_highlights   s    


FrB   c             C   s  g }t t}t| \}d }d }d }d }d }d }	d }
x6t|D ](\}}|jddjd}|dkr|jd}|jd}|jd}|jd}|jd	}|jd
}	|jd}
q@|r|d dkrq@q@|rt|dk r|| j|j	  q@|ot|dkr@t
|| t
|| || || ||	 ||
 f\}}}}}}t|||||dkd}||_|jr@|j| || j| q@W W d Q R X ||fS )Nr    r   r   ZS1ZE1	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   	ambiguousrJ   )report_fpathaligned_blocksmisassembled_id_to_structureZreport_fileZ	contig_idZ	start_colZend_colZref_colZ
contig_colZ	ambig_colZbest_colrA   lineZ
split_lineZidy_colrG   rH   rI   	ambiguityZis_bestblockr/   r/   r0   parse_aligner_contig_report   sD    






rX   c             C   s   g }xL| D ]D}|r
|t j| }t|\}}|d kr6q
t||dd}|j| q
W |rxtdd |D }t| |j|fS dS d S )NT)Zfilter_localc             S   s   g | ]}t |qS r/   )r   ).0rS   r/   r/   r0   
<listcomp>   s    z$parse_alignments.<locals>.<listcomp>)NN)r	   label_from_fpath_for_fnamerX   r   r;   r%   r   
assemblies)contigs_fpathscontig_report_fpath_patternZlists_of_aligned_blockscontigs_fpathrR   rS   rT   Zmax_contigsr/   r/   r0   parse_alignments   s    
r`   c             C   s.  t || jd }|d }t|d }d }x| jD ]}d|_|jrJd|_n|jrVd|_|r|j|jkr|j|jkrt|j	|j	t
|j|j |k rt
|j	|j	|_	t|j|j|_q2|r|jdj |jt|j	t|jd|j gd	  |}q2W |jdj |jt|j	t|jd|j gd	  W d Q R X |S )
Nz.confiP  r   ZgreenZredZppurpler   zcolor=r   )r   labelr!   Z
alignmentscolorZmisassembledrQ   rI   r%   rG   minrH   r#   r$   )assemblyref_lenr(   
conf_fpathZmax_gapr+   Z
prev_alignalignr/   r/   r0   create_alignment_plots   s&     0:rh   c       	      C   s   g }t | *}x"|D ]}|jt|j d  qW W d Q R X t|}tt|tt| }}t|d}t	j
| | ||||fS )Nr   zgc.txt)r!   r;   floatrM   r   rP   rc   r%   r   shutilcopy)	gc_fpathdata_dirZ	gc_valuesfrU   
max_pointsmin_gcmax_gcZdst_gc_fpathr/   r/   r0   create_gc_plot   s    

$
rs   c             C   s  d}| sd |fS t  }t|d}t|j }t| }d}xt|D ]\}	}
|
j }|
jdrd}|d dd  }t|d d }|| }dd t	|| d D ||< qDt|d }|| ||  j
| |t7 }qDW W d Q R X t|d}x|j D ]v\}}xlt|D ]`\}}|r(t|t| nd}|jd	j|t|| t|d | t|gd
  |d7 }q
W qW W d Q R X ||fS )Nr   zcoverage.txt#r   c             S   s   g | ]}g qS r/   r/   )rY   rA   r/   r/   r0   rZ      s    z(create_coverage_plot.<locals>.<listcomp>   r   r   r   ri   )dictr   rK   valuesr!   r<   rM   
startswithrP   ranger;   r   r"   sumr   r#   r$   )	cov_fpathwindow_sizer'   r(   rp   Zcov_by_chromcov_data_fpathro   posrN   rU   fsr?   Zchrom_orderZ	chrom_lendepthr+   Z
depth_listrA   ZdepthsZ	avg_depthr/   r/   r0   create_coverage_plot   s4    


 4r   c                s2  t j| j}t|dtj}tt||}t|\}}	}}t|	 sJtj	 rNd S t||d }
t
 fdd}t|	}x|D ]}t|jdd j d }|j d j }|j d j }|}x`t|D ]T}t|d }|jd	r|| t|   d7  < |d7 }q|jd
s||7 }qW q~W W d Q R X t|
d}x|j D ]\}}d\}}xt|D ]\}}|dkr|d  }nn|r|jdj|t|t|dgd  |jdj|t| t|d  t|gd  |d  }d }q`W |rF|jdj|t|t|dgd  qFW W d Q R X |
S )Nz..z.mismatches.txtc                  s   dg  d  S )Nr   r   r/   r/   )re   r|   r/   r0   <lambda>  s    z(create_mismatches_plot.<locals>.<lambda>|r      r   *+r   r   r   r   ri   )r   r   )r	   r[   fpathr   r
    detailed_contigs_reports_dirnamer   r   r   	show_snpsr   r!   rP   rM   rO   r   r   rx   r"   r<   r#   r$   )rd   r|   re   root_dirr(   assembly_labelaligner_dirpathZcoords_basename_Zcoords_filtered_fpathZmismatches_fpathZmismatch_density_by_chromZcoords_filerU   s1r?   cigarref_posopZn_basesr+   Zdensity_listrG   rH   rA   densityr/   )re   r|   r0   create_mismatches_plot  sF    




$4
4r   c                s  g }d}| s||fS x| D ]~}t ||jd }t|jdkrBqd}t fdd}	t|d}
x|jD ]}|jr|j|jkr|jn|j}||jkr|j| nd }|sqnxTt	|j
 t|j d t|	| D ](}|t|	| k r|	| |  d7  < qW qnW xj|	j D ]^\}}xRt|D ]F\}}|
jdj |t| t|d  t|gd  |d7 }q$W qW W d Q R X t|r|j| t||}qW ||fS )	Nr   z.txtc                  s   dg  d  S )Nr   r   r/   r/   )re   r|   r/   r0   r   A  s    z#create_genes_plot.<locals>.<lambda>r   r   r   r   )r   kindr   region_listr   r!   
chromosomeZchr_names_dictseqnamery   rG   rc   rH   r"   r<   r#   r$   r   r;   r%   )features_containersr|   re   r(   feature_fpathsrp   feature_containerfeature_fpathZ
num_pointsZgene_density_by_chromr+   Zregionr?   rA   Zgene_density_listr   r/   )re   r|   r0   create_genes_plot5  s8    .4

r   c             C   sX   t |d}t|d:}x2| j D ]&\}}|jdj |dt|gd  q W W d Q R X |S )Nz
genome.txtr   r   r   r   )r   r!   r"   r#   r$   )r'   r(   Zgenome_fpathr+   r,   r-   r/   r/   r0   create_genome_fileV  s
    
,r   c             C   s  t |d}g }d}x6t|D ]*\}}	|jdt|d  |f |d7 }qW x2|D ]*}
t|
jdkrP|j|
j|f |d7 }qPW |r|jd|f t|d4}|jt	| j
 d d dj d	d
 |D   W d Q R X t |d}t|d}|jdt|| d  W d Q R X ||fS )Nz
labels.txtr   rd   r   coverager   z
	0	0	null	,c             S   s   g | ]\}}d ||f qS )z
track%d=%sr/   )rY   ra   rA   r/   r/   r0   rZ   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#   rK   r    r   )r'   r\   r   coverage_fpathr(   Zlabels_txt_fpathtrack_labelsplot_idxrA   rd   r   r+   Zlabels_conf_fpathr/   r/   r0   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 )NrE   r2      i N     i'  i  r3   i  r   i i ei i i i@B r/   )re   r|   r/   r/   r0   set_window_size  s    r   c       
      C   s   t |d}t|d}|jdtjr&dnd||f  tjrD|jd |jd x,t| D ] \}}	|jd|d	 |	jf  qXW |jd
 |r|jd |r|jd|rdnd  W d Q R X |S )Nz
legend.txtr   zn1) The outer circle represents reference sequence%s with GC (%%) heatmap [from %d%% (white) to %d%% (black)].
srC   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#   r
   is_combined_refr<   ra   )
r\   rq   rr   r   r   r(   Zlegend_fpathr+   rA   rd   r/   r/   r0   create_legend  s    




 r   c       '         sb  t d t stj  t| }t| \}	}
}|	dDkrBdE}n|	dFkrPdG}nd}t| }t|j t	t
||\}} fdd|D }|sd S t| \}}}}t| \}} fd	d|D }t|| \}}tt||||g}t|||| \}}t d
}d}d}tgt| }|rPt|dH< |tgt| 7 }|rht|dI< |jt t|dJ< t|d} | jd | jdt|  | jdt|  | jdt|
  | jd|  | jd | jdtt d  x<tt|D ],}!| jd|!|f  |t8 }|||! 8 }q W | jdt||f  | jd | jd  | jdt  | jd | jd | jd | jd | jd | jd | jd  | jd! tjr| jd" t| }"| jd# | jdt|"  | jd$ | jd% | jd& | jd' | jdt d(d)  | jd*|  | jd+t|j   | jd, | jd- xH|D ]@\}#}!| jd. | jd/|!  | jdt|  | jd0 qpW x"t |D ]\}!}$| jd. | jd1 | jd2 | jd3 | jd4 | jdt|$  | jd5t| d6  | jd7t| d8  | jd0 |r||! r| jd. | jd9 | jd: | jd; | jdt||!   | jd5t| d6  | jd7t| d8  | jd0 |d7 }qW x~|D ]v}%| jd. | jd< | jdt|%  | jd= | jd5t| d6  | jd7t| d8  | jd0 |d7 }qW |r| jd. | jd9 | jd: | jdt|  | jd> | jd5t| d6  | jd7t| d8  | jd0 |d7 }| jd. | jd< | jdt|  | jd? | jd@ | jdA | jdB | jd0 | jdC W d Q R X t!|||||}&||&fS )KNdatar2   r3   rE   r   i  c                s   g | ]}t | qS r/   )rh   )rY   rd   )rn   re   r/   r0   rZ     s    zcreate_conf.<locals>.<listcomp>c                s   g | ]}t | qS r/   )r   )rY   rd   )rn   r(   re   r|   r/   r0   rZ     s    zcircos.confgffffff?r   r   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
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>
i@B i i i'  ri   ri   ri   )"r   r   osmakedirsr   r1   r7   rz   rw   r   r`   rs   r   r   r%   
MAX_POINTSr   TRACK_INTERVALr   BIG_TRACK_INTERVALr;   r!   r#   r   r$   TRACK_WIDTHry   circos_png_fnamer
   r   rB   r    r<   r   )'	ref_fpathr]   r^   r(   rm   r   r{   loggerr'   r)   r*   r.   r4   r5   r\   Zcontig_pointsZalignments_fpathsrq   rr   Z	gc_pointsr   Zgene_pointsZmismatches_fpathsr}   Z
cov_pointsrp   Zlabels_fpathr   rf   Zradiusr   Ztrack_intervalsr+   rA   r=   ra   Zalignments_confr   circos_legend_fpathr/   )rn   r(   re   r|   r0   create_conf  s    





















































r   c          	   C   s   t |stj| t| |||||||\}}	td}
|
sV|jd| d |	 d  dS |
d|g}t|d}t|d}t|t}tj	|t
|dt
|dd	}|d
krt|r||	fS |jd| d | d  dS d S )NcircoszCircos 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   z-confz
circos.logz
circos.errr   )stdoutstderrr   z&  Circos diagram was not created. See z and z for details)NN)NN)r   r   r   r   r   warningr   r   r	   call_subprocessr!   r   )r   r]   r^   rm   r   r{   r(   r   rf   r   Zcircos_execcmdline	log_fpath	err_fpathcircos_png_fpathreturn_coder/   r/   r0   do-  s"    




r   )8
__future__r   r   rerk   collectionsr   os.pathr   r   r   r   r   ImportErrorZ%quast_libs.site_packages.ordered_dictr9   r	   r
   Z!quast_libs.ca_utils.align_contigsr   quast_libs.ca_utils.miscr   r   Zquast_libs.fastaparserr   Zquast_libs.icarus_utilsr   r   r   quast_libs.qutilsr   r   r   Zquast_libs.reads_analyzerr   r   r   r   r   r   r1   r7   rB   rX   r`   rh   rs   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   sL   (3( (!# 