U
    ñadC9  ã                   @   s*  d dl mZ d dlZd dlZd dlZd dlZzd dlmZ W n  ek
r\   d dl	mZ Y nX d dl
mZmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ eejƒZd
Z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d„Z%dd„ Z&d d!„ Z'd"d#„ Z(dS )%é    )Úwith_statementN)ÚOrderedDict)Ú	reportingÚqconfigÚqutils)Úopen_gzipsafe)Úwrite_fastaÚget_chr_lengths_from_fastafile)ÚGene)Ú
get_logger)Úrun_parallelTFc                 C   sD   t j| ddddd|d||g
||dt  |¡ d}|d	koBtj |¡S )
z— Run GeneMark.hmm with this heuristic model (heu_dirpath)
        prompt> gmhmmp -m heu_11_45.mod sequence
        prompt> gm -m heu_11_45.mat sequencez-dz-az-pÚ0z-mz-oú    ©ÚstdoutÚstderrÚindentr   )r   Úcall_subprocessÚindex_to_strÚosÚpathÚisfile)Z	tool_execÚfasta_fpathÚ	heu_fpathÚ	out_fpathÚerr_fileÚindexÚreturn_code© r   ú2lib/python3.8/site-packages/quast_libs/genemark.pyÚgmhmm_p!   s    ür    c                  C   sœ   ddl } tj tjd¡}tj |ddtjdkr2dnd ¡}zNtj d	¡}tj |¡rx|  	||¡s„tj 
|¡tj 
|¡k r„t ||¡ W d
S    Y dS X dS )z€Installation instructions for GeneMark.
    Please, copy key "gm_key" into users home directory as:
    cp gm_key ~/.gm_key
    r   NÚgenemarkZgm_keysZgm_key_Zlinux_32Z32Z64z	~/.gm_keyTF)Úfilecmpr   r   Újoinr   ÚLIBS_LOCATIONÚplatform_nameÚ
expanduserr   ZcmpÚgetmtimeÚshutilZcopyfile)r"   Zbase_genemark_dirZgm_key_fpathZ
gm_key_dstr   r   r   Úinstall_genemark.   s     
ÿ
ÿÿr)   c              	   C   sz   t j | t |d ¡d ¡}t j |¡rvt|ƒ@}|D ]4}| d¡dkr6t 	¡  t 
d¡  W 5 Q R £ dS q6W 5 Q R X dS )Nr   ú_genemark.stderrzlicense period has endedéÿÿÿÿax  License period for GeneMark has ended! 
To update license, please visit http://exon.gatech.edu/GeneMark/license_download.cgi page and fill in the form.
You should choose GeneMarkS tool and your operating system (note that GeneMark is free for non-commercial use).
Download the license key and replace your ~/.gm_key with the updated version. After that you can restart QUAST.
FT)r   r   r#   r   Úlabel_from_fpath_for_fnamer   ÚopenÚfindÚloggerÚ	main_infoÚwarning)Úout_dirpathÚfasta_fpathsÚ	err_fpathZerr_fÚliner   r   r   Úis_license_validA   s    

r6   c              	   C   sR  d}d}d}t ƒ }d }t| ƒ }|D ]}| d¡r–g }| ¡  d¡\}	}
|	 d¡\}}}}}}|dd … }|
dd … }
d|krˆd}nd	|kr”d}q&|sž|r&| ¡ r,t|ƒ}t|ƒ}|rÌd |¡}d}n|râd |¡}g }d}||krò|| nt|
|||d
}|r||_	g }|r"||_
d }|||< q&| | ¡ ¡ q&W 5 Q R X t| ¡ ƒS )NFÚ z>geneú	ú|é   ÚntTZaa)ÚcontigÚstartÚendÚstrand)r   r-   Ú
startswithÚstripÚsplitÚisspaceÚintr#   r
   ÚseqÚproteinÚappendÚlistÚvalues)r   Zreading_geneZreading_proteinrF   Zgenes_by_idÚgene_idÚfr5   rE   Zseq_idZ	contig_idÚ_Zseq_lenr?   Z
left_indexZright_indexÚgener   r   r   Úparse_gmhmm_outR   sP    




ÿ
rN   c              	   c   sj   t | ƒX}|D ]L}d|kr| ¡  ¡ }t|d |d t|d ƒt|d ƒ|d d}|V  qW 5 Q R X d S )NZCDSr   é   é   é   é	   )r<   r?   r=   r>   rE   )r-   rA   rB   r
   rD   )r   rK   r5   ÚlrM   r   r   r   Úparse_gtf_out   s    
.rT   c              
   C   s  t |dƒ}|r,tjr | d¡ q6| d¡ n
| d¡ | d¡ t| ƒD ]Æ\}}| d|j|j|j|j|d f ¡ |j	r¼| d¡ t
d	t|j	ƒd
ƒD ]$}| d|j	||d
 …  d ¡ q–|jrH| d¡ t
