3
ja                 @   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 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dfddZdddZ dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dddZ'dd d!Z(dd"d#Z)dd$d%Z*dd&d'Z+d(d) Z,d*d+ Z-d,d- Z.d.d/ Z/d0d1 Z0d2d3 Z1d4d5 Z2e	j3j4d6fd7d8Z5d9d: Z6dd;d<Z7dd=d>Z8d?d@ Z9ddAdBZ:dCdD Z;ddEdFZ<dGdH Z=dIdJ Z>ddKdLZ?dMdN Z@dOdP ZAdQdR ZBdSdT ZCdUdV ZDdWdX ZEdYdZ ZFd[d\ ZGd]d^ ZHd_d` ZIejJddcfdddeZKddfdgZLddhdiZMdjdk ZNdldm ZOdndo ZPdpdq ZQdrds ZRdtdu ZSdvdw ZTdxdy ZUdzd{ ZVd|d} ZWdddZXdddZYdd ZZdddZ[dd Z\dd Z]dd Z^dd Z_dd Z`dd ZadS )    N)uname)LooseVersion)abspath
expanduserjoin)SeqIOz== Error == == Warning == z ERROR z WARN TF   c             C   s   d}|rR|j d|| f  t|dd |j d|  |j d |j d|j   nNtjjd|| f  tjjd	|  tjjd
 tjjd|j   tjj  trtj	j
trtjt tj| d S )NZSPAdesz

%s %sT)
with_errorzR
In case you have troubles running %s, you can write to spades.support@cab.spbu.ruzCor report an issue on our GitHub repository github.com/ablab/spadeszMPlease provide us with params.txt and %s.log files from the output directory.z	

%s %s

zS
In case you have troubles running %s, you can write to spades.support@cab.spbu.ru
zDor 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   ]/home/psgendb/BIRCHDEV/pkg/SPAdes-3.15.4/linux-x86_64/share/spades/spades_pipeline/support.pyerror+   s$    



r   c             C   s:   |r|j d|| f  ntjjd|| f  tjj  d S )Nz	

%s %s

z


%s %s


)r   r   stdoutr   r   )Zwarn_strr   r   r   r   r   warningB   s    r    c              C   s   dd } |  rdS dS )Nc               S   s   dt  d j kS )NZ	microsoft   )r   r   r   r   r   r   in_wslK   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_checkJ   s    r$   c             C   s   | dkrt  S d S )N   i)r$   )r   r   r   r   get_error_hintsV   s    r&   c             C   s(   t |}d| ||f }t|||d d S )NzAsystem call for: "%s" finished abnormally, OS return value: %d
%s)r   )r&   r   )cmdr   r   Z	hints_strerr_msgr   r   r   	sys_error[   s    r)   c              C   s   dd } t jj d }g }xtjD ]}|d }d|krF|jd\}}n&|jdrd|d d | }}n| }}| |}|jd||jddf  t|t|  kot|k n  r"d	S q"W t	d
|dj
|f  d S )Nc             S   sT   | j d}x>ttt|D ]*}|| j rtt|| d ||< P qW dj|S )N.r	   )splitreversedrangelenisdigitstrintr   )versionZ
componentsir   r   r   __next_versionb   s    
z,check_python_version.<locals>.__next_versionr   -+r	   zPython%s: %sz and higherTz=python version %s is not supported!
Supported versions are %sz, )r   r2   r+   options_storageZSUPPORTED_PYTHON_VERSIONSendswithappendreplacer   r   r   )r4   Zcurrent_versionZsupported_versions_msgZsupported_versionsmajorZmin_incZmax_incZmax_excr   r   r   check_python_versiona   s     
$r=   c               C   s   dS )Nz2You can obtain SPAdes binaries in one of two ways:z:
1. Download them from http://cab.spbu.ru/software/spades/z5
2. Build source code with ./spades_compile.sh scriptzlYou can obtain SPAdes binaries in one of two ways:
1. Download them from http://cab.spbu.ru/software/spades/zYou can obtain SPAdes binaries in one of two ways:
1. Download them from http://cab.spbu.ru/software/spades/
2. Build source code with ./spades_compile.sh scriptr   r   r   r   r    get_spades_binaries_info_message|   s     r>   c             C   s@   x:dD ]2}t jj| |}t jj|std|t f | qW d S )Nspades-hammerspades-ionhammerspades-core
spades-bwaz SPAdes binaries not found: %s
%s)r?   r@   rA   rB   )r   r   r   isfiler   r>   )Z
binary_dirr   binaryZbinary_pathr   r   r   check_binaries   s    
rE   r#   c             C   sD   t t| }t|| tjj|s6td||f |d |tj| < |S )Nzfile not found: %s (%s))r   )	r   r   check_path_is_asciir   r   rC   r   r8   dict_of_rel2abs)input_filenamemessager   filenamer   r   r   check_file_existence   s    

