
:>"^*                 @   s  d  Z  d d l m Z d d l m Z m Z 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 e d	 e d
 e d e d e d e d e d e d e i	 Z d d   Z Gd d   d e  Z e d k r d d l m Z e d d  d S)a  Bio.SeqIO support for the "pir" (aka PIR or NBRF) file format.

This module is for reading and writing PIR or NBRF format files as
SeqRecord objects.

You are expected to use this module via the Bio.SeqIO functions, or if
the file contains a sequence alignment, optionally via Bio.AlignIO instead.

This format was introduced for the Protein Information Resource (PIR), a
project of the National Biomedical Research Foundation (NBRF).  The PIR
database itself is now part of UniProt.

The file format is described online at:
http://www.ebi.ac.uk/help/pir_frame.html
http://www.cmbi.kun.nl/bioinf/tools/crab_pir.html (currently down)

An example file in this format would be::

  >P1;CRAB_ANAPL
  ALPHA CRYSTALLIN B CHAIN (ALPHA(B)-CRYSTALLIN).
    MDITIHNPLI RRPLFSWLAP SRIFDQIFGE HLQESELLPA SPSLSPFLMR
    SPIFRMPSWL ETGLSEMRLE KDKFSVNLDV KHFSPEELKV KVLGDMVEIH
    GKHEERQDEH GFIAREFNRK YRIPADVDPL TITSSLSLDG VLTVSAPRKQ
    SDVPERSIPI TREEKPAIAG AQRK*

  >P1;CRAB_BOVIN
  ALPHA CRYSTALLIN B CHAIN (ALPHA(B)-CRYSTALLIN).
    MDIAIHHPWI RRPFFPFHSP SRLFDQFFGE HLLESDLFPA STSLSPFYLR
    PPSFLRAPSW IDTGLSEMRL EKDRFSVNLD VKHFSPEELK VKVLGDVIEV
    HGKHEERQDE HGFISREFHR KYRIPADVDP LAITSSLSSD GVLTVNGPRK
    QASGPERTIP ITREEKPAVT AAPKK*

Or, an example of a multiple sequence alignment::

  >P1;S27231
  rhodopsin - northern leopard frog
  MNGTEGPNFY IPMSNKTGVV RSPFDYPQYY LAEPWKYSVL AAYMFLLILL GLPINFMTLY
  VTIQHKKLRT PLNYILLNLG VCNHFMVLCG FTITMYTSLH GYFVFGQTGC YFEGFFATLG
  GEIALWSLVV LAIERYIVVC KPMSNFRFGE NHAMMGVAFT WIMALACAVP PLFGWSRYIP
  EGMQCSCGVD YYTLKPEVNN ESFVIYMFVV HFLIPLIIIS FCYGRLVCTV KEAAAQQQES
  ATTQKAEKEV TRMVIIMVIF FLICWVPYAY VAFYIFTHQG SEFGPIFMTV PAFFAKSSAI
  YNPVIYIMLN KQFRNCMITT LCCGKNPFGD DDASSAATSK TEATSVSTSQ VSPA*

  >P1;I51200
  rhodopsin - African clawed frog
  MNGTEGPNFY VPMSNKTGVV RSPFDYPQYY LAEPWQYSAL AAYMFLLILL GLPINFMTLF
  VTIQHKKLRT PLNYILLNLV FANHFMVLCG FTVTMYTSMH GYFIFGPTGC YIEGFFATLG
  GEVALWSLVV LAVERYIVVC KPMANFRFGE NHAIMGVAFT WIMALSCAAP PLFGWSRYIP
  EGMQCSCGVD YYTLKPEVNN ESFVIYMFIV HFTIPLIVIF FCYGRLLCTV KEAAAQQQES
  LTTQKAEKEV TRMVVIMVVF FLICWVPYAY VAFYIFTHQG SNFGPVFMTV PAFFAKSSAI
  YNPVIYIVLN KQFRNCLITT LCCGKNPFGD EDGSSAATSK TEASSVSSSQ VSPA*

  >P1;JN0120
  rhodopsin - Japanese lamprey
  MNGTEGDNFY VPFSNKTGLA RSPYEYPQYY LAEPWKYSAL AAYMFFLILV GFPVNFLTLF
  VTVQHKKLRT PLNYILLNLA MANLFMVLFG FTVTMYTSMN GYFVFGPTMC SIEGFFATLG
  GEVALWSLVV LAIERYIVIC KPMGNFRFGN THAIMGVAFT WIMALACAAP PLVGWSRYIP
  EGMQCSCGPD YYTLNPNFNN ESYVVYMFVV HFLVPFVIIF FCYGRLLCTV KEAAAAQQES
  ASTQKAEKEV TRMVVLMVIG FLVCWVPYAS VAFYIFTHQG SDFGATFMTL PAFFAKSSAL
  YNPVIYILMN KQFRNCMITT LCCGKNPLGD DE-SGASTSKT EVSSVSTSPV SPA*


As with the FASTA format, each record starts with a line beginning with ">"
character.  There is then a two letter sequence type (P1, F1, DL, DC, RL,
RC, or XX), a semi colon, and the identification code.  The second like is
free text description.  The remaining lines contain the sequence itself,
terminating in an asterisk.  Space separated blocks of ten letters as shown
above are typical.