d	t|jƒd
ƒD ]$}| d|j||d
 …  d ¡ qÞ| d¡ qH| ¡  d S )NÚwz##gff out for MetaGeneMark
z$##gff out for GeneMarkS PROKARYOTIC
z%##gff out for GeneMark-ES EUKARYOTIC
z##gff-version 3
z$%s	GeneMark	gene	%d	%d	.	%s	.	ID=%d
r:   z##Nucleotide sequence:
r   é<   z##Ú
z##Protein sequence:
)r   r   ZmetagenemarkÚwriteÚ	enumerater<   r=   r>   r?   rE   ÚrangeÚlenrF   Úclose)ÚgenesZ	gff_fpathÚ
prokaryoteZgffÚidrM   Úir   r   r   Úadd_genes_to_gffˆ   s*    


ÿ
"
"ra   c                    s   ‡ fdd„}t ||ƒ ƒ d S )Nc                  3   sN   t ˆ ƒD ]@\} }|j|j }d| d ||j|j|j|jf }||jfV  qd S )Nz'>gene_%d|GeneMark.hmm|%d_nt|%s|%d|%d|%sr:   )rY   r>   r=   r?   r<   rE   )r`   rM   ZlengthrJ   ©r]   r   r   Úinner£   s         ÿz!add_genes_to_fasta.<locals>.inner)r   )r]   r   rc   r   rb   r   Úadd_genes_to_fasta¢   s    rd   c              	   C   sè   t j|d}tj | d¡}t|dƒ}t |¡}tjd|d|dd||g||dt 	|¡ d	}	|	d
krfd S g }
tj | d¡}tj ||¡}|d }tj ||d ¡}t|dƒ$}t
||||||ƒ}|rÊt|ƒ}
W 5 Q R X tjsät |¡ |
S )N)Údirzgmsn.plrU   Úperlz--namez--cleanú--outr   r   r   Úgmhmmpú.gmhmmz_hmm_heuristic.modÚa)ÚtempfileZmkdtempr   r   r#   r-   r   Úname_from_fpathr   r   r    rN   r   Údebugr(   Úrmtree)Útool_dirpathr   r4   r   Útmp_dirpathÚnum_threadsÚtool_exec_fpathr   Z
fasta_namer   r]   Zsub_fasta_fpathr   r   Úokr   r   r   Úgmhmm_p_everyGC®   s<    

ÿû  ÿ
rt   c           
   
   C   sr   t j | d¡}t j | d¡}|d }t|dƒ:}	t|||||	|ƒrVt|ƒW  5 Q R £ S W 5 Q R £ d S W 5 Q R X d S )Nrh   z../MetaGeneMark_v1.modri   rU   )r   r   r#   r-   r    rN   )
ro   r   r4   r   rp   rq   rr   r   Zgmhmm_fpathr   r   r   r   Úgmhmm_p_metagenomicÎ   s    ru   c                 C   sè   t j | d¡}t j tjdd¡}t|dƒ}|t |¡7 }t j |¡sNt  	|¡ tj
dd||ddt|ƒd	|d
|gtjrzdgng  ||dt |¡ d}	|	dkr d S g }
dd„ t  |¡D ƒ}|D ]&}| d¡r¼|
 tt j ||¡ƒ¡ q¼|
S )Nzgmes_petap.plúgenemark-esÚlibrU   rf   z-Iz--ESz--coresz
--sequencerg   z--fungusr   r   r   c                 S   s    g | ]\}}}|D ]}|‘qqS r   r   )Ú.0r   ÚdirsÚfilesÚfnamer   r   r   Ú
<listcomp>ê   s       zgm_es.<locals>.<listcomp>Zgtf)r   r   r#   r   r$   r-   r   rl   ÚisdirÚmkdirr   ÚstrZ	is_fungusr   ÚwalkÚendswithÚextendrT   )ro   r   r4   r   rp   rq   rr   Zlibs_dirpathr   r   r]   Úfnamesr{   r   r   r   Úgm_esÚ   s2    

 ÿÿû
