a
    ub"                     @   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0 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_NAMELOGGER_META_NAMEospathabspathdefault_results_root_dirnameoutput_dirnamestrmakedirsgetcwdchdirislinkremovesymlinkr   default_json_dirname)	output_dirpathZjson_outputpathmake_latest_symlink	save_jsonZexisting_quast_diriZbase_dirpathZprev_dirpathZlatest_symlink r&   ;/home/psgendb/BIRCHDEV/pkg/quast-5.2.0/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&   r8   r'   correct_seqX   s    rN   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 )Nr<   zH because >sequence_name field is empty for the entry starting with "%s".   r=   r>   Fr   r;   zFile zG contains non-ACGTN characters. Please re-run QUAST without --no-check.)r?   exit_with_codez because file is empty.T)r   intr   
read_fastarH   rI   lencorrect_nameget_uniq_namer   no_checkrN   rB   rF   rG   appendwarningwrite_fasta)rK   
min_contigZcorrected_fpathis_referenceZmodified_fasta_entriesZused_seq_namesZ
first_linerJ   Z	corr_nameZ	uniq_namerL   r&   r&   r'   correct_fastah   s>    


r\   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 r5   )r   rZ   .0lr&   r&   r'   	<genexpr>   r:   z)get_lengths_from_fasta.<locals>.<genexpr>z8Skipping %s because it doesn't contain contigs >= %d bp.)	r   get_chr_lengths_from_fastafilevaluessumrH   rX   r   rZ   list)contigs_fpathlabellengthsr&   r&   r'   get_lengths_from_fasta   s    rh   c                    s   |r| |}d}tjr:|tjv 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&   r]   Z	thresholdr&   r'   r`      r:   3add_lengths_to_report.<locals>.<listcomp>.<genexpr>Nrc   r^   rg   Zmin_thresholdri   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 r5   r&   r]   ri   r&   r'   r`      r:   rj   Nrk   rl   rm   ri   r'   rn      s   )getr   split_scaffoldsdict_of_broken_scaffoldsr   Zget_color_and_lsZsecondary_line_stylerZ   	add_fieldFieldsZCONTIGS__FOR_THRESHOLDScontig_thresholdsZTOTALLENS__FOR_THRESHOLDS)rg   	reportingre   reportZ	is_brokenr&   rm   r'   add_lengths_to_report   s&    



rw   c                    s\  t jd u 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&   )r^   r%   re   corrected_dirpathlabelsr&   r'   rn      r:   z#correct_contigs.<locals>.<listcomp>   
_broken)r   max_threadsminrS   rH   	main_info	enumeraterun_parallelparallel_correct_contigsanyexitranger	   rW   assembly_labels_by_fpathrw   
draw_plotshtml_reportr   dict_color_and_lsZsave_colors_and_ls)contigs_fpathsry   rz   ru   n_jobsZparallel_run_argsZ
old_fpathscorr_fpathsbroken_scaffold_fpathslogsis_fatal_errorZcorrected_contigs_fpathsold_contigs_fpathsZ
contig_idxrf   Z	old_fpath
corr_fpathrg   Zbroken_fpathr&   rx   r'   correct_contigs   s:    







r   c                 C   s   t  rt| S t| S d S r5   )
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]+)	unicodedata	normalizer   encodedecoderB   rE   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 ==> %sr}   )r   r   r   splitext_for_fasta_fileunique_corrected_fpathr	   r   rh   r   no_check_metar\   rZ   rW   index_to_strrS   rp   is_combined_refbroke_scaffoldsrq   )file_counterre   ry   rz   contigs_fnamefname	fasta_extrf   r   r   r   r   r   r   rg   Zbroken_scaffold_fpathr&   r&   r'   r      s@    

