U
    ad"                     @   s  d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dl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mZ zd dlmZ d dlZW n$   d dlmZ d dlmZ Y nX d dlmZmZmZ d dlmZ eejZd	Z d
Z!ej"ej#dZ$da%dd Z&dd Z'dddZ(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.dd  Z/dd"d#Z0d$d% Z1d&d' Z2d(d) Z3d*d+ Z4d,d- Z5d.d/ Z6d0d1 Z7dd2d3Z8d4d5 Z9d6efd7d8Z:dd9d:Z;d;d< Z<e fd=d>Z=e fd?d@Z>dAdB Z?dCdD Z@dEdF ZAdGdH ZBefdIdJZCdKdL ZDdMdN ZEdOdP ZFdddd6dQdefdRdSZGdTdU ZHddVdWZId dXlJmKZKmLZLmMZMmZmNZNmOZO eKfdYdZZPdd[d\ZQd]d^ ZRdd_d`ZSdadb ZTdcdd ZUdedf ZVdgdh ZWdidj ZXdkdl ZYdefdmdnZZdodp Z[ddqdrZ\dsdt Z]dudv Z^deddddfdwdxZ_ddzd{Z`d|d} Zadefd~dZbdd ZcdddZddd Zedd Zfdd ZgeddfddZhdddZiefddZjdddZkdddZldd Zmdd ZndddZodd Zpdd ZqdS )    )with_statement)divisionN)defaultdict)basenameisfileisdirexistsjoin)urlopen)fastaparserqconfigplotter_data)
get_loggeri  i*  Zexternal_toolsc           	      C   s@  d}| r>t | rtt| tjd s8tt| tjd rd}nTtjtjtj	tj
} t | r|rd}| }t | rt|d t| } |d7 }qlt | st|  |rt }ttj	 d}tj|rt| tt| | t| |r6|rt |s6t| n$tj| tj}t |s6t| | ||fS )NF.logT   __   Zlatest)r   r   r	   r   LOGGER_DEFAULT_NAMEZLOGGER_META_NAMEospathabspathZdefault_results_root_dirnameZoutput_dirnamestrmakedirsgetcwdchdirislinkremovesymlinkr   Zdefault_json_dirname)	output_dirpathZjson_outputpathZmake_latest_symlinkZ	save_jsonZexisting_quast_diriZbase_dirpathZprev_dirpathZlatest_symlink r    0lib/python3.8/site-packages/quast_libs/qutils.pyset_up_output_dir'   sH    






r"   c                    s   |   }ddddddddddd
 ddttj   }t| fdd|}td|r|t	j
d| d	 d
d d S |S )NN)
MKRYWSVBHDz(%s)|c                    s    |    S N)group)mZdicr    r!   <lambda>_       zcorrect_seq.<locals>.<lambda>[^ACGTN]	Skipping z* because it contains non-ACGTN characters.    indent)upperr	   mapreescapekeyssubcompilesearchloggererror)seqoriginal_fpathcorr_seqpatr    r2   r!   correct_seqX   s    rH   Fc                 C   s  g }t t}t| D ]\}}|sJtjd|  d|d d   dd  dS t||ksZ|rt|}t||}	||  d7  < t	j
st|| }
|
s dS n2td|rtjd	|  d
 ddd  dS |}
||	|
f q|stjd|  d dd dS |r
t|| dS )Nr6   zH because >sequence_name field is empty for the entry starting with "%s".   r7   r8   Fr   r5   zFile zG contains non-ACGTN characters. Please re-run QUAST without --no-check.)r9   exit_with_codez because file is empty.T)r   intr   
read_fastarB   rC   lencorrect_nameget_uniq_namer   no_checkrH   r<   r@   rA   appendwarningwrite_fasta)rE   
min_contigZcorrected_fpathis_referenceZmodified_fasta_entriesZused_seq_namesZ
first_linerD   Z	corr_nameZ	uniq_namerF   r    r    r!   correct_fastah   s@    


 rV   c                 C   s@   t |  }tdd |D s8td|tjf  d S t|S )Nc                 s   s   | ]}|t jkr|V  qd S r/   )r   rT   .0lr    r    r!   	<genexpr>   s     
 z)get_lengths_from_fasta.<locals>.<genexpr>z8Skipping %s because it doesn't contain contigs >= %d bp.)	r   get_chr_lengths_from_fastafilevaluessumrB   rR   r   rT   list)contigs_fpathlabellengthsr    r    r!   get_lengths_from_fasta   s    rb   c                    s   |r| |}d}tjr:|tjks6t|d tjkr:d}|sBdntj||j	j
 fddtjD  ||j	j fddtjD  d S )NFr   Tr   c                    s.   g | ]&  kr&t  fd dD ndqS )c                 3   s   | ]}| krd V  qdS )r   Nr    rW   Z	thresholdr    r!   rZ      s      3add_lengths_to_report.<locals>.<listcomp>.<genexpr>Nr]   rX   ra   Zmin_thresholdrc   r!   
