a
    ÈhÌ†  ã                   @   sþ  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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 d dlZd dlmZ dZdZdZdZdadad	Zd
Zdedfdd„Zd•dd„Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$d–dd„Z%d—dd „Z&d˜d!d"„Z'd™d#d$„Z(dšd%d&„Z)d'd(„ Z*d)d*„ Z+d+d,„ Z,d-d.„ Z-d/d0„ Z.d1d2„ Z/d3d4„ Z0d›d5d6„Z1d7d8„ Z2dœd9d:„Z3dd;d<„Z4d=d>„ Z5džd?d@„Z6dAdB„ Z7dŸdCdD„Z8dEdF„ Z9dGdH„ Z:d dIdJ„Z;dKdL„ Z<dMdN„ Z=dOdP„ Z>dQdR„ Z?dSdT„ Z@dUdV„ ZAdWdX„ ZBdYdZ„ ZCd[d\„ ZDd]d^„ ZEejFd_d`fdadb„ZGd¡dcdd„ZHd¢dedf„ZIdgdh„ ZJdidj„ ZKdkdl„ ZLdmdn„ ZMdodp„ ZNdqdr„ ZOdsdt„ ZPdudv„ ZQdwdx„ ZRdydz„ ZSd£d|d}„ZTd¤d~d„ZUd€d„ ZVd¥dƒd„„ZWd…d†„ ZXd‡dˆ„ ZYd‰dŠ„ ZZd‹dŒ„ Z[ddŽ„ Z\dd„ Z]d‘d’„ Z^d¦d“d”„Z_dS )§é    N)Úuname)ÚabspathÚ
expanduserÚjoin)ÚSeqIOz== Error == ú== Warning == z ERROR z WARN TFéÿÿÿÿc                 C   s²   d}|rH|  d|| f ¡ t|dd |  d| ¡ |  d| ¡  ¡ nBtj d|| f ¡ tj d| ¡ tj d	| ¡  ¡ tj ¡  tr¤tj	 
t¡r¤t t¡ t |¡ d S )
NÚSPAdesz

%s %sT)Ú
with_errorzo
In case you have troubles running %s, you can report an issue on our GitHub repository github.com/ablab/spadeszMPlease provide us with params.txt and %s.log files from the output directory.ú	

%s %s

zp
In case you have troubles running %s, you can report an issue on our GitHub repository github.com/ablab/spades
zNPlease provide us with params.txt and %s.log files from the output directory.
)ÚinfoÚlog_warningsÚlowerÚsysÚstderrÚwriteÚflushÚcurrent_tmp_dirÚosÚpathÚisdirÚshutilÚrmtreeÚexit)Zerr_strÚlogÚprefixÚ	exit_codeZbinary_name© r   úf/home/psgendb/BIRCHDEV/install/SPAdes-4.2.0-Linux/linux-x86_64/share/spades/spades_pipeline/support.pyÚerror+   s&    
ÿÿ
ÿ

r   c                 C   s:   |r|  d|| f ¡ ntj d|| f ¡ tj ¡  d S )Nr   z