*
r   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:r}   r   d   i  z6    %d scaffolds (%s) were broken into %d contigs (%s)zK    WARNING: nothing was broken, skipping '%s broken' from further analysis)rW   r   rS   r   r   r   r   r   r	   r   name_from_fpathr   r   rR   split_by_nsr   Ns_break_thresholdrZ   rY   )r   rz   re   ry   r   r   r   r   rf   r   Zcorr_fpath_wo_extZbroken_scaffolds_fpathZbroken_scaffolds_fastaZcontigs_counterZscaffold_counternamerJ   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   _)rS   findrW   splitr   )
rJ   r   Zsplitted_fastar   rZ   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   rV   rS   r   r   )rJ   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)r[   zReference file zU is empty or contains incorrect sequences (header-only or with non-ACGTN characters)!r   )rP   z  %s ==> %s)r   r   r   r   r   r	   r   r   r   r\   rZ   rH   rI   r   r   )	ref_fpathry   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   r^   rf   r&   r&   r'   rn   {  r:   z parse_labels.<locals>.<listcomp>z@Number of labels does not match the number of files with contigs   T	to_stderr)r   rS   rH   rI   r   r   )r   r   r   rz   r%   rf   r&   r&   r'   parse_labelsm  s    	r   c                 C   s    t jt jt j| }|S r5   )r   r   r   dirnamer   )re   rf   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   )re   r   r   rf   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'   rn     r:   z"get_duplicated.<locals>.<listcomp>c                    s"   g | ]}  | d kr|qS )r   )countr   r   Zlowercase_labelsr&   r'   rn     r:   r&   )rz   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 r5   )rW   r   r   r   zipr   )r   rz   fpathduplicated_labelr%   rf   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 ]$\}\}}||v 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   r^   r   r&   r&   r'   rn     r:   z"process_labels.<locals>.<listcomp>r    r   )r   r   r   setr   r   r   )	r   rz   all_labels_from_dirsr%   rf   Zduplicated_labelsr   r   jr&   r&   r'   process_labels  s(    

r   c                 C   s   t jst jst|  d S r5   )r   debugr   shutilrmtree)ry   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   rI   )r   messagerH   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   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   plots_fnamer   r   report_prefix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   )rB   rE   r   r   Zmax_name_lenr&   r&   r'   rT     s    rT   c                 C   s   |   d | S r5   r   r   r&   r&   r'   correct_asm_label  s    r   c                 C   s    | |v r| dt ||   7 } | S r   r   )r   Z
used_namesr&   r&   r'   rU     s    rU   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   rT   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vr"| d }}t j|\}}|dv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| v sd| v s| dkrdS t j| \}}t j|\}}|dkrN|| }}|dv rZdS |dvrt|d	|   dS |dv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   rX   )r   rH   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 r5   )r   r   r   r&   r&   r'   label_from_fpath_  s    r   c                 C   s   t tj|  S r5   )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   moder   
startswithr   r   relpathZprint_command_line
subprocesscallr   rS   )argsr  r  r  r?   r  r  rH   Zprinted_argsr%   argreturn_coder&   r&   r'   call_subprocessg  s"    r  c                  C   s   d\} }t jdkrtddj}|D ]T}| }t|d dkrRt|d d d } t|d d	kr"t|d d d }q"W d    n1 s0    Y  t| d
 |d S )N)r   r   linux_64z/proc/meminforr   z	MemTotal:r   i   zMemFree:r{   r   )r   platform_nameopenr   r   rQ   r   )Z	total_memZfree_memZmemr   r&   r&   r'   get_free_memory  s    
4r  c                 C   s   | d }|r"t dd | D nd }t|st| }t|dL}| D ]2\}}|r`|| n|}||d t| d  qLW d    n1 s0    Y  |S )Nz.faic                 s   s   | ]\}}||fV  qd S r5   r&   )r^   rT   Zraw_namer&   r&   r'   r`     r:   z$get_chr_len_fpath.<locals>.<genexpr>w	r|   )dictitemsis_non_empty_filer   ra   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  rS   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_OKrH   rX   )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 urt
t|dd d \}}t|	d|kst|	d|krS |d u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communicaterB   rF   rG   r   r6   rA   rQ   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&   )r9  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
y   Y dS 0 d S )
Nc                 S   s0   |  drt| dd  S dd l}|t| S )Nz1.r   r   )r  floatmathfloor)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
  r1  r2  r3  r4  rB   rF   rS   findallr   r   )r*  rB  r5  r  r  r6  r8  r&   r&   r'   check_java_version  s    

rE  c                 C   s    | ot j| ot j| |kS r5   )r   r   r   getsize)r   Zmin_sizer&   r&   r'   r    s    r  c              
   C   s   t | ts| g} t|db}| D ]L}tj|r t|$}|D ]}|| q>W d    q 1 sb0    Y  q W d    n1 s0    Y  d S )Nr  )
isinstancerd   r  r   r   r   r  )Z	in_fnamesZ	out_fnameZoutfiler   Zinfiler   r&   r&   r'   	cat_files   s    