<listcomp>   s   z)add_lengths_to_report.<locals>.<listcomp>c                    s.   g | ]&  kr&t  fd dD ndqS )c                 3   s   | ]}| kr|V  qd S r/   r    rW   rc   r    r!   rZ      s      rd   Nre   rf   rg   rc   r!   rh      s   )getr   split_scaffoldsdict_of_broken_scaffoldsr   Zget_color_and_lsZsecondary_line_stylerT   Z	add_fieldZFieldsZCONTIGS__FOR_THRESHOLDSZcontig_thresholdsZTOTALLENS__FOR_THRESHOLDS)ra   	reportingr_   ZreportZ	is_brokenr    rg   r!   add_lengths_to_report   s&    



rm   c                    s\  t jd krdt _tt| t j}td  fddt| D }tt||\}}}}	}
g }g }t	|
rpt
d tt|D ]}| }td|	|  || D ]}|| |t j|< q|| D ](\}}|| |t j|< t||| q|| D ]6\}}|| || |d t j|< t||| qq|t jsBt jrTtjsTt| ||fS )Nr   z  Pre-processing...c                    s   g | ]\}}|| fqS r    r    )rX   r   r_   corrected_dirpathlabelsr    r!   rh      s     z#correct_contigs.<locals>.<listcomp>   
_broken)r   max_threadsminrM   rB   	main_info	enumeraterun_parallelparallel_correct_contigsanyexitranger	   rQ   assembly_labels_by_fpathrm   Z
draw_plotsZhtml_reportr   Zdict_color_and_lsZsave_colors_and_ls)contigs_fpathsro   rp   rl   n_jobsZparallel_run_argsZ
old_fpathscorr_fpathsbroken_scaffold_fpathslogsis_fatal_errorZcorrected_contigs_fpathsold_contigs_fpathsZ
contig_idxr`   Z	old_fpath
corr_fpathra   Zbroken_fpathr    rn   r!   correct_contigs   s:    







r   c                 C   s   t  rt| S t| S d S r/   )
is_python2Zunicoder   valuer    r    r!   convert_to_unicode   s    r   c                 C   sV   ddl }|dt| ddd} ttdd|  } ttd	d| } t| S )
z
    Prepare string to use in file names: normalizes string,
    removes non-alpha characters, and converts spaces to hyphens.
    r   NZNFKDasciiignorezutf-8z[^\w\s-]-z[-\s]+)	unicodedataZ	normalizer   encodedecoder<   r?   stripr   )r   r   r    r    r!   slugify   s
    r   c                 C   sb  t j|}t|\}}||  }g }g }	g }
g }d}tt j|t|| }t||}|sbd }n8tj	rt
|tjs~d }d}q|}nt
|tj|sd }d}|r|	||f |
| |dt| t|dkd d||f   tjrTtjsT|rTt| ||||\}}|rTt||d }|rTtj	s<t
|tj|rT|||f |tj|< |
|	|||fS )NFT  r   forcez	%s ==> %srs   )r   r   r   splitext_for_fasta_fileunique_corrected_fpathr	   r   rb   r   no_check_metarV   rT   rQ   index_to_strrM   rj   is_combined_refbroke_scaffoldsrk   )file_counterr_   ro   rp   contigs_fnamefname	fasta_extr`   r   r   r   r   r   r   ra   Zbroken_scaffold_fpathr    r    r!   ry      s@    