%s %s


)r   r   Ústdoutr   r   )Zwarn_strr   r   r   r   r   Úwarning@   s    r!   c                  C   s   dd„ } | ƒ rdS dS )Nc                   S   s   dt ƒ d  ¡ v S )NZ	microsofté   )r   r   r   r   r   r   Úin_wslI   s    zwsl_check.<locals>.in_wslz1. WSL is an unsupported platform
2. If SPAdes crashes, then you might want to compile it from sources
3. If nothing works, run on real LinuxÚ r   )r#   r   r   r   Ú	wsl_checkH   s    r%   c                 C   s   | dkrt ƒ S d S )Niõÿÿÿ)r%   ©r   r   r   r   Úget_error_hintsT   s    r'   c                 C   s(   t |ƒ}d| ||f }t|||d d S )NzAsystem call for: "%s" finished abnormally, OS return value: %d
%sr&   )r'   r   )Úcmdr   r   Z	hints_strÚerr_msgr   r   r   Ú	sys_errorY   s    r*   c                	   C   s@   t jtjk r<tdt j ¡ d d tt	t
tjƒƒ¡f ƒ dS dS )NzD
Python version %s is not supported!
Minimal supported version is %sr   Ú.FT)r   Úversion_infoÚoptions_storageZMINIMAL_PYTHON_VERSIONr   ÚversionÚsplitr   ÚlistÚmapÚstrr   r   r   r   Úcheck_python_version_   s    "þr3   c                   C   s   dS )NzžYou can obtain SPAdes binaries in one of two ways:
1. Download them from https://github.com/ablab/spades/
2. Build source code with ./spades_compile.sh scriptr   r   r   r   r   Ú get_spades_binaries_info_messageh   s    r4   c                 C   s<   dD ]2}t j | |¡}t j |¡std|tƒ f |ƒ qd S )N)zspades-hammerzspades-ionhammerzspades-corez
spades-bwaz SPAdes binaries not found: %s
%s)r   r   r   Úisfiler   r4   )Z
binary_dirr   ÚbinaryZbinary_pathr   r   r   Úcheck_binariesn   s    r7   r$   c                 C   sD   t t| ƒƒ}t||ƒ tj |¡s6td||f |d |tj| < |S )Nzfile not found: %s (%s)©r   )	r   r   Úcheck_path_is_asciir   r   r5   r   r-   Údict_of_rel2abs)Úinput_filenameÚmessager   Úfilenamer   r   r   Úcheck_file_existenceu   s    

r>   c                 C   sD   | t jv r$t j|  }t d| ¡}n
t | ¡}|s@td|  |ƒ |S )Nr=   z%incorrect extension of reads file: %s)r-   Údict_of_prefixesr   Úget_read_file_typer   )r;   r   ÚextÚ	file_typer   r   r   r@   ~   s    


r@   c              
   C   s¼   t t| ƒƒ}t| |ƒ}|dks&|dkr*d S z:t t |d¡|¡}t|d ƒd u rbtd||f |d W nR ty¶ } z:t|j	d j
|dd t ¡ j
|d |d W Y d }~n
d }~0 0 d S )	NZbamÚsraÚrzfile is empty: %s (%s)r8   r   ©ZFILEú

)r   r   r@   r   ÚparseÚOpenÚnextr   Ú	ExceptionÚargsÚformatÚ	tracebackÚ
format_exc)r;   r<   r   r=   rB   Zreads_iteratorÚinstr   r   r   Úcheck_file_not_emptyŠ   s    
ÿÿrP   c                 C   sD   t t| ƒƒ}t||ƒ tj |¡s6td||f |d |tj| < |S )Nzdirectory not found: %s (%s)r8   )	r   r   r9   r   r   r   r   r-   r:   )Zinput_dirnamer<   r   Údirnamer   r   r   Úcheck_dir_existence™   s    

rR   c                 C   s   t | ƒstd| |f ƒ d S )Nz+path contains non-ASCII characters: %s (%s))Úis_ascii_stringr   )r   r<   r   r   r   r9   ¢   s    r9   c                 C   s0   t j | ¡rt  | ¡ t j | ¡s,t  | ¡ d S ©N)r   r   r5   ÚremoveÚexistsÚmakedirs©rQ   r   r   r   Úensure_dir_existence¨   s    
rY   c                 C   s$   t j | ¡rt | ¡ t  | ¡ d S rT   )r   r   r   r   r   rW   rX   r   r   r   Úrecreate_dir¯   s    
rZ   c                 C   s*   | D ] }|   |¡dkrtd| |ƒ qd S )Né   z$file %s was specified at least twice)Úcountr   )Ú	filenamesr   r=   r   r   r   Úcheck_files_duplicationµ   s    r^   c           	      C   s¦  | t jv rt j|  }n€tj | ¡d }| ¡ dkr–tj | d t|ƒ … ¡d }||  ¡ t jv rl|| }n*tj | d t|| ƒ … ¡d }|| }| ¡ t jvrÀtdd 	t j¡| |f |ƒ |sð| ¡ t j
v rðtd 	t j
¡d| |f  |ƒ |s.| ¡ t jvr.|t jvr.tdd 	t j¡| |f |ƒ | d¡rh| ¡ t jvrhtd|d 	t j¡| |f |ƒ | d	¡r¢| ¡ t jvr¢td
|d 	t j¡| |f |ƒ d S )Nr[   ú.gzzGfile with reads has unsupported format (only %s are supported): %s (%s)z, z4 formats supported only for iontorrent mode: %s (%s)zYto run read error correction, reads should be in FASTQ format (%s are supported): %s (%s)ÚcontigszCfile with %s should be in FASTA format  (%s are supported): %s (%s)ZgraphzAfile with %s should be in GFA format  (%s are supported): %s (%s))r-   r?   r   r   Úsplitextr   ÚlenÚALLOWED_READS_EXTENSIONSr   r   Z(IONTORRENT_ONLY_ALLOWED_READS_EXTENSIONSZBH_ALLOWED_READS_EXTENSIONSÚLONG_READS_TYPESÚendswithZ CONTIGS_ALLOWED_READS_EXTENSIONSZGRAPH_ALLOWED_READS_EXTENSIONS)	r=   r<   Úonly_assemblerÚ
iontorrentZlibrary_typer   rA   Zpre_extZpre_pre_extr   r   r   Úcheck_reads_file_format»   sR    

