
    Ri2                         d 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 G d d      Z G d d      Z G d de
      Zedk(  rddlmZ  e        yy)z,Bio.SearchIO parser for HMMER 2 text output.    N)Hit)HSP)HSPFragment)QueryResult)read_forward   )_BaseHmmerTextIndexer)Hmmer2TextParserHmmer2TextIndexerz(\S+):\s+domain (\d+) of (\d+)c                       e Zd Zd Zy)_HitPlaceholderc                     t        |      }| j                  |_        | j                  |_        | j                  |_        | j                  r| j                  |_        | j
                  |_        |S )N)r   id_evaluebitscoredescriptiondomain_obs_num)selfhsp_listhits      X/home/agent/.friday_env/lib/python3.12/site-packages/Bio/SearchIO/HmmerIO/hmmer2_text.py	createHitz_HitPlaceholder.createHit   sU    (m(([[
}}"..CO!00
    N)__name__
__module____qualname__r    r   r   r   r      s    r   r   c                   N    e Zd ZdZd Zd ZddZd Zd Zd Z	d Z
d	 Zd
 Zd Zy)r
   z'Iterator for the HMMER 2.0 text output.c                 J    || _         g | _        | j                         | _        y)zInitialize the class.N)handlebufparse_preamble_meta)r   r    s     r   __init__zHmmer2TextParser.__init__'   s     ((*
r   c              #      K   | j                         D ]f  }| j                  j                  d      |_        | j                  j                  d      |_        | j                  j                  d      |_        | h yw)z4Iterate over Hmmer2TextParser, yields query results.programtargetversionN)parse_qresultr#   getr&   r'   r(   )r   qresults     r   __iter__zHmmer2TextParser.__iter__-   s_     ))+ 	G"jjnnY7GO!ZZ^^H5GN"jjnnY7GOM		s   A;A=c                    t        | j                        dkD  r| j                  j                         S | j                  j	                         | _        | j
                  rd|rb| j
                  j                         sH| j                  j	                         | _        | j
                  r|r| j
                  j                         sH| j
                  r!|r| j
                  j                         | _        | j
                  S )z<Return the next non-empty line, trailing whitespace removed.r   )lenr!   popr    readlinelinestriprstrip)r   r3   s     r   	read_nextzHmmer2TextParser.read_next5   s    txx=188<<>!KK((*	iiF499??+<,,.DI iiF499??+<99 II,,.	yyr   c                 :    | j                   j                  |       y)z-Un-read a line that should not be parsed yet.N)r!   append)r   r1   s     r   	push_backzHmmer2TextParser.push_backA   s    r   c                     | j                   j                  dd      \  }}|j                         |j                         fS )z(Parse key-value pair separated by colon.:r   )r1   splitr2   )r   keyvalues      r   parse_key_valuez Hmmer2TextParser.parse_key_valueE   s1    YY__S!,
Uyy{EKKM))r   c                    i }d}| j                         rI|dk(  r| j                  j                  d      r0| j                  j                  d      d   j	                         |d<   nx| j                  j                  d      r}| j                  j                  d      r!| j                  j                         d   |d	<   n | j                  j                  d      d
k(  rd}|dk(  sJ d|v sJ | j                  j                  d      dk(  r	 |S | j                         \  }}|d   dk(  r|dk(  r||d<   /|d   dk(  r|dk(  r||d<   C|||<   | j                         rI|S )zParse HMMER2 preamble.GENERIChmm-r   r&   zHMMER isHMMERr   r(   $   OPTIONS    	hmmsearchzSequence databaser'   hmmpfamzHMM file)r4   r1   
startswithr:   r2   countr=   )r   metastater;   r<   s        r   r"   zHmmer2TextParser.parse_preambleJ   s]   nn	!99''.&*iiooc&:1&=&C&C&EDOYY))*5YY))'2&*iioo&7&:DOYY__S)R/%EI%%%$$$yys#r)  --/JCI+---%*DNiI-*$%*DNDI7 nn: r   c              #     K   | j                         r| j                  j                  d      sy| j                         \  }}t	        |      | _        d}| j                         r| j                  j                  d      s| j                  j                  d      r"| j                         d   | j
                  _        | j                  j                  d      r| j                         d   }| j                         r| j                  j                  d      s| j                         }t        |      dkD  r!| j                  |       | j                          | j                  j                  d      s9| j                          | j                  sn| j                  j                  d      s9| j                  j                  | j                         ||| j
                  _        | j
                   | j                         ryyw)	zParse a HMMER2 query block.QueryN)idScores	Accessionr   Descriptionr   )r4   r1   rH   r=   r   r+   	accession