rH  c                 C   s:   zt |  W dS  ty"   Y dS  ty4   Y dS 0 d S )NTF)r>  r   	TypeErrorr   r&   r&   r'   is_float  s    rJ  c                 C   s*   z
t | W S  ty$   t|  Y S 0 d S r5   )rQ   r   r>  )sr&   r&   r'   parse_str_to_num  s    
rL  c                 C   s   | d u rdS t | S d S )Nr   r   )valr&   r&   r'   
val_to_str  s    rN  c                 C   sH   t j| \}}|dv r0t j|\}}|| }||r>d| nd | S )N)r   r   r   r0  r   r   )r   suffixbaseextZext2r&   r&   r'   
add_suffix#  s
    rR  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    rU  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   noticerX   )r   failed_compilation_flagjust_noticerH   msgr&   r&   r'   check_prev_compilation_failed2  s    

rZ  c                 C   s\   t | r*zt|  W n ty(   Y n0 t| rXztj| dd W n tyV   Y n0 d S )NTignore_errors)r   r   r   OSErrorr   r   r   r   r&   r&   r'   safe_rm>  s    r_  c                 C   sL   zt | d  W n4 tyF   | d }|r8|| n
|| Y n0 d S )Nr  z( cannot be created. Did you forget sudo?)r  closeIOErrorrI   rV  )r   rH   Zis_requiredrY  r&   r&   r'   safe_createK  s    rb  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0 d S )Nz
aclocal.m4zMakefile.inzconfig.h.inZ	configure)r   utimer	   r   r&   r&   r'   fix_configure_timestampsZ  s    rh  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yn   d| d }|r^|| n
|| Y dS 0 |dkst||st| ||
||d dS dS )NZmaker   z.failedTrH   Fz
Compiling z (details are in z.log and make.err)r   r  z.errz./configurer   r.  z-C)r  r  rH   Permission denied accessing z. Did you forget sudo?r   )rX  rH   )r	   r   r_  rU  rZ  r   r  r`  r   r   r   r  ra  rV  rX   write_failed_compilation_flag)r   r   ZrequirementsrX  rH   
only_cleanZflag_suffixZmake_cmdZconfigure_argsZmake_logs_basepathrW  rT  Zprev_dirr  rY  r&   r&   r'   compile_toold  sJ    




rm  rc  c                 C   s<   t | stjd| d|d d| v r8tjd| d|d dS )Nz5QUAST does not support non-ASCII characters in path.
T)r   rP   r   z(QUAST does not support spaces in paths.
)is_ascii_stringrH   rI   )r   r   	exit_coder&   r&   r'   check_dirpath  s
    rp  c                 C   s4   t | rt| sdS t | s0ttj| s0dS dS rS  )r   check_write_permissionr   r   r   rg  r&   r&   r'   is_dir_writable  s
    rr  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   rV  rX   rb  )tooltool_dirpathrW  rX  rH   rY  r&   r&   r'   rk    s    
rk  c                 C   s   t | t jS r5   )r   r$  W_OKr^  r&   r&   r'   rq    s    rq  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 r5   r   r   r   r	   r   )rt  r&   r'   r`     r:   z'get_dir_for_download.<locals>.<genexpr>c                 3   s    | ]}t jt |V  qd S r5   rw  r   )tool_home_dirpathr&   r'   r`     r:   rj  z. z& will be downloaded to home directory z+Permission denied accessing home directory z cannot be downloaded.)r	   r   LIBS_LOCATIONr   r   
expanduserallrr  rV  rX   r   r   )r   rs  required_filesrH   rl  Zquast_home_dirpathr&   )rt  rx  r'   get_dir_for_download  s$    

r}  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&   )r^   libr   r&   r&   r'   rn     r:   z&check_reads_fpaths.<locals>.<listcomp>c                 S   s   g | ]\}}||fqS r&   r&   r^   read1Zread2r&   r&   r'   rn     r:   c                 S   s   g | ]\}}||fqS r&   r&   r  r&   r&   r'   rn     r:   )r   forward_readsreverse_readsinterlaced_readsunpaired_readsmp_forward_readsmp_reverse_readsmp_interlaced_readspacbio_readsnanopore_readsreads_fpathsr   paired_readsextend
mate_pairs)rH   Zreads_librariesr&   r&   r'   check_reads_fpaths  s    r  c                 C   s   t | t}|S r5   )r=  blast_dirpath)r   Z
blast_pathr&   r&   r'   get_blast_fpath  s    
r  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)rQ   printr   r>  rd  r  flush)r   bcr&   r&   r'   show_progress  s    4,r  c                 C   s   g d}|p|}dd |D }|s*|s*dS t dd|| |datsDdS d	d |D }|rttjtrpt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 )N)ZmakeblastdbZblastnZtblastnc                 S   s   g | ]}t |s|qS r&   r  r^   cmdr&   r&   r'   rn     r:   z+download_blast_binaries.<locals>.<listcomp>TblastZBLAST)rl  Fc                 S   s   g | ]}t |s|qS r&   r  r  r&   r&   r'   rn     r:   r[  ri  )r}  r  r   r   r   r   r   r   download_blast_binaryinfochmodstatst_modeS_IXUSRS_IXGRPS_IXOTH)rH   	filenamesrl  Zall_binariesr|  r%   r  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 n8 t
yx   t \}}}td|| ||f  Y d S 0 |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   rH   r  r   urllibZ	URLopenerZretriever  	Exceptionrd  exc_inforI   r   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 )Nr  T)platform_specificis_executable)r   r   r   r  r   download_external_tool)Zblast_filenamerH   r&   r&   r'   r    s    
r  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  GIT_ROOT_URLr	  
QUAST_HOMEr   r   rH   r  r   copyr  r  r  r  r  r  r  rI   )	r   r   rs  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}zTdd l}ddlm}m z$ddi}|f i | || W n ty|   Y n0 W n: ty   t	 rddl
m}m nddlm}m Y n0 |f i | fdd	|D g }r\td tstd trJtd }	r2fd
dt|	D }nfddt|	D }nfddD }|S )Nc                    s   g | ]} | qS r&   r&   r^   r  )_fnr&   r'   rn   -  r:   z run_parallel.<locals>.<listcomp>r   r   )ParalleldelayedZbackendmultiprocessingc                 3   s   | ]} | V  qd S r5   r&   r  )r  r  r&   r'   r`   B  r:   zrun_parallel.<locals>.<genexpr>c                    s   g | ]  fd dD qS )c                    s   g | ]}|  r|  qS r&   r&   r^   Zresult_listr%   r&   r'   rn   H  r:   +run_parallel.<locals>.<listcomp>.<listcomp>r&   rl   results_tuplesr  r'   rn   H  r:   c                    s   g | ]  fd dD qS )c                    s   g | ]}|  qS r&   r&   r  r  r&   r'   rn   J  r:   r  r&   rl   r  r  r'   rn   J  r:   c                    s   g | ]}|s s|qS r&   r&   )r^   result)filter_resultsr&   r'   rn   L  r:   )r   memory_efficientr~   joblibr  r  updaterI  ImportErrorr   Zjoblib2Zjoblib3rG  rd   tuplerS   r   )
r  Zfn_argsr   r  Zparallel_argsr  r  Znew_style_parallel_argsresultsZresults_cntr&   )r  r  r  r  r'   r   +  s6    