"ÿÿ
ÿÿÿÿÿÿÿÿÿrh   c                 C   sx   dd„ }t j | ¡\}}|r*|| ƒrt| S nJdt jv rtt jd  t j¡D ],}| d¡}t j || ¡}||ƒrF|  S qFd S )Nc                 S   s   t j | ¡ot  | t j¡S rT   )r   r   r5   ÚaccessÚX_OK)Úfpathr   r   r   Úis_exeß   s    zwhich.<locals>.is_exeÚPATHú")r   r   r/   ÚenvironÚpathsepÚstripr   )Zprogramrl   rk   Zfnamer   Zexe_filer   r   r   ÚwhichÞ   s    


rr   c                  C   sŠ   d} d}t j | ¡r†zJt| ƒD ]<}| |¡rt|t|ƒd …  ¡ d ƒ}|d }|  W S qW n& tyr   Y d S  t	y„   Y d S 0 d S )Nz/proc/meminfoz	MemTotal:r   i   )
r   r   r5   ÚopenÚ
startswithÚintrb   r/   Ú
ValueErrorÚIOError)Zmem_info_filenameZavail_mem_headerÚlineZ	avail_memr   r   r   Úget_available_memoryï   s    
ry   c                 C   s>   z|   d¡ W n& ty"   Y dS  ty4   Y dS 0 dS d S )NÚasciiFT)ÚencodeÚUnicodeDecodeErrorÚUnicodeEncodeError)rx   r   r   r   rS     s    rS   c                 C   s   |rt | dƒ ¡ S |  ¡ S )Nzutf-8)r2   Úrstrip)rx   Úutf8r   r   r   Úprocess_readline  s    r€   c                 C   s   d| v rd|  d } | S )Nú rn   r   )r2   r   r   r   Úprocess_spaces  s    r‚   c           	      C   sØ   dd l }dd l}t| tƒr | }n
| | ¡}|j||j|j|d}d}| ¡ sˆt	|j
 ¡ ƒ}|rz|rn| |¡ n||d 7 }|jd urDqˆqD|j
 ¡ D ],}t	|ƒ}|r’|r²| |¡ q’||d 7 }q’|jrÔt| ||jƒ |S )Nr   ©r    r   Úcwdr$   Ú
)ÚshlexÚ
subprocessÚ
isinstancer0   r/   ÚPopenÚPIPEÚSTDOUTÚpollr€   r    Úreadliner   Ú
returncodeÚ	readlinesr*   )	r(   r   r„   r†   r‡   Úcmd_listÚprocÚoutputrx   r   r   r   Úsys_call  s0    


r“   c                 C   sh  ddl }ddl}t| tƒr | }n
| | ¡}|r:t|dƒ}n|j}|rPt|dƒ}	n|j}	|j|||	|d}
|r*|rx|s*|
 ¡ sÎ|s t	|
j
 ¡ ƒ}|r | |¡ |sÀt	|
j ¡ ƒ}|rÀ| |¡ |
jdurxqÎqx|sø|
j
 ¡ D ]}|dkrÜ| t	|ƒ¡ qÜ|s2|
j ¡ D ]}|dkr| t	|ƒ¡ qn|
 ¡  |r@| ¡  |rN|	 ¡  |
