3
ëyû^Z%  ã               @   s|   d dl mZmZmZmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZejeƒZG dd„ dƒZdS )é    )Úabsolute_importÚdivisionÚprint_functionÚunicode_literalsNc               @   s>  e Zd ZdZeƒ ZdZdZdd„ Zdd„ Z	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZdJdd„ZdKdd„Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Z d6d7„ Z!d8d9„ Z"d:d;„ Z#d<d=„ Z$d>d?„ Z%d@dA„ Z&dBdC„ Z'dDdE„ Z(e)dFdG„ ƒZ*dHdI„ Z+dS )LÚTNodeaR  
    generic Trinity graph node object representing a node in the Trinity isoform reconstruction graph

    Node's are objects within a gene and can be shared among transcript isoforms.

    instance members include:

        tgraph : (TGraph obj) graph for the Trinity gene, which will hold the nodes.

        transcripts: list(str) names of the isoforms that contains this node.

        loc_node_id : (int) identifier of the node

        seq : (str)  nucleotide sequence for this node in the transcript

        len : (int)  length of the node sequence

        prev : (set) node objects connected as parental nodes in the graph

        next : (set) node objects connected as descendant nodes in the graph

    class members include:

        merged_nodeset_counter : (int) tracking nodes that get merged under squeeze operations.
        
    r   c             C   sŽ   t |ƒdkrtdƒ‚|| _tƒ | _| j|ƒ || _|| _t |ƒ| _ t j	d7  _	tj	| _
tƒ | _tƒ | _tƒ | _tƒ | _d| _d| _d| _dS )zi
        constructor, but don't use directly.... instead, use TGraph.get_node() factory function
        r   z?Error, TNode instantiation requires node sequence of length > 0é   FNéÿÿÿÿ)ÚlenÚRuntimeErrorÚtgraphÚsetÚtranscriptsÚadd_transcriptsÚloc_node_idÚseqr   Úall_nodes_counterÚ_idÚprevÚnextÚstashed_prevÚstashed_nextÚtouchedÚdeadÚtopological_order)Úselfr   Útranscript_idr   Únode_seq© r   úI/broad/hptmp/bhaas/trinityrnaseq/Analysis/SuperTranscripts/pylib/TNode.pyÚ__init__6   s"    

zTNode.__init__c             C   s   | j S )N)r   )r   r   r   r   Úget_idX   s    zTNode.get_idc             C   s   | j S )N)r   )r   r   r   r   Ú
get_loc_id\   s    zTNode.get_loc_idc             C   s
   || _ d S )N)r   )r   r   r   r   r   Ú
set_loc_id_   s    zTNode.set_loc_idc             C   s
   | j jƒ S )N)r   Úget_gene_id)r   r   r   r   r#   c   s    zTNode.get_gene_idc             C   s    | j ƒ }| jƒ }|d | }|S )Nz::)r#   r!   )r   Úgene_idZloc_idÚnode_idr   r   r   Úget_gene_node_idf   s    zTNode.get_gene_node_idc             C   s   | j S )N)r   )r   r   r   r   Úget_touched_valo   s    zTNode.get_touched_valc             C   s   | j S )N)r   )r   r   r   r   Úis_deadr   s    zTNode.is_deadNc             C   sd   |d krt ƒ }|| krdS || jkr(dS |j| ƒ x,| jD ]"}||krHq:|j||ƒ}|r:dS q:W dS )NTF)r   r   ÚaddÚis_ancestral)r   ÚnodeÚvisitedZ	prev_nodeÚfoundr   r   r   r*   u   s    

zTNode.is_ancestralc             C   sb   |d krt ƒ }|| krdS || jkr(dS |j| ƒ x*| jD ] }||kr:|j||ƒ}|r:dS q:W dS )NTF)r   r   r)   Úis_descendant)r   r+   r,   Ú	next_noder-   r   r   r   r.   “   s    

zTNode.is_descendantc             C   s   | j S )N)r   )r   r   r   r   Ú	get_graph¨   s    zTNode.get_graphc             C   s   | j S )N)r   )r   r   r   r   Úget_seq«   s    zTNode.get_seqc             C   s
   || _ d S )N)r   )r   r   r   r   r   Úset_seq¯   s    zTNode.set_seqc             C   s   | j S )N)r   )r   r   r   r   Úget_topological_order³   s    zTNode.get_topological_orderc             C   s
   || _ d S )N)r   )r   Z
topo_orderr   r   r   Úset_topological_order¶   s    zTNode.set_topological_orderc             C   s   | j S )N)r   )r   r   r   r   Úget_transcripts¹   s    zTNode.get_transcriptsc             C   s@   t |ƒtkr| jj|ƒ n"t |ƒtkr4| jj|ƒ ntdƒ‚d S )Nz+Error, parameter must be a string or a set )Útyper   r   ÚupdateÚstrr)   r
   )r   Ztranscript_name_or_setr   r   r   r   ¼   s
    zTNode.add_transcriptsc             C   s
   t | jƒS )N)r   r   )r   r   r   r   Úget_prev_nodesÄ   s    zTNode.get_prev_nodesc             C   s
   t | jƒS )N)r   r   )r   r   r   r   Úget_next_nodesÇ   s    zTNode.get_next_nodesc             C   s   | j j|ƒ d S )N)r   r)   )r   Znext_node_objr   r   r   Úadd_next_nodeÊ   s    zTNode.add_next_nodec             C   s   | j j|ƒ d S )N)r   Úremove)r   Úremove_node_objr   r   r   Úremove_next_nodeÍ   s    zTNode.remove_next_nodec             C   s   | j |ƒ | jj|ƒ d S )N)r>   r   r)   )r   Ústash_node_objr   r   r   Ústash_next_nodeÐ   s    
