3
Xgam                 @   s  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 d dlZd dl	Z	d dl
mZ dd Zdd	 Zd
d ZG dd dejZdd ZG dd dejZG dd dejZG dd dejZdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdQd+d,Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&d9d: Z'd;d< Z(dRd=d>Z)dSd?d@Z*dTdAdBZ+dCdD Z,dEdF Z-dGdH Z.dIdJ Z/dKdL Z0dMdN Z1dOdP Z2dS )U    N)gettext)basename)abspath
expanduser)empty_configc              C   sx  d } t tjd }tj}tjdd}|jdddd |jdd	dd |jd
ddd |jdddd |jdddd |jdddd |jdddd |jdddd |jdddd |j|\}}|dks|jrd	} nL|dks|jrd} n8|dks|j	rd} n$|j
rd} n|dks|jr"d} |dksD|j	r<|jsD|jrHd} |dksZ|jr^d} |dksp|jrtd} | S ) Nr   F)add_helpz	--isolateisolate
store_true)destactionz--rnarnaz	--plasmidplasmidz--metametaz--biobioz--metaviral	metaviralz--metaplasmidmetaplasmidz
--rnaviralrnaviralz--coronacoronazrnaspades.pyzrnaviralspades.pyzplasmidspades.pybgczmetaspades.pyzmetaplasmidspades.pyzmetaviralspades.pyzcoronaspades.py)r   options_storagefirst_command_lineargparseArgumentParseradd_argumentparse_known_argsr   r   r   r   r   r   r   r   )modeZscript_basenameoptionsZmode_parsernargsunknown_args r   d/home/psgendb/BIRCHDEV/pkg/SPAdes-3.15.4/linux-x86_64/share/spades/spades_pipeline/options_parser.pyget_mode   s>    "r!   c             C   s   t  }|dkrd| _n|dkr&d| _n|dkr<d| _d| _nx|dkrLd| _nh|dkrhd| _d| _d| _nL|dkrd| _d| _d| _n0|dkrd| _d| _n|d	krd| _d| _d| _d S )
Nr   Tr   r   r   r   r   r   r   )	r!   r   r   r   r   r   r   r   r   )argsr   r   r   r    add_mode_to_args8   s2    r#   c              C   s(   t  } dtj }| d k	r$|d|  7 }|S )NzSPAdes genome assembler v%sz [%sSPAdes mode])r!   r   spades_version)r   verr   r   r    versionU   s
    
r&   c                   s0   e Zd Zd fdd	Zdd Zdd	d
Z  ZS )SpadesHelpFormatter      d   c                s   t t| j|||| d S )N)superr'   __init__)selfprogZindent_incrementZmax_help_positionwidth)	__class__r   r    r,   ^   s    zSpadesHelpFormatter.__init__c             C   s   |j  S )N)
splitlines)r-   textr/   r   r   r    _split_linesa   s    z SpadesHelpFormatter._split_linesNc             C   s*   |d krt t d }tjj| ||||S )Nz	

Usage: )r   r&   r   HelpFormatter_format_usage)r-   usageZactionsgroupprefixr   r   r    r5   d   s    z!SpadesHelpFormatter._format_usage)r(   r)   r*   )N)__name__
__module____qualname__r,   r3   r5   __classcell__r   r   )r0   r    r'   ]   s   r'   c               C   s   t  S )N)dictr   r   r   r    init_dataset_dataj   s    r>   c                   s(   e Zd Zd fdd	ZdddZ  ZS )	AddToDatasetActionNFc                s&   t t| j|||||||||	|

 d S )N)r+   r?   r,   )r-   option_stringsr
   r   constdefaulttypechoicesrequiredhelpmetavar)r0   r   r    r,   o   s    zAddToDatasetAction.__init__c             C   s   |dkrdt _|tjkrdt _d|ks0|jd krBt }t|d| d}t|dkrd|j	dd  |d	  }t|j	dd