jrdt| ||
jƒ dS )z‚
    Runs cmd and redirects stdout to out_filename (if specified), stderr to err_filename (if specified), or to log otherwise
    r   NÚwrƒ   r$   )r†   r‡   rˆ   r0   r/   rs   rŠ   r‰   rŒ   r€   r    r   r   r   rŽ   r   ÚwaitÚcloser*   )r(   r   Zout_filenameÚerr_filenamer„   r†   r‡   r   r    r   r‘   rx   r   r   r   Úuniversal_sys_call;  sN    





r˜   c                 C   sb   t |dƒ}| |  ¡ ¡ W d   ƒ n1 s.0    Y  t |tjtjB tjB tj	B tj
B ¡ d S )NÚwb)rs   r   Úreadr   ÚchmodÚstatÚS_IWRITEÚS_IREADÚS_IXUSRÚS_IXGRPÚS_IXOTH)ÚdataÚfiler’   r   r   r   Úsave_data_to_filer  s    ,r¤   c                 C   sn  dd„ }|rt }t}nt}t}tržt| ƒ<}| t¡ | ¡ }| ¡ sP| ¡ }q>| 	¡ }W d   ƒ n1 sl0    Y  t| ƒ 	¡ }| 
|¡}	|d |	… | }nt| ƒ 	¡ }g }
g }d}|D ]ª}| |¡rÊqº||v r|| |¡t|ƒ d …  ¡ }| |d¡ ¡ }||
|ƒsd|
 || ¡ qº||v rº|| |¡t|ƒ d …  ¡ }| ¡ }|||ƒsº| || ¡ qº|
|fS )Nc                 S   s   | D ]}|  |¡r dS qdS ©NTF©re   )Zlist_to_checkÚsuffixÚitemr   r   r   Úalready_savedz  s    
z6get_important_messages_from_log.<locals>.already_savedz * r$   )ÚSPADES_PY_WARN_MESSAGEÚSPADES_WARN_MESSAGEÚSPADES_PY_ERROR_MESSAGEÚSPADES_ERROR_MESSAGEÚcontinue_logfile_offsetrs   Úseekr   rq   r   Úindexrt   Úfindrb   ÚreplaceÚappend)Úlog_filenameÚwarningsr©   Zspades_py_messageZspades_messageZcontinued_logZcontinued_stage_phraseZlines_to_checkZ	all_linesZfailed_stage_indexZspades_py_msgsZspades_msgsZ IMPORTANT_MESSAGE_SUMMARY_PREFIXrx   r§   r   r   r   Úget_important_messages_from_logy  sD    


&



r¶   c                 C   s*   d }| j d D ]}|jjdkr|j}q|S )NÚhandlersÚFileHandler)Ú__dict__Ú	__class__Ú__name__ÚbaseFilename)r   Úlog_fileÚhr   r   r   Úget_logger_filename©  s
    r¿   c                 C   s<  t | ƒ}|sdS | jd D ]}| ¡  qt|dd\}}|sB|r8|rR|  d¡ n
|  d¡ tj tj |¡d¡}t	j
|dd	}|  |¡ |  d
¡ |r¶|  d¡ |D ]}|  |¡ q¦|rØ|  d¡ |D ]}|  |¡ qÈ|  d| ¡ |  |¡ |r4t|dd\}	}
|  d
¡ |  d¡ |
|	 D ]}|  |¡ q"dS dS )NFr·   T)rµ   z?
======= SPAdes pipeline finished abnormally and WITH WARNINGS!z0
======= SPAdes pipeline finished WITH WARNINGS!zwarnings.logr”   )Úmoder$   z=== Pipeline warnings:z-=== Error correction and assembling warnings:z======= Warnings saved to z=== ERRORs:)r¿   r¹   r   r¶   r   r   r   r   rQ   Úloggingr¸   Ú
addHandlerÚremoveHandler)r   r
   r½   r¾   Zspades_py_warnsZspades_warnsZwarnings_filenameZwarnings_handlerrx   Zspades_py_errorsZspades_errorsr   r   r   r   ±  s@    









