o
    Rŀgn2                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dZ
G d	d
 d
ZG dd deZG dd dZedkrMddlmZ e  dS dS )z2Bio.SearchIO parser for HMMER table output format.    )chain)SearchIndexer)Hit)HSP)HSPFragment)QueryResult)Hmmer3TabParserHmmer3TabIndexerHmmer3TabWriterc                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )r   z"Parser for the HMMER table format.c                 C   s   || _ | j  | _dS zInitialize the class.N)handlereadlinelineselfr    r   S/var/www/html/myenv/lib/python3.10/site-packages/Bio/SearchIO/HmmerIO/hmmer3_tab.py__init__   s   zHmmer3TabParser.__init__c                 c   sF    d}| j |r| j | _ | j |s	| j r!|  E dH  dS dS )z3Iterate over Hmmer3TabParser, yields query results.#N)r   
startswithr   r   _parse_qresult)r   header_markr   r   r   __iter__   s   zHmmer3TabParser.__iter__c                 C   s  dd | j  dD }t|dk rtdt| d|dd |d< i }|d |d< |d	 |d
< i }|d |d< |d |d
< t|d |d< t|d |d< t|d |d< t|d |d< t|d |d< t|d |d< t|d |d< t|d |d< t|d |d< t|d |d < t|d! |d"< |d |d#< i }t|d$ |d< t|d% |d< t|d& |d< i }d |d'< |d(< d)|d*< ||||d+S ),z3Return a dictionary of parsed row values (PRIVATE).c                 S      g | ]}|r|qS r   r   .0xr   r   r   
<listcomp>'       z.Hmmer3TabParser._parse_row.<locals>.<listcomp>    z#Less columns than expected, only %iN   id   	accessionr         evalue   bitscore   bias
   domain_exp_num   
region_num   cluster_num   overlap_num   env_num   domain_obs_num   domain_reported_num   domain_included_numdescription      	   
hit_strandquery_strandproteinmolecule_type)qresulthithspfrag)r   stripsplitlen
ValueErrorjoinfloatint)r   colsrD   rE   rF   rG   r   r   r   
_parse_row%   s<   zHmmer3TabParser._parse_rowc                 c   s   d}d}d}d}d}d}d\}}g }	d}
	 |dur|}|
}| j r2| j ds2|  }|d d	 }
n|}d}
||
kr=|}n|}|dur|d
 d	 }t||}|d  D ]
\}}t||| qTt|g}|d  D ]
\}}t||| qjt|g}|d
  D ]
\}}t||| q|	| ||ks||krt	|	|}|d  D ]
\}}t||| q|V  ||krdS g }	| j
 | _ q)z%Return QueryResult objects (PRIVATE).r   r%   r#   N)NNTr   rD   r"   rE   rG   rF   )r   r   rP   r   itemssetattrr   r   appendr   r   r   )r   	state_EOFstate_QRES_NEWstate_QRES_SAME
qres_state
file_stateprev_qidcurprevhit_listcur_qidprev_hidrG   attrvaluerF   rE   rD   r   r   r   r   L   sX   




