B
    ‰°bÜ  ã               @   sV   d Z ddlm  mZ ddlmZ G dd„ deƒZdd„ Z	dd	„ Z
d
d„ Zdd„ ZdS )zAModule for the support of Motif Alignment and Search Tool (MAST).é    N)Úmemec               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚRecordaq  The class for holding the results from a MAST run.

    A mast.Record holds data about matches between motifs and sequences.
    The motifs held by the Record are objects of the class meme.Motif.

    The mast.Record class inherits from list, so you can access individual
    motifs in the record by their index. Alternatively, you can find a motif
    by its name:

    >>> from Bio import motifs
    >>> with open("motifs/mast.crp0.de.oops.txt.xml") as f:
    ...     record = motifs.parse(f, 'MAST')
    >>> motif = record[0]
    >>> print(motif.name)
    1
    >>> motif = record['1']
    >>> print(motif.name)
    1
    c             C   s(   g | _ d| _d| _i | _d| _d| _dS )zInitialize the class.Ú N)Ú	sequencesÚversionÚdatabaseÚdiagramsÚalphabetÚstrand_handling)Úself© r   ú.lib/python3.7/site-packages/Bio/motifs/mast.pyÚ__init__"   s    zRecord.__init__c             C   s8   t |tƒr(x(| D ]}|j|kr|S qW nt | |¡S dS )zReturn the motif of index key.N)Ú
isinstanceÚstrÚnameÚlistÚ__getitem__)r   ÚkeyÚmotifr   r   r   r   +   s
    



zRecord.__getitem__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   	r   c             C   sL   t ƒ }yt | ¡}W n tjk
r2   tdƒ‚Y nX t||ƒ t||ƒ |S )z2Parse a MAST XML format handle as a Record object.zOImproper MAST XML input file. XML root tag should start with <mast version= ...)r   ÚETÚparseZ
ParseErrorÚ
ValueErrorÚ__read_metadataÚ__read_sequences)ZhandleÚrecordÚxml_treer   r   r   Úread5   s    

r!   c             C   s¾   |  ¡  d¡| _| d¡ d¡ d¡| _| d¡ d¡| _| d¡ d¡| _xlt| d	¡ d
¡ƒD ]T\}}t	 
| j¡}t|d ƒ|_| d¡|_| d¡|_t| d¡ƒ|_|  |¡ qbW d S )Nr   Zsequence_dbsZsequence_dbÚsourcer	   r   Zsettingsr
   Zmotifsr   é   ÚidZaltÚlength)ZgetrootÚgetr   Úfindr   r	   r
   Ú	enumerateÚfindallr   ZMotifr   r   r$   Zalt_idÚintr%   Úappend)r   r    ÚiZ
motif_treer   r   r   r   r   F   s    r   c             C   sH   xB|  d¡ d¡D ].}| d¡}| j |¡ t| |ƒ}|| j|< qW dS )z+Read sequences from XML ElementTree object.r   Zsequencer   N)r'   r)   r&   r   r+   Ú__make_diagramr   )r   r    Úsequence_treeZsequence_nameZdiagram_strr   r   r   r   W   s
    

r   c          	   C   sf  t | d¡ƒ}g g g   }}}xŽ| d¡D ]€}xz| d¡D ]l}t | d¡ƒ}|sZ|d }	n |t |d  d¡ƒ |d j }	| |	¡ | | t | d¡ƒ ¡ | |¡ q:W q*W |sºt|ƒS | jdkrÚd	d
„ t||ƒD ƒ}
n2| jdkrúdd
„ t||ƒD ƒ}
ntd| j› dƒ‚|t |d  d¡ƒ |d j d }dd
„ t||
ƒD ƒt|ƒg }dd
„ |D ƒ}d 	|¡S )z?Make diagram string found in text file based on motif hit info.r%   ZsegZhitÚposr#   éÿÿÿÿÚidxZcombinec             S   s4   g | ],\}}d |  d¡dkr dnd› |j› d‘qS )ú[ZrcÚyú-ú+ú])r&   r   )Ú.0Úhit_eleÚ	hit_motifr   r   r   ú
<listcomp>s   s   z"__make_diagram.<locals>.<listcomp>Z
unstrandedc             S   s   g | ]\}}d |j › d‘qS )r2   r6   )r   )r7   r8   r9   r   r   r   r:   x   s    zStrand handling option z not parsablec             S   s   g | ]}|D ]}t |ƒ‘qqS r   )r   )r7   ZpairÚsr   r   r   r:   €   s    c             S   s   g | ]}|d kr|‘qS )Ú0r   )r7   r;   r   r   r   r:   „   s    r4   )
r*   r&   r)   r%   r+   r   r
   ÚzipÚ	ExceptionÚjoin)r   r.   Zsequence_lengthZhit_elesZ
hit_motifsZgapsZseg_treer8   Zhit_posZgapZ
motif_strsZtail_lengthZmotifs_with_gapsr   r   r   r-   a   s0    
 


$r-   )r   Zxml.etree.ElementTreeZetreeZElementTreer   Z
Bio.motifsr   r   r   r!   r   r   r-   r   r   r   r   Ú<module>   s   (