kr|j	dd dkr|d|d  7 }q|d|j	dd  7 }|d }q|d }n|}t|d	kr|d	 }t j
|||j d S )Nz-sTFdataset_data r(   z---r         orrN   rN   rN   )supportold_style_single_readsr   OLD_STYLE_READS_OPTIONSonly_old_style_optionsrH   r>   setattrlensplitadd_to_dataset)r-   parser	namespacevaluesoption_stringrH   argoptr   r   r    __call__t   s(    


zAddToDatasetAction.__call__)NNNNNFNN)N)r9   r:   r;   r,   r]   r<   r   r   )r0   r    r?   n   s    r?   c                   s(   e Zd Zd fdd	ZdddZ  ZS )	StoreUniqueActionNFc                s(   t t| j|||||||||	|
d
 d S )N)
r@   r
   r   rA   rB   rC   rD   rE   rF   rG   )r+   r^   r,   )r-   r@   r
   r   rA   rB   rC   rD   rE   rF   rG   )r0   r   r    r,      s    zStoreUniqueAction.__init__c             C   s.   |j | j d k	rtj| dt|| j| d S )Nz#option was specified at least twice)__dict__r
   r   ArgumentErrorrS   )r-   rW   rX   rY   rZ   r   r   r    r]      s    zStoreUniqueAction.__call__)NNNNNFNN)N)r9   r:   r;   r,   r]   r<   r   r   )r0   r    r^      s    r^   c                   s(   e Zd Zd fdd	ZdddZ  ZS )	ConcatenationActionNFc                s(   t t| j|||||||||	|
d
 d S )N)
r@   r
   r   rA   rB   rC   rD   rE   rF   rG   )r+   ra   r,   )r-   r@   r
   r   rA   rB   rC   rD   rE   rF   rG   )r0   r   r    r,      s    zConcatenationAction.__init__c             C   sb   dd |D }t |dkr0|d dkr0|d }n t |dkrPd|krPtj| dt|| j| d S )Nc             S   s   g | ]}|D ]}|qqS r   r   ).0Zouterxr   r   r    
<listcomp>   s    z0ConcatenationAction.__call__.<locals>.<listcomp>rL   r   autoz2cann't set 'auto' and kmers' size at the same time)rT   r   r`   rS   r
   )r-   rW   rX   rY   rZ   r   r   r    r]      s    
zConcatenationAction.__call__)NNNNNFNN)N)r9   r:   r;   r,   r]   r<   r   r   )r0   r    ra      s    ra   c             C   sf   | dkr| gS t | }|tjk s*|tjkrBtjd|tjtjf |d dkr\tjd| |gS d S )Nre   z:wrong k value %d: all k values should be between %d and %dr(   r   z,wrong k value %d: all k values should be odd)intr   MIN_KMAX_Kr   ArgumentTypeError)r[   kr   r   r    kmer   s    rk   c             C   sT   | }|d dkr|d d }|j d}x(tt|D ]}t|| d ||< q4W |S )NrL   ,r   rN   rN   )rU   rangerT   rk   )r[   k_mersir   r   r    kmers   s    
rp   c             C   s   | dkr| S t | S d S )Nre   )rf   )r[   r   r   r    qvoffset   s    rq   c             C   sD   | dks| dkr| S t j| r2t| dkr2t| S tjd|  d S )Nre   offg        zGwrong value %s (should be a positive float number, or 'auto', or 'off'))rO   is_floatfloatr   ri   )r[   r   r   r    
cov_cutoff   s
    ru   c             C   s0   t j| rt| dkrt| S tjd|  d S )Ng        z2wrong value %s (should be a positive float number))rO   rs   rt   r   ri   )r[   r   r   r    lcer_cutoff   s    rv   c             C   s8   | t jkr4| t jkr4| jd r4tjd| t jf | S )Nrj   z>wrong value %s (should be 'ec', 'as', 'k<int>', 'mc', or '%s'))r   SHORT_STAGES_NAME
LAST_STAGE
startswithr   ri   )r[   r   r   r    restart_from   s     rz   c             C   s(   | t jkr$| jd r$tjd|  | S )Nrj   z8wrong value %s (should be 'ec', 'as', 'k<int>', or 'mc'))r   rw   ry   r   ri   )r[   r   r   r    
stop_after   s    r{   c             C   s0   t j| rt| dkrt| S tjd|  d S )Nr   z8wrong value %s (should be a non-negative integer number))rO   is_intrf   r   ri   )r[   r   r   r    read_cov_threshold   s    r}   c          	   C   s  xt ddD ]}xfdD ]^}| jd||f ddtjtd	 | jd
||f ddtjtd	 | jd||f ddtjtd	 qW x`dD ]X}| jd||f dtjtd | jd
||f dtjtd | jd||f dtjtd qW | jd| ddtjtd	 | jd| ddtjtd	 qW d S )NrL   
   -12-1-2-sz--pe%d%sz
