
    Ri|T                        d Z ddlZddl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 ej                  d      Z ej                  d      Z ej                  d      Z ej                  d      Z ej                  d      Z ej                  d      Z ej                  d      ZdZdZdZdZdZdZdZdZdZdZdZ  G d de      Z! G d d e      Z"e#d!k(  rdd"l$m%Z%  e%        yy)#z:Bio.SearchIO parser for Infernal plain text output format.    N)SearchIndexer)HSP)HSPFragment)QueryResult)read_forward   )_BaseInfernalParser)InfernalTextParserInfernalTextIndexerz^# .*?(\w?cm\w+) :: .*$z# INFERNAL+ ([\w+\.]{2,}) .*$z^# (.+):\s+(.+)$z\d+z\Dz	[^A-Za-z]z(\*\[[ 0-9]+\]\*)+z# - - -z//zQuery:z(Internal CM pipeline statistics summary:z.Internal HMM-only pipeline statistics summary:zHit scores:zHit alignments:z7   [No hits detected that satisfy reporting thresholds]z ----   --------- ------z" ------ inclusion threshold ------z>> c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)r
   z$Parser for the Infernal text output.c                 p    || _         t        | j                         | _        | j                         | _        y)Initialize the class.N)handler   line_parse_header_meta)selfr   s     ]/home/agent/.friday_env/lib/python3.12/site-packages/Bio/SearchIO/InfernalIO/infernal_text.py__init__zInfernalTextParser.__init__>   s)     -	'')
    c              #   @   K   | j                         E d{    y7 w)zIterate over query results.N)_parse_qresult)r   s    r   __iter__zInfernalTextParser.__iter__D   s     &&(((s   c                 x    	 | j                   r || j                         ryt        | j                        | _         :)zERead the file handle until the given function returns True (PRIVATE).N)r   r   r   )r   	bool_funcs     r   _read_untilzInfernalTextParser._read_untilH   s/    99	$)) 4$T[[1DI r   c                    i }d|d<   d}	 | j                   j                  d      s	 |S | j                   j                  t              r|sd}n	 |S |sut        j                  t
        | j                         }|r|j                  d      |d<   t        j                  t        | j                         }|r|j                  d      |d<   n|r}t        j                  t        | j                         }d	|j                  d      v r#|j                  d
      j                         |d	<   n#|j                  d
      ||j                  d      <   t        | j                        | _         W)z Parse Infernal header (PRIVATE).yesshow alignments in outputFT#r   programversiontarget   )r   
startswith_DIV_HEADER_OPTresearch_RE_PROGRAMgroup_RE_VERSION_RE_OPTstripr   r   )r   metahas_optsregxs       r   r   z InfernalTextParser._parse_headerO   s*    -2() 99'',> 9 %%o6  $H ( ' yydii8&*jjmDOyydii8&*jjmDOyy$))4tzz!},%)ZZ]%8%8%:DN*.**Q-DA'$T[[1DIA r   c              #     K   | j                  d        | j                  r| j                  j                  t              r| j                  j	                         j                         d   }t        t        j                  t        d| j                  j	                         j                         d               }||| j                  j                  d      | j                  j                  d      | j                  j                  d      d}nt        | j                        | _        d	}| j                  j                  t              st        | j                        | _        | j                  j                  d
      rA| j                  j	                         j                  dd      d   }|j	                         d<   n[| j                  j                  d      r@| j                  j	                         j                  dd      d   j	                         }|d<   | j                  j                  t              sg }| j                  r| j                  j                  t              s| j!                  |      }| j                  j                  t"              s| j                  j                  t$              rq| j                  re| j                  j                  t              sFt        | j                        | _        | j                  r | j                  j                  t              sF| j                  r | j                  j                  t              st'        |      }j)                         D ]  \  }}	t+        |||	        | t        | j                        | _        d| j                  v ry| j                  ryyw)z'Parse a Infernal query block (PRIVATE).c                 ,    | j                  t              S N)r%   _DIV_QUERY_STARTr   s    r   <lambda>z3InfernalTextParser._parse_qresult.<locals>.<lambda>~       doo6F&G r   r    r!   r"   r#   )idseq_lenr!   r"   r#   z<unknown description>z
