
:>"^-                 @   sD   d  Z  d d   Z d d   Z Gd d   d e  Z d d   Z d	 S)
a~  Parser for the prosite dat file from Prosite at ExPASy.

See https://www.expasy.org/prosite/

Tested with:
 - Release 20.43, 10-Feb-2009
 - Release 2017_03 of 15-Mar-2017.

Functions:
 - read                  Reads a Prosite file containing one Prosite record
 - parse                 Iterates over records in a Prosite file.

Classes:
 - Record                Holds Prosite data.

c             c   s#   x t  |   } | s P| Vq Wd S)zParse Prosite records.

    This function is for parsing Prosite files containing multiple
    records.

    Arguments:
     - handle   - handle to the file.

    N)__read)handlerecord r   7/tmp/pip-build-ww9dw3qa/biopython/Bio/ExPASy/Prosite.pyparse   s
    
r   c             C   s.   t  |   } |  j   } | r* t d   | S)zRead one Prosite record.

    This function is for parsing Prosite files containing
    exactly one record.

    Arguments:
     - handle   - handle to the file.

    z"More than one Prosite record found)r   read
ValueError)r   r   	remainderr   r   r   r   +   s
    
r   c               @   s"   e  Z d  Z d Z d d   Z d S)Recordag  Holds information from a Prosite record.

    Main attributes:
     - name           ID of the record.  e.g. ADH_ZINC
     - type           Type of entry.  e.g. PATTERN, MATRIX, or RULE
     - accession      e.g. PS00387
     - created        Date the entry was created.  (MMM-YYYY for releases
       before January 2017, DD-MMM-YYYY since January 2017)
     - data_update    Date the 'primary' data was last updated.
     - info_update    Date data other than 'primary' data was last updated.
     - pdoc           ID of the PROSITE DOCumentation.
     - description    Free-format description.
     - pattern        The PROSITE pattern.  See docs.
     - matrix         List of strings that describes a matrix entry.
     - rules          List of rule definitions (from RU lines).  (strings)
     - prorules       List of prorules (from PR lines). (strings)

    NUMERICAL RESULTS:
     - nr_sp_release  SwissProt release.
     - nr_sp_seqs     Number of seqs in that release of Swiss-Prot. (int)
     - nr_total       Number of hits in Swiss-Prot.  tuple of (hits, seqs)
     - nr_positive    True positives.  tuple of (hits, seqs)
     - nr_unknown     Could be positives.  tuple of (hits, seqs)
     - nr_false_pos   False positives.  tuple of (hits, seqs)
     - nr_false_neg   False negatives.  (int)
     - nr_partial     False negatives, because they are fragments. (int)

    COMMENTS:
     - cc_taxo_range  Taxonomic range.  See docs for format
     - cc_max_repeat  Maximum number of repetitions in a protein
     - cc_site        Interesting site.  list of tuples (pattern pos, desc.)
     - cc_skip_flag   Can this entry be ignored?
     - cc_matrix_type
     - cc_scaling_db
     - cc_author
     - cc_ft_key
     - cc_ft_desc
     - cc_version     version number (introduced in release 19.0)

    The following are all lists if tuples (swiss-prot accession, swiss-prot name).

    DATA BANK REFERENCES:
     - dr_positive
     - dr_false_neg
     - dr_false_pos
     - dr_potential   Potential hits, but fingerprint region not yet available.
     - dr_unknown     Could possibly belong
     - pdb_structs    List of PDB entries.

    c             C   s  d |  _  d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ g  |  _	 g  |  _
 g  |  _ g  |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ g  |  _ d |  _ g  |  _ g  |  _ g  |  _ g  |  _ g  |  _ g  |  _ d S)zInitialize the class. N)NN)NN)NN)NN)nametype	accessioncreateddata_updateinfo_updatepdocdescriptionpatternmatrixrulesprorulespostprocessingnr_sp_release
