
    Ric:                        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d
dddZg dZg dZg dZdefdefdefdefdZdefdefdefdefdefdZdefdefdefdefdefdefdefd d! fd"efd#d$ fd%d& fd'd( fd)d* fd+d, fd-d. fd/Zd0efd1efd2efd3efd4efd5Zd>d6Z G d7 d8e      Z G d9 d:e      Zed;k(  rdd<lmZ  e        y=y=)?z7Bio.SearchIO parser for Infernal tabular output format.    )SearchIndexer)HSP)HSPFragment)QueryResult   )_BaseInfernalParser)_open_for_random_access)InfernalTabParserInfernalTabIndexer)target_name
target_acc
query_name	query_accmdlmdl_frommdl_toseq_fromseq_tostrandtruncpassgcbiasscoreevalueincdescription)idxr   r   r   r   clanr   r   r   r   r   r   r   r   r   r   r   r   r   olpanyidxafrct1afrct2winidxwfrct1wfrct2mdl_lenseq_lenr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r(   r   )r         )target name	accession
query namer,   r   mdl frommdl toseq fromseq tor   r   r   r   r   r   E-valuer   description of target)r   r+   r,   r-   r,   z	clan namer   r.   r/   r0   r1   r   r   r   r   r   r   r2   r   r    r!   r"   r#   r$   r%   r&   mdl lenseq lenr3   )r+   r,   r-   r,   r   r.   r/   r0   r1   r   r   r   r   r   r   r2   r   r4   r5   r3   idr,   r(   r   )r   r   r(   r   query_idr   )r   r   r   r   r'   bitscorer   r   r   model	truncatedpipeline_passis_includedc                     | dk(  rdS dS )N!TF xs    \/home/agent/.friday_env/lib/python3.12/site-packages/Bio/SearchIO/InfernalIO/infernal_tab.py<lambda>rC      s    Q#XT 5     r    r!   c                 &    | dk(  rd S t        |       S N-intr@   s    rB   rC   rC      s    184 Q rD   r"   c                 &    | dk(  rd S t        |       S rF   floatr@   s    rB   rC   rC          184 q rD   r#   c                 &    | dk(  rd S t        |       S rF   rK   r@   s    rB   rC   rC      rM   rD   r$   c                 0    | dk(  s| dk(  rd S t        |       S NrG   "rH   r@   s    rB   rC   rC      s    AHS4 s1v rD   r%   c                 0    | dk(  s| dk(  rd S t        |       S rP   rK   r@   s    rB   rC   rC          AHS4 uQx rD   r&   c                 0    | dk(  s| dk(  rd S t        |       S rP   rK   r@   s    rB   rC   rC      rS   rD   )r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   query_start	query_end	hit_starthit_end
hit_strand)r   r   r   r   r   c                 t   d } || |      } || |      }|dk(  s|dk(  rt        d      t        |      D cg c]  \  }}|dk(  s| c}}t        |      gz   }d}g }	|D ]&  }|	j                  ||| j	                                |}( |	t
        k(  ry|	t        k(  ry|	t        k(  ryt        d      c c}}w )	z<Infer tabular format from the tabular file header. (PRIVATE)c                 f    | j                         j                         }|r|j                         S |S )z5Process a line from the handle, decoding byte stream.)readlinestripdecode)handleis_bytelines      rB   process_linez+_infer_tabular_format.<locals>.process_line   s*     &&( 't{{}1T1rD    z?Unexpected empty line in the header of Infernal tabular output. r   r)   r*   zCannot determine the tabular format from the header.             The tabular file is likely incorrect or its format is unsupported.             Tabular format 1, 2 and 3 are currently supported).)
ValueError	enumeratelenappendr]   _TABULAR_FMT_1_HEADER_FIELDS_TABULAR_FMT_2_HEADER_FIELDS_TABULAR_FMT_3_HEADER_FIELDS)
r_   r`   rb   header_labelheader_delimr   charindicesprev_idxfieldss
             rB   _infer_tabular_formatrr      s    2
  0L0Lr\R/M
 	
 %.l$;KysDts{sKLO G HF l8C06689
 --	/	/	/	/A
 	
# Ls   B4B4c                   0    e Zd ZdZddZd Zd Zd Zd Zy)	r
   z'Parser for the Infernal tabular format.Nc                 p    || _         t        |t              r|dv sJ || _        yt	        |      | _        y)Initialize the class.>   r   r)   r*   )r_   N)r_   
isinstancerI   fmtrr   )selfr_   _fmts      rB   __init__zInfernalTabParser.__init__	  s4    dC 9$$$DH,F;DHrD   c              #   D  K   | j                   j                         | _        | j                  j                  d      r;| j                   j                         | _        | j                  j                  d      r;| j                  r| j	                         E d{    yy7 w)z5Iterate over InfernalTabParser, yields query results.#N)r_   r\   ra   
startswith_parse_qresult)rx   s    rB   __iter__zInfernalTabParser.__iter__  sy      KK((*	ii""3',,.DI ii""3' 99**,,, ,s   A5B 8B BB c           	         | j                   j                         j                  d      D cg c]  }|s|	 }}t        |      t        t        | j
                           k  r$t        d| j
                   dt        |             dj                  |t        t        | j
                           dz
  d       |t        t        | j
                           dz
  <   i i i i f\  }}}}t        t        | j
                     |dt        t        | j
                                  D ]M  \  }}|t        f|t        f|t        f|t        ffD ]'  \  }	}
||
v s|
|   \  }}|t        ur ||      }||	|<   ) O | j                  |       ||||dS c c}w )z3Return a dictionary of parsed row values (PRIVATE).rd   z&Less columns than expected for format z, only r   N)qresulthithspfrag)ra   r]   splitrg   _TAB_FORMATrw   re   joinzip_COLUMN_QRESULT_COLUMN_HIT_COLUMN_HSP_COLUMN_FRAGstr_adjust_coords)rx   rA   colsr   r   r   r   snamevalueparsed_dictmapping	attr_namecasters                rB   
_parse_rowzInfernalTabParser._parse_row  s   99??,2237=a1==t9s;txx0118
'#d)U  03xx[*+a/120
STXX&'!+, #%b"b.c4!4(D#k$((.C*D#E
 	3LE5 /*k"k"|$	) 3$W G#(/%IvS( &u-2K	*3	3& 	D!"3sDIIA >s
   FFc                 ^    |d   }|J |dk(  r|d   }|d   }||d<   ||d<   d|d<   yd|d<   y)z?Adjust start and end coordinates according to strand (PRIVATE).rY   NrG   rW   rX   r   r?   )rx   r   r   rW   rX   s        rB   r   z InfernalTabParser._adjust_coords@  sY    l#!!!S=[)I9oG 'D'DO!#D!"DrD   c              #     K   d}d}d}d}d}d}d}d}d}	d\  }
}i }	 |
|
}|}|}	| j                   r<| j                   j                  d      s!| j                         }
|
d   d   }|
d	   d   }n|}d\  }}||k7  r|}n|}|t        |	|      }|d
   j	                         D ]  \  }}t        |||        t        |g      }|d   j	                         D ]  \  }}t        |||        | j                  |d	   ||       ||k(  s||k(  rOt        | j                  |      |      }|d   j	                         D ]  \  }}t        |||        | ||k(  ryi }| j                  j                         | _         [w)z$Yield QueryResult objects (PRIVATE).r   r   r*   N)NNr|   r   r6   r   r   r   )ra   r}   r   r   itemssetattrr   _add_hit_to_dictr   _hit_to_listr_   r\   )rx   	state_EOFstate_QRES_NEWstate_QRES_SAME
qres_state
file_statecur_qidcur_hidprev_qidprev_hidcurprevhit_dictr   attrr   r   r   s                     rB   r~   z InfernalTabParser._parse_qresultN  s     	

	T""yy!5!5c!:oo'i..e*T*&
#-  7"+
,
  #8X6#'<#5#5#7 /KD%D$./4&k#';#4#4#6 .KD%Cu-.%%d5k3A /:3J)$*;*;H*ExPG'+I'<'<'> 6eu56!M!Y.!H,,.DI_ s   E6E8)N)	__name__
__module____qualname____doc__rz   r   r   r   r~   r?   rD   rB   r
   r
     s!    1<-"JH#A/rD   r
   c                   &    e Zd ZdZeZd Zd Zd Zy)r   z*Indexer class for Infernal tabular output.c                     t        |      5 }t        |d      }ddd       dk(  rdnd| _        t        j                  | ||       y# 1 sw Y   0xY w)ru   T)r`   Nr)   r*   )ry   )r	   rr   _query_id_idxr   rz   )rx   filenamer_   rw   s       rB   rz   zInfernalTabIndexer.__init__  sQ     %X. 	>&'=C	>"%(QtXC8		> 	>s   A		Ac              #     K   | j                   }|j                  d       d}|j                         }d}|j                  d      r2|j                         }|j	                         }|j                  d      r2	 |j                         }|sy|j                         j                  d      D cg c]  }|s|	 }}||| j                     }n>|| j                     }||k7  r*|t        |      z
  }	|j                         ||	|z
  f |}|	}|j	                         }|r|j                  d      r|j                         |||z
  f yc c}w w)zCIterate over the file handle; yields key, start offset, and length.r   N   #    )