Accession: 	accessionzDescription:description)r:   hitsz[ok]N)r   r   r%   r4   r-   splitintr'   sub_RE_NOT_NUMERICr   getr   r   _DIV_HIT_SCORE_TABLE_DIV_QUERY_END
_parse_hit_DIV_HITS_END_CM_DIV_HITS_END_HMMr   itemssetattr)
r   qidqlenqresult_attrsqdescacchit_listqresultattrvalues
             r   r   z!InfernalTextParser._parse_qresult|   s    GHiiyy##$45iioo'--/2266/2tyy7H7N7N7PQS7TUV ##zz~~i8#zz~~i8"jjnnX6! )5	 ,Eii**+?@(5	99''5))//+11#q9!<C14M+.YY)).9 IIOO-33C;A>DDFE38M-0 ii**+?@ H))DII$8$8$H??3699''(89TYY=Q=Q%> ))DII,@,@,P$0$=	 ))DII,@,@,P ))DII$8$8$H "Sx8G,224 .eu-.M$T[[1DI "e iis    H6O9C.O(+OA+OOc                    d}d}d}d}i }| j                   d   dk(  rt        }nt        }	 | j                  st	        d      | j                  j                  t              r^	 t        | j                        | _        | j                  j                  t              s| j                  j                  t              rd}g S ]| j                  j                  |      r\| j                   d   dk(  r5|rJ | j                  d        t        | j                        | _        dx}}n| j                  ||       d}n| j                  j                  t              s| j                  j                  t              rd}d}nL|r+| j                  j                         r| j                  }ndx}}| j                  j                         | _        |r*|(|j                  t              s| j!                  |||       |r| j#                  |      S )z Parse an Infernal hit (PRIVATE).FNr   noTzUnexpected end of filec                 ,    | j                  t              S r3   r%   _DIV_TABLE_STARTr5   s    r   r6   z/InfernalTextParser._parse_hit.<locals>.<lambda>   s    $//BR2S r   )r   rE   _DIV_ALIGNMENT_STARTr   
ValueErrorr%   _DIV_NO_HITr   r   rH   rI   r   _parse_hit_from_alignmentr-   readline_DIV_INC_THRESHOLD_parse_scores_table_row_hit_to_list)	r   rL   rO   hit_endin_score_tableparsing_hits	prev_linehit_dictdiv_hit_starts	            r   rG   zInfernalTextParser._parse_hit   s    	
  ::12d:0M0M99 !9::%%k2 ,T[[ 9DIyy++,<=AUAU)B #'!	  %%m4::9:dB---$$%ST ,T[[ 9DI488L>223A#'L%%&67499;O;O!< $ "yy($(II	8==~ !KK002	 )"7 ++,>?00CJ ((22g r   c                    | j                   t        t              d j                  dd      \  }}|j	                         }| j                  d        t        | j                        | _         | j                   j	                         j                         D cg c]  }|s|	 }}t        |      dk(  sJ |||d}t        |d         t        |d         t        |d	         |d
   |d   t        |d         t        |d         |d   |d   |d   dk(  rdndd
}t        |d         }	t        |d         }
|d   dk(  rt        |d         nt        |d         }|d   dk(  rt        |d         nt        |d         }|d   dk(  rdnd}t        | j                        | _         | j                  |d   |d   |d   |	|
|||      }t        |      }|j                         D ]  \  }}t        |||        | j                  |||       yc c}w )z*Parse an Infernal hit alignment (PRIVATE).Nz  r   c                 ,    | j                  t              S r3   rX   r5   s    r   r6   z>InfernalTextParser._parse_hit_from_alignment.<locals>.<lambda>  r7   r      r:   query_idr>   r$                           !TF)
evaluebitscorebiasmodel	truncatedgcavg_accquery_endtypehit_endtypeis_included         +	   
   r   r9   r:   rl   ry   )r   lenrZ   r@   r-   r   r   r   floatrA   _parse_aln_blockr   rJ   rK   _add_hit_to_dict)r   rL   rf   hidhdescxrow	hit_attrs	hsp_attrsquery_start	query_end	hit_startrb   