r   c                 C   s<   t jjr8dt j_t| ƒ}|r8t|ƒ}| dd¡ | ¡ ad S )NFr   r"   )r-   rK   Úcontinue_moder¿   rs   r¯   Útellr®   )r   r´   r½   r   r   r   Úcontinue_from_hereÖ  s    rÆ   c                    sJ   dd„ ‰ ‡ fdd„}d }t t | ¡|ddD ]}tj |¡r,|} qFq,|S )Nc                 S   s   |   ¡ rt| ƒS | S rT   )Úisdigitru   ©Útextr   r   r   Úatoiâ  s    zget_latest_dir.<locals>.atoic                    s   ‡ fdd„t  d| ¡D ƒS )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   )Ú.0Úc©rÊ   r   r   Ú
<listcomp>è  ó    z8get_latest_dir.<locals>.natural_keys.<locals>.<listcomp>z(\d+))Úrer/   rÈ   rÍ   r   r   Únatural_keysç  s    z$get_latest_dir.<locals>.natural_keysT)ÚkeyÚreverse)ÚsortedÚglobr   r   r   )ÚpatternrÑ   Z
latest_dirZdir_to_testr   rÍ   r   Úget_latest_dirá  s    r×   c                 C   s4   |st jj}tj |¡s"t |¡ tj|| da	t	S )N)Údirr   )
r-   rK   Útmp_dirr   r   r   rW   ÚtempfileZmkdtempr   )r   Úbase_dirr   r   r   Úget_tmp_dirò  s    
rÜ   c                 C   sN   t j ¡ D ]>}|  d| ¡r
| td| ƒtd| ƒd …  ¡ r
|  S q
d S )Nú--r[   )r-   ÚSHORT_READS_TYPESÚkeysrt   rb   rÇ   )ÚoptionZshort_reads_typer   r   r   Úget_short_reads_typeþ  s
    $
rá   c                 C   s.   t jD ]"}|  d¡r| d| v r|  S qd S ©NrÝ   )r-   rd   rt   )rà   Zlong_reads_typer   r   r   Úget_long_reads_type  s    

rã   c                 C   s.   t jD ]"}|  d¡r| d| v r|  S qd S râ   )r-   ZGRAPH_READS_TYPESrt   )rà   Zgraph_reads_typer   r   r   Úget_graph_type  s    

rä   c                 C   s   |   d¡o| dd …  ¡ S )Nz--sé   )rt   rÇ   )rà   r   r   r   Úis_single_read_type  s    ræ   c                 C   sX   d}d}t | ƒr.t | ƒ}tt d| ¡ ¡ ƒ}n"t| ƒr@t| ƒ}nt| ƒrPt| ƒ}||fS )NZper[   z\d+)rá   ru   rÐ   ÚsearchÚgrouprã   rä   )rà   Úlib_typeÚ
lib_numberr   r   r   Úget_lib_type_and_number  s    
rë   c                 C   sz   |   d¡rd}nf|   d¡r d}nV|   d¡r0d}nF|   d¡sRt| ƒsRt| ƒsRt| ƒrXd}n|   d	¡sl|   d
¡rrd}nd}|S )Nz-12úinterlaced readsz-1ú
left readsz-2úright readsz-súsingle readsz-mz-mergedúmerged readsÚorientation)re   ræ   rã   rä   )rà   Ú	data_typer   r   r   Úget_data_type(  s$    



ÿþýró   c                 C   sX   d }d| v rPd| d |   d¡…  tjv rP| d |   d¡… }| |   d¡d d … } | |fS )Nú:r+   r[   )r±   r-   rc   )r¢   r   r   r   r   Úget_option_prefix;  s
    $rõ   c                 C   sâ   t | ƒ\}}d||f }t| ƒ}|dkr4| dd … }||vrzi ||< ||| d< |tjv rntj| || d< n||| d< | d¡rÒt|ƒ\}}|r¢d| tj|< ||| v rÂ|| |  |¡ qÞ|g|| |< n||| |< d S )Nz%s_%drñ   éþÿÿÿÚnumberÚtypeÚreadsr+   )rë   ró   r-   rÞ   re   rõ   r?   r³   )rà   r¢   Údataset_dataré   rê   Z	record_idrò   r   r   r   r   Úadd_to_datasetC  s&    