nr_sp_seqsnr_totalnr_positive
nr_unknownnr_false_posnr_false_neg
nr_partialcc_taxo_rangecc_max_repeatcc_sitecc_skip_flagdr_positivedr_false_negdr_false_posdr_potential
dr_unknownpdb_structs)selfr   r   r   __init__q   s>    																														zRecord.__init__N)__name__
__module____qualname____doc__r,   r   r   r   r   r
   =   s   2r
   c             C   s  d d  l  } d  } x|  D]} | d  d  | d d   j   } } | d k r t   } | j d  } t |  d k r t d |   | d | _ | d j d  | _ q | d	 k r | j d
  | _ q | d k r| j d  j d  } | d j	 dD  r*| d j
 d d  d | _ n t d |   | d j	 dE  rm| d j
 d d  d | _ n t d |   | d j	 dF  r| d j
 d d  d | _ qt d |   q | d k r| | _ q | d k r| j | 7_ q | d k r| j j |  q | d k r@| j j | j d
   q | d k r_| j j |  q | d k r| j d
  } x=| D]} | sqd d   | j d  D \ }	 }
 |	 d k r|
 j d  \ } } | | _ t |  | _ q|	 d k rt |
  | _ q|	 d  k r*t |
  | _ q|	 dG k r| j d% |
  } | sjt d& t |
  | f   t t t | j     } |	 d! k r| | _  q|	 d" k r| | _! q|	 d# k r| | _" q|	 d$ k r| | _# qt d' t |	  | f   qWq | d( k r| j d
  } x| D]} | s*| d  d)  d* k rPq*| j$ d  d k rhq*d+ d   | j d  D \ }	 }
 |	 d, k r|
 | _% q*|	 d- k r|
 | _& q*|	 d. k r|
 j d  \ } } | j' j t |  | f  q*|	 d/ k r|
 | _( q*|	 d0 k r*|
 | _) q*|	 d1 k rB|
 | _* q*|	 d2 k rZ|
 | _+ q*|	 d3 k rr|
 | _, q*|	 d4 k r|
 | _- q*|	 d5 k r|
 | _. q*t d' t |	  | f   q*Wq | d6 k r| j d
  } x| D] } | sqd7 d   | j d  D \ } } } | d8 k r@| j/ j | | f  q| d9 k re| j0 j | | f  q| d: k r| j1 j | | f  q| d; k r| j2 j | | f  q| d< k r| j3 j | | f  qt d= |   qWq | d> k r0| j   } x | D] } | j4 j | j d
   q
Wq | d? k r^| j d
  } | j5 j |  q | d@ k r| j d
  | _6 q | d( k rq q | dA k r| sq Pq t dB |   q Wd  S| st dC   | S)HN          ZIDz; z)I don't understand identification line
%s   .ZAC;ZDT
 (CREATED) CREATED zI don't understand date line
%s (DATA UPDATE) DATA UPDATE (INFO UPDATE) INFO UPDATEZDEZPAZMAZPPZRUZNRc             S   s   g  |  ] } | j     q Sr   )lstrip).0wordr   r   r   
<listcomp>   s   	 z__read.<locals>.<listcomp>=z/RELEASE,z
/FALSE_NEGz/PARTIAL/TOTAL	/POSITIVE/UNKNOWN
/FALSE_POSz(\d+)\((\d+)\)z!Broken data %s in comment line
%sz"Unknown qual %s in comment line
%sCC   zAutomatic scalingc             S   s   g  |  ] } | j     q Sr   )r>   )r?   r@   r   r   r   rA      s   	 z/TAXO-RANGEz/MAX-REPEATz/SITEz
/SKIP-FLAGz/MATRIX_TYPEz/SCALING_DBz/AUTHORz/FT_KEYz/FT_DESCz/VERSIONZDRc             S   s   g  |  ] } | j     q Sr   )strip)r?   r@   r   r   r   rA     s   	 TFNP?zI don't understand type flag %sZ3DZPRZDOz//zUnknown keyword %s foundzUnexpected end of stream.)r7   r8   )r:   r;   )r<   r=   )rD   rE   rF   rG   )7rerstripr
   splitlenr   r   r   r   endswithrsplitr   r   r   r   r   r   appendr   extendr   r   intr   r   r    match	Exceptionreprtuplemapgroupsr   r   r   r   countr!   r"   r#   r$   Zcc_matrix_typeZcc_scaling_dbZ	cc_authorZ	cc_ft_keyZ
cc_ft_descZ
cc_versionr%   r'   r&   r(   r)   r*   r   r   )r   rP   r   linekeywordvaluecolsdatescolZqualdatareleaseZseqsmhitsposdescrefsrefaccr   r   idr   r   r   r   r      s   '	   "	 " % r   N)r0   r   r   objectr
   r   r   r   r   r   <module>   s   _