hit_strand	frag_listhsprS   rT   s                     r   r]   z,InfernalTextParser._parse_hit_from_alignment   s   YYs#78:;AA$J
U 	GH -	 ))//+1139Qqq993x2~~ CF	CFmc!f#a&MVRB.SW~ Vr7#&q6S=4e
	 #a&kAK	#&r7c>CAKs3r7|	"%b'S.#c"g,c#a&kb'S.Qb
 !-	 ))dOj!g	
	 )n$??, 	&KD%Cu%	& 	ih7U :s   HHc           	      Z   |j                         j                  d      D cg c]  }|s|	 }}t        |      dkD  rdj                  |dd       |d<   n/t        |      dk  r!|j	                  d       t        |      dk(  sJ |d   ||d   d}t        |d         t        |d         t        |d	         |d
   |d   t        |d         |d   dk(  rdndd}|d   dk(  rt        |d         nt        |d         |d   dk(  rt        |d         nt        |d         |d   dk(  rdndd}t        |d   |      }|j                         D ]  \  }	}
t        ||	|
        t        |g      }|j                         D ]  \  }	}
t        ||	|
        | j                  |||       yc c}w )zFParse an Infernal hit scores table (when used with --noali) (PRIVATE).r<   rt   Nr8   ro   rk   r$   rm   rn   r   r   r   r   ru   TF)rv   rw   rx   ry   rz   r{   r   rs   r   r   r   r   r9   )r   rb   r   )r-   r@   r   joinappendr   rA   r   rJ   rK   r   r   )r   r   rL   rf   r   r   r   hsp_frag_attrshsp_fragrS   rT   r   s               r   r`   z*InfernalTextParser._parse_scores_table_row2  s    ))+++C06QAq66s8b=hhs23x(CGX]JJrNs8r>!> q6s3r7K	CFmc!f#a&MVRB.#&q6S=4e
	 ),A#SV3s1v;&)!fms3q6{SV"1v}!"
 s1vs+)//1 	+KD%HdE*	+ 8*o$??, 	&KD%Cu%	& 	ih7K 7s
   F(F(c	                    g }	d}
d}|dk(  rddddd}ndddd}	 | j                   j                  t              s?| j                   j                  t              s | j                   j                  t              rdg}|t        j                  t        |
      D cg c]$  }|j                  d      |j                  d      f& c}z  }|dk(  r|n|}|}g }t        t        |            D ]  }||   d   }|dz   t        |      k  r||dz      d   nd}|dk(  rt        j                  nt        j                  }||| }| j                  ||   |      } |||      } ||t        t        j                  t         d|                  }|dk(  r
|dk(  r|dz  }|d	k(  r
|dk(  r|dz  }|}|
|| j#                  d
d      }| j                  ||   |
      }||z   }|t        t        j                  t         d|            z   }|dk(  r|dz  }|}|j%                         D ci c]  \  }}||||  } }}t'        ||      }!||!_        ||!_        ||!_        ||!_        |dk(  r|n||!_        |dk(  r|n||!_        ||!_        | |!_        |	j9                  |!        |	S |dk(  rdnd}"|dk(  rdnd}#dg|"z  }$t        |"      D ]+  }| j                   |$|<   t;        | j<                        | _         - t        |$d|#z      j?                         jA                         d         }%t        |$d|#z            |%z
  dz
  }&t        |$d|#z            dz
  }'|
|$d|#z      |&|' z  }
||$d|#z      |&|' z  }|dk(  r|dxx   |$d   |&|' z  cc<   |dxx   |$d|#z      |&|' z  cc<   |dxx   |$d|#z      |&|' z  cc<   |dxx   |$d|#z      |&|' z  cc<   c c}w c c}}w )z/Parse a Infernal HSP alignment block (PRIVATE).r8   cm)NCCS
similarityPP)r   r   r   )r   r   r   r   Nr9   .-r   ro   rn   rm   r   r   r   r$   r   )!r   r%   rZ   rH   rI   r'   finditer_RE_SPLIT_ALNstartendranger   operatoraddrB   _local_aln_gap_size_RE_LETTERSreplacerJ   r   queryhitr   r   r   rb   r   aln_annotationr   r   r   r-   r@   )(r   r   rL   ry   r   r   r   rb   r   r   	model_seqhit_seqannotlocal_aln_idxmprev_hit_startprev_model_starthspsilocal_start	local_endopcur_hit_seqcur_hit_gap_sizecur_hit_startcur_hit_endcur_model_seqcur_model_gap_sizecur_model_startcur_model_endkv	cur_annotfrag
block_sizeoffsetlinesblklenblkstartblkends(                                           r   r   z#InfernalTextParser._parse_aln_block]  s`    		D=RrDERr:E 		$$%9:99''(8999''(9: ! [[	B" WWQZq*" 
 /9Ao7#. s=12 0+A"/"21"5K34q53};M3Ma!e,Q/SW 
 *4qhllB")+i"@K'+'?'?%a('($ %'~7G$HM"$%s266+r;+O'P#K "Q16#q(!R'AF#q(%0N$-k)$D$L$LSRU$VM)-)A)A%a()*& '79K&KO$3c{B>7 %M Av%*'4$IN WAAk)$<!< WI W 'sC0D!.DJ*DH'6D$%2DN6@Ao];DN2</;}DL&0DO*3D'$$T*a0+d !  $tmJ4-QQFFZ'E:& 699a(5	6
 q6z*00288:1=>F5V,-6:Hq6z*+a/Fq6z*8F;;IuQZ(&99G}duQx88$K5V,Xf==K,5V#4Xf#EE$K5V,Xf==KG $"X !Xs   )N9N>c           	          d}|d   dkD  rJt        t        j                  t        ||d   |d          D cg c]  }t	        |       c}      }|dkD  sJ |S c c}w )z>Calculate the gap size between the local alignments (PRIVATE).r   r   )sumr'   findall_RE_NUMERICrA   )r   cur_aln_idxseqgap_lenns        r   r   z&InfernalTextParser._local_aln_gap_size  sn    q>A  ZZ#SQ+a.%I FG Q;;s   AN)__name__
__module____qualname____doc__r   r   r   r   r   rG   r]   r`   r   r    r   r   r
   r
   ;   s?    .*)2+Z6pF3P48l)8Vn>`r   r
   c                   2     e Zd ZdZeZ fdZd Zd Z xZ	S )r   z-Indexer class for Infernal plain text output.c                 2    t        |   |i | d| _        y)r   r   N)superr   	_preamble)r   argskwargs	__class__s      r   r   zInfernalTextIndexer.__init__  s    $)&)r   c              #     K   | j                   }|j                  d       |j                         }	 t        |      }|j                         }|j	                  t
        j                               r0|j                         j                         d   }|t        |      z
  }n>|j	                  t        j                               rj                         |df |}n|syw)zHIterate over InfernalTextIndexer; yields query results' key, offsets, 0.r   r   N)_handleseektellr   r%   r4   encoder-   r@   r   rF   decode)r   r   start_offsetr   