*
ry   c              	   C   sX  | dt| t|dkd d  tj|}t|\}}||  }ttj|t	|| }	tj|t
|	}
|
d | }g }d}d}tt|D ]<\}\}}|d dkr|dkrt|||tjtj}||7 }q||d kr*t|| | dt| t|dkd d	|d |||d f   ||fS | dt| t|dkd d
|   d |fS )Nr   r   r   z"  breaking scaffolds into contigs:rs   r   d   i  z6    %d scaffolds (%s) were broken into %d contigs (%s)zK    WARNING: nothing was broken, skipping '%s broken' from further analysis)rQ   r   rM   r   r   r   r   r   r	   r   name_from_fpathrw   r   rL   split_by_nsr   Ns_break_thresholdrT   rS   )r   rp   r_   ro   r   r   r   r   r`   r   Zcorr_fpath_wo_extZbroken_scaffolds_fpathZbroken_scaffolds_fastaZcontigs_counterZscaffold_counternamerD   Ztotal_contigs_for_the_scafr    r    r!   r     s>    "
r   r   c           
      C   s   d}d}|t | k r| d|dkr| d|}|d }	|	t | krZ| |	 dkrZ|	d7 }	q8|	d }|	| |kr|| d d t|d  | || f |d7 }|	}qt | | |kr|| d d t|d  | |d  f |d7 }|S )Nr   r#   r   _)rM   findrQ   splitr   )
rD   r   Zsplitted_fastar   rT   Ztotal_contigsZcur_contig_startcumul_contig_lengthstartendr    r    r!   r   /  s8    




r   c                 C   s   t jr
dS d}t| }||k r|| d|dkr|| d|}|d }||kr`| | dkr`|d7 }qB|d }|| t jkrdS qdS )NFr   r#   r   r   T)r   rP   rM   r   r   )rD   r   Zseq_lenr   r   r    r    r!   is_scaffoldI  s    
r   c                 C   s   t j| }t|\}}tt j||| }tjsdtjsdt	| tj
|ddshtjd|  d dd n| }td| t|f  |} | S )NT)rU   zReference file zU is empty or contains incorrect sequences (header-only or with non-ACGTN characters)!r   )rJ   z  %s ==> %s)r   r   r   r   r   r	   r   r   r   rV   rT   rB   rC   rv   r   )	ref_fpathro   Z	ref_fnamer   r   r   r    r    r!   correct_referenceZ  s     
r   c                 C   sr   dd }||  d}dd |D }t|t|krHtjdddd	 g S t|D ]\}}|| ||< qP|S d S )
Nc                 S   s<   | r8| d dkr| dd  } | d dkr4| d d } | S d S )Nr   "r   r   r    liner    r    r!   remove_quotesn  s    z#parse_labels.<locals>.remove_quotes,c                 S   s   g | ]}|  qS r    r   rX   r`   r    r    r!   rh   {  s     z parse_labels.<locals>.<listcomp>z@Number of labels does not match the number of files with contigs   T	to_stderr)r   rM   rB   rC   rw   r   )r   r~   r   rp   r   r`   r    r    r!   parse_labelsm  s    	r   c                 C   s    t jt jt j| }|S r/   )r   r   r   dirnamer   )r_   r`   r    r    r!   get_label_from_par_dir  s    r   c                 C   s<   t j| }tt j| }t jt j|d | }|S Nr   )r   r   r   rm_extentions_for_fasta_filer   r   )r_   r   r   r`   r    r    r!    get_label_from_par_dir_and_fname  s    r   c                    s$   dd | D   fdd| D }|S )Nc                 S   s   g | ]}|  qS r    )lowerr   r    r    r!   rh     s     z"get_duplicated.<locals>.<listcomp>c                    s"   g | ]}  | d kr|qS )r   )countr   r   Zlowercase_labelsr    r!   rh     s      r    )rp   Z
dup_labelsr    r   r!   get_duplicated  s    r   c                 C   s^   g }| D ]}| t| qt|D ]4}tt|| D ] \}\}}||kr6t|||< q6q$|S r/   )rQ   r   r   rw   zipr   )r~   rp   fpathduplicated_labelr   r`   r    r    r!   get_labels_from_par_dirs  s    r   c           	      C   s   |r,t |D ]\}}|st| | ||< qn\|r:t| }nNdd | D }tt|}t t|| D ]$\}\}}||krbt| | ||< qbt|D ]Z}d}t t|| D ]B\}\}}||kr|dkr|||< n|d t| ||< |d7 }qq|S )Nc                 S   s   g | ]}t tj|qS r    )r   r   r   r   rX   r   r    r    r!   rh     s     z"process_labels.<locals>.<listcomp>r    r   )rw   r   r   setr   r   r   )	r~   rp   Zall_labels_from_dirsr   r`   Zduplicated_labelsr   r   jr    r    r!   process_labels  s(    

r   c                 C   s   t jst jst|  d S r/   )r   debugr   shutilrmtree)ro   r    r    r!   cleanup  s    r    c                 C   s(   t j| s$|jd|| f ddd | S )NzFile not found (%s): %sr   Tr   )r   r   r   rC   )r   messagerB   r    r    r!   assert_file_exists  s
    r   c                 C   s6   t jdkr|sdS d| d dkr$dnd | d  S d S )Nr   r   z%d 
   r   )r   Zassemblies_num)r   r   r    r    r!   r     s    r   c                 C   sv   t j| tj}t j|r&t | t j| tjd }t j|rPt | t j| tj}t	|rrt