rK   c             C   sD   | t jkr$t j|  }tjd| }n
tj| }|s@td|  | |S )NrJ   z%incorrect extension of reads file: %s)r8   dict_of_prefixesr   get_read_file_typer   )rH   r   ext	file_typer   r   r   rM      s    


rM   c             C   s   t t| }t| |}|dkr"d S y:tjtj|d|}t|d d krZtd||f |d W nP tk
r } z4t|j	d j
|dd tj j
|d |d W Y d d }~X nX d S )NZbamrzfile is empty: %s (%s))r   r   )FILEz

)r   r   rM   r   parseOpennextr   	Exceptionargsformat	traceback
format_exc)rH   rI   r   rJ   rO   Zreads_iteratorinstr   r   r   check_file_not_empty   s    
r[   c             C   sD   t t| }t|| tjj|s6td||f |d |tj| < |S )Nzdirectory not found: %s (%s))r   )	r   r   rF   r   r   r   r   r8   rG   )Zinput_dirnamerI   r   dirnamer   r   r   check_dir_existence   s    

r]   c             C   s   t | std| |f  d S )Nz+path contains non-ASCII characters: %s (%s))is_ascii_stringr   )r   rI   r   r   r   rF      s    rF   c             C   s0   t jj| rt j|  t jj| s,t j|  d S )N)r   r   rC   removeexistsmakedirs)r\   r   r   r   ensure_dir_existence   s    
rb   c             C   s$   t jj| rtj|  t j|  d S )N)r   r   r   r   r   ra   )r\   r   r   r   recreate_dir   s    
rc   c             C   s.   x(| D ] }| j |dkrtd| | qW d S )Nr	   z$file %s was specified at least twice)countr   )	filenamesr   rJ   r   r   r   check_files_duplication   s    
rf   c       	      C   s  | t jkrt j|  }ntjj| d }|j dkrtjj| d t|  d }|| j t jkrl|| }n*tjj| d t||   d }|| }|j t jkrtddj	t j| |f | | r|j t j
krtdj	t j
d| |f  | | r2|j t jkr2|t jkr2tddj	t j| |f | |jdrl|j t jkrltd|dj	t j| |f | |jd	r|j t jkrtd
|dj	t j| |f | d S )Nr	   z.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))r8   rL   r   r   splitextr   r.   ALLOWED_READS_EXTENSIONSr   r   Z(IONTORRENT_ONLY_ALLOWED_READS_EXTENSIONSZBH_ALLOWED_READS_EXTENSIONSLONG_READS_TYPESr9   Z CONTIGS_ALLOWED_READS_EXTENSIONSZGRAPH_ALLOWED_READS_EXTENSIONS)	rJ   rI   only_assembler
iontorrentZlibrary_typer   rN   Zpre_extZpre_pre_extr   r   r   check_reads_file_format   s2    

"rm   c             C   sx   dd }t jj| \}}|r*|| rt| S nJdt jkrtx>t jd jt jD ](}|jd}t jj|| }||rH|S qHW d S )Nc             S   s   t jj| ot j| t jS )N)r   r   rC   accessX_OK)fpathr   r   r   is_exe   s    zwhich.<locals>.is_exePATH")r   r   r+   environpathsepstripr   )Zprogramrq   rp   Zfnamer   Zexe_filer   r   r   which   s    

