o
    Rŀgq$                     @   sd   d Z ddl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j	Z	G d	d
 d
ej
Z
dS )zBio.Align support for "clustal" output from CLUSTAL W and other tools.

You are expected to use this module via the Bio.Align functions (or the
Bio.SeqIO functions if you are interested in the sequences only).
    N)	Alignment)
interfaces)Seq)	SeqRecordc                   @   $   e Zd ZdZdZdd Zdd ZdS )AlignmentWriterzClustalw alignment writer.Clustalc              	   C   sr   z	|j }|d }W n ttfy   d}tj}Y nw |dd}| d| d}|| |d |d dS )	z"Use this to write the file header.Program	BiopythonVersion  z multiple sequence alignment

N)metadataAttributeErrorKeyErrorBio__version__getwrite)selfstream
alignmentsr   programversionline r   E/var/www/html/myenv/lib/python3.10/site-packages/Bio/Align/clustal.pywrite_header   s   


zAlignmentWriter.write_headerc              	   C   sl  |j \}}|dkrtd|dkrtdz|j}W n ty%   d}Y nw |d}t|}g }t|jD ]+\}}	z|	j}
W n tyL   d| }
Y nw |
dd 	dd	}
|

d
}
||
 q6g }d}||kr|d }||krt|}t||D ]\}
}|
 |||  d}|| qy|durd|||  d }|| |d |}||ksj|d d|S )z>Return a string with a single alignment in the Clustal format.r   zMust have at least one sequencez Non-empty sequences are requiredNclustal_consensuszsequence_%d   r   _$   2   r   z$                                    r   )shape
ValueErrorcolumn_annotationsr   r   list	enumerate	sequencesidreplaceljustappendzipjoin)r   	alignmentnseqslengthr&   	consensusgapped_sequencesnamesisequencenamelinesstartstopgapped_sequencer   r   r   r   format_alignment(   sN   








z AlignmentWriter.format_alignmentN)__name__
__module____qualname____doc__fmtr   r=   r   r   r   r   r      s
    r   c                   @   r   )AlignmentIteratorzClustalw alignment iterator.r   c                 C   s   zt |}W n ty   tdd w i | _| }g d}|d }||vr1td|d|f || jd< |D ]"}|d dkrL|d d	krL|d
d }|d  rZ|| jd<  d S q8d S )NzEmpty file.)CLUSTALPROBCONSMUSCLEMSAPROBSKalignr
   r   z-%s is not known to generate CLUSTAL files: %sz, r	   ()   r   )nextStopIterationr%   r   splitr/   isdigit)r   r   r   wordsknown_programsr   wordr   r   r   _read_headerd   s0   


zAlignmentIterator._read_headerc              	   C   s2  g }g }d}d }|D ]}| dr-t|dksJ |d usJ t|}||||  } no| r| }	t|	dk sAt|	dkrGtd| |	d d \}
}||
 || |d u re||t|
}t|	dkrzt|	d }W n ty   td| d w t||d |krtd	| d q
|r nq
d S |d usJ t|d }|D ]
}t||ksJ q|rt||ksJ t|}d}|D ]}| dr|d usJ t|}|||||  7 }q| sq|| }
| }	t|	dk st|	dkrtd| |
|	d ksJ |	d
 }||  |7  < t|	dkrNzt|	d }W n ty6   td| d w t|| || d |krNtd	| d |d
7 }||krYd}qdd |D }t	
|\}}dd t||D }t	||}|r|j}t||krtd|t||f i |_||jd< |S )Nr   r   r         zCould not parse line:
%sz,Could not parse line, bad sequence count:
%s-z2Could not parse line, incorrect sequence count:
%srL   z-Could not parse line, bad sequence number:
%sc                 S   s   g | ]}|  qS r   )encode).0sr   r   r   
<listcomp>   s    z:AlignmentIterator._read_next_alignment.<locals>.<listcomp>c                 S   s"   g | ]\}}t t||d dqS )r   )r*   description)r   r   )rY   seqidseqr   r   r   r[      s    z6Alignment has %i columns, consensus length is %i, '%s'r   )
startswithlenstriprO   r%   r-   findintcountr   parse_printed_alignmentr.   r2   r&   )r   r   idsaligned_seqsr3   indexr   aligned_seqr2   fieldsr]   rd   nr6   seqscoordinatesrecordsr0   columnsr   r   r   _read_next_alignment   s   



 


z&AlignmentIterator._read_next_alignmentN)r>   r?   r@   rA   rB   rT   rp   r   r   r   r   rC   _   s
    !rC   )rA   r   	Bio.Alignr   r   Bio.Seqr   Bio.SeqRecordr   r   rC   r   r   r   r   <module>   s   K