| d S )Nz.html)r   r   r	   r   Zplots_fnamer   r   Zreport_prefixZhtml_aux_dirr   r   r   )r   Zplots_fpathZ
html_fpathZhtml_report_aux_dirr    r    r!   remove_reports  s    

r   c                 C   s   t dd|  d | S )Nz
[^\w\._\-]r   )r<   r?   r   r   Zmax_name_lenr    r    r!   rN     s    rN   c                 C   s   |   d | S r/   r   r   r    r    r!   correct_asm_label  s    r   c                 C   s    | |kr| dt ||   7 } | S r   r   )r   Z
used_namesr    r    r!   rO     s    rO   c                 C   s   t j| }t j| }t|}t jt j||rvd}|}t jt j||rvt|}t|d | }|d7 }q>t j||S )Nr   r   )r   r   r   r   rN   r   r	   r   )r   dirpathr   Z
corr_fnamer   Zbase_corr_fnameZstr_ir    r    r!   r   !  s    
r   c                 C   s   t t| d S Nr   )r   r   )r   r    r    r!   r   2  s    r   c                 C   sL   t j| \}}|dkr"| d }}t j|\}}|dkrD|d }}||fS )N).zip.gz.gzip.bz2.bzip2r   ).fa.fasta.fas.seq.fnaz.contigr   r   splitext)r   basename_plus_innerext	outer_extr   r   r    r    r!   r   6  s    

r   c                 C   s   d| ksd| ks| dkrdS t j| \}}t j|\}}|dkrN|| }}|dkrZdS |dkrt|d	|   dS |dkr|d
|   dS dS )Nz	blast.reszblast.checkz	blast.errFr   )r   r   r   r   r   T)r   r   r   r   r   r   z2Skipping %s because it is not a supported archive.z5Skipping %s because it has not a supported extension.)r   r   r   rR   )r   rB   r   r   r   r   r    r    r!   check_is_fasta_fileE  s    
r   c                 C   s   t jt j| d S r   )r   r   r   r   r   r    r    r!   r   [  s    r   c                 C   s
   t j|  S r/   )r   r}   r   r    r    r!   label_from_fpath_  s    r   c                 C   s   t tj|  S r/   )r   r   r}   r   r    r    r!   label_from_fpath_for_fnamec  s    r   Tc                 C   s   | d d  }|r|d|j g7 }|r>||jdkr2dnd|j g7 }|r^||jdkrRdnd|j g7 }t|D ]"\}	}
