ó
Y_Sc           @   sb   d  Z  d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 S(
   sà   Provides functionality of a linked list.

Each node has one (or none) predecessor, and an arbitrary number of successors.
Nodes can store arbitrary data in a NodeData class.

Subclassed by Trees to store phylogenetic trees.
t   ChainExceptionc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR       s   t   NodeExceptionc           B   s   e  Z RS(    (   R   R   (    (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR      s   t   Chainc           B   sk   e  Z d  Z d „  Z d „  Z d „  Z d d „ Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z RS(   s0   Stores a list of nodes that are linked together.c         C   s   i  |  _  d |  _ d S(   s   Initiates a node chain.iÿÿÿÿN(   t   chaint   id(   t   self(    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   __init__   s    	c         C   s   |  j  d 7_  |  j  S(   s&   Gets a new id for a node in the chain.i   (   R   (   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   _get_id   s    c         C   s   t  |  j j ƒ  ƒ S(   s   Return a list of all node ids.(   t   listR   t   keys(   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   all_ids$   s    c         C   sŽ   | d k	 r4 | |  j k r4 t d t | ƒ ƒ ‚ nV |  j ƒ  } | j | ƒ | j | ƒ | d k	 r} |  j | j | ƒ n  | |  j | <| S(   s   Attaches node to another.s   Unknown predecessor: N(   t   NoneR   R    t   strR	   t   set_idt   set_prevt   add_succ(   R   t   nodet   prevR   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   add(   s    c         C   s¹   | |  j  k r( t d t | ƒ ƒ ‚ n  |  j  | j ƒ  } |  j  | j | ƒ |  j  | j ƒ  } x" | D] } |  j  | j | ƒ qi W|  j  | j | ƒ |  j  | } |  j | ƒ | S(   s>   Deletes node from chain and relinks successors to predecessor.s   Unknown ID: (	   R   R    R   t   get_prevt   remove_succt   get_succR   R   t   kill(   R   R   t   prev_idt   succ_idst   iR   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   collapse5   s    c         C   s6   | |  j  k r( t d t | ƒ ƒ ‚ n
 |  j  | =d S(   s?   Kills a node from chain without caring to what it is connected.s   Unknown ID: N(   R   R    R   (   R   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   C   s    c         C   s‰   | |  j  k r( t d t | ƒ ƒ ‚ n] |  j  | j } | d k	 rq |  j  | j j |  j  | j j | ƒ ƒ n  d |  j  | _ | Sd S(   s&   Disconnects node from his predecessor.s   Unknown ID: N(   R   R    R   R   R   t   succt   popt   index(   R   R   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   unlinkJ   s    -c         C   sŒ   | |  j  k r( t d t | ƒ ƒ ‚ n` | |  j  k rP t d t | ƒ ƒ ‚ n8 |  j | ƒ |  j  | j j | ƒ |  j  | j | ƒ d S(   s   Connects son to parent.s   Unknown ID: N(   R   R    R   R    R   t   appendR   (   R   t   parentt   child(    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   linkU   s    c         C   se   | | k s% | |  j  | j ƒ  k r) t Sx5 |  j  | j ƒ  D] } |  j | | ƒ r= t Sq= Wt Sd S(   s+   Check if grandchild is a subnode of parent.N(   R   R   t   Truet   is_parent_oft   False(   R   R"   t
   grandchildt   sn(    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR&   `   s    %c         C   s›   | |  j  k s | |  j  k r- t d ƒ ‚ n  |  j | | ƒ sL | | k rP g  SxD |  j  | j ƒ  D]/ } |  j | | ƒ rd | g |  j | | ƒ Sqd Wd S(   sR   Returns a list of all node_ids between two nodes (excluding start, including end).s   Unknown node.N(   R   R   R&   R   t   trace(   R   t   startt   finishR)   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR*   k   s    N(   R   R   t   __doc__R   R	   R   R   R   R   R   R    R$   R&   R*   (    (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR      s   								t   Nodec           B   st   e  Z 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 RS(   s   A single node.c         C   s(   d |  _ | |  _ d |  _ g  |  _ d S(   s?   Represents a node with one predecessor and multiple successors.N(   R   R   t   dataR   R   (   R   R/   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   y   s    			c         C   s+   |  j  d k	 r t d ƒ ‚ n  | |  _  d S(   s&   Sets the id of a node, if not set yet.s   Node id cannot be changed.N(   R   R   R   (   R   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   €   s    c         C   s   |  j  S(   s   Returns the node's id.(   R   (   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   get_id†   s    c         C   s   |  j  S(   s(   Returns a list of the node's successors.(   R   (   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   Š   s    c         C   s   |  j  S(   s)   Returns the id of the node's predecessor.(   R   (   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   Ž   s    c         C   s<   t  | t g  ƒ ƒ r( |  j j | ƒ n |  j j | ƒ d S(   s(   Adds a node id to the node's successors.N(   t
   isinstancet   typeR   t   extendR!   (   R   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   ’   s    c         C   s   |  j  j | ƒ d S(   s-   Removes a node id from the node's successors.N(   R   t   remove(   R   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   ™   s    c         C   s1   t  | t g  ƒ ƒ s$ t d ƒ ‚ n  | |  _ d S(   s   Sets the node's successors.s$   Node successor must be of list type.N(   R1   R2   R   R   (   R   t   new_succ(    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   set_succ   s    c         C   s   | |  _  d S(   s   Sets the node's predecessor.N(   R   (   R   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR   £   s    c         C   s   |  j  S(   s   Returns a node's data.(   R/   (   R   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   get_data§   s    c         C   s   | |  _  d S(   s   Sets a node's data.N(   R/   (   R   R/   (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   set_data«   s    N(   R   R   R-   R   R   R   R0   R   R   R   R   R6   R   R7   R8   (    (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyR.   v   s   									N(   R-   t	   ExceptionR    R   t   objectR   R.   (    (    (    sE   /home/psgendb/BIRCHDEV/pkg/weblogo-3.4/corebio/seq_io/_nexus/Nodes.pyt   <module>   s   _