3
b-                 @   s   d dl mZ d dlZd dlZd dlmZ d dlZ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 d d	lmZmZ eejZG d
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 Z dS )    )with_statementN)isfile)qconfigqutils)Mapping)minimap_fpathparse_cs_tag)
get_logger)SPLIT_ALIGN_THRESHOLD)md5is_non_empty_filec               @   s   e Zd ZdZdZdZdZdS )AlignerStatusr            N)__name__
__module____qualname__FAILEDOKNOT_ALIGNEDERROR r   r   K/home/psgendb/BIRCHDEV/pkg/quast-5.2.0/quast_libs/ca_utils/align_contigs.pyr      s   r   c             C   sX   t | d}|jdt|  |jdt|  |jdtjj jd d  |j  d S )NwzAssembly md5 checksum: %s
zReference md5 checksum: %s
zSuccessfully finished on z%Y/%m/%d %H:%M:%S
)openwriter   datetimenowstrftimeclose)fpathcontigs_fpath	ref_fpathZsuccessful_check_filer   r   r   create_successful_check!   s    
r%   c             C   sn   t | j jd}t|dk r"dS |d j j d tt|krFdS |d j j d tt|krjdS dS )	Nr   r   Fr   r   Tr&   )r   readsplitlenstripstrr   )r"   r#   r$   successful_check_contentr   r   r   check_successful_check*   s      r-   c       	      C   sl   t jdk rdnd}t ddd|ddd	d
ddddddt|||g}tj|t| dt|ddtj| d}|S )N_   1z0.9z-cxasm20z--mask-levelz-N100z	--score-N0z-Ez1,0z-f200z--csz-tr   az  )stdoutstderrindent)r   min_IDYr   r+   r   call_subprocessr   index_to_str)		out_fpathr$   r#   log_err_fpathindexmax_threads
mask_levelcmdlinereturn_coder   r   r   run_minimap_agb5   s    rB   c             C   s   t jrt| |||||S t jdk r(d}nt jdk r8d}nd}t jrFdnd}t jrTdnd	}d
dddtt jd|dtt jddg}	t dd|gt j	s|	ng  d|ddddddddt|||g }
t
j|
t| dt|ddt
j| d}|S ) NZ   r0   c   Zasm10Zasm5r/   z0.9r1   Z50z-B5z-O4,16z--no-long-joinz-rz-Nz-sz-zr3   z-cz-xz--mask-levelz	--min-occz-gZ2500z	--score-N2z--csz-tr   r4   z  )r5   r6   r7   )r   is_agb_moderB   r8   is_combined_refr+   local_misassembly_min_lengthmin_alignmentr   large_genomer   r9   r   r:   )r;   r$   r#   r<   r=   r>   presetr?   Znum_alignmentsZadditional_optionsr@   rA   r   r   r   run_minimap>   s     

$rL   c             C   s@   | d }| d }t js| d nd}t js0| d nd}||||fS )Nz.coordsz.coords.filteredz
.unalignedz	/dev/nullz
.used_snps)r   space_efficient)fnamecoords_fpathcoords_filtered_fpathZunaligned_fpathZused_snps_fpathr   r   r   get_aux_out_fpaths\   s
    rQ   c             C   sl  t jd}t| N}t|d6}x,|D ]"}|jd}t|dk rJq,|d |d |d |d |d	 |d
 f\}}}	}
}}tt||	|f\}}	}|d7 }|d7 }|d jdr|d j }|d }nd}|d  }|jdd! }d}|
dk r|	| }}	d"}d}d}tt|d |d f\}}|j	|}x|D ]}t|d d# |d$  }}|dksb|dkrl||7 }nV|dks|dks|dkr||7 }||7 }n&|dkr||7 }n|dkr0||7 }q0W ||d |  }	|| d }d|d |  }|dkr,t
|tjkr<t||||	||||||d
}|j|j d  q,t||||||| q,W W d Q R X W d Q R X d S )%Nz(\d+[M=XIDNSH])r   	
   r   r   r            r   cs :-	   SHM=XDIz%.2fg      Y@*)