zTNode.stash_next_nodec             C   s   | j j|ƒ d S )N)r   r)   )r   Zprev_node_objr   r   r   Úadd_prev_nodeÔ   s    zTNode.add_prev_nodec             C   s   | j j|ƒ d S )N)r   r<   )r   r=   r   r   r   Úremove_prev_node×   s    zTNode.remove_prev_nodec             C   s   | j |ƒ | jj|ƒ d S )N)rB   r   r)   )r   r?   r   r   r   Ústash_prev_nodeÚ   s    
zTNode.stash_prev_nodec             C   s0   | j j| jƒ tƒ | _| jj| jƒ tƒ | _d S )N)r   r7   r   r   r   r   )r   r   r   r   Úrestore_stashed_nodesß   s    zTNode.restore_stashed_nodesc             C   s*   t ƒ }x| jƒ D ]}|j|jƒ ƒ qW |S )N)Úlistr9   Úappendr!   )r   Úloc_idsr+   r   r   r   Úget_prev_node_loc_idsæ   s    zTNode.get_prev_node_loc_idsc             C   s*   t ƒ }x| jƒ D ]}|j|jƒ ƒ qW |S )N)rE   r:   rF   r!   )r   rG   r+   r   r   r   Úget_next_node_loc_idsì   s    zTNode.get_next_node_loc_idsc             C   s   | j S )N)r   )r   r   r   r   Ú__repr__ò   s    zTNode.__repr__c             C   s   |  j d7  _ d S )Nr   )r   )r   r   r   r   Útouch÷   s    zTNode.touchc             C   s   |  j d8  _ d S )Nr   )r   )r   r   r   r   Úuntouchú   s    zTNode.untouchc             C   s
   d| _ d S )Nr   )r   )r   r   r   r   Úclear_touchý   s    zTNode.clear_touchc             C   sz   t dt | jƒ ƒ d t | jƒ ƒ d t | jƒ ƒ d t | jƒ d | jƒ  ƒ}| jdkrh|dj| jƒ7 }| jrv|d7 }|S )	Nzprev: z, me: z, next: z, transcripts: z, r   z, topo_order={}z ** dead ** )	r8   rH   r!   rI   r   r1   r   Úformatr   )r   Útxtr   r   r   ÚtoString  s    L
zTNode.toStringc       	      C   s˜   t jdj|ƒƒ d}t jd7  _djtjƒ}|d jƒ }x>|D ]6}t jdj|jƒ ƒƒ |jƒ }||7 }|j|jƒ ƒ}q@W |d j	ƒ }t||||ƒ}|S )z„
        Merges linear stretches of nodes into a single new node that has
        concatenated sequences of the input nodes
        zMerging nodes: {}Ú r   zM{}r   znode being merge: {})
ÚloggerÚdebugrN   r   Úmerged_nodeset_counterr5   rP   r1   Úintersectionr0   )	ÚclsZ	node_listZmerged_node_seqZmerged_loc_node_idr   Únode_objr   r   Zmerged_noder   r   r   Úmerge_nodes  s    
zTNode.merge_nodesc             C   s´   | j ƒ r| jƒ rdS t| j ƒ ƒdks4t| jƒ ƒdkr8dS t| jƒ ƒdkrtt| j ƒ ƒdkrtt| jƒ jƒ j ƒ ƒdkrtdS t| jƒ ƒdkr°t| j ƒ ƒdkr°t| j ƒ jƒ jƒ ƒdkr°dS dS )aB  
        returns true if node (x) is in this graphical context:

          X                               X
            \           or               /
         C-- A--?                   ?-- A--B

         where X dangles.


         So, X has only one parent or child and not otherwise connected in the graph.

         Fr   r   T)r9   r:   r	   Úpop)r   r   r   r   Úis_burr1  s     zTNode.is_burr)N)N),Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚdictÚ
node_cacherT   r   r   r    r!   r"   r#   r&   r'   r(   r*   r.   r0   r1   r2   r3   r4   r5   r   r9   r:   r;   r>   r@   rA   rB   rC   rD   rH   rI   rJ   rK   rL   rM   rP   ÚclassmethodrX   rZ   r   r   r   r   r      sN   "	

 r   )Ú
__future__r   r   r   r   ÚosÚsysÚreÚloggingÚargparseÚcollectionsÚnumpyÚtimeÚTGraphÚ	getLoggerr[   rR   r   r   r   r   r   Ú<module>   s   