parse_hitsr.   
parse_hspsparse_hsp_alignmentsr!   r6   r   )r   _r   r   hit_placeholderss        r   r)   zHmmer2TextParser.parse_qresultm   s    nn99''0))+FAs&#.DLK.."499+?+?+I99''4-1-A-A-CA-FDLL*99''6"&"6"6"8";K	 .."499+?+?+I  $0#$q( 01))+ii**73 yy ii**73 HHOODII&&+6(,,7 nns   DHBH+AHHc                    g }| j                         rv| j                  j                  d      r	 |S | j                  j                  d      dkD  r	 |S | j                  j                  d      s6| j                  j                  d      s| j                  j                  d      r| j                  j	                         }|j                  d      }t        |j                               }t        |j                               }t        |j                               }dj                  |      j                         }t               }||_        ||_        ||_        ||_        ||_        |j!                  |       | j                         rv|S )	z7Parse a HMMER2 hit block, beginning with the hit table.Parsedzno hitsSequenceModelz	-------- r    )r4   r1   rH   findr:   r/   intfloatjoinr2   r   r   r   r   r   r   r6   )	r   rW   fieldsr   r   r   r   r   r   s	            r   rS   zHmmer2TextParser.parse_hits   s>   nnyy##H-4  3 yy~~i(2-0  + 		$$Z099''099''4YY__&F**Q-C .N6::<(FVZZ\*H((6*002K!#CCGCJ#CL)CO!/C##C(5 nn8  r   c           
         i }| j                         r| j                  j                  d      s*| j                  j                  d      s| j                  dk(  rnV| j                  j                  d      s6| j                  j                  d      s| j                  j                  d      r| j                  j                         \
  }}}}}}}	}
}}t	        || j
                  j                        }d|_        | j                  d   d	k(  rGt        |      d
z
  |_
        t        |	      |_        t        |      d
z
  |_        t        |      |_        nX| j                  d   dk(  rFt        |      d
z
  |_        t        |	      |_        t        |      d
z
  |_
        t        |      |_        t        |g      }t        |      |_        t        |      |_        t        |j                  d      d         |_        | j                  d   d	k(  r|
|_        ||_        n | j                  d   dk(  r|
|_        ||_        ||vr;|D cg c]  }|j*                  |k(  s| c}d   }|j-                  |g      }|||<   n'||   }|j.                  |_        |j3                  |       | j                         r|D ]*  }| j
                  j3                  ||j*                            , yc c}w )z7Parse a HMMER2 hsp block, beginning with the hsp table.
Alignments	Histogram//r\   r[   z--------proteinr&   rG   r   rF   /r   N)r4   r1   rH   r:   r   r+   rN   molecule_typer#   r_   	hit_starthit_endquery_start	query_endr   r`   r   r   domain_indexhit_endtypequery_endtyper   r   r   hit_descriptionr6   )r   rW   unordered_hitsr   domainseq_fseq_t	seq_complhmm_fhmm_t	hmm_complscorer   fraghsppplaceholderr   s                     r   rT   zHmmer2TextParser.parse_hsps   s|    nn		$$\299''499$		$$W-99''
399''
3 		! sDLLOO4D!*Dzz)$	1!$Ua"5z#&u:> !$UI&+5#&u:> !$U!$Ua"5ztf+CvCJ <CL"6<<#4Q#78Czz)$	1"+$-!I&+5$-!"+.(*:KQaeeslqKAN!++SE2&)s#$S)&)oo#

