B
    b%/                 @   sd   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	 G dd deZ
G d	d
 d
eZdS )zBio.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).
    )MultipleSeqAlignment)AlignmentIterator)SequentialAlignmentWriter)Seq)	SeqRecordc               @   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| dkr(tdyt|j}W n tk
rN   d}Y nX |sXd}|drld| }nd| }d}t |d }|dkrtdd	|jkr|jd	 }n$y
|j}W n tk
r   d
}Y nX x||krx|d |kr|| }nd}xN|D ]F}|j	dd 
ddd}	|	t|j|||  7 }	||	d 7 }qW |rf|d||||   d 7 }|d7 }||7 }qW | 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_consensusN2       _$   
z$                                    )len
ValueErrorZget_alignment_lengthstr_versionAttributeError
startswithcolumn_annotations
_star_infoidreplaceljustseqhandlewrite)
self	alignmentversionoutputZcur_charZ
max_lengthZ	star_infoZshow_numrecordline r$   4lib/python3.7/site-packages/Bio/AlignIO/ClustalIO.pywrite_alignment   sJ    







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          	   C   s  | j }| jdkr| }n| j}d| _|s.tdddddg}|  d |krrtd|  d d	|f d}xF| D ]:}|d d
kr|d dkr|dd }|d dkr|}P qW | }x| dkr| }qW g }g }d}d}	x|d dkr4| dkr4|  }
t	|
dk s8t	|
dkrDtd| |
|
d  |
|
d  |	dkrt	|
d |t	|
d d |
d  }|t	|
d  }t||}	~~|
d ||	 kstt	|
dkryt|
d }W n$ tk
r
   td| dY nX t	|
d dd|krtd| n|d dkrt	|t	|ksXtt	|dksjt|	dk	sxt||	 }|d|	j  rt||	jd  rt| }| dkstP nP | }|sP qW | dkst|	dk	stx(|D ] }t	|t	|d kstqW |rLt	|t	|d ksLtd}x|sx*|rp| dkr| }|s\P q\W |sP |ddd |kr|| _P xtt	|D ]}|d dkrtd| |  }
t	|
dk st	|
dkrtd| |
d || kr:td|
d || f |
d ||	 krt	|
d |t	|
d d |
d  }||	jkrtd|	|f |t	|
d  }t||}	~~||  |
d 7  < t	|| t	|d kstt	|
dkrLyt|
d }W n$ tk
r$   td| dY nX t	|| dd|krLtd| | }qW |rT|d dksrt|	dk	st|||	 7 }t	|t	|d kst|d|	j  rt||	jd  rt| }qTW t	|t	|kstt	|dkst	|d dkrt| jdk	rP| jt	|krPtdt	|| jf dd t||D }t|}|rx||_|rt	|d }t	||krt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, ()   
0123456789r   r         zCould not parse line:
%sz-Could not parse line, bad sequence number:
%s-z1Could not parse line, invalid sequence number:
%sFzUnexpected line:
%rzCould not parse line:
%rz4Identifiers out of order? Got '%s' but expected '%s'zOld location %s -> %i:XXz5Found %i records in this alignment, told to expect %ic             s   s$   | ]\}}t t|||d V  qdS ))r   ZdescriptionN)r   r   ).0isr$   r$   r%   	<genexpr>!  s    z+ClustalIterator.__next__.<locals>.<genexpr>z4Alignment length is %i, consensus length is %i, '%s'r	   )r   _headerreadlineStopIterationstripsplitr   joinrstripr   appendfindsliceAssertionErrorintr   startstoprangeZrecords_per_alignmentzipr   r   r   r   )r   r   r#   Zknown_headersr    ZwordZidsZseqsZ	consensusZseq_colsZfieldsrD   endZlettersr6   Zdoner5   Zrecordsr   Zalignment_lengthr$   r$   r%   __next__a   s   


*


 
*


 
zClustalIterator.__next__)r'   r(   r)   r*   r8   rI   r$   r$   r$   r%   r+   \   s   r+   N)r*   Z	Bio.Alignr   ZBio.AlignIO.Interfacesr   r   ZBio.Seqr   ZBio.SeqRecordr   r   r+   r$   r$   r$   r%   <module>   s   I