zHmmer3TabParser._parse_qresultN)__name__
__module____qualname____doc__r   r   rP   r   r   r   r   r   r      s    
'r   c                   @   s(   e Zd ZdZeZdZdd Zdd ZdS )r	   z%Indexer class for HMMER table output.r!   c                 c   s    | j }|d | j}d}d}d}|}||r&| }| }||s	 | }|s/dS dd | |D }	|du rD|	| }n|	| }
|
|kr`|t| }|	 ||| fV  |
}|}| }|sr|	 ||| fV  dS q')zCIterate over the file handle; yields key, start offset, and length.r   N   #    Tc                 S   r   r   r   r   r   r   r   r      r   z-Hmmer3TabIndexer.__iter__.<locals>.<listcomp>)
_handleseek_query_id_idxr   tellr   rH   rI   rJ   decode)r   r   query_id_idxqresult_keyr   
split_markr   start_offset
end_offsetrO   curr_keyadj_endr   r   r   r      s<   



zHmmer3TabIndexer.__iter__c           
      C   s   | j }|| | j}d}d}d}	 | }|s	 |S dd | |D }|du r0|| }n|| }	|	|kr;	 |S ||7 }q)zJReturn the raw bytes string of a QueryResult object from the given offset.N    rf   Tc                 S   r   r   r   r   r   r   r   r      r   z,Hmmer3TabIndexer.get_raw.<locals>.<listcomp>)rg   rh   ri   r   rH   rI   )
r   offsetr   rl   rm   qresult_rawrn   r   rO   rq   r   r   r   get_raw   s(   


zHmmer3TabIndexer.get_rawN)	ra   rb   rc   rd   r   _parserri   r   rv   r   r   r   r   r	      s    (r	   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )r
   z$Writer for hmmer3-tab output format.c                 C   s
   || _ dS r   )r   r   r   r   r   r      s   
zHmmer3TabWriter.__init__c           	      C   s   | j }d\}}}}zt|}W n ty   ||   Y n<w || | t|g|D ],}|rZ|| | |d7 }|t|7 }|tdd |D 7 }|tdd |D 7 }q.||||fS )zsWrite to the handle.

        Returns a tuple of how many QueryResult, Hit, and HSP objects were written.

        )r   r   r   r   r%   c                 s   s    | ]}t |V  qd S N)rJ   r   rE   r   r   r   	<genexpr>   s    z-Hmmer3TabWriter.write_file.<locals>.<genexpr>c                 s   s    | ]}t |jV  qd S rx   )rJ   	fragmentsry   r   r   r   rz      s    )	r   nextStopIterationwrite_build_headerr   
_build_rowrJ   sum)	r   qresultsr   qresult_counterhit_counterhsp_counterfrag_counterfirst_qresultrD   r   r   r   
write_file   s"   zHmmer3TabWriter.write_fileNc                 C   s   |dur#d}t dt|d j}t dt|j}t dt|d j}nd\}}}}d|| | | d dd	d
df }|d|d d|d|d|ddddddddddddddddf 7 }|d|d d|d|d |dd!d"d#d!d"d#d$d$d$d$d$d$d$d$d%f 7 }|S )&z;Return the header string of a HMMER table output (PRIVATE).N   r   r,   )r   r   r,   r,   z#%*s %22s %22s %33s
r!    z--- full sequence ----z--- best 1 domain ----z!--- domain number estimation ----zP#%-*s %-*s %-*s %-*s %9s %6s %5s %9s %6s %5s %5s %3s %3s %3s %3s %3s %3s %3s %s
r%   z target namer$   z
query namez	  E-valuez scorez biasexpregcluz ovenvdomrepinczdescription of targetzL#%*s %*s %*s %*s %9s %6s %5s %9s %6s %5s %5s %3s %3s %3s %3s %3s %3s %3s %s
z-------------------z
----------z--------------------z	---------z------z-----z---z---------------------)maxrJ   r"   r$   )r   r   qnamewtnamewqaccwtaccwheaderr   r   r   r      s<   


	zHmmer3TabWriter._build_headerc                 C   s   d}t dt|j}t dt|d j}t dt|j}t dt|d j}|D ];}|d||j||j||j||j|j|j|j|jd j|jd j|jd j|j|j	|j
|j|j|j|j|j|jf 7 }q(|S )zGReturn a string or one row or more of the QueryResult object (PRIVATE).r   r   r   r,   z]%-*s %-*s %-*s %-*s %9.2g %6.1f %5.1f %9.2g %6.1f %5.1f %5.1f %3d %3d %3d %3d %3d %3d %3d %s
)r   rJ   r"   r$   r'   r)   r+   hspsr-   r/   r1   r3   r5   r7   r9   r;   r<   )r   rD   rowsr   r   r   r   rE   r   r   r   r      sF   


zHmmer3TabWriter._build_rowrx   )ra   rb   rc   rd   r   r   r   r   r   r   r   r   r
      s    
%r
   __main__)run_doctestN)rd   	itertoolsr   Bio.SearchIO._indexr   Bio.SearchIO._modelr   r   r   r   __all__r   r	   r
   ra   
Bio._utilsr   r   r   r   r   <module>   s   ~Hu