|
t rft|
||	< qf|j|||d tj	| ||||d}|d	kr|
d
t| d |rdt|j  d nd  |S )N<az>>>z2>>z2>)only_if_debug)stdinstdoutstderrenvr   r   zThe tool returned non-zero.z See z for stderr.r   )r   moderw   
startswithr   r   relpathZprint_command_line
subprocessZcallr   rM   )argsr   r   r   r9   r   r   rB   Zprinted_argsr   argreturn_coder    r    r!   call_subprocessg  s"    r   c               	   C   s   d\} }t jdkrtdd`}|D ]T}| }t|d dkrRt|d d d } t|d d	kr"t|d d d }q"W 5 Q R X t| d
 |d S )N)r   r   Zlinux_64z/proc/meminforr   z	MemTotal:r   i   zMemFree:rq   r   )r   platform_nameopenr   r   rK   ru   )Z	total_memZfree_memZmemr   r    r    r!   get_free_memory  s    
 r   c              	   C   s   | d }|r"t dd | D nd }t|st| }t|dB}| D ]2\}}|r`|| n|}||d t| d  qLW 5 Q R X |S )Nz.faic                 s   s   | ]\}}||fV  qd S r/   r    )rX   rN   Zraw_namer    r    r!   rZ     s     z$get_chr_len_fpath.<locals>.<genexpr>w	rr   )dictitemsis_non_empty_filer   r[   r   writer   )r   Zcorrect_chr_namesZchr_len_fpathZraw_chr_namesZchr_lengthsZout_fZchr_nameZchr_lenr    r    r!   get_chr_len_fpath  s    
&r  )curdirseppardirr	   r   commonprefixc                 C   sf   | st dt|t}t| t}tt||g}tgt||  ||d  }|s^tS t| S )z#Return a relative version of a pathzNo path specifiedN)	
ValueErrorr   r   r  rM   r
  r	  r  r	   )r   r   
start_list	path_listr   rel_listr    r    r!   r     s    r   c                    s   dd dfdd}d
 fdd	|rTt j|}||rT|S t jd	 t jD ]"}t j|}||rf|  S qfdS )zH
    returns the path to an executable or None if it can't be found
    r   r   r   c                    sR   t j| rNt | t jrN| }| krN|krJtdf  dS dS )NzVersion of installed %s differs from its version in the QUAST package (%s). Please make sure that you use an actual version of software.TF)r   r   r   accessX_OKrB   rR   )r   Zversion_check)INCOMPATIBLE_VERSIONNOT_RECOMMENDED_VERSIONcheck_versionmax_allowed_versionmin_versionprogramrecommend_versionr    r!   is_exe  s    z#get_path_to_program.<locals>.is_exeNc                    sJ  |s S t j| dgt jt jd}| \}}td}|t|}|	drX|	ds\S t
t|dd d \}	}
t|	d|	krBt|	d|
krB|d k	rt
t|dd d \}}t|	d|kst|	d|krS |d k	r>t
t|dd d \}}t|	d|ks:t|	d|kr>S  S S d S )Nz	--versionr   r   z.(?P<major_version>\d+)\.(?P<minor_version>\d+)Zmajor_versionminor_version.r   )r   PopenPIPESTDOUTcommunicater<   r@   rA   r   r0   r;   rK   r   )r   r  r  r  pr   r   version_patternvversionr  Zmax_versionZmax_minor_versionZrec_versionZrec_minor_version)CORRECT_VERSIONr  r  r    r!   r    s(    
($
(z*get_path_to_program.<locals>.check_versionPATH)NN)r   r   r	   environr   pathsep)r  r   r  r  r  r  Zexe_filer   r    )r$  r  r  r  r  r  r  r  r!   get_path_to_program  s    

r(  c                 C   s   dd }zjt jddgt jt jd}| \}}td}t|t	|dk rTW dS ||t	|d	 }|| kW S  t
k
r   Y dS X d S )
Nc                 S   s0   |  drt| dd  S dd l}|t| S )Nz1.r   r   )r   floatmathZfloor)Zverr*  r    r    r!   __get_java_major_version  s    
z4check_java_version.<locals>.__get_java_major_versionjavaz-versionr  zversion "(\d+\.\d+)r   Fr   )r   r  r  r  r  r<   r@   rM   findallr   r  )r  r+  r   r   r   r!  r#  r    r    r!   check_java_version  s    

r.  c                 C   s    | ot j| ot j| |kS r/   )r   r   r   getsize)r   Zmin_sizer    r    r!   r    s    r  c                 C   sh   t | ts| g} t|dD}| D ]8}tj|r t|}|D ]}|| q>W 5 Q R X q W 5 Q R X d S )Nr   )
isinstancer^   r   r   r   r   r  )Z	in_fnamesZ	out_fnameZoutfiler   Zinfiler   r    r    r!   	cat_files   s    