_handleseektellr}   r\   r]   r   r   rg   r^   )
rx   r_   qresult_keystart_offsetra   
end_offsetrA   r   curr_keyadj_ends
             rB   r   zInfernalTabIndexer.__iter__  sE    A{{}  ood#!;;=L??$D ood#
   J#zz|11$7=!1A=D=""4#5#56 2 23{*(3t94G&--/w?UVV"*K#*L??$D4??40"))+\:;TUU/  >s   A4E75E,E4E8BEc                 X   | j                   }d}d}|j                  |       	 |j                         }|r|j                  d      r	 |S |j	                         j                  d      D cg c]  }|s|	 }}||| j                     }n|| j                     }||k7  r	 |S ||z  }c c}w )zJReturn the raw bytes string of a QueryResult object from the given offset.NrD   r   r   )r   r   r\   r}   r]   r   r   )	rx   offsetr_   r   qresult_rawra   rA   r   r   s	            rB   get_rawzInfernalTabIndexer.get_raw  s     	F??$D4??40   $zz|11$7=!1A=D=""4#5#56 2 23{*  4K  >s   *B'2B'N)	r   r   r   r   r
   _parserrz   r   r   r?   rD   rB   r   r     s    4G9'RrD   r   __main__)run_doctestN)F)r   Bio.SearchIO._indexr   Bio.SearchIO._modelr   r   r   _baser   Bio.Filer	   __all__r   ri   rj   rk   r   rI   r   r   rL   r   r   rr   r
   r   r   
Bio._utilsr   r?   rD   rB   <module>r      s   > - # + + & ,
5(>iJX  (  >  2 +s#3SM	 #;$s#!3'3 % UO-S>3c"@A3<?@ABABMNOPOP$ $C c"#S!0
fI/+ I/XM Mb z&M rD   