a
    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}|dt|  |dt|  |dtj d d  |  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 |  d}t|dk r"dS |d   d tt|krFdS |d   d tt|krjdS dS )Nr   r   Fr   r   T)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| d}|S )N_   10.9z-cxasm20--mask-level-N100	--score-N0z-Ez1,0z-f200--cs-tr   a  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    rJ   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
| d}|S ) NZ   r1   c   Zasm10Zasm5r/   r0   r4   Z50z-B5z-O4,16z--no-long-joinz-rr3   z-sz-zr7   z-cz-xr2   z	--min-occz-gZ2500r5   2r8   r9   r   r:   r;   r<   )r   is_agb_moderJ   r@   is_combined_refr+   local_misassembly_min_lengthmin_alignmentr   large_genomer   rA   r   rB   )rC   r$   r#   rD   rE   rF   presetrG   Znum_alignmentsZadditional_optionsrH   rI   r   r   r   run_minimap>   s&    

 rT   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
    rY   c                 C   s  t d}t| b}t|d4}|D ]}|d}t|dk rFq(|d |d |d |d |d	 |d
 f\}}}	}
}}tt||	|f\}}	}|d7 }|d7 }|d dr|d  }|d }nd}|d }|dd }d}|
dkr|	| }}	d}d}d}tt|d |d f\}}|	|}|D ]}t|d d |d  }}|dksZ|dkrd||7 }nV|dks|dks|dkr||7 }||7 }n&|dkr||7 }n|dkr(||7 }q(||d |  }	|| d }d|d |  }|dkr(t
|tjkr2t||||	||||||d
}|| d  q(t||||||| q(W d    n1 s^0    Y  W d    n1 s~0    Y  d S )Nz(\d+[M=XIDNSH])r   	
   r   r   r            r   r&   cs :-	   SHM=XDI%.2f      Y@*)
s1e1s2e2len1len2idyrefcontigcigarr   )recompiler   r(   r)   mapint
startswithr*   findallfloatr   r@   r   r   
coords_strsplit_align)Zraw_coords_fpathrW   Zcigar_patternfcoords_filelinefsrw   align_startZ	align_endstrandref_name	ref_startr_   rx   strand_directionZ	align_lenref_lenmatched_basesZbases_in_mappingZ
operationsopn_basesZ	operationZref_endru   alignr   r   r   parse_minimap_outputd   s^    


&








r   c                    s  fdd d fdd	}dt ||||dd||dd	d}t|D ]}	|	drf||	7 }qN|r|d}
|||
|
d}|	d	rt|	d
d  }
 j|	7  _ j|
7  _ j|
7  _|
7 qNt|	d
 }
|	dr||	|
dqN|	drN||	|
dqN   d S )Nc                      s    j tjk s jr jsd S  j j d  _ j j d    _dd t	 j j    _
t j
tjkr  d  d S )Nr   rl   rm   r   )rt   r   rQ   rs   rx   ro   rp   rq   rr   maxru   r   r@   r   r   r   )r   r   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 )N)r   r   ra   r   )r
   ro   rs   rq   rt   rx   )r   Zprev_op
n_refbasesn_alignbases)r   r   r   r   r   
_try_split   s    zsplit_align.<locals>._try_splitra   )	ro   rp   rq   rr   rs   rt   rv   rw   rx   rn   rb   r   +)r   rc   )r   )r   r   )	r   r   r}   countr|   rx   rs   rt   r)   )r   r   r   r   r   rw   r_   r   Zcur_mismatch_stretchr   r   r   )r   r   r   r   r   r   r      s6    	





r   c	                 C   s  t |d}	|d }
|	d tjd urtjtjrttj|\}}}}tj	tj|}t
|rt
| rvt|  ttj|tj| |  |	d tdt| d  tjS d t_t
|
rt
| rt|
||r|	d tdt| d  tjS |	d	 tdt| d
  | d }t||||||}|dkrXtjS t
|shtjS t|sxtjS t|
|| |	d t||  tjS )Nr   z.sfz!Aligning contigs to reference...
z9	Reusing alignments from the combined_reference stage...
r;   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 reference_tmpr   zFiltering alignments...
)r   r   r   alignments_for_reuse_dirpathospathisdirrY   basenamejoinr   removesymlinkrelpathdirnameloggerinfor   rB   r   r   r-   rT   r   r   r   r   r%   r   )output_fpathZout_basenamer$   r#   Zold_contigs_fpathrE   threadsZlog_out_fpathrD   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   ry   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-   rJ   rT   rY   r   r   r   r   r   r   r   <module>   s(   
		84