rw   c              C   s   d} d}t jj| ryHxBt| D ]6}|j|r t|t|d  j d }|d }|S q W W n& tk
rp   d S  t	k
r   d S X d S )Nz/proc/meminfoz	MemTotal:r   i   i   )
r   r   rC   open
startswithr1   r.   r+   
ValueErrorIOError)Zmem_info_filenameZavail_mem_headerlineZ	avail_memr   r   r   get_available_memory  s    
r}   c             C   s>   y| j d W n& tk
r"   dS  tk
r4   dS X dS d S )NasciiFT)encodeUnicodeDecodeErrorUnicodeEncodeError)r|   r   r   r   r^     s    r^   z3.c             C   s   |rt | dj S | j S )Nzutf-8)r0   rstrip)r|   Z
is_python3r   r   r   process_readline   s    r   c             C   s   d| krd|  d } | S )N rs   r   )r0   r   r   r   process_spaces&  s    r   c       	      C   s   dd l }dd l}t| tr | }n
|j| }|j||j|j|d}d}xF|j st	|j
j }|r||rp|j| n||d 7 }|jd k	rFP qFW x:|j
j D ],}t	|}|r|r|j| q||d 7 }qW |jrt| ||j |S )Nr   )r   r   cwdr#   
)shlex
subprocess
isinstancelistr+   PopenPIPESTDOUTpollr   r   readliner   
returncode	readlinesr)   )	r'   r   r   r   r   cmd_listprocoutputr|   r   r   r   sys_call,  s0    



r   c             C   sx  ddl }ddl}t| tr | }n
|j| }|r:t|d}n|j}|rPt|d}	n|j}	|j|||	|d}
|ov| sz| r:xX|
j s|st	|
j
j }|r|j| |st	|
jj }|r|j| |
jdk	r|P q|W |sx(|
j
j D ]}|dkr|jt	| qW |sBx6|
jj D ]}|dkr|jt	| qW n|
j  |rP|j  |r^|	j  |
jrtt| ||
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w)r   r   r   r#   )r   r   r   r   r+   rx   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   r|   r   r   r   universal_sys_callO  sN    






r   c             C   sN   t |d}|j| j  W d Q R X tj|tjtjB tjB tj	B tj
B  d S )Nwb)rx   r   readr   chmodstatS_IWRITES_IREADS_IXUSRS_IXGRPS_IXOTH)datafiler   r   r   r   save_data_to_file  s    r   c             C   sb  dd }|rt }t}nt}t}trt| 6}|jt |j }x|j sR|j }q@W |j	 }W d Q R X t| j	 }|j
|}	|d |	 | }nt| j	 }g }
g }d}x|D ]}|j|rq||kr||j|t| d  j }|j|dj }||
|sV|
j||  q||kr||j|t| d  j }|j }|||s|j||  qW |
|fS )Nc             S   s    x| D ]}|j |rdS qW dS )NTF)r9   )Zlist_to_checksuffixitemr   r   r   already_saved  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_offsetrx   seekr   rv   r   indexry   findr.   r;   r:   )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_PREFIXr|   r   r   r   r   get_important_messages_from_log  sD    







r   c             C   s.   d }x$| j d D ]}|jjdkr|j}qW |S )NhandlersFileHandler)__dict__	__class____name__baseFilename)r   log_filehr   r   r   get_logger_filename  s
    
r   c             C   sL  t | }|sdS x| jd D ]}|j  qW t|dd\}}|sF|rH|rV| jd n
| jd tjjtjj|d}t	j
|dd	}| j| | jd
 |r| jd x|D ]}| j| qW |r| jd x|D ]}| j| qW | jd|  | j| |rDt|dd\}	}
| jd
 | jd x|
|	 D ]}| j| q0W 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   r\   loggingr   
addHandlerremoveHandler)r   r
   r   r   Zspades_py_warnsZspades_warnsZwarnings_filenameZwarnings_handlerr|   Zspades_py_errorsZspades_errorsr   r   r   r     s@    