s1e1s2e2len1len2idyrefcontigcigarr   r&   r&   r&   r&   r&   r&   r&   )recompiler   r(   r)   mapint
startswithr*   findallfloatr   r8   r   r   
coords_strsplit_align)Zraw_coords_fpathrO   Zcigar_patternfcoords_filelinefsrl   align_startZ	align_endstrandref_name	ref_startrW   rm   strand_directionZ	align_lenref_lenmatched_basesZbases_in_mappingZ
operationsopn_basesZ	operationZref_endrj   alignr   r   r   parse_minimap_outputd   sZ    

4









r   c                s$  fdd d fdd	}dt ||||dd||dd	d}xt|D ]}	|	jdrh||	7 }qP|r|jd}
|||
|
d}|	jd	rt|	d
d  }
 j|	7  _ j|
7  _ j|
7  _|
7 qPt|	d
 }
|	jd r||	|
dqP|	jdrP||	|
dqPW    d S )Nc                  s    j tjk s j s j r d S  j j d  _ j j d    _dd t	 j j    _
t j
tjkrj j d  d S )Nr   z%.2fg      Y@r   )ri   r   rI   rh   rm   rd   re   rf   rg   maxrj   ru   r8   r   rv   r   )r   ry   r   r   r   r   _write_align   s    z!split_align.<locals>._write_alignr   c                s   |t ks|t krZ    jj| 7  _ jj|  7  _d\__d_d} n* j|7  _ j|7  _ j|7  _| S )Nr   rX   )r   r   )r
   rd   rh   rf   ri   rm   )r   Zprev_op
n_refbasesn_alignbases)r   r   r   r   r   
_try_split   s    zsplit_align.<locals>._try_splitrX   )	rd   re   rf   rg   rh   ri   rk   rl   rm   rc   rY   r   +)r   rZ   )r   )r   r   )	r   r   rs   countrr   rm   rh   ri   r)   )ry   r|   r   r   r~   rl   rW   r   Zcur_mismatch_stretchr   r   r   )r   r   ry   r   r   r   rw      s4    	




rw   c	             C   s  t |d}	|d }
|	jd tjd k	rtjjtjrttjj|\}}}}tjj	tj|}t
|rt
| rvtj|  tjtjj|tjj| |  |	jd tjdtj| d  tjS d t_t
|
ot
| r
t|
||r
|	jd tjdtj| d  tjS |	jd	 tjdtj| d
  | d }t||||||}|dkrVtjS t
|sftjS t|svtjS t|
|| |	jd t||  tjS )Nr   z.sfz!Aligning contigs to reference...
z9	Reusing alignments from the combined_reference stage...
z  z8Reusing alignments from the combined_reference stage... z	Using existing alignments...
zUsing existing alignments... z#	Aligning contigs to the reference
z!Aligning contigs to the referenceZ_tmpr   zFiltering alignments...
)r   r   r   alignments_for_reuse_dirpathospathisdirrQ   basenamejoinr   removesymlinkrelpathdirnameloggerinfor   r:   r   r   r-   rL   r   r   r   r   r%   r   )output_fpathZout_basenamer$   r#   Zold_contigs_fpathr=   threadsZlog_out_fpathr<   Z	log_out_fZsuccessful_check_fpath_Zcoords_to_reuse_fnameZcoords_to_reuse_fpathZtmp_output_fpath	exit_coder   r   r   align_contigs   sB    










r   )!
__future__r   ro   r   os.pathr   r   
quast_libsr   r   Z)quast_libs.ca_utils.analyze_misassembliesr   quast_libs.ca_utils.miscr   r   quast_libs.logr	   Zquast_libs.qconfigr
   quast_libs.qutilsr   r   LOGGER_DEFAULT_NAMEr   r   r%   r-   rB   rL   rQ   r   rw   r   r   r   r   r   <module>   s(   
		84