3u nn| " 	7ALLquu 56	7 Ls   K!K!c                 ^   | j                   j                  d      sy| j                         r | j                   dk(  s| j                   j                  d      ryt        j                  t
        | j                         }|c|j                  d      }t        |j                  d            }t        |j                  d            }| j                  |   }|j                  |k7  r||dz
     d   }d	}d	}d	}	d	}
d}| j                         r| j                   j                  d
      rp| j                   dd dk(  r2|
| j                   dd j                         z  }
| j                         sn,| j                   dd dk(  r| j                   dd }d}n| j                   dd }d}||z  }t        |      }| j                  d      sn|| j                   d|z   d|z   |z    z  }t        |      t        |      z
  }|d
|z  z  }| j                         sn| j                   dd j                         }t        |      dk(  r1|	| j                   dd j                         d   j                         z  }	| j                         r| j                   j                  d
      rp| j                  | j                          |j                  d      r
|dd }|dd }||j                  d<   |
r|
|j                  d<   | j                   d   dk(  r||_        |	|_        n|	|_        ||_        | j                         ryy)z#Parse a HMMER2 HSP alignment block.rd   Nrf   re   r         r    r]         CS      z*->F)r3   z<-*
similarityr&   rG   )r1   rH   r4   research_HSP_ALIGN_LINEgroupr_   r+   r   r2   r.   r:   r7   endswithaln_annotationr#   r   query)r   matchr   idxnumr   r{   hmmseq	consensusotherseqstructureseqpadseqline_lenextra_paddingpartss                   r   rU   z%Hmmer2TextParser.parse_hsp_alignments   s   yy##L1nnyyD DII$8$8$EIIotyy9E}++a.Cekk!n%Cekk!n%C,,s#C!!S(sQw<?DFIHLC.."tyy';';C'@99R#t+ DIIbcN$8$8$::L>>+ 99R#u,))BC.CC))BC.CC#s8~~U~3TYYrCx"s(X2EFF	 !$Fc)n <S=00	~~' 		"#,,.u:?		"# 4 4 6q 9 ? ? AAHG .."tyy';';C'@J NN499% u%%crN	 1:D- ,8##D)zz)$	1!%
##
_ nnr   N)T)r   r   r   __doc__r$   r,   r4   r7   r=   r"   r)   rS   rT   rU   r   r   r   r
   r
   $   s<    1+
*
!F> BD7LT$r   r
   c                   "    e Zd ZdZeZdZdZd Zy)r   zIndexer for hmmer2-text format.s   Querys   //c              #   `  K   | j                   }|j                  d       |j                         }t        j                  d      }d}t        |      }|j                  d      rd}	 |j                         }|j                  | j                        rDt        j                  ||      }|j                  d      j                         }|t        |      z
  }nM|j                  | j                        rj                         |df |}n|s|rj                         |df yt        |      }ȭw)zFIterate over Hmmer2TextIndexer; yields query results' key, offsets, 0.r   s!   Query\s*(?:sequence|HMM)?:\s*(.*)Fs	   hmmsearchTr   N)_handleseektellr   compiler   rH   qresult_startr   r   r2   r.   qresult_enddecode)	r   r    start_offsetregex_idis_hmmsearchr1   
end_offsetregxqresult_keys	            r   r,   zHmmer2TextIndexer.__iter__S  s    A{{}::CD F#??<(LJt112yy40"jjm113  *CI5!1!12!((*L!;;)%,,.a??'D% s   D,D.N)	r   r   r   r   r
   _parserr   r   r,   r   r   r   r   r   J  s    )GM K(r   r   __main__)run_doctest)r   r   Bio.SearchIO._modelr   r   r   r   Bio.SearchIO._utilsr   _baser	   __all__r   r   r   r
   r   r   
Bio._utilsr   r   r   r   <module>r      ss    3 	 # # + + , (
3 "**>?	 	c$ c$L	((- ((X z&M r   