r   c             C   s<   t jjr8dt j_t| }|r8t|}|jdd |j ad S )NFr   r!   )r8   rV   continue_moder   rx   r   tellr   )r   r   r   r   r   r   continue_from_here  s    r   c                sL   dd   fdd}d }x.t tj| |ddD ]}tjj|r.|}P q.W |S )Nc             S   s   | j  rt| S | S )N)r/   r1   )textr   r   r   atoi  s    zget_latest_dir.<locals>.atoic                s    fddt jd| D S )Nc                s   g | ]} |qS r   r   ).0c)r   r   r   
<listcomp>  s    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j|s"tj| tj|| da	t	S )N)dirr   )
r8   rV   tmp_dirr   r   r   ra   tempfileZmkdtempr   )r   base_dirr   r   r   get_tmp_dir  s    
r   c             C   sN   xHt jj D ]:}| jd| r| td| td| d  j r|S qW d S )Nz--r	   )r8   SHORT_READS_TYPESkeysry   r.   r/   )optionZshort_reads_typer   r   r   get_short_reads_type  s
    $r   c             C   s.   x(t jD ]}| jdr| d| kr|S qW d S )Nz--)r8   rj   ry   )r   Zlong_reads_typer   r   r   get_long_reads_type  s    r   c             C   s.   x(t jD ]}| jdr| d| kr|S qW d S )Nz--)r8   ZGRAPH_READS_TYPESry   )r   Zgraph_reads_typer   r   r   get_graph_type"  s    r   c             C   s   | j do| dd  j S )Nz--s   )ry   r/   )r   r   r   r   is_single_read_type)  s    r   c             C   sX   d}d}t | r.t | }ttjd| j }n"t| r@t| }nt| rPt| }||fS )NZper	   z\d+)r   r1   r   searchgroupr   r   )r   lib_type
lib_numberr   r   r   get_lib_type_and_number-  s    
r   c             C   sz   | j drd}nf| j dr d}nV| j dr0d}nF| j dsRt| sRt| sRt| rXd}n| j d	sl| j d
rrd}nd}|S )Nz-12zinterlaced readsz-1z
left readsz-2zright readsz-szsingle readsz-mz-mergedzmerged readsorientation)r9   r   r   r   )r   	data_typer   r   r   get_data_type<  s    



r   c             C   sX   d }d| krPd| d | j d  tjkrP| d | j d }| | j dd d  } | |fS )N:r*   r	   )r   r8   ri   )r   r   r   r   r   get_option_prefixO  s
    $r   c             C   s   t | \}}d||f }t| }|dkr4| dd  }||krzi ||< ||| d< |tjkrntj| || d< n||| d< |jdrt|\}}|rd| tj|< ||| kr|| | j| q|g|| |< n||| |< d S )	Nz%s_%dr   r!   numbertypereadsr*   )r   r   r8   r   r9   r   rL   r:   )r   r   dataset_datar   r   Z	record_idr   r   r   r   r   add_to_datasetW  s&    

r   c             C   s   g }xt | tr| j n| D ]}|s&qd}d}x,|j D ] }|jdrJd}|dkr8d}P q8W |sbq| r|d d	krd
|d< d|kr|d= d|kr|d d	ks|d dkrd|d< n|d dkrd|d< |j| qW |S )NFr   Tinterlaced readsmerged reads
left readsright readsr   z
paired-endZsingler   zhq-mate-pairsfrz
mate-pairsZrf)r   r   r   r   )r   dictvaluesr   r9   r:   )r   Zcorrected_dataset_datareads_libraryZ	has_readsZhas_paired_readsr   r   r   r   correct_datasetq  s2    

r   c       	      C   s   t t|}g }x| D ]}x|j D ]|\}}|jdr$g }x\|D ]T}t t|t|}|tj|< |tjkr||krtj| tj|< tj|= |j| q@W |||< q$W |j| qW |S )Nr   )	r   r   itemsr9   r   r8   rG   rL   r:   )	r   r\   Zabs_paths_dataset_datar   r   valueZabs_paths_reads
reads_fileZabs_pathr   r   r   relative2abs_paths  s     



