
:>"^d/  ã               @   sŒ   d  Z  d d l m Z d d l m Z d d l m Z d d l m Z d d l	 m
 Z
 m Z Gd d	 „  d	 e ƒ Z Gd
 d „  d e
 ƒ Z d S)záBio.AlignIO support for "clustal" output from CLUSTAL W and other tools.

You are expected to use this module via the Bio.AlignIO functions (or the
Bio.SeqIO functions if you want to work directly with the gapped sequences).
é    )Úprint_function)ÚSeq)Ú	SeqRecord)ÚMultipleSeqAlignmenté   )ÚAlignmentIteratorÚSequentialAlignmentWriterc               @   s"   e  Z d  Z d Z d d „  Z d S)ÚClustalWriterzClustalw alignment writer.c       
      C   sþ  t  | ƒ d k r t d ƒ ‚ | j ƒ  d k r< t d ƒ ‚ y t | j ƒ } Wn t k
 ri d } Yn X| sv d } | j d ƒ r’ d | } n
 d | } d } t  | d ƒ } | d k rÊ t d ƒ ‚ d	 | j k ré | j d	 } n! t | d
 ƒ r| j	 } n d } xÙ | | k rå| d | k r6| | } n d } xe | D]] } | j
 d d … j d d ƒ j d ƒ }	 |	 t | j | | | … ƒ 7}	 | |	 d 7} qCW| rÎ| d d | | | | … d 7} | d 7} | | 7} qW|  j j | d ƒ d S)z=Use this to write (another) single alignment to an open file.r   zMust have at least one sequencez Non-empty sequences are requiredÚ z1.81z2.z)CLUSTAL %s multiple sequence alignment


z-CLUSTAL X (%s) multiple sequence alignment