rû   c                 C   sÒ   g }t | tƒr|  ¡ n| D ]²}|s$qd}d}| ¡ D ]"}| d¡rFd}|dv r4d} qXq4|s^q|s„|d dkr„d|d< d|v r„|d= d|vrÂ|d dks¤|d d	kr®d
|d< n|d dkrÂd|d< | |¡ q|S )NFrù   T)rì   rð   rí   rî   rø   z
paired-endZsinglerñ   zhq-mate-pairsÚfrz
mate-pairsZrf)rˆ   ÚdictÚvaluesrß   re   r³   )rú   Zcorrected_dataset_dataÚreads_libraryZ	has_readsZhas_paired_readsrÒ   r   r   r   Úcorrect_dataset]  s2    

r   c           	      C   sª   t t|ƒƒ}g }| D ]}| ¡ D ]x\}}| d¡r g }|D ]T}t t|t|ƒƒƒ}|tj|< |tjv r„||kr„tj| tj|< tj|= | |¡ q:|||< q | |¡ q|S )Nrù   )	r   r   Úitemsre   r   r-   r:   r?   r³   )	rú   rQ   Zabs_paths_dataset_datarÿ   rÒ   ÚvalueZabs_paths_readsÚ
reads_fileZabs_pathr   r   r   Úrelative2abs_pathsz  s     


r  é'  é   c           
         sv   ‡ ‡fdd„t | ˆ ||ƒD ƒ}t|ƒt|ƒ }|D ](}t || ¡|kr2td||f ˆ ƒ q2t|ƒ}	ˆ  d|	 ¡ |	S )Nc                    s   g | ]}t |ˆ ˆƒ‘qS r   ©Úget_max_reads_length©rË   r  ©r   Únum_checkedr   r   rÎ     rÏ   z$get_reads_length.<locals>.<listcomp>zEread lengths differ more than allowable. Length: %f. Avg. length: %f.ú