r   
         c       
         sz    fddt |  ||D }t|t| }x0|D ](}tj|| |kr4td||f   q4W t|}	 jd|	  |	S )Nc                s   g | ]}t | qS r   )get_max_reads_length)r   r   )r   num_checkedr   r   r     s    z$get_reads_length.<locals>.<listcomp>zEread lengths differ more than allowable. Length: %f. Avg. length: %f.z
Reads length: %d
)get_reads_filessumr.   mathfabsr    minr   )
r   r   ignored_types
used_typesr  Zdiff_len_allowablemax_reads_lenghtsZavg_lenZmax_lenreads_lengthr   )r   r  r   get_reads_length  s    
r  c                s8    fddt |  ||D }t|} jd|  |S )Nc                s   g | ]}t | qS r   )r   )r   r   )r   r  r   r   r     s    z0get_primary_max_reads_length.<locals>.<listcomp>z
Reads length: %d
)r  maxr   )r   r   r  r  r  r	  r
  r   )r   r  r   get_primary_max_reads_length  s
    r  c             c   sv   xp| D ]h}|d k	r |d |kr qxL|j  D ]@\}}||krL|jd|  q*q*|jdr*x|D ]
}|V  q\W q*W qW d S )Nr   zFiles with %s were ignored.r   )r   r   r9   )r   r   r  r  r   r   r   r   r   r   r   r    s    


r  c             C   s   t | |}d}y.tdd tjtjtj| d||D }W nP tk
r } z4t|j	d j
| dd tj j
| d |d W Y d d }~X nX |jd| t|f  |S )	Nr   c             S   s   g | ]}t |qS r   )r.   )r   Zrecr   r   r   r     s    z(get_max_reads_length.<locals>.<listcomp>rP   )rQ   z

)r   z%s: max reads length: %s)rM   r  	itertoolsislicer   rR   rS   rU   r   rV   rW   rX   rY   r   r0   )r   r   r  rO   Zmax_reads_lengthrZ   r   r   r   r     s    
,*r   c          
   C   sJ  g }x t | D ]\}}d}d}d|kr6|d |d< x|j D ]\}	}
|	jdr@x|
D ]}t|d|	|d |d f | t|d|	|d |d f |||d | |d tjkrt|d|	|d |d f | |j| qXW |	dkrt	|
}q@|	dkr@t	|
}q@W ||krt
d	|d |d f | qW t	|s<t
d
| t|| d S )Nr   r   r	   r   z(%s, library number: %d, library type: %sr   z
left readszright readszthe 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   r9   rK   rm   r8    READS_TYPES_USED_IN_CONSTRUCTIONr[   r:   r.   r   rf   )r   rk   rl   r   Z	all_filesidr   Zleft_numberZright_numberr   r   r   r   r   r   check_dataset_reads  s<    




r  c             C   s   t  r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    )r   r   r   r   check_single_reads_in_options  s    
r  c             C   sF   t |tk	r|g}g }x*t| D ]\}}|d |kr |j| q W |S )Nr   )r   r   r  r:   )r   typesZlib_idsr  r   r   r   r   get_lib_ids_by_type   s    r  c             C   s.   t | |}g }x|D ]}|j| |  qW |S )N)r  r:   )r   r  idsresultr  r   r   r   get_libs_by_type
  s
    

r  c             C   s*   t | |}xt|ddD ]
}| |= qW | S )NT)r   )r  r   )r   r  r  r  r   r   r   rm_libs_by_type  s    

r  c             C   s   x| D ]}|rdS qW dS )NFTr   )r   r   r   r   r   dataset_is_empty  s    
r  c             C   sJ   xD| D ]<}x6|D ].}|j drx|| D ]}|j dr(dS q(W qW qW dS )Nr   z.gzTF)r9   )r   r   r   r   r   r   r   dataset_has_gzipped_reads   s    