Úclustal_consensusÚ
_star_infoNé2   é   ú Ú_é$   Ú
)ÚlenÚ
ValueErrorZget_alignment_lengthÚstrÚ_versionÚAttributeErrorÚ
startswithÚcolumn_annotationsÚhasattrr   ÚidÚreplaceÚljustÚseqÚhandleÚwrite)
ÚselfÚ	alignmentÚversionÚoutputZcur_charÚ
max_lengthZ	star_infoZshow_numÚrecordÚline© r(   ú:/tmp/pip-build-ww9dw3qa/biopython/Bio/AlignIO/ClustalIO.pyÚwrite_alignment   sH    
(!!
zClustalWriter.write_alignmentN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r(   r(   r(   r)   r	      s   r	   c               @   s(   e  Z d  Z d Z d Z d d „  Z d S)ÚClustalIteratorzClustalw alignment iterator.Nc                s¹  ˆ  j  } ˆ  j d k r' | j ƒ  } n ˆ  j } d ˆ  _ | sE t ‚ d d d d d g } | j ƒ  j ƒ  d | k r¥ t d | j ƒ  j ƒ  d d	 j | ƒ f ƒ ‚ d } x[ | j ƒ  D]M } | d d
 k rî | d  d k rî | d d! … } | d d k r¸ | } Pq¸ W| j ƒ  } x" | j ƒ  d k r9| j ƒ  } qWg  } g  } d } d }	 xp| d d k rã| j ƒ  d k rã| j ƒ  j ƒ  }
 t	 |
 ƒ d k  s­t	 |
 ƒ d k r½t d | ƒ ‚ | j
 |
 d ƒ | j
 |
 d ƒ |	 d k rIt	 |
 d ƒ | t	 |
 d ƒ d … j |
 d ƒ } | t	 |
 d ƒ } t | | ƒ }	 ~ ~ |
 d | |	 k sct ‚ t	 |
 ƒ d k r®y t |
 d ƒ } Wn" t k
 r­t d | ƒ ‚ Yn Xt	 |
 d j d d ƒ ƒ | k r®t d | ƒ ‚ nË | d d k r­t	 | ƒ t	 | ƒ k st ‚ t	 | ƒ d k s)t ‚ |	 d k	 s;t ‚ | |	 } | d |	 j … j ƒ  set ‚ | |	 j d … j ƒ  s…t ‚ | j ƒ  } | j ƒ  d k s©t ‚ Pn P| j ƒ  } | sUPqUW| j ƒ  d k sÝt ‚ |	 d k	 sït ‚ x0 | D]( } t	 | ƒ t	 | d ƒ k söt ‚ qöW| rJt	 | ƒ t	 | d ƒ k sJt ‚ d } x3| s…x0 | su| j ƒ  d k r‹| j ƒ  } | s\Pq\W| s“P| j d d ƒ d | k r¿d } | ˆ  _ Pxt t	 | ƒ ƒ D]} | d d k rþt d t | ƒ ƒ ‚ | j ƒ  j ƒ  }
 t	 |
 ƒ d k  s4t	 |
 ƒ d k rJt d t | ƒ ƒ ‚ |
 d | | k r|t d |
 d | | f ƒ ‚ |
 d | |	 k rt	 |
 d ƒ | t	 |
 d ƒ d … j |
 d ƒ } | |	 j k rêt d |	 | f ƒ ‚ | t	 |
 d ƒ } t | | ƒ }	 ~ ~ | | |
 d 7<t	 | | ƒ t	 | d ƒ k sKt ‚ t	 |
 ƒ d k rÈy t |
 d ƒ } Wn" t k
 r•t d | ƒ ‚ Yn Xt	 | | j d d ƒ ƒ | k rÈt d | ƒ ‚ | j ƒ  } qÒW| rS| d d k sôt ‚ |	 d k	 st ‚ | | |	 7} t	 | ƒ t	 | d ƒ k s6t ‚ | d |	 j … j ƒ  sVt ‚ | |	 j d … j ƒ  svt ‚ | j ƒ  } qSWt	 | ƒ t	 | ƒ k s¤t ‚ t	 | ƒ d k sÌt	 | d ƒ d k rÒt ‚ ˆ  j d k	 rˆ  j t	 | ƒ k rt d t	 | ƒ ˆ  j f ƒ ‚ ‡  f d d †  t | | ƒ Dƒ } t | ˆ  j ƒ } | rX| | _ | rµt	 | d ƒ } t	 | ƒ | k rŸt d | t	 | ƒ | f ƒ ‚ | | j d <| | _ | S)"z)Parse the next alignment from the handle.NZCLUSTALZPROBCONSZMUSCLEZMSAPROBSZKalignr   z$%s is not a known CLUSTAL header: %sz, ú(r   ú)Ú
0123456789r
   r   é   é   zCould not parse line:
%sz-Could not parse line, bad sequence number:
%sú-z1Could not parse line, invalid sequence number:
%sFTzUnexpected line:
%sz4Identifiers out of order? Got '%s' but expected '%s'zOld location %s -> %i:XXz5Found %i records in this alignment, told to expect %ic             3   s9   |  ]/ \ } } t  t | ˆ  j ƒ d  | d | ƒVq d S)r   ÚdescriptionN)r   r   Úalphabet)Ú.0ÚiÚs)r!   r(   r)   ú	<genexpr>$  s   z+ClustalIterator.__next__.<locals>.<genexpr>z4Alignment length is %i, consensus length is %i, '%s'r   éÿÿÿÿr<   )r   Ú_headerÚreadlineÚStopIterationÚstripÚsplitr   ÚjoinÚrstripr   ÚappendÚfindÚsliceÚAssertionErrorÚintr   ÚstartÚstopÚrangeÚreprZrecords_per_alignmentÚzipr   r7   r   r   r   )r!   r   r'   Zknown_headersr#   ÚwordÚidsZseqsZ	consensusZseq_colsÚfieldsrI   ÚendÚlettersr:   Údoner9   Úrecordsr"   Zalignment_lengthr(   )r!   r)   Ú__next__b   s   			) "$5"
  &"		$5&""  (		zClustalIterator.__next__)r+   r,   r-   r.   r=   rU   r(   r(   r(   r)   r/   ]   s   r/   N)r.   Ú
__future__r   ZBio.Seqr   ZBio.SeqRecordr   Z	Bio.Alignr   Z
Interfacesr   r   r	   r/   r(   r(   r(   r)   Ú<module>   s   H