<filename>)rG   r   rF   r   z--mp%d%sz
--hqmp%d%s-fr-rf-ffr   )r   rF   r   z--s%dz--pe%d-m)r   r   r   r   )r   r   r   )rm   r   r   SUPPRESSr?   )pgroup_input_datanumZsufixorientationr   r   r    add_deprecated_input_data_args   sP    



r   c          	   C   s  t  }| jdddtd dtd |d k	}| jdd|s6dntjd	d
 | jdd|sRdntjd	d
 | jdd|sndntjd	d
 | jdd|sdntjd	d
 | jdd|sdntjd	d
 | jdd|sdntjd	d
 | jdd|sdntjd	d
 | jdd| sdntjd	d
 | jd d!|sd"ntjd	d
 | jd#d$|s8d%ntjd	d
 | jd&d'd(d	d
 | jd)d*d+d	d
 | jd,d-d.d/d0 | jd1d2d3d4t d5 d S )6Nz-oz<output_dir>z5directory to store all the resulting files (required)
output_dir)rG   rF   rC   rB   r
   r   z	--isolater   zMthis flag is highly recommended for high-coverage isolate and multi-cell datar	   )r
   rF   r   z--scsingle_cellz0this flag is required for MDA (single-cell) dataz--metar   z*this flag is required for metagenomic dataz--bior   z1this flag is required for biosyntheticSPAdes modez--coronar   z+this flag is required for coronaSPAdes modez--rnar   z&this flag is required for RNA-Seq dataz	--plasmidr   z1runs plasmidSPAdes pipeline for plasmid detectionz--metaviralr   z1runs metaviralSPAdes pipeline for virus detectionz--metaplasmidr   zoruns metaplasmidSPAdes pipeline for plasmid detection in metagenomic datasets (equivalent for --meta --plasmid)z
