o
    RŀgH'                     @   s\   d 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 "xmfa" output from Mauve/ProgressiveMauve.

You are expected to use this module via the Bio.Align functions.
    )	Alignment)
interfaces)Seq)	SeqRecordc                       s>   e Zd ZdZdZd fdd	Zdd Zdd	 Zd
d Z  Z	S )AlignmentWriterzMauve xmfa alignment writer.MauveNc                    s   t  | || _|| _dS )a  Create an AlignmentWriter object.

        Arguments:
         - target       - output stream or file name
         - metadata     - metadata to be included in the output. If metadata
                          is None, then the alignments object to be written
                          must have an attribute `metadata`.
         - identifiers  - list of the IDs of the sequences included in the
                          alignment. Sequences will be numbered according to
                          their index in this list. If identifiers is None,
                          then the alignments object to be written must have
                          an attribute `identifiers`.
        N)super__init__	_metadata_identifiers)selftargetmetadataidentifiers	__class__ C/var/www/html/myenv/lib/python3.10/site-packages/Bio/Align/mauve.pyr	      s   
zAlignmentWriter.__init__c                 C   s6  | j }|dd}d| d}|| | j}|d}|du rGt|D ]!\}}|d }	d|	 d	| d}|| d|	 d
}|| q$n<t|D ]7\}	}
|	t|
ksWJ |	d7 }	d|	 d	| d}|| d|	 d|	 d}|| d|	 d
}|| qK|d}|durd| d}|| dS dS )z)Write the file header to the output file.FormatVersionMauve1z#FormatVersion 
FileN   z	#SequencezFile	zFormat	FastA
zEntry	BackboneFilez#BackboneFile	)r
   getwriter   	enumerateint)r   stream
alignmentsr   format_versionliner   filenameindexnumber
identifierbackbone_filer   r   r   write_header)   s8   





zAlignmentWriter.write_headerc                 C   s   | j }|du rz|j}W n ty   tdw || _ | j}|du r6z|j}W n ty2   tdw || _tj| ||}|S )zWrite a file with the alignments, and return the number of alignments.

        alignments - A Bio.Align.mauve.AlignmentIterator object.
        Nz.alignments do not have an attribute `metadata`z1alignments do not have an attribute `identifiers`)	r
   r   AttributeError
ValueErrorr   r   r   r   
write_file)r   r   r   r   r   countr   r   r   r*   I   s$   

zAlignmentWriter.write_filec                 C   sV  | j }|j\}}|dkrtd|dkrtd|d}g }t|D ]}}|j| j}|j|df }	|j|df }
|	|
kr@d}nd}|
|	}	}
|	|
krR|	dksQJ n|	d7 }	|| }|d	u ry| j	|d }d
| d|	 d|
 d| d| d}nt
|d }d
| d|	 d|
 d| d| d}|| | d}|| q#|d d|S )z<Return a string with a single alignment in the Mauve format.r   zMust have at least one sequencez Non-empty sequences are requiredr   +-r   Nz> : r   z=
 )r
   shaper)   r   range	sequencesidcoordinatesr   r#   r   appendjoin)r   	alignmentr   nmr"   linesir%   startendstrandsequencer$   r!   r   r   r   format_alignmenta   s>   


&$



z AlignmentWriter.format_alignment)NN)
__name__
__module____qualname____doc__fmtr	   r'   r*   rB   __classcell__r   r   r   r   r      s     r   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
AlignmentIteratorzMauve xmfa alignment iterator.r   c                 C   s`  i }d}d}i }|D ]}g ||< q
|D ]^}| ds!| | _ nX|dd   \}}	| |rk|D ]	}||r; nq2td| |dkrLt|	d }	t|t|t|  }
|| |	 |
t|| ksjJ q|	 ||< q|sytdd tt	|d dkr|d d	 |d< d
d |d D | _
ntt	|d t|d ksJ |d | _
|| _d S )NSequence)r   EntryFormat#r   zUnexpected keyword '%s'rK   zEmpty file.r   r   c                 S   s   g | ]}t |qS r   )str).0entryr   r   r   
<listcomp>       z2AlignmentIterator._read_header.<locals>.<listcomp>)
startswithstrip_linesplitendswithr)   r   lenr7   setr   r   )r   r   r   prefixsuffixesid_infosuffixr!   keyvalueseq_numr   r   r   _read_header   s>   





 

zAlignmentIterator._read_headerc           
      C   s   | dsJ |dd  d d\}}}|d\}}t|d }| j| }|dv s,J |d\}}	t|}t|	}	|dkrF|	dksEJ n|d8 }|||	||fS )N>r      r/   z+-r.   r   )rS   rV   r   r   )
r   r!   locusr@   commentsr`   	start_endr%   r>   r?   r   r   r   _parse_description   s   
z$AlignmentIterator._parse_descriptionc                 C   s  g }g }z| j }W n	 ty   Y nw | ` | |}|\}}}}	}
|| |d |D ]}| }|drdd |D }t|\}}g }tt	||D ]w\}\}}|\}}}}	}
t
||| ksfJ |	dkrkn|	dkrt
|||d d f  ||d d f< ntd|	 ||  |7  < |dkrt|}|	dkr| }n|	dkrt||i|d	}ntd|i|d	}| }t|||
d
}|| qOt||  S |dr| |}|\}}}}	}
|| |d q-|d  |7  < q-d S )Nr1   =c                 S   s   g | ]}|  qS r   )encode)rO   seqr   r   r   rQ      rR   z:AlignmentIterator._read_next_alignment.<locals>.<listcomp>r-   r.   zUnexpected strand '%s'r   )length)r5   descriptionrb   r,   )rU   r(   rg   r7   rT   rS   r   parse_printed_alignmentr   ziprX   r)   r   reverse_complementr   )r   r   descriptionsseqsr!   rl   r%   r>   r?   r@   re   r6   recordsr#   rj   recordr   r   r   _read_next_alignment   s\   




&


z&AlignmentIterator._read_next_alignmentN)rC   rD   rE   rF   rG   ra   rg   rt   r   r   r   r   rI      s    (rI   N)
rF   	Bio.Alignr   r   Bio.Seqr   Bio.SeqRecordr   r   rI   r   r   r   r   <module>   s   x