Sequence codes and their meanings:
 - P1 - Protein (complete)
 - F1 - Protein (fragment)
 - D1 - DNA (e.g. EMBOSS seqret output)
 - DL - DNA (linear)
 - DC - DNA (circular)
 - RL - RNA (linear)
 - RC - RNA (circular)
 - N3 - tRNA
 - N1 - Other functional RNA
 - XX - Unknown

    )print_function)single_letter_alphabetgeneric_proteingeneric_dnageneric_rna)	as_handle)Seq)	SeqRecord)SequentialSequenceWriterP1ZF1D1ZDLZDCRLZRCZN3XXc             c   s  t  |  d  }  x1 |  j   } | d k r1 d S| d d k r Pq WxX| d d k re t d   | d d  } | t k s | d d	 k r t d
   | d d  j   } |  j   j   } g  } |  j   } xG | s P| d d k r P| j | j   j d d   |  j   } q Wd j |  } | d d k rLt d   t	 t
 | d d  t |  d | d | d | } | | j d <| V| sI d SqI Wt d   Wd QRXd S)a  Iterate over Fasta records as SeqRecord objects.

    handle - input file
    alphabet - optional alphabet
    title2ids - A function that, when given the title of the FASTA
    file (without the beginning >), will return the id, name and
    description (in that order) for the record as a tuple of strings.

    If this is not given, then the entire title line will be used
    as the description, and the first word as the id and name.

    Note that use of title2ids matches that of Bio.Fasta.SequenceParser
    but the defaults are slightly different.

    Examples
    --------
    >>> with open("NBRF/DMB_prot.pir") as handle:
    ...    for record in PirIterator(handle):
    ...        print("%s length %i" % (record.id, len(record)))
    HLA:HLA00489 length 263
    HLA:HLA00490 length 94
    HLA:HLA00491 length 94
    HLA:HLA00492 length 80
    HLA:HLA00493 length 175
    HLA:HLA01083 length 188

    rU Nr   >z4Records in PIR files should start with '>' character      ;zBRecords should start with '>XX;' where XX is a valid sequence type    *z5Sequences in PIR files should include a * terminator!idnamedescriptionzPIR-typezUnrecognised PIR record format.r   )r   readline
ValueError_pir_alphabetsstripappendrstripreplacejoinr	   r   annotations)handlelineZpir_typeZ
identifierr   linesseqrecord r*   4/tmp/pip-build-ww9dw3qa/biopython/Bio/SeqIO/PirIO.pyPirIteratoru   sN    			r,   c               @   s7   e  Z d  Z d Z d d d d d  Z d d   Z d S)	PirWriterz Class to write PIR format files.<   Nc             C   sP   t  j |  |  d |  _ | r1 | d k  r1 t  | |  _ | |  _ | |  _ d S)au  Create a PIR writer.

        Arguments:
         - handle - Handle to an output file, e.g. as returned
           by open(filename, "w")
         - wrap - Optional line length used to wrap sequence lines.
           Defaults to wrapping the sequence at 60 characters
           Use zero (or None) for no wrapping, giving a single
           long line for the sequence.
         - record2title - Optional function to return the text to be
           used for the title line of each record.  By default
           a combination of the record.id, record.name and
           record.description is used.
         - code - Optional sequence code must be one of P1, F1,
           D1, DL, DC, RL, RC, N3 and XX. By default None is used,
           which means auto detection based on record alphabet.

        You can either use::

            handle = open(filename, "w")
            writer = PirWriter(handle)
            writer.write_file(myRecords)
            handle.close()

        Or, follow the sequential file writer system, for example::

            handle = open(filename, "w")
            writer = PirWriter(handle)
            writer.write_header() # does nothing for PIR files
            ...
            Multiple writer.write_record() and/or writer.write_records() calls
            ...
            writer.write_footer() # does nothing for PIR files
            handle.close()

        Nr   )r
   __init__wrapr   record2titlecode)selfr%   r0   r1   r2   r*   r*   r+   r/      s    %			zPirWriter.__init__c             C   s~  |  j  s t  |  j s t  d |  _ |  j rL |  j |  j |   } n |  j | j  } | j r | j r |  j | j d | j  } n: | j r | j r |  j | j  } n |  j | j  } |  j	 r |  j	 } nr t
 | j j t t   rd } nN t
 | j j t t   r'd } n* t
 | j j t t   rKd } n d } | t k rwt d t j   d   d	 | k st  d
 | k st  |  j j d | | | f  |  j |  } d	 | k st  d
 | k st  |  j rfd } xB t d t |  |  j  D]% } | | | | |  j  d	 7} qW| d d  d } |  j j |  n |  j j | d  d S)z&Write a single PIR record to the file.Tz - r   r   r   r   zSequence code must be one of .
z
>%s;%s
%s
r   r   Nr   z*
r   )Z_header_writtenAssertionErrorZ_footer_writtenZ_record_writtenr1   cleanr   r   r   r2   
isinstancer(   Zalphabettyper   r   r   r   	TypeErrorkeysr%   writeZ_get_seq_stringr0   rangelen)r3   r)   titler   r2   datar&   ir*   r*   r+   write_record   sH    		 					"#zPirWriter.write_record)__name__
__module____qualname____doc__r/   rC   r*   r*   r*   r+   r-      s   .r-   __main__)run_doctestverboseN)rG   
__future__r   ZBio.Alphabetr   r   r   r   ZBio.Filer   ZBio.Seqr   ZBio.SeqRecordr	   ZBio.SeqIO.Interfacesr
   r   r,   r-   rD   Z
Bio._utilsrI   r*   r*   r*   r+   <module>X   s(   "Qg