--rnaviralr   z9this flag enables virus assembly module from RNA-Seq dataz--iontorrent
iontorrentz)this flag is required for IonTorrent dataz--test	test_modezruns SPAdes on toy datasetz-hz--helpzprints this usage messagerF   )rF   r   z-vz	--versionzprints versionr&   )rF   r   r&   )r!   r   strr^   r   r   r&   )pgroup_basicr   help_hiddenr   r   r    add_basic_args  s    r   Fc             C   s8  d|kr2|j d|  dd|s&d|| f ntjtd d|krd|j d	|  dd|sXd
|| f ntjtd d|kr|j d|  dd|sd|| f ntjtd d|kr|j d|  dd|sd|| f ntjtd d|k r|j d|  dd| sd|| f ntjtd d|kr4|j d|  dd|s(d|| f ntjtd d S )N12z--%s-12<#>
<filename>r(   zefile with interlaced reads for %s library number <#>.
Older deprecated syntax is -%s<#>-12 <filename>)rG   r   rF   r   1z--%s-1zafile with forward reads for %s library number <#>.
Older deprecated syntax is -%s<#>-1 <filename>2z--%s-2zafile with reverse reads for %s library number <#>.
Older deprecated syntax is -%s<#>-2 <filename>sz--%s-szbfile with unpaired reads for %s library number <#>.
Older deprecated syntax is -%s<#>-s <filename>mz--%s-mz`file with merged reads for %s library number <#>.
Older deprecated syntax is -%s<#>-m <filename>rM   z--%s-or<or>zkorientation of reads for %s library number <#> 
(<or> = fr, rf, ff).
Older deprecated syntax is -%s<#>-<or>)r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   r   r?   )Zlibidnamesuffixesr   r   r   r   r    add_library_argsm  sF    






r   c          	   C   s8  t  }| jddddtd | jddddtd | jdddd	td | jd
dddtd | jddddtd t|  |d?k}tddddddddg|  | jdd@ddtd tdddddddg| | tdddddddg| | | jd dd|sd!ntjtd |dk}| jd"ddd#td | jd$ddd%td |dk}| jd&dd|sFd'ntjtd | jd(dd|sfd)ntjtd |dk}| jd*dd|sd+ntjtd | jd,d-d.d/d0g|sd1ntjd2d3 | jd4d-d.d/tjd5d6 | jd7d.d0tjd5d8 |d9ko|d:ko|d;ko|d<k}| jd=dd|s(d>ntjtd d S )ANz--12
<filename>rL   z9file with interlaced forward and reverse paired-end reads)rG   r   rF   r   z-1z"file with forward paired-end readsz-2z"file with reverse paired-end readsz-szfile with unpaired readsz--mergedz5file with merged forward and reverse paired-end readsr   r   pez
paired-endr   r   r   r   r   rM   z--s<#>r(   zjfile with unpaired reads for single reads library number <#>.
Older deprecated syntax is --s<#> <filename>mpz	mate-pairhqmpzhigh-quality mate-pairz--sangerzfile with Sanger readsz--pacbiozfile with PacBio readsz
--nanoporezfile with Nanopore readsz--trusted-contigszfile with trusted contigsz--untrusted-contigszfile with untrusted contigsz--fl-rnazFfile with PacBio/Nanopore/contigs that capture full-length transcriptsz--ssz<type>strand_specificityfrrfzestrand specific data, <type> = fr (normal) and rf (antisense).
Older deprecated syntax is --ss-<type>store)rG   r
   rD   rF   r   z--ss-frZstore_const)rG   r
   rA   rF   r   z--ss-rf)r
   rA   rF   r   r   r   r   r   z--assembly-graphzfile with assembly graph)r   r   )r   r   )r!   r   r?   r   r   r   r   )r   r   r   r   r   r    add_input_data_args  s    &r   c          	   C   sX  t  }|dkp|dk}| jddd |s(dntjdd | jdd	d |sFd
ntjdd |d)k}| j }|jddd |stdntjdd |jddd tjdd | jdddddd | jddddd dtj }|d*krdtj }| jdddd t|dd  | j }|jd!d"d d#dd |jd$d"d tjdd | j }|jd%d&d d'dd |jd(d&d tjdd d S )+Nr   r   z--only-error-correctiononly_error_correctionz4runs only read error correction (without assembling)r	   )r
   rB   rF   r   z--only-assembleronly_assemblerz4runs only assembling (without read error correction)r   z	--carefulcarefulz5tries to reduce number of mismatches and short indelsz--careful:falsestore_falsez--checkpointsz<last or all>checkpointsz.save intermediate check-points ('last', 'all')r   )rG   r
   rF   r   z
--continuecontinue_modezNcontinue run from the last available check-point (only -o should be specified))r
   rF   r   zfrestart run with updated options and from the specified check-point
('ec', 'as', 'k<int>', 'mc', '%s')zZrestart run with updated options and from the specified check-point
('as', 'k<int>', '%s')z--restart-fromz<cp>rz   )rG   r
   rB   rC   rF   r   z--disable-gzip-outputdisable_gzip_outputz;forces error correction not to compress the corrected readsz--disable-gzip-output:falsez--disable-rr
disable_rrz.disables repeat resolution stage of assemblingz--disable-rr:false)r   r   r   )r   r   )r!   r   r   r   add_mutually_exclusive_groupr   rx   rz   )pgroup_pipeliner   r   Zcareful_groupZrestart_from_helpZdisable_gzip_output_groupr   r   r   r    add_pipeline_args  s    r   c          	   C   s   t  }| jddtjdddd | jddd	d
tdtj dd | jddd	tddtj dd | jdddddd | jdd	ddtdtj	d  t
d |d,k}| jdd td d!|sd"ntjdd# | jd$d%d&td'dd | jd(dd)d*dd+ d S )-Nz	--datasetz
<filename>dataset_yaml_filenamez,file with dataset description in YAML formatr   )rG   rC   r
   rF   r   z-tz	--threadsz<int>threadsz!number of threads. [default: %s]
)rG   r
   rC   rF   r   z-mz--memorymemoryzCRAM limit for SPAdes in Gb (terminates if exceeded). [default: %s]
z	--tmp-dirz	<dirname>z:directory for temporary files. [default: <output_dir>/tmp]tmp_dir)rG   rF   r
   r   z-krn   +zDlist of k-mer sizes (must be odd and less than %d)