r„   c	                    s‚  t  |¡}	t  |¡}
t dt  | ¡ |	 ¡ tj ||
d ¡}||||| ||ƒ‰ t	|ƒ}ˆ sld }d }d }n
ˆ D ] }|j
dkoŒ|j||j k |_qpd}tj ||
d | d ¡}tˆ ||ƒ trätj ||
d | d ¡}tˆ |ƒ ‡ fdd	„|D ƒ}‡ fd
d	„|D ƒ}dd	„ ˆ D ƒ}tt|ƒƒ}tˆ ƒ}t dt  | ¡ d t|ƒ d t|ƒ d ¡ t dt  | ¡ d | ¡ ˆ |||fS )Nú  r*   r:   r!   rL   z
_genes.gffz_genes.fastac                    s"   g | ]‰ t ‡ fd d„ˆD ƒƒ‘qS )c                    s"   g | ]}|j r|j|j ˆ k‘qS r   ©Úis_fullr>   r=   ©rx   rM   ©Z	thresholdr   r   r|     s      ú,predict_genes.<locals>.<listcomp>.<listcomp>©Úsum©rx   rb   r‰   r   r|     s   ÿz!predict_genes.<locals>.<listcomp>c                    s"   g | ]‰ t ‡ fd d„ˆD ƒƒ‘qS )c                    s"   g | ]}|j s|j|j ˆ k‘qS r   r†   rˆ   r‰   r   r   r|     s      rŠ   r‹   r   rb   r‰   r   r|     s   ÿc                 S   s   g | ]}|j r|j n|j‘qS r   )rE   Únamerˆ   r   r   r   r|     s     z
  Genes = z	 unique, z totalz  Predicted genes (GFF): )r   Úlabel_from_fpathr,   r/   Úinfor   r   r   r#   r	   r=   r>   r<   r‡   ra   ÚOUTPUT_FASTArd   r[   Úsetr   )r   Zcontigs_fpathÚgene_lengthsr2   ro   rp   Úgmhmm_p_functionr^   rq   Zassembly_labelZcorr_assembly_labelr4   Zcontig_lengthsÚunique_countÚfull_cntÚpartial_cntrM   Ú	tool_nameZout_gff_fpathZout_fasta_fpathZgene_idsZtotal_countr   rb   r   Úpredict_genesñ   s<    



ÿ
ÿ0r™   c                    s|  t  ¡  trt  d¡ d S |r,d}d}t‰nˆr>d}d}t‰nd}d}t‰t  d| ¡ tj	 
tj|tj¡‰tj	 ˆ¡sŠt  d| ¡ nîtƒ sžt  d	¡ nÚtj	 ˆ¡s´t ˆ¡ tj	 
ˆd
¡‰tj	 ˆ¡sØt ˆ¡ tt| ƒtjƒ}tdtj| ƒ‰‡ ‡‡‡‡‡‡fdd„t| ƒD ƒ}tt||ƒ\}	}
}}tˆ| ƒs>d S tƒ }t| ƒD ]æ\}}t |¡}t |¡}|	| ||< |
| d k	r–| tj j!|
| ¡ || d k	rÐdd„ t"|| || ƒD ƒ}| tj j#|¡ |
| d krL|| d krLt  $dt %|¡ d | d |dkr(tj	 &|¡dk r(dnd ¡ qLtj'sjt( )ˆd ¡D ]}tj	 |¡rJt* +|¡ qJt  d¡ |S d S )Nz>GeneMark tool can't be started because of license limitations!ZMetaGeneMarkr!   Z	GeneMarkSzGeneMark-ESrv   zRunning %s...zA  Sorry, can't use %s on this platform, skipping gene prediction.zD  Can't copy the license key to ~/.gm_key, skipping gene prediction.Ztmpr:   c                    s&   g | ]\}}||ˆ ˆˆˆˆˆˆf	‘qS r   r   )rx   r   r   ©r“   r”   rq   r2   r^   rp   ro   r   r   r|   <  s   þ  ÿzdo.<locals>.<listcomp>c                 S   s   g | ]\}}d ||f ‘qS )z%s + %s partr   )rx   r–   r—   r   r   r   r|   L  s     r…   zFailed predicting genes in z. i€„ z`File may be too small for GeneMark-ES. Try to use GeneMarkS instead (remove --eukaryote option).r7   Ú*zDone.),r/   Zprint_timestampÚLICENSE_LIMITATIONS_MODEr1   ru   rt   r„   r0   r   r   r#   r   r$   r%   Úexistsr)   r}   r~   Úminr[   Zmax_threadsÚmaxrY   r   r™   r6   Údictr   Úgetr   r   Z	add_fieldZFieldsZPREDICTED_GENES_UNIQUEÚzipZPREDICTED_GENESÚerrorr   Úgetsizerm   ÚglobZiglobr(   rn   )r3   r“   r2   r^   Úmetar˜   Ztool_dirnameZn_jobsZparallel_run_argsZ
genes_listr•   Z
full_genesZpartial_genesZgenes_by_labelsr`   Z
fasta_pathZreportZlabelr]   Údirpathr   rš   r   Údo  s€    


þ

ÿÿÿÿÿý

r¨   )NN))Z
__future__r   r   r¥   r(   rk   Úcollectionsr   ÚImportErrorZ%quast_libs.site_packages.ordered_dictZ
quast_libsr   r   r   Zquast_libs.ca_utils.miscr   Zquast_libs.fastaparserr   r	   Zquast_libs.genes_parserr
   Zquast_libs.logr   Zquast_libs.qutilsr   ZLOGGER_DEFAULT_NAMEr/   rœ   r‘   r    r)   r6   rN   rT   ra   rd   rt   ru   r„   r™   r¨   r   r   r   r   Ú<module>   s:   
-	 
(