r  c             C   s   x| D ]}d|krdS qW dS )Nzinterlaced readsTFr   )r   r   r   r   r   dataset_has_interlaced_reads*  s    
r  c             C   s$   x| D ]}|d j drdS qW dS )Nr   rg   TF)r9   )r   r   r   r   r   dataset_has_additional_contigs1  s    
r       c             C   s   dddddg}xt | D ]\}}|j|d|d |d f   d	|kr\|jd
||d	 f  x:|D ]2}||krtd}nt|| }|jd|||f  qbW qW d S )Nz
left readszright readszinterlaced readszsingle readszmerged readsz$Library number: %d, library type: %sr	   r   r   z%s  orientation: %sznot specifiedz
%s  %s: %s)r  r   r0   )r   r   indentZREADS_TYPESr  r   Z
reads_typer   r   r   r   pretty_print_reads8  s    
r#  c             C   s   g }g }d}d}|r t j| }nt| }xh|D ]`}t||oDtjjd}|sNq.|d dkr|j|j  |sx|j| nd}d}q.||j 7 }q.W |j| |j  t	||S )NTr#   z3.r   >F)
gziprx   r   r   r2   ry   r:   rv   r   zip)rJ   gzippedZres_nameZres_seqfirstseqZfile_handlerr|   r   r   r   
read_fastaI  s*    

r*  c             C   sn   t | dZ}xR|D ]J\}}|j|d  x2tdt|dD ]}|j|||d  d  q:W qW W d Q R X d S )Nr   r   r   <   )rx   r   r-   r.   )rJ   ZfastaZoutfilenamer)  r3   r   r   r   write_fastad  s
    r-  Nc             C   s|  g }d}xht t| |D ]T\}\}}d}	d}
d}x|	t|k oP|jd|	dkr|dkr`d}|jd|	}|d }x$|t|kr|| dkr|d7 }qvW |d }	|| |kr6d}||kr|j|j d d t|
 d dj|j dd   ||| jd|f |
d7 }
|}q6W |t|k r|j|j d d t|
 d dj|j dd   ||d  jd|f qW ||fS )	NFr   r	   r.  T_r   r7   )	r  r*  r.   r   r:   r+   r0   r   r;   )rH   Z	thresholdZreplace_charr'  Z	new_fastaZmodifiedr  r,  r)  r3   Zcur_contig_numberZcur_contig_startstartendr   r   r   break_scaffoldsl  s2      
44r2  c             C   s   dddddd| j   S )NTAGCr.  )r4  r3  r6  r5  r.  )upper)Zletterr   r   r   comp  s    r8  c             C   s   dj tjt| d d d S )Nr#   r	   r7   )r   r  Zimapr8  )r)  r   r   r   rev_comp  s    r9  c             C   sZ   | j d}t|dk s.|d dkr>|d dkr>td|   d S d| krR|d d S |d S )	Nr/  r!   r   z>NODEZNODEzcontig %s has unknown ID format'r	   )r+   r.   r    )sr   r   r   r   get_contig_id  s    
$r<  c             C   s   | j dr| dd  S | S )Nr$  r	   )ry   )r;  r   r   r   remove_fasta_pref  s    
r=  c             C   s&   yt |  dS  tk
r    dS X d S )NTF)floatrz   )r   r   r   r   is_float  s
    r?  c             C   s&   yt |  dS  tk
r    dS X d S )NTF)r1   rz   )r   r   r   r   is_int  s
    r@  r7   )Nr   )r#   N)N)r#   N)r#   N)r#   )NN)NNN)T)F)r#   Ni'  '  )rA  )N)r!  )F)r.  F)br   r%  r  r   r  r   r   r   r   r   r   rX   platformr   Zdistutils.versionr   Zos.pathr   r   r   r8   commonr   r   r   r   r   r   r   r  r  r   r    r$   r&   r)   r=   r>   rE   rK   rM   r[   r]   rF   rb   rc   rf   rm   rw   r}   r^   r2   ry   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   r#  r*  r-  r2  r8  r9  r<  r=  r?  r@  r   r   r   r   <module>
   s   

	


	
#
#
7
0
%
	
	
&





