ó
ƒå˜[c           @` 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 d d d „  ƒ  YZ d S(   i    (   t   absolute_importt   divisiont   print_functiont   unicode_literalsNt   TNodec           B` sj  e  Z d  Z e ƒ  Z d Z d Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z d	 „  Z d% d
 „ Z d% d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d  „  Z& d! „  Z' d" „  Z( e) d# „  ƒ Z* d$ „  Z+ RS(&   uR  
    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.
        
    i    c         C` sÎ   t  | ƒ d k r! t d ƒ ‚ n  | |  _ t ƒ  |  _ |  j | ƒ | |  _ | |  _ t  | ƒ |  _  t j	 d 7_	 t j	 |  _
 t ƒ  |  _ t ƒ  |  _ t ƒ  |  _ t ƒ  |  _ d |  _ t |  _ d |  _ d S(   ui   
        constructor, but don't use directly.... instead, use TGraph.get_node() factory function
        i    u?   Error, TNode instantiation requires node sequence of length > 0i   iÿÿÿÿN(   t   lent   RuntimeErrort   tgrapht   sett   transcriptst   add_transcriptst   loc_node_idt   seqR   t   all_nodes_countert   _idt   prevt   nextt   stashed_prevt   stashed_nextt   touchedt   Falset   deadt   topological_order(   t   selfR   t   transcript_idR   t   node_seq(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   __init__6   s"    					c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_idX   s    c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt
   get_loc_id\   s    c         C` s   | |  _  d  S(   N(   R   (   R   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt
   set_loc_id_   s    c         C` s   |  j  j ƒ  S(   N(   R   t   get_gene_id(   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyR   c   s    c         C` s*   |  j  ƒ  } |  j ƒ  } | d | } | S(   Nu   ::(   R   R   (   R   t   gene_idt   loc_idt   node_id(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_gene_node_idf   s    c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_touched_valo   s    c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   is_deadr   s    c         C` s‹   | d  k r t ƒ  } n  | |  k r( t S| |  j k r; t S| j |  ƒ x< |  j D]1 } | | k rg qR | j | | ƒ } | rR t SqR Wt S(   N(   t   NoneR   t   TrueR   t   addt   is_ancestralR   (   R   t   nodet   visitedt	   prev_nodet   found(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyR(   u   s    c         C` s‹   | d  k r t ƒ  } n  | |  k r( t S| |  j k r; t S| j |  ƒ x< |  j D]1 } | | k rR | j | | ƒ } | rƒ t SqR qR Wt S(   N(   R%   R   R&   R   R'   t   is_descendantR   (   R   R)   R*   t	   next_nodeR,   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyR-   “   s    c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt	   get_graph¨   s    c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_seq«   s    c         C` s   | |  _  d  S(   N(   R   (   R   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   set_seq¯   s    c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_topological_order³   s    c         C` s   | |  _  d  S(   N(   R   (   R   t
   topo_order(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   set_topological_order¶   s    c         C` s   |  j  S(   N(   R	   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_transcripts¹   s    c         C` sZ   t  | ƒ t k r% |  j j | ƒ n1 t  | ƒ t k rJ |  j j | ƒ n t d ƒ ‚ d  S(   Nu+   Error, parameter must be a string or a set (   t   typeR   R	   t   updatet   strR'   R   (   R   t   transcript_name_or_set(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyR
   ¼   s
    c         C` s   t  |  j ƒ S(   N(   R   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_prev_nodesÄ   s    c         C` s   t  |  j ƒ S(   N(   R   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_next_nodesÇ   s    c         C` s   |  j  j | ƒ d  S(   N(   R   R'   (   R   t   next_node_obj(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   add_next_nodeÊ   s    c         C` s   |  j  j | ƒ d  S(   N(   R   t   remove(   R   t   remove_node_obj(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   remove_next_nodeÍ   s    c         C` s!   |  j  | ƒ |  j j | ƒ d  S(   N(   R@   R   R'   (   R   t   stash_node_obj(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   stash_next_nodeÐ   s    c         C` s   |  j  j | ƒ d  S(   N(   R   R'   (   R   t   prev_node_obj(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   add_prev_nodeÔ   s    c         C` s   |  j  j | ƒ d  S(   N(   R   R>   (   R   R?   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   remove_prev_node×   s    c         C` s!   |  j  | ƒ |  j j | ƒ d  S(   N(   RE   R   R'   (   R   RA   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   stash_prev_nodeÚ   s    c         C` sB   |  j  j |  j ƒ t ƒ  |  _ |  j j |  j ƒ t ƒ  |  _ d  S(   N(   R   R7   R   R   R   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   restore_stashed_nodesß   s    c         C` s7   t  ƒ  } x' |  j ƒ  D] } | j | j ƒ  ƒ q W| S(   N(   t   listR:   t   appendR   (   R   t   loc_idsR)   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_prev_node_loc_idsæ   s    	c         C` s7   t  ƒ  } x' |  j ƒ  D] } | j | j ƒ  ƒ q W| S(   N(   RH   R;   RI   R   (   R   RJ   R)   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   get_next_node_loc_idsì   s    	c         C` s   |  j  S(   N(   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   __repr__ò   s    c         C` s   |  j  d 7_  d  S(   Ni   (   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   touch÷   s    c         C` s   |  j  d 8_  d  S(   Ni   (   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   untouchú   s    c         C` s   d |  _  d  S(   Ni    (   R   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   clear_touchý   s    c         C` s¥   t  d t  |  j ƒ  ƒ d t  |  j ƒ  ƒ d t  |  j ƒ  ƒ d t  |  j ƒ d |  j ƒ  ƒ } |  j d k r‹ | d j |  j ƒ 7} n  |  j r¡ | d 7} n  | S(	   Nu   prev: u   , me: u   , next: u   , transcripts: u   , i    u   , topo_order={}u    ** dead ** (	   R8   RK   R   RL   R	   R0   R   t   formatR   (   R   t   txt(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   toString  s    `	c   	      C` sÎ   t  j d j | ƒ ƒ d } t j d 7_ d j t j ƒ } | d j ƒ  } xU | D]M } t  j d j | j ƒ  ƒ ƒ | j ƒ  } | | 7} | j | j ƒ  ƒ } qT W| d j	 ƒ  } t | | | | ƒ } | S(   u„   
        Merges linear stretches of nodes into a single new node that has
        concatenated sequences of the input nodes
        u   Merging nodes: {}u    i   u   M{}i    u   node being merge: {}(
   t   loggert   debugRQ   R   t   merged_nodeset_counterR5   RS   R0   t   intersectionR/   (	   t   clst	   node_listt   merged_node_seqt   merged_loc_node_idR	   t   node_objR   R   t   merged_node(    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   merge_nodes  s    
c         C` s  |  j  ƒ  r |  j ƒ  r t St |  j  ƒ  ƒ d k sL t |  j ƒ  ƒ d k rP t St |  j ƒ  ƒ d k r¨ t |  j  ƒ  ƒ d k r¨ t |  j ƒ  j ƒ  j  ƒ  ƒ d k r¨ t St |  j ƒ  ƒ d k r t |  j  ƒ  ƒ d k r t |  j  ƒ  j ƒ  j ƒ  ƒ d k r t St S(   uB  
        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.

         i   i    (   R:   R;   R   R   t   popR&   (   R   (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   is_burr1  s    0$$N(,   t   __name__t
   __module__t   __doc__t   dictt
   node_cacheRV   R   R   R   R   R   R   R"   R#   R$   R%   R(   R-   R/   R0   R1   R2   R4   R5   R
   R:   R;   R=   R@   RB   RD   RE   RF   RG   RK   RL   RM   RN   RO   RP   RS   t   classmethodR^   R`   (    (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyR      sN   		"																															 (    (   t
   __future__R    R   R   R   t   ost   syst   ret   loggingt   argparset   collectionst   numpyt   timet   TGrapht	   getLoggerRa   RT   R   (    (    (    su   /oak/stanford/groups/akundaje/marinovg/programs/trinityrnaseq-Trinity-v2.8.4/Analysis/SuperTranscripts/pylib/TNode.pyt   <module>   s   "$