[default: 'auto']rL   )rG   r
   r   rC   rF   r   r   r   r   z--cov-cutoffz<float>ru   zUcoverage cutoff value (a positive float number, or 'auto', or 'off')
[default: 'off'])rG   rC   rB   r
   rF   r   z--phred-offsetz
<33 or 64>rq   zJPHRED quality offset in the input reads (33 or 64),
[default: auto-detect]z--custom-hmmscustom_hmmszEdirectory with custom hmms that replace default ones,
[default: None])rG   r
   rF   r   )r   r   r   )r!   r   rO   check_file_existencerf   r   THREADSMEMORYrp   rh   ra   ru   r   r   rq   )pgroup_advancedr   r   r   r   r    add_advanced_args`  sf    
r   c             C   sJ  dt jk}| j }|jddd |r$dntjdd |jddd tjdd |jd	d
d |rXdntjdd | jdddt|rxdntjdd | jddd |rdntjdd | j }|jddd |rdntjdd |jddd tjdd | jdddtj|rdntjdd | jdddtj|rdntjdd | jd d!d"tj	|r<d#ntjdd | jd$d%d&t
|r^d'ntjdd | jd(d)d*|r~d+ntjdd | jd,d-d |rd.ntjdd | jd/d0td1|rd2ntjdd3 | jd4d%d5t|rd6ntjdd | jd7d8|r d9ntjdd: | jd;d<|rd=ntjdd: | jd|r:d>ntjd?d@ d S )ANz--help-hiddenz--debugdeveloper_modezruns SPAdes in debug moder	   )r
   rB   rF   r   z--debug:falser   z--trace-timetime_tracerzenable time trackerz--stop-afterz<cp>r{   zRruns SPAdes until the specified check-point ('ec', 'as', 'k<int>', 'mc') inclusiver   )rG   r
   rC   rF   r   z--truseqtruseq_modezruns SPAdes in TruSeq modez--mismatch-correctionmismatch_correctorz>runs post processing correction of mismatches and short indelsz--mismatch-correction:falsez--referencez
<filename>	referencez:file with reference for deep analysis (only in debug mode)z--series-analysisseries_analysisz3config for metagenomics-series-augmented reassemblyz--configs-dirz<config_dir>Zconfigs_dirzdirectory with configsz--read-buffer-sizez<int>read_buffer_sizez/sets size of read buffer for graph constructionz--large-genomelarge_genomeFz'Enables optimizations for large genomesz	--save-gpsave_gpzIEnables saving graph pack before repeat resolution (even without --debug)z--hidden-cov-cutoffz<float>rv   zcoverage cutoff value deeply integrated in simplification (a positive float number). Base coverage! Will be adjusted depending on K and RL!)rG   rC   r
   rF   r   z--read-cov-thresholdr}   z5read median coverage threshold (non-negative integer)z--only-generate-configonly_generate_configz2generate configs and print script to run_spades.sh)r
   rF   r   z--no-clear-afterno_clear_afterz5don't delete tmp files after SPAdes pipeline finishedz1prints this usage message with all hidden optionsrF   )rF   r   )sysargvr   r   r   r   r{   rO   r   check_dir_existencerf   rv   r}   )pgroup_hiddenZshow_help_hiddenZdebug_groupZmismatch_correction_groupr   r   r    add_hidden_args  s    
r   c              C   sp   t jdtddd} | jd}| jd}| jd}| jd}| jd	}t| t| t| t| t| | S )
Nz	spades.pyz"%(prog)s [options] -o <output_dir>F)r.   Zformatter_classr6   r   zBasic optionsz
Input datazPipeline optionszAdvanced optionszHidden options)	r   r   r'   Zadd_argument_groupr   r   r   r   r   )rW   r   r   r   r   r   r   r   r    create_parser  s    





r   c             C   s   dt jkr"t jjd k	r"tjd|  t jjr6tjd|  t jjrJtjd|  t jjr^tjd|  t jjrrtjd|  t jj	rtjd|  t jj
rtjd|  t jjrtjd	|  t jjrtjd
|  t jjrtjd|  t jjd k	rtjd|  d S )NrH   z[you cannot specify input data (-1, -2, -12, --pe-1, --pe-2 ...) with --restart-from option!z8you cannot specify --dataset with --restart-from option!z3you cannot specify --sc with --restart-from option!z5you cannot specify --meta with --restart-from option!z8you cannot specify --plasmid with --restart-from option!z4you cannot specify --rna with --restart-from option!z8you cannot specify --isolate with --restart-from option!z;you cannot specify --iontorrent with --restart-from option!z?you cannot specify --only-assembler with --restart-from option!zFyou cannot specify --only-error-correction with --restart-from option!zVyou cannot specify strand specificity (--ss-rf or --ss-fr) with --restart-from option!)r   r"   rH   rO   errorr   r   r   r   r   r   r   r   r   r   )logr   r   r    check_options_for_restart_from,  s,    r   c             C   s  | j rt| ttj | jrT|stdtjkrBtjjd k	rBtjd t	j
jdtj_n dtjksjtjjd krttjd |stt| j}|tj| j< tj|d || _| jd k	rtt| j}|tj| j< tj|d || _| jd k	rtt| j}tj|d || _d| kr"| jd k	r"d	| _| jr0d	| _| jrJ| jrJtjd
 | jsZ| jrn| jrntjd| | jr| jrtjd| | jdkr| jd	krtjd | jd	kr| jdkrtjd | jr| js| jrtjd| | jr| js
| jrtjd| | jr0| jr0tjd | jrJ| jrJtjd | j d k	r\d	| _| jd k	rp| j| _| jr~t  | js| js| jr| j rd	| _d S )Nr   z/you cannot specify -o and --test simultaneouslyZspades_testzGthe output_dir is not set! It is a mandatory parameter (-o output_dir).zoutput directoryzdirectory for temporary fileszdirectory with custom hmmsr   TzNyou cannot specify --only-error-correction and --only-assembler simultaneouslyz;you cannot specify --only-error-correction in RNA-seq mode!z;you cannot specify --only-error-correction in isolate mode!FzKyou cannot specify --mismatch-correction and --careful:false simultaneouslyzKyou cannot specify --mismatch-correction:false and --careful simultaneouslyzFyou cannot specify --mismatch-correction or --careful in RNA-seq mode!zFyou cannot specify --mismatch-correction or --careful in isolate mode!zLIsolate mode already implies --only-assembler, so this option has no effect.zHRNA mode already implies --only-assembler, so this option has no effect.) rz   r   r#   r   r"   r   r   rO   r   ospathr   r   dict_of_rel2abscheck_path_is_asciir   r   r   r   r   r   r   r   r   r   r   r   warningr   r   enable_truseq_moder   )r"   r   skip_output_dirr   r   r   r   r   r    add_to_optionD  sl    








"r   c                s  t  | d< t  | d< |js$t  | d< |js4t  | d< |j| d jd< |j| d jd< |j| d jd< |j| d jd< |j| d jd	< |j	| d jd
< |j
| d jd< |jr|j| d jd< d  |jd k	r|j n0|jrtjj|tj n|jr tjj|tj  d k	rxd}dd tjj rFdj fddtj D }n rT }|dkrjtjd| || d jd< |j| d jd< |j	r|jr|j| d jd< |jsNtjj| d jd| d jd< |j | d jd< |jr|j| d jd< |j| d jd< tj| d jd< |js(|j r6d| d jd< |j!rN|j!| d jd< |js&|j"dkrt|j#d krtd |_"|j"r|j"| d jd < n0|j$s|j%rd| d jd < ntj&| d jd < |j'| d jd!< |j(| d jd"< |j)| d jd#< |j*| d jd$< |j!r|j!| d jd< tj+| d jd%< |j r|j,rt  | d&< d | d& jd'< tjj|d(| d& jd)< |j| d& jd*< |j| d& jd+< tj-| d,< d S )-Ncommondataseterror_correctionassemblyr   r   r   max_threads
max_memoryr   r   r   rI   c             S   s4   t jj| o2| jdp2| jdp2| jdp2| jdS )NZhmmzhmm.gzZaazaa.gz)r   r   isfileendswith)hmmfiler   r   r    <lambda>  s   zadd_to_cfg.<locals>.<lambda>rl   c                s,   g | ]$}t jj |rt jj |qS r   )r   r   join)rb   r   )	hmms_path
is_hmmfiler   r    rd     s   zadd_to_cfg.<locals>.<listcomp>zXCustom HMM folder does not contain any HMMs. They should have .hmm or .hmm.gz extension.Zset_of_hmmsyaml_filenamer   Z	correctedgzip_outputrq   r   max_iterationsrL   Zcount_filter_singletonsr   re   iterative_Kr   ru   rv   r   correct_scaffoldsr   zskip-maskedz
spades-bwaZbwar   z
output-dirrun_truseq_postprocessing).r   r   r   r   r_   r   r   r   r   r   r   r   r   r   r   r   r   r   biosyntheticspades_hmmsr   coronaspades_hmmsisdirlistdirrO   r   r   r   r   rq   r   
ITERATIONSr   r   r   rn   rz   r   r   K_MERS_SHORTr   ru   rv   r   r   r   r   )cfgr   bin_homespades_homer"   Zhmmsr   )r   r   r    
add_to_cfg  s    








r   c             C   s  t jjdrdd l}nt jjdr*dd l}| jr| jrhtjdt	j
j|d| tjdt	j
j|d| n0tjdt	j
j|d| tjdt	j
j|d	| | js| jrd
| _| jstjd| t	j
j| js| jrtjd| t	j| j | js|r$| jrtj|stjd| t  nt  nV| jrztjdd}	|	jdddd |	jdtdtd |	j|\}
}|rztjd| | jr| js| js| j dkr| j d k	rtjd| | j!s| jr| jrtjd| | j| j"| j#| j!| j| j$| j%| jgj&d
}|dkrd| j| jgj&d
dk rd| j| jgj&d
dk rd| j| jgj&d
dk rdtjd| n|dkrxtj'd | jrd S d }t	j
j| jd}|rt	j
j(|ry|j)t*|}W n |j+k
r   d }Y nX |t,_-| j.r\y|j)t*| j.t,_-W n> |j+k
r>   t j/ \}}}tjd | j. t|  Y nX tj0t,j-t	j
j1| j.t,_-n"tj2t,j-t,_-tj0t,j-t	j3 t,_-|d k	r|}nt,j-}|| _.tj4|| j5p| j!| j6| tj7|t,j8stjd! | j!rt9|t9tj7|t,j:krtjd"d#jt,j: d$  | jr| j; r| j rt<dt9tj7|d%}t<dt9tj7|d&}t<dt9tj7|d'd(g}t9||| | krtjd) |d krt*| j.d*}|j=||dd+t>d,d- W d Q R X t?  |S ).Nz2.r   z3.z-1ztest_dataset_plasmid/pl1.fq.gzz-2ztest_dataset_plasmid/pl2.fq.gzztest_dataset/ecoli_1K_1.fq.gzztest_dataset/ecoli_1K_2.fq.gzTzGthe output_dir is not set! It is a mandatory parameter (-o output_dir).zBthe output_dir should exist for --continue and for --restart-from!z4you cannot specify reads with --restart-from option!F)r   z
--continuer   r	   )r
   r   z-or   )rC   r
   r   zyou cannot specify any option except -o with --continue option! Please use '--restart-from last' if you need to change some of the options from the initial run and continue from the last available checkpoint.rr   zXyou cannot specify --careful, --mismatch-correction or --cov-cutoff in metagenomic mode!z-you cannot specify --careful in RNA-Seq mode!rL   r(   zyou cannot simultaneously use more than one mode out of Isolate, Metagenomic, Large genome, Illumina TruSeq, RNA-Seq, Plasmid, and Single-cell (except combining Metagenomic and Plasmid)!zxNo assembly mode was specified! If you intend to assemble high-coverage multi-cell/isolate data, use '--isolate' option.zinput_dataset.yamlz/exception caught while parsing YAML file (%s):
zYyou should specify at least one unpaired, paired-end, or high-quality mate-pairs library!z)you cannot specify any data types except z, z in RNA-Seq mode!z
paired-endzassembly-graphpacbionanoporezyou cannot specify any data types except a single paired-end library (optionally accompanied by a single library of PacBio reads or Nanopore reads) in metaSPAdes mode!w"inf)default_flow_styledefault_styler/   )@r   r&   ry   pyyaml2pyyaml3r   r   rO   rV   r   r   r   r   r   r   r   r   r   r   makedirsrz   dataset_is_emptysave_restart_optionsload_restart_optionsr   r   r   r   r^   r   r   r   ru   r   r   r   r   r   countr   r   loadopen	YAMLErrorr   original_dataset_datar   exc_inforelative2abs_pathsdirnamecorrect_datasetgetcwdcheck_dataset_readsr   r   get_lib_ids_by_type READS_TYPES_USED_IN_CONSTRUCTIONrT   READS_TYPES_USED_IN_RNA_SEQr   maxdumprt   set_default_values)r"   r   rH   r   r   load_processed_datasetrz   r   pyyamlcontinue_parserr   r   Zmodes_countZexisting_dataset_dataZprocessed_dataset_fpath_excZpaired_end_libsZ
graph_libsZlong_read_libsfr   r   r    postprocessing  s    
(*R






r  c          	   C   s   t  }t }|r tjj}tjj}	|}
|}|j|\t_}tjjd k	r|| r|x tjjD ]}|j	f |d i qTW |j|\t_}|rd}|j
|dj|  |r|tj_|	tj_ttj| |
 dtjkrtjj}nt }ttj||| ||||}tjjrtjd d fS t|| ||tj tj||fS )NzIPlease specify option (e.g. -1, -2, -s, etc)) for the following paths: %sz, rH   )r=   r   r   r"   r   r{   r   rz   r_   Zset_defaultsr   r   r   rH   r>   r  r   r   )r   r   r   secondary_fillingrz   r   r   rW   Zold_output_dirZold_stop_afterr   r  r   r[   msgrH   r   r   r    
parse_args\  s8    



r  c             C   s   t  }|j  d S )N)r   Z
print_help)r$   Zshow_hiddenr   rW   r   r   r    r6     s    r6   c               C   s  t jjd krt jt j_t jjd krNtj rDttt j	tj t j_n
t j	t j_t jj
d krbdt j_
t jjd krvdt j_t jjd krdt j_t jjd krdt j_t jjd krdt j_t jjd krdt j_t jjd krdt j_t jjdkrd t j_t jjd krdt j_t jjd kr*tjjt jjt jt j_t jjd kr@dt j_t jjd krVdt j_t jjd krldt j_t jjd krdt j_t jjd krdt j_d S )NFZnonere   rr   )r   r"   r   r   r   rO   get_available_memoryrf   minr   r   r   r   r   r   r   r   rq   ru   r   r   r   r   r   TMP_DIRr   r   r   r   r   r   r   r   r    r    sH    

r  c               C   s0   t jf ttjt_d tj_d tj_d tj_d S )N)	r   Z	Namespacevarsr   r"   restartr   rz   r   r   r   r   r    r    s    r  c              C   s   dt jkrFt jjrFt jjt _t jjdkr2d t j_nt jjt j_d t j_x4t jjD ](} t jj|  d k	rPt jj|  t jj| < qPW d S )Nrn   re   )r   r#  rn   r"   original_k_mersr_   )optionr   r   r    r    s    

r  c               C   sR   ddddgt _dddddgt _dddddddgt _dt j_dt _dt _dt j_d S )	N   !   -   7   M   c      T)	r   r   
K_MERS_150
K_MERS_250r"   r   r   r   r   r   r   r   r    r     s    r   c             C   s,   x&| D ]\}}|dks |j drdS qW dS )Nz
--continuez--restart-fromTF)ry   )r   r\   r[   r   r   r    
will_rerun  s
    r/  c              C   sN   t jdd} | jdddd | jddd td	d
 | j \}}|jpJ|jd k	 S )NF)r   z
--continuer   r	   )r
   r   z--restart-fromrz   r   )r
   rB   rC   r   )r   r   r   rz   r   r   )r  r   r   r   r   r    is_first_run  s
    r0  c              C   sF   t jdd} | jdtdtd | j \}}|jd kr8d S tt|jS )NF)r   z-or   )rC   r
   r   )	r   r   r   r   r^   r   r   r   r   )Zoutput_parserr   r   r   r   r    get_output_dir_from_args  s    
r1  )F)N)FN)FN)3r   r   r   r   Zos.pathr   r   r   rO   r   Zprocess_cfgr   r!   r#   r&   r4   r'   r>   ZActionr?   r^   ra   rk   rp   rq   ru   rv   rz   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r  r  r6   r  r  r  r   r/  r0  r1  r   r   r   r    <module>	   sZ   $&
	-N
6pM@xKZ
s
*
(
