
:>"^  ã               @   s¢   d  Z  d d l m Z d d l m Z d d l m Z d d „  Z d d „  Z e ƒ  Z	 d	 d
 „  Z
 d d „  Z d d „  Z e d k rž d d l m Z e ƒ  d S)z3Functions to calculate assorted sequence checksums.é    )Úprint_function)Úcrc32)Ú	_as_bytesc             C   sC   y t  t t |  ƒ ƒ ƒ SWn" t k
 r> t  t |  ƒ ƒ SYn Xd S)zÅReturn the crc32 checksum for a sequence (string or Seq object).

    Note that the case is important:

    >>> crc32("ACGTACGTACGT")
    20049947
    >>> crc32("acgtACGTacgt")
    1688586483

    N)Ú_crc32r   ÚstrÚAttributeError)Úseq© r	   ú:/tmp/pip-build-ww9dw3qa/biopython/Bio/SeqUtils/CheckSum.pyr      s    r   c              C   s“   g  }  x† t  d ƒ D]x } | } d } xV t  d ƒ D]H } | d @} | d L} | d @r` | d O} | d L} | r2 | d N} q2 W|  j | ƒ q W|  S)Né   r   é   é   é   l      0 l        )ÚrangeÚappend)Ú_table_hÚiZpart_lZpart_hÚjZrflagr	   r	   r
   Ú_init_table_h)   s    




r   c             C   sy   d } d } x\ |  D]T } | d @d >} | d ?} | d ?| B} | t  | ƒ Ad @} | t | A} | } q Wd | | f S)zßReturn the crc64 checksum for a sequence (string or Seq object).

    Note that the case is important:

    >>> crc64("ACGTACGTACGT")
    'CRC-C4FBB762C4A87EBD'
    >>> crc64("acgtACGTacgt")
    'CRC-DA4509DC64A87EBD'

    r   éÿ   é   r   zCRC-%08X%08X)Úordr   )ÚsZcrclZcrchÚcZshrZtemp1hZtemp1lÚidxr	   r	   r
   Úcrc64>   s    

r   c             C   s~   y t  |  ƒ }  Wn t k
 r$ Yn Xd } } xD |  D]< } | d 7} | | t | j ƒ  ƒ 7} | d k r6 d } q6 W| d S)aá  Return the GCG checksum (int) for a sequence (string or Seq object).

    Given a nucleotide or amino-acid secuence (or any string),
    returns the GCG checksum (int). Checksum used by GCG program.
    seq type = str.

    Based on BioPerl GCG_checksum. Adapted by Sebastian Bassi
    with the help of John Lenton, Pablo Ziliani, and Gabriel Genellina.

    All sequences are converted to uppercase.

    >>> gcg("ACGTACGTACGT")
    5688
    >>> gcg("acgtACGTacgt")
    5688

    r   r   é9   i'  )r   r   r   Úupper)r   ÚindexZchecksumÚcharr	   r	   r
   ÚgcgV   s    


r    c             C   sË   d d l  } d d l } | j ƒ  } y t |  ƒ }  Wn t k
 rH Yn X| j t |  j ƒ  ƒ ƒ y8 | j | j	 ƒ  ƒ } | j
 ƒ  j d d ƒ j d ƒ SWn t k
 r® Yn X| j | j	 ƒ  ƒ j d ƒ S)a  Return the SEGUID (string) for a sequence (string or Seq object).

    Given a nucleotide or amino-acid secuence (or any string),
    returns the SEGUID string (A SEquence Globally Unique IDentifier).
    seq type = str.

    Note that the case is not important:

    >>> seguid("ACGTACGTACGT")
    'If6HIvcnRSQDVNiAoefAzySc6i4'
    >>> seguid("acgtACGTacgt")
    'If6HIvcnRSQDVNiAoefAzySc6i4'

    For more information about SEGUID, see:
    http://bioinformatics.anl.gov/seguid/
    https://doi.org/10.1002/pmic.200600032
    r   NÚ
Ú ú=)ÚhashlibÚbase64Úsha1r   r   Úupdater   r   ÚencodebytesÚdigestÚdecodeÚreplaceÚrstripÚ	b64encode)r   r$   r%   ÚmÚtmpr	   r	   r
   Úseguidw   s    #r0   Ú__main__)Úrun_doctestN)Ú__doc__Ú
__future__r   Úbinasciir   r   Z	Bio._py3kr   r   r   r   r    r0   Ú__name__Z
Bio._utilsr2   r	   r	   r	   r
   Ú<module>   s   	!'