ó
gbc           @   sÖ   d  d l  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 d  d l m Z d  d l Z d  d l Z d  d l Z d  d l Z d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   NucSequence(   t   EcoPCRDBFile(   t   EcoTaxonomyDBt   ecoTaxonomyWriter(   t   loadTaxonomyDatabase(   t   EcoPCRDBAnnotationWriter(   t   universalOpen(   t   globNt   EcoPCRDBSequenceIteratorc           B   s;   e  Z d  Z d d „ Z d „  Z d „  Z e d „  ƒ Z RS(   se   
    Build an iterator over the sequences include in a sequence database
    formated for ecoPCR
    c         C   sW   | |  _  | d k	 r! | |  _ n t | ƒ |  _ t d |  j  ƒ |  _ |  j j ƒ  d S(   sö  
        ecoPCR data iterator constructor
        
        @param path: path to the ecoPCR database including the database prefix name
        @type path: C{str}
        @param taxonomy: a taxonomy can be given to the reader to decode the taxonomic data
                         associated to the sequences. If no Taxonomy is furnish, it will be read 
                         before the sequence database files using the same path.
        @type taxonomy: L{obitools.ecopcr.taxonomy.Taxonomy}
        s
   %s_???.sdxN(   t   _patht   Nonet	   _taxonomyR   R   t   _seqfilesFilest   sort(   t   selft   patht   taxonomy(    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyt   __init__   s    	c         c   s¶   x¯ |  j  | ƒ D]ž } t | ƒ } | d } t j d | | ƒ \ } } } } }	 }
 | j d ƒ } |
 |  } t j j |
 | ƒ } t | | | d |  j	 j	 | d ƒ} | Vq Wd  S(	   Ni   i   s   > I 20s I I I %dss    t   taxidi    i   i$   (
   t   _ecoRecordIteratort   lent   structt   unpackt   stript   gzipt   zlibt
   decompressR    R   (   R   t   filet   recordt   lrecordt   lnamesR   t   seqidt	   deflengtht	   seqlengtht   cptseqlengtht   stringt   det   seqt   bioseq(    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyt   __ecoSequenceIterator)   s    
(
&c         c   s7   x0 |  j  D]% } x |  j | ƒ D] } | Vq  Wq
 Wd  S(   N(   R   t.   _EcoPCRDBSequenceIterator__ecoSequenceIterator(   R   t   seqfileR%   (    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyt   __iter__4   s    c         C   s   |  j  S(   s5   Return the taxonomy associated to the ecoPCRDB reader(   R   (   R   (    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyR   9   s    N(	   t   __name__t
   __module__t   __doc__R
   R   R(   R*   t   propertyR   (    (    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyR      s
   		t   EcoPCRDBSequenceWriterc           B   sM   e  Z d d d d e d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c            sè  d d l  m } | |  _ d  |  _ t | ƒ |  _ | j } |  j d  k	 r• t | d ƒ sh | j | k r• t	 j
 d It | |  j ƒ t	 j
 d IJn  | d  k rê t j d ƒ ‰  t t ‡  f d †  t d | ƒ Dƒ ƒ d	 g ƒ d
 } n  | |  _ | |  _ d | | f |  _ | rzt |  j ƒ }	 t j d |	 j d ƒ ƒ \ }
 |
 |  _ |
 |  _ ~	 |  j d ƒ |  j j d	 d ƒ n d	 |  _ d	 |  _ |  j d ƒ | d  k	 rÛ| d  k	 s½t d ƒ ‚ t | | | | | ƒ |  _ n	 d  |  _ d  S(   Niÿÿÿÿ(   t   currentInputFileNamet   ecodbs   Writing the taxonomy file...t   Oks   ([0-9]{3})\.sdxc         3   s-   |  ]# } t  ˆ  j | ƒ j d  ƒ ƒ Vq d S(   i   N(   t   intt   searcht   group(   t   .0t   i(   t   p(    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pys	   <genexpr>T   s   s   %s_[0-9][0-9][0-9].sdxi    i   s   %s_%03d.sdxs   > Ii   s   r+bi   t   wbs-   You must specify an id attribute for features(    t   obitools.optionsR0   R
   t   _currentfileR   R   t   ecopcroutputt   hasattrR1   t   syst   stderrR   t   ret   compilet   maxt   listR   t   _fileidxt   _dbnamet	   _filenameR   R   R   t   readt   _sequenceCountt   _sequenceFileCountt   opent   _filet   seekt   AssertionErrorR   t   _annotation(   R   t   optionst   fileidxt   ftidt   typet
   definitiont   appendR0   t   dbnamet   ft   recordCount(    (   R8   s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyR   B   sB    			
						c   	   
   C   sm  t  j j t | ƒ j ƒ  d ƒ } t | ƒ } t | j ƒ } d | | } |  j d  k se d | k rn d } n |  j j	 | d ƒ } | d k rÓ t
 d | j |  j d  k r± d n d | k rÃ d n d	 f ƒ ‚ n  yA t j d
 | | f | | | j | t | ƒ | | j | ƒ	 } Wn0 t j k
 rF} t j d | j IJ| ‚ n Xt | ƒ | d k sit d ƒ ‚ | S(   Ni	   i   i   R   iÿÿÿÿs   Taxonomy error for %s: %ss   taxonomy is missings   sequence has no taxids   wrong taxids   > I i 20s I I I %ds %dss(   

============

Error on sequence : %s

s   error in sequence packingi   i   i    i$   (   R   R   t   compresst   strt   upperR   RS   R   R
   t	   findIndext	   Exceptiont   idR   t   packt   errorR>   R?   RM   (	   R   R%   t
   compactseqR"   t   delengtht	   totalSizet   taxont   packedt   e(    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyt   _ecoSeqPackerq   s0    !	C	
"c         C   sC   |  j  j d d ƒ |  j  j t j d |  j ƒ ƒ |  j  j ƒ  d  S(   Ni    s   > I(   RK   RL   t   writeR   R^   RI   t   close(   R   (    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyRh   ”   s    c         C   sZ   d |  j  |  j f |  _ t |  j | ƒ |  _ d |  _ |  j j t j d |  j ƒ ƒ d  S(   Ns   %s_%03d.sdxi    s   > I(	   RE   RD   RF   RJ   RK   RI   Rg   R   R^   (   R   t   mode(    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyRJ   ™   s    	c         C   s  |  j  d  k r! |  j ƒ  |  _  n  |  j ƒ  |  j  k rn |  j ƒ  |  _  |  j ƒ  |  j d 7_ |  j d ƒ n  |  j d  k	 r¨ d | k r¨ t | d ƒ r¨ | j ƒ  q¨ n  |  j	 j
 |  j | ƒ ƒ |  j d  k	 ré |  j j | |  j ƒ n  |  j d 7_ |  j d 7_ d  S(   Ni   R9   R   t   extractTaxon(   R;   R
   R0   Rh   RD   RJ   R   R=   Rj   RK   Rg   Rf   RN   t   putRH   RI   (   R   t   sequence(    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyRk   Ÿ   s    
c         C   s   |  j  ƒ  d  S(   N(   Rh   (   R   (    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyt   __del__³   s    N(
   R+   R,   R
   t   FalseR   Rf   Rh   RJ   Rk   Rm   (    (    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyR/   @   s   /	#			(   t   obitoolsR    t   obitools.ecopcrR   t   obitools.ecopcr.taxonomyR   R   t   obitools.ecopcr.optionsR   t   obitools.ecopcr.annotationR   t   obitools.utilsR   R   R   R   R>   R@   R   t   objectR/   (    (    (    s7   lib/python2.7/site-packages/obitools/ecopcr/sequence.pyt   <module>   s   2