r1  c                 C   s>   zt |  W dS  tk
r$   Y dS  tk
r8   Y dS X d S )NTF)r)  r  	TypeErrorr   r    r    r!   is_float  s    r3  c                 C   s,   z
t | W S  tk
r&   t|  Y S X d S r/   )rK   r  r)  )sr    r    r!   parse_str_to_num  s    
r5  c                 C   s   | d krdS t | S d S )Nr   r   )valr    r    r!   
val_to_str  s    r7  c                 C   sH   t j| \}}|dkr0t j|\}}|| }||r>d| nd | S )N)r   r   r   r  r   r   )r   suffixbaseZextZext2r    r    r!   
add_suffix#  s
    r:  c                 C   s"   |D ]}t t| |s dS qdS NFT)r   r	   )Zaligner_dirpathZrequired_binariesrequired_binaryr    r    r!   all_required_binaries_exist+  s    r=  c                 C   sB   t |r>d|  d d | d }|r0|| n
|| dS dS )NzPrevious try of z compilation was unsuccessful! z#For forced retrying, please remove z and restart QUAST. TF)r   noticerR   )r   failed_compilation_flagjust_noticerB   msgr    r    r!   check_prev_compilation_failed2  s    

rB  c                 C   s`   t | r,zt|  W n tk
r*   Y nX t| r\ztj| dd W n tk
rZ   Y nX d S )NTignore_errors)r   r   r   OSErrorr   r   r   r   r    r    r!   safe_rm>  s    rG  c                 C   sN   zt | d  W n6 tk
rH   | d }|r:|| n
|| Y nX d S )Nr   z( cannot be created. Did you forget sudo?)r   closeIOErrorrC   r>  )r   rB   Zis_requiredrA  r    r    r!   safe_createK  s    rJ  c                   C   s   t jd dk S )Nr      )sysversion_infor    r    r    r!   r   V  s    r   c                 C   s^   zLt t| dd  t t| dd  t t| dd  t t| dd  W n   Y nX d S )Nz
aclocal.m4zMakefile.inzconfig.h.inZ	configure)r   utimer	   r   r    r    r!   fix_configure_timestampsZ  s    rP  c	                 C   s  t |d}	|	|rt|nd d }
|rJ|D ]}tt || q*t|
 dS t||st| |
||drjdS |d|  d |	 d	  t|	d
 d  t|	d d  |rt	 }t
| tdg| t|	d
 dt|	d dd t
| z@t|rd|gndgd|g t|	d
 dt|	d d|d}W n@ tk
rp   d| d }|r`|| n
|| Y dS X |dkst||st| ||
||d dS dS )NZmaker   z.failedTrB   Fz
Compiling z (details are in z.log and make.err)r   r   z.errz./configurer   r  z-C)r   r   rB   Permission denied accessing z. Did you forget sudo?r   )r@  rB   )r	   r   rG  r=  rB  rv   r   rH  r   r   r   r   rI  r>  rR   write_failed_compilation_flag)r   r   Zrequirementsr@  rB   
only_cleanZflag_suffixZmake_cmdZconfigure_argsZmake_logs_basepathr?  r<  Zprev_dirr   rA  r    r    r!   compile_toold  sL    


 

rU  rK  c                 C   s<   t | stjd| d|d d| kr8tjd| d|d dS )Nz5QUAST does not support non-ASCII characters in path.
T)r   rJ   r   z(QUAST does not support spaces in paths.
)is_ascii_stringrB   rC   )r   r   Z	exit_coder    r    r!   check_dirpath  s
    rW  c                 C   s4   t | rt| sdS t | s0ttj| s0dS dS r;  )r   check_write_permissionr   r   r   rO  r    r    r!   is_dir_writable  s
    rY  c                 C   sJ   d|  d | d t jsdnd }|r2|| n