" r   c                 C   s>   z|  d W n& ty"   Y dS  ty4   Y dS 0 dS d S )Nr   FT)r   UnicodeDecodeErrorUnicodeEncodeErrorr   r&   r&   r'   rn  Q  s    rn  c                 C   sV   t  }t| d,}|d}|s$q0|| qW d    n1 sD0    Y  | S )Nrbi    )hashlibmd5r  readr  Z	hexdigest)r   Zhash_md5fbufr&   r&   r'   r  \  s    
*r  c                 C   s   |d u r| d }t | rt |rt|$}|   d }W d    n1 sR0    Y  tt| }||krt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  rH   rX   )r   Z	md5_fpathr  Zexpected_md5Zcalculated_md5r&   r&   r'   
verify_md5g  s     
2r  c                 C   s4   dd l }t|t| | d d }| td| S )Nr   r   r   )r?  rQ   ceilrS   max)rb   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   )rS   )rb   Zmedianr&   r&   r'   calc_median  s    (r  )NF)r   r   r   )NF)F)N)NNNN)r   )F)r   rc  )F)T)FF)NF)N)rZ
__future__r   r   Zglobr  r   r
  r   r  rd  rB   collectionsr   Zos.pathr   r   r   r   r	   Zurllib2r
   r  Zurllib.requestZrequest
quast_libsr   r   r   quast_libs.logr   r   rH   ZMAX_CONTIG_NAMEZMAX_CONTIG_NAME_GLIMMERr   r  r  r  r(   rN   r\   rh   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   r   rU   r   r   r   r   r   r   r   r  r  r  	posixpathr  r  r  r   r  r	  r=  rE  r  rH  rJ  rL  rN  rR  rU  rZ  r_  rb  r   rh  rm  rp  rr  rk  rq  r}  r  r  r  r  r  r  r  r   rn  r  r  r  r  r&   r&   r&   r'   <module>   s   
1
#')"

$
.

 
5




,





&