Reads length: %d
)Úget_reads_filesÚsumrb   ÚmathÚfabsr!   Úminr   )
rú   r   Úignored_typesÚ
used_typesr  Zdiff_len_allowableÚmax_reads_lenghtsZavg_lenZmax_lenÚreads_lengthr   r
  r   Úget_reads_length  s    ÿr  c                    s8   ‡ ‡fdd„t | ˆ ||ƒD ƒ}t|ƒ}ˆ  d| ¡ |S )Nc                    s   g | ]}t |ˆ ˆƒ‘qS r   r  r	  r
  r   r   rÎ     rÏ   z0get_primary_max_reads_length.<locals>.<listcomp>r  )r  Úmaxr   )rú   r   r  r  r  r  r  r   r
  r   Úget_primary_max_reads_lengthœ  s    ÿr  c                 c   sj   | D ]`}|d ur|d |vrq|  ¡ D ]<\}}||v rH| d| ¡ q&q&| d¡r&|D ]
}|V  qVq&qd S )Nrø   zFiles with %s were ignored.rù   )r  r   re   )rú   r   r  r  rÿ   rÒ   r  r  r   r   r   r  ¥  s    
r  c              
   C   s¸   t | |ƒ}d}|dkrd}n˜z.tdd„ t t t | d¡|¡|¡D ƒƒ}W nR tyœ } z:t|j	d j
| dd t ¡ j
| d |d	 W Y d }~n d }~0 0 | d
| t|ƒf ¡ |S )Nr   rC   éd   c                 S   s   g | ]}t |ƒ‘qS r   )rb   )rË   Zrecr   r   r   rÎ   º  rÏ   z(get_max_reads_length.<locals>.<listcomp>rD   rE   rF   r8   z%s: max reads length: %s)r@   r  Ú	itertoolsÚislicer   rG   rH   rJ   r   rK   rL   rM   rN   r   r2   )r  r   r  rB   Zmax_reads_lengthrO   r   r   r   r  ²  s     
$ÿÿÿr  c              
   C   s<  g }t | ƒD ]
\}}d}d}d|vr2|d |d< | ¡ D ]º\}	}
|	 d¡r:|
D ]€}t|d|	|d |d f |ƒ t|d|	|d |d f |||d |ƒ |d tjv rÆt|d|	|d |d f |ƒ | |¡ qP|	dkrät	|
ƒ}q:|	dkr:t	|
ƒ}q:||krt
d	|d |d f |ƒ qt	|ƒs.t
d
|ƒ t||ƒ d S )Nr   r÷   r[   rù   z(%s, library number: %d, library type: %srø   rí   rî   zŽthe number of files with left paired reads is not equal to the number of files with right paired reads (library number: %d, library type: %s)!z0you should specify at least one file with reads!)Ú	enumerater  re   r>   rh   r-   Ú READS_TYPES_USED_IN_CONSTRUCTIONrP   r³   rb   r   r^   )rú   rf   rg   r   Z	all_filesÚidrÿ   Zleft_numberZright_numberrÒ   r  r  r   r   r   Úcheck_dataset_readsÃ  sT    
ÿþÿþÿþ

þþ

r  c                 C   s   t strtd| ƒ d S )Nzqit is recommended to specify single reads with --pe<#>-s, --mp<#>-s, --hqmp<#>-s, or --s<#> option instead of -s!)Úonly_old_style_optionsÚold_style_single_readsr!   r8   r   r   r   Úcheck_single_reads_in_optionsé  s    ÿr"  c                 C   sB   t |ƒtur|g}g }t| ƒD ]\}}|d |v r| |¡ q|S )Nrø   )rø   r0   r  r³   )rú   ÚtypesZlib_idsr  rÿ   r   r   r   Úget_lib_ids_by_typeï  s    r$  c                 C   s*   t | |ƒ}g }|D ]}| | | ¡ q|S rT   )r$  r³   )rú   r#  ÚidsÚresultr  r   r   r   Úget_libs_by_typeù  s
    
r'  c                 C   s&   t | |ƒ}t|ddD ]
}| |= q| S )NT)rÓ   )r$  rÔ   )rú   r#  r%  r  r   r   r   Úrm_libs_by_type  s    
r(  c                 C   s   | D ]}|r dS qdS )NFTr   ©rú   rÿ   r   r   r   Údataset_is_empty  s    r*  c                 C   sD   | D ]:}|D ]0}|  d¡r|| D ]}|  d¡r"   dS q"qqdS )Nrù   r_   TFr¦   )rú   rÿ   rÒ   r  r   r   r   Údataset_has_gzipped_reads  s    

r+  c                 C   s   | D ]}d|v r dS qdS )Nrì   TFr   r)  r   r   r   Údataset_has_interlaced_reads  s    r,  c                 C   s"   | D ]}|d   d¡r dS qdS )Nrø   r`   TFr¦   r)  r   r   r   Údataset_has_additional_contigs   s    r-  ú    c                 C   s’   g d¢}t | ƒD ]|\}}| |d|d |d f  ¡ d|v rT| d||d f ¡ |D ]2}||vrjd}nt|| ƒ}| d|||f ¡ qXqd S )	N)rí   rî   rì   rï   rð   z$Library number: %d, library type: %sr[   rø   rñ   z%s  orientation: %sznot specifiedz
%s  %s: %s)r  r   r2   )rú   r   ÚindentZREADS_TYPESr  rÿ   Z
reads_typer  r   r   r   Úpretty_print_reads'  s    r0  c                 C   sž   g }g }d}d}|r t  | ¡}nt| ƒ}|D ]T}t||ƒ}|s@q,|d dkrt| | ¡ ¡ |sj| |¡ nd}d}q,|| ¡ 7 }q,| |¡ | ¡  t||ƒS )NTr$   r   ú>F)Úgziprs   r€   r³   rq   r–   Úzip)r=   ÚgzippedZres_nameZres_seqÚfirstÚseqZfile_handlerrx   r   r   r   Ú
read_fasta8  s*    

r7  c              	   C   sz   t | dƒ\}|D ]F\}}| |d ¡ tdt|ƒdƒD ]}| |||d … d ¡ q6qW d   ƒ n1 sl0    Y  d S )Nr”   r…   r   é<   )rs   r   Úrangerb   )r=   ZfastaZoutfileÚnamer6  Úir   r   r   Úwrite_fastaS  s
    r<  ÚNc              	   C   sp  g }d}t t| |ƒƒD ]N\}\}}d}	d}