|| t|| d S )NzFailed to compile z (z)! Try to compile it manually. zKYou can restart Quast with the --debug flag to see the compilation command.r   )r   r   r>  rR   rJ  )tooltool_dirpathr?  r@  rB   rA  r    r    r!   rS    s    
rS  c                 C   s   t | t jS r/   )r   r  W_OKrF  r    r    r!   rX    s    rX  c                    s   t tj|  t tjdd}t || t fdd|D rB S tfdd|D r\S t s|s|d  d | d |  t|s|s|	d	| d | d
  d S  t
 st   S )N~z.quastc                 3   s    | ]}t jt |V  qd S r/   r   r   r   r	   r   )r[  r    r!   rZ     s     z'get_dir_for_download.<locals>.<genexpr>c                 3   s    | ]}t jt |V  qd S r/   r^  r   )tool_home_dirpathr    r!   rZ     s     rR  z. z& will be downloaded to home directory z+Permission denied accessing home directory z cannot be downloaded.)r	   r   ZLIBS_LOCATIONr   r   
expanduserallrY  r>  rR   r   r   )r   rZ  required_filesrB   rT  Zquast_home_dirpathr    )r[  r_  r!   get_dir_for_download  s$    

rc  c              	   C   s   t jt jt jt jt jt jt jt jt j	g	}dd |D t _
t j
sBd S dd tt jt jD t _t jt j dd tt jt jD t _t jt j d S )Nc                 S   s   g | ]}|D ]}|r|qqS r    r    )rX   libr   r    r    r!   rh     s
        z&check_reads_fpaths.<locals>.<listcomp>c                 S   s   g | ]\}}||fqS r    r    rX   read1Zread2r    r    r!   rh     s     c                 S   s   g | ]\}}||fqS r    r    re  r    r    r!   rh     s     )r   Zforward_readsZreverse_readsZinterlaced_readsZunpaired_readsZmp_forward_readsZmp_reverse_readsZmp_interlaced_readsZpacbio_readsZnanopore_readsZreads_fpathsr   Zpaired_readsextendZ
mate_pairs)rB   Zreads_librariesr    r    r!   check_reads_fpaths  s       rh  c                 C   s   t | t}|S r/   )r(  blast_dirpath)r   Z
blast_pathr    r    r!   get_blast_fpath  s    
rj  c                 C   sn   | dkrjt ||d  dkrj| t ||d   dkrjtdtdt t| | | d |f f tj  d S )Nr   r   z% 3.1f%% of %d bytes)rK   printru   r)  rL  r   flush)r   bcr    r    r!   show_progress  s    4,ro  c                 C   s   dddg}|p|}dd |D }|s,|s,dS t dd|| |d	atsFd
S dd |D }|rvtjtrrtjtdd dS t|D ]L\}}t|| d}| 	  |s d
S t
|t|jtjB tjB tjB  q~dS )NZmakeblastdbZblastnZtblastnc                 S   s   g | ]}t |s|qS r    rj  rX   cmdr    r    r!   rh     s      z+download_blast_binaries.<locals>.<listcomp>TblastZBLAST)rT  Fc                 S   s   g | ]}t |s|qS r    rp  rq  r    r    r!   rh     s      rC  rQ  )rc  ri  r   r   r   r   r   rw   download_blast_binaryinfochmodstatst_modeS_IXUSRS_IXGRPS_IXOTH)rB   	filenamesrT  Zall_binariesrb  r   rr  Zblast_fpathr    r    r!   download_blast_binaries  s(    
(r}  c              
   C   s   t j|std|t j|f  zt | |d t	 W n: t
k
rz   t \}}}td|| ||f  Y d S X |rt|d | td|  |S )NzDownloading %s (file: %s)...z	.downloadzFailed downloading %s (url: %s), QUAST functionality will be limited! Exception caught: %s
You can try to download the file manually, place it in %s and restart QUASTz%s successfully downloaded!)r   r   r   rB   ru  r   urllibZ	URLopenerZretrievero  	ExceptionrL  exc_inforC   r   Zmove)urlr   Z	tool_nameZ	move_filer   	exc_valuer    r    r!   download_file  s     
r  c                 C   s(   t jtst t t| tddddS )Nrs  T)platform_specificis_executable)r   r   r   ri  r   download_external_tool)Zblast_filenamerB   r    r    r!   rt    s    
rt  c           	      C   s   t || }tj|r|S t t|}|r4t |tj}tj || }t tjt|tj	 | }t|slt
| t|rtd|  d |  t|| nt|||}|r|rt|t|jtjB tjB tjB  n
td |S )NzCopying z from zePlease try to install the tool manually, add it to your PATH environment variable, and restart QUAST.)r	   r   r   r   external_tools_dirpathr   r   ZGIT_ROOT_URLr   
QUAST_HOMEr   r   rB   ru  r   copyr  rv  rw  rx  ry  rz  r{  rC   )	r   r   rZ  r  r  Zdownloaded_fpathZexternal_dirpathZexternal_fpathr  r    r    r!   r    s&    


