ó
gbc           @   s  d  d l  m Z m Z d  d l Z d  d l Z e j d e j ƒ Z e j d e j ƒ Z d „  Z	 e j d e j ƒ Z
 e j d e j ƒ Z d „  Z e j d	 ƒ Z e j d
 e j ƒ Z e j d ƒ Z e j d e j e j ƒ Z d „  Z d e e f d „  ƒ  YZ d „  Z e d „ Z d S(   iÿÿÿÿ(   t   Locationt   locationGeneratorNs#   ^(FT|  )   [^ ].+
((FT|  )    .+
)+s   ^FTc         c   sA   x: t  j |  ƒ D]) } | j ƒ  } t j d | ƒ } | Vq Wd S(   sÀ  
    Iterate through a textual description of a feature table in a genbank
    or embl format. Return at each step a text representation of each individual
    feature composing the table.
    
    @param fttable:  a string corresponding to the feature table of a genbank
                     or an embl entry
                      
    @type fttable: C{str}
    
    @return: an iterator on str
    @rtype: iterator
    
    @see: L{ftParser}
    s     N(   t   _featureMatchert   finditert   groupt   _featureCleanert   sub(   t   fttablet   mt   t(    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   textFeatureIterator   s    s   (?<=^ {21}/).+(
 {21}[^/].+)*s   ^ +c         c   sá   xÚ t  j |  ƒ D]É } | j ƒ  } t j d | ƒ } | j d d ƒ } t | ƒ d k rk | d d f } ni | d d k r” | d j d d ƒ } n | d j d d ƒ } y t	 | ƒ } Wn n X| d | f } | Vq Wd S(	   s€  
    Parse a textual description of a feature in embl or genbank format
    as returned by the textFeatureIterator iterator and iterate through 
    the key, value qualified defining this location.
     
    @param qualifiers: substring containing qualifiers
    @type qualifiers: str
    
    @return: an iterator on tuple (key,value), where keys are C{str}
    @rtype: iterator
    t    t   =i   i    t   translations   
t    N(
   t   _qualifierMatcherR   R   t   _qualifierCleannerR   t   splitt   lent   Nonet   replacet   eval(   t
   qualifiersR   R	   t   value(    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   qualifierIterator$   s    s   (?<=^ {5})\S+s   (?<=^.{21})[^/]+s   [\s
]+s   ^ +/.+c         C   sŠ   t  j |  ƒ j ƒ  } t j |  ƒ j ƒ  } t j d | ƒ } t j |  ƒ } | d  k	 rf | j ƒ  } n d } t j	 d |  ƒ | | | f S(   NR   s3   Qualifiers regex not matching on 
=====
%s
========(
   t
   _ftmatchert   searchR   t   _locmatchert	   _cleanlocR   t   _qualifiersMatcherR   t   loggingt   debug(   t   featuret   fttypet   locationR   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   ftParserH   s    t   Featurec           B   sÚ   e  Z d  „  Z d „  Z e d „ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z e e d d d ƒ Z d „  Z d „  Z d „  Z e e d d d ƒ Z e e d d d ƒ Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   _fttypet   _loc(   t   selft   typeR"   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   __init__W   s    	c         C   s   |  j  S(   N(   R%   (   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt	   getFttype[   s    c         C   s2   |  j  j | ƒ } | r. | j ƒ  j |  ƒ n  | S(   N(   R&   t   extractSequencet   getInfot   update(   R'   t   sequencet   withQualifiert   seq(    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR+   _   s    c         C   s   |  j  j ƒ  S(   N(   R&   t   isDirect(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR1   e   s    c         C   s   |  j  j ƒ  S(   N(   R&   t   isSimple(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR2   h   s    c         C   s   |  j  j ƒ  S(   N(   R&   t   isFullLength(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR3   k   s    c         C   s,   t  |  j |  j j ƒ  ƒ } | j |  ƒ | S(   N(   R$   R%   R&   t   simplifyR-   (   R'   t   f(    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR4   n   s    c         C   s   t  |  j ƒ S(   N(   t   strR&   (   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   locStrs   s    c         C   s   |  j  j ƒ  S(   N(   R&   t   needNucleic(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR8   v   s    c         C   s
   t  |  ƒ S(   N(   t   repr(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   __str__y   s    c         C   s(   t  |  j t  |  j ƒ t j |  ƒ f ƒ S(   N(   R6   t   ftTypeR&   t   dictt   __repr__(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR=   |   s    c         C   s   |  j  j | ƒ S(   N(   R&   t   __cmp__(   R'   t   y(    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR>      s    c         C   s   |  j  j ƒ  S(   N(   R&   t   _getglocpos(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR@   ‚   s    s   Feature type namec         C   se   |  j  ƒ  | d k s& t d | ƒ ‚ | d k r6 |  St |  j |  j j | ƒ ƒ } | j |  ƒ | S(   Ni    s   shift to large (%d)(   t   getBegint   AssertionErrorR$   R%   R&   t   shiftR-   (   R'   t   sR5   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyRC   ‡   s    &c         C   s   |  j  j ƒ  S(   N(   R&   RA   (   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyRA      s    c         C   s   |  j  j ƒ  S(   N(   R&   t   getEnd(   R'   (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyRE   “   s    s"   beginning position of the locations   ending position of the locationN(   t   __name__t
   __module__R)   R*   t   FalseR+   R1   R2   R3   R4   R7   R8   R:   R=   R>   R@   t   propertyR   R;   RC   RA   RE   t   begint   end(    (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyR$   V   s&   																c         C   ss   t  |  ƒ \ } } } t | ƒ } t | | ƒ } |  | _ x3 t | ƒ D]% \ } } | j | g  ƒ j | ƒ qF W| S(   N(   R#   R   R$   t   rawR   t
   setdefaultt   append(   t   featureDescriptionR!   R"   R   R    t   kt   v(    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   featureFactoryš   s    	c         c   sv   xo t  |  ƒ D]a } y t | ƒ } WnC t k
 rh } t j d | ƒ | sU | ‚ n  t j d ƒ q n X| Vq Wd  S(   Ns=   Parsing error on feature :
===============
%s
===============s   	===> Error skipped(   R
   RR   RB   R   R   (   t   featureTablet	   skipErrort   tftR    t   e(    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   featureIterator¥   s    	(   t   obitools.locationR    R   R   t   ret   compilet   MR   R   R
   R   R   R   R   t   DOTALLR   R   R   R#   R<   R$   RR   RH   RW   (    (    (    s8   lib/python2.7/site-packages/obitools/location/feature.pyt   <module>   s    			D	