d}|	t|ƒk r| d|	¡dkr|dkr\d}| d|	¡}|d }|t|ƒkr’|| dkr’|d7 }qp|d }	|| |kr0d}||kr| | ¡ d d t|
ƒ d d | ¡ dd … ¡ |||…  d|¡f¡ |
d7 }
|}q0|t|ƒk r| | ¡ d d t|
ƒ d d | ¡ dd … ¡ ||d …  d|¡f¡ q||fS )	NFr   r[   r=  r   TÚ_r   )	r  r7  rb   r±   r³   r/   r2   r   r²   )r;   Z	thresholdZreplace_charr4  Z	new_fastaZmodifiedr  r:  r6  r;  Zcur_contig_numberZcur_contig_startÚstartÚendr   r   r   Úbreak_scaffolds[  s6     

4ÿ4ÿrA  c                 C   s   ddddddœ|   ¡  S )NÚTÚAÚGÚCr=  )rC  rB  rE  rD  r=  )Úupper)Zletterr   r   r   Úcompx  s    rG  c              	   C   s   d  t t| d d d… ¡¡S )Nr$   r   )r   r  ZimaprG  )r6  r   r   r   Úrev_comp|  s    rH  c                 C   sZ   |   d¡}t|ƒdk s.|d dkr>|d dkr>td|  ƒ d S d| v rR|d d S |d S )	Nr>  r"   r   z>NODEZNODEzcontig %s has unknown ID formatú'r[   )r/   rb   r!   )Úsrþ   r   r   r   Úget_contig_id€  s    
$rK  c                 C   s   |   d¡r| dd … S | S )Nr1  r[   )rt   )rJ  r   r   r   Úremove_fasta_prefŠ  s    
rL  c                 C   s(   zt | ƒ W dS  ty"   Y dS 0 d S r¥   )Úfloatrv   ©r  r   r   r   Úis_float  s
    rO  c                 C   s(   zt | ƒ W dS  ty"   Y dS 0 d S r¥   )ru   rv   rN  r   r   r   Úis_int˜  s
    rP  c                 C   s¶   t  | ¡}t  | |jtjB tjB ¡ t  | ¡D ]‚\}}}|D ]6}t j ||¡}t  |¡}t  ||jtjB tjB ¡ q<|D ]6}t j ||¡}t  |¡}t  ||jtjB tjB ¡ qxq.d S rT   )	r   rœ   r›   Úst_modeÚS_IWUSRÚS_IRUSRÚwalkr   r   )r   rJ  ÚrootÚdirsÚfilesÚdÚfr   r   r   Ú#add_user_write_permission_recursive   s    


rZ  c           	      C   sŽ   |st j}nt j}tj |¡r(t  |¡ t j| ||d |sDt|ƒ |sŠt 	|¡D ]6\}}}t 
|d ¡ |D ]}t 
tj ||¡d ¡ qlqRd S )N)Úcopy_function)r   ÚcopyfileÚcopy2r   r   rV   r   ÚcopytreerZ  rT  Úutimer   )	ÚsrcÚdstZpreserve_timesZpreserve_modeZcopy_fnÚdirpathr>  r]   r£   r   r   r   Ú	copy_tree°  s    
rc  )Nr   )r$   N)N)r$   N)r$   N)r$   )T)NN)NNN)T)F)r$   N)r  )N)r.  )F)r=  F)TT)`rÕ   r2  r  rÁ   r  r   rÐ   r   rœ   r   rÚ   rM   Úplatformr   Zos.pathr   r   r   r-   Úcommonr   r¬   rª   r­   r«   r®   r   r   r!  r   r!   r%   r'   r*   r3   r4   r7   r>   r@   rP   rR   r9   rY   rZ   r^   rh   rr   ry   rS   r€   r‚   r“   r˜   r¤   r¶   r¿   r   rÆ   r×   rÜ   rá   rã   rä   ræ   rë   ró   rõ   rû   r   r  r  r  r  r  r  r  r"  r$  r'  r(  r*  r+  r,  r-  r0  r7  r<  rA  rG  rH  rK  rL  rO  rP  rZ  rc  r   r   r   r   Ú<module>   s¶   
	
	


	
#

#
7
0
%
	þ

	
&