(
r  c           
         s\  t jr fdd|D n|p"t j}d|i}zRdd l}ddlm}m z ddi}|f | || W n tk
rz   Y nX W n< tk
r   t	 rddl
m}m nddlm}m Y nX |f | fdd	|D g }rXtd tstd trFtd }	r.fd
dt|	D }nfddt|	D }nfddD }|S )Nc                    s   g | ]} | qS r    r    rX   r   )_fnr    r!   rh   -  s     z run_parallel.<locals>.<listcomp>r   r   )ParalleldelayedZbackendZmultiprocessingc                 3   s   | ]} | V  qd S r/   r    r  )r  r  r    r!   rZ   B  s     zrun_parallel.<locals>.<genexpr>c                    s   g | ]  fd dD qS )c                    s   g | ]}|  r|  qS r    r    rX   Zresult_listr   r    r!   rh   H  s      +run_parallel.<locals>.<listcomp>.<listcomp>r    rf   results_tuplesr  r!   rh   H  s     c                    s   g | ]  fd dD qS )c                    s   g | ]}|  qS r    r    r  r  r    r!   rh   J  s     r  r    rf   r  r  r!   rh   J  s     c                    s   g | ]}|s s|qS r    r    )rX   result)filter_resultsr    r!   rh   L  s       )r   Zmemory_efficientrt   joblibr  r  updater2  ImportErrorr   Zjoblib2Zjoblib3r0  r^   tuplerM   r|   )
r  Zfn_argsr   r  Zparallel_argsr  r  Znew_style_parallel_argsZresultsZresults_cntr    )r  r  r  r  r!   rx   +  s6    


 rx   c                 C   sB   z|  d W n* tk
r$   Y dS  tk
r8   Y dS X dS d S )Nr   FT)r   UnicodeDecodeErrorUnicodeEncodeErrorr   r    r    r!   rV  Q  s    rV  c              	   C   sB   t  }t| d"}|d}|s$q0|| qW 5 Q R X | S )Nrbi    )hashlibmd5r   readr  Z	hexdigest)r   Zhash_md5fZbufr    r    r!   r  \  s    
r  c              	   C   s   |d kr| d }t | rxt |rxt|}|   d }W 5 Q R X tt| }||krttd| ||f  dS dS td| |f  dS )Nz.md5r   zFFailure of md5 check for %s! Expected md5 is %s, calculated md5 is %s.FTzVFailed to check md5 for %s! Either this file or its md5 file (%s) is missing or empty.)	r  r   readliner   r   r   r  rB   rR   )r   Z	md5_fpathr  Zexpected_md5Zcalculated_md5r    r    r!   
verify_md5g  s     
r  c                 C   s4   dd l }t|t| | d d }| td| S )Nr   r   r   )r*  rK   ZceilrM   max)r\   Zpercentr*  Zpercentile_idxr    r    r!   
percentiley  s    r  c                 C   sR   t | d dkr&| t | d d  }n(| t | d  | t | d d   d }|S )Nr   r   )rM   )r\   Zmedianr    r    r!   calc_median  s    (r  )NF)r   r   r   )NF)F)N)NNNN)r   )F)r   rK  )F)T)FF)NF)N)rZ
__future__r   r   Zglobr  r   r   r   rw  rL  r<   collectionsr   os.pathr   r   r   r   r	   Zurllib2r
   r~  Zurllib.requestZrequestZ
quast_libsr   r   r   Zquast_libs.logr   r   rB   ZMAX_CONTIG_NAMEZMAX_CONTIG_NAME_GLIMMERr   r  r  ri  r"   rH   rV   rb   rm   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   r   rO   r   r   r   r   r   r   r   r   r   r  	posixpathr  r  r	  r   r
  r   r(  r.  r  r1  r3  r5  r7  r:  r=  rB  rG  rJ  r   rP  rU  rW  rY  rS  rX  rc  rh  rj  ro  r}  r  rt  r  rx   rV  r  r  r  r  r    r    r    r!   <module>   s   
1
#')"

$
.  

 
5



 
,





&