end_offsetqresult_keys         r   r   zInfernalTextIndexer.__iter__  s     A{{}'DJ/6689"jjl00215  *CI5!6!6!89!((*L!;;) s   CCc                    | j                   }d}| j                  s\|j                  d       	 |j                         }|j	                  t
        j                               rn| xj                  |z  c_        J|| j                  z  }|j                  |       	 |j                         }||z  }|j	                  t        j                               s|s	 |S >)z6Return the raw record from the file as a bytes string.r   r   )r   r   r   r^   r%   r4   r   rF   )r   r   r   qresult_rawr   s        r   get_rawzInfernalTextIndexer.get_raw  s     ~~KKN(??#3#:#:#<=$&	  	t~~% 	F??$D4K ~4467t r   )
r   r   r   r   r
   _parserr   r   r   __classcell__)r   s   @r   r   r     s    7 G
*r   r   __main__)run_doctest)&r   r   r'   Bio.SearchIO._indexr   Bio.SearchIO._modelr   r   r   Bio.SearchIO._utilsr   _baser	   __all__compiler)   r+   r,   r   rC   r   r   r&   rF   r4   rH   rI   rE   _DIV_HIT_ALIGNMENTr\   rY   r_   rZ   r
   r   r   
Bio._utilsr   r   r   r   <module>r      s   A  	 - # + + , &
7 bjj34bjj9:
"**(
)bjj "**U#bjj&

01  = D $ & G- 9  _, _D:- :| z&M r   