ó
a#nSc           @   sŽ   d  d l  m Z d  d l Z d  d l Z d  d l Z d e f d „  ƒ  YZ d „  Z e d k rŠ d  d l	 Z	 e ƒ  \ Z
 Z e	 j e
 ƒ n  d S(   iÿÿÿÿ(   t   DataStructsNt   VectCollectionc           B   s­   e  Z d  Z d „  Z d „  Z e e ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d	 „  Z d
 „  Z d „  Z e d „ Z d „  Z d „  Z d „  Z d „  Z RS(   s¤  

  >>> vc = VectCollection()
  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((1,3,5))
  >>> vc.AddVect(1,bv1)
  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((6,8))
  >>> vc.AddVect(2,bv1)
  >>> len(vc)
  10
  >>> vc.GetNumBits()
  10
  >>> vc[0]
  0
  >>> vc[1]
  1
  >>> vc[9]
  0
  >>> vc[6]
  1
  >>> vc.GetBit(6)
  1
  >>> list(vc.GetOnBits())
  [1, 3, 5, 6, 8]
  
  keys must be unique, so adding a duplicate replaces the
  previous values:
  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((7,9))
  >>> vc.AddVect(1,bv1)
  >>> len(vc)
  10
  >>> vc[1]
  0
  >>> vc[9]
  1
  >>> vc[6]
  1

  we can also query the children:
  >>> vc.NumChildren()
  2
  >>> cs = vc.GetChildren()
  >>> id,fp = cs[0]
  >>> id
  1
  >>> list(fp.GetOnBits())
  [7, 9]
  >>> id,fp = cs[1]
  >>> id
  2
  >>> list(fp.GetOnBits())
  [6, 8]

  attach/detach operations:
  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((5,6))
  >>> vc.AddVect(3,bv1)
  >>> vc.NumChildren()
  3
  >>> list(vc.GetOnBits())
  [5, 6, 7, 8, 9]
  >>> vc.DetachVectsNotMatchingBit(6)
  >>> vc.NumChildren()
  2
  >>> list(vc.GetOnBits())
  [5, 6, 8]
  

  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((7,9))
  >>> vc.AddVect(1,bv1)
  >>> vc.NumChildren()
  3
  >>> list(vc.GetOnBits())
  [5, 6, 7, 8, 9]
  >>> vc.DetachVectsMatchingBit(6)
  >>> vc.NumChildren()
  1
  >>> list(vc.GetOnBits())
  [7, 9]


  to copy VectCollections, use the copy module:
  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((5,6))
  >>> vc.AddVect(3,bv1)
  >>> list(vc.GetOnBits())
  [5, 6, 7, 9]
  >>> vc2 = copy.copy(vc)
  >>> vc.DetachVectsNotMatchingBit(6)
  >>> list(vc.GetOnBits())
  [5, 6]
  >>> list(vc2.GetOnBits())
  [5, 6, 7, 9]
  
  The Uniquify() method can be used to remove duplicate vectors:
  >>> vc = VectCollection()
  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((7,9))
  >>> vc.AddVect(1,bv1)
  >>> vc.AddVect(2,bv1)
  >>> bv1 = DataStructs.ExplicitBitVect(10)
  >>> bv1.SetBitsFromList((2,3,5))
  >>> vc.AddVect(3,bv1)
  >>> vc.NumChildren()
  3
  >>> vc.Uniquify()
  >>> vc.NumChildren()
  2
  

  
  c         C   s(   i  |  _  d  |  _ d |  _ t |  _ d  S(   Niÿÿÿÿ(   t   _VectCollection__vectst   Nonet   _VectCollection__orVectt   _VectCollection__numBitst   Truet   _VectCollection__needReset(   t   self(    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   __init__‚   s    			c         C   s   |  j  r |  j ƒ  n  |  j S(   N(   R   t   ResetR   (   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt	   GetOrVect‰   s    	c         C   s   | |  j  | <t |  _ d  S(   N(   R   R   R   (   R   t   idt   vect(    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   AddVect�   s    c         C   s¨   |  j  s d  Sd  |  _ |  j s# d  S|  j j ƒ  } t j |  j | d ƒ |  _ |  j j ƒ  |  _ x7 t d t	 | ƒ ƒ D]  } |  j |  j | | O_ qw Wt
 |  _  d  S(   Ni    i   (   R   R   R   R   t   keyst   copyt
   GetNumBitsR   t   ranget   lent   False(   R   t   kst   i(    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyR
   “   s    			c         C   s   t  |  j j ƒ  ƒ S(   N(   R   R   R   (   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   NumChildren    s    c         C   s   t  |  j j ƒ  ƒ S(   N(   t   tupleR   t	   iteritems(   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   GetChildren£   s    c         C   s   |  j  r |  j ƒ  n  |  | S(   N(   R   R
   (   R   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   GetBit¦   s    	c         C   s
   t  |  ƒ S(   N(   R   (   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyR   ª   s    c         C   s#   |  j  r |  j ƒ  n  |  j j ƒ  S(   N(   R   R
   R   t	   GetOnBits(   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyR   ­   s    	c         C   sU   t  |  j j ƒ  ƒ } x9 | D]1 \ } } | j | ƒ s |  j | =t |  _ q q Wd  S(   N(   t   listR   R   R   R   R   (   R   t   bitt   itemst   kt   v(    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   DetachVectsNotMatchingBit²   s
    
c         C   sU   t  |  j j ƒ  ƒ } x9 | D]1 \ } } | j | ƒ r |  j | =t |  _ q q Wd  S(   N(   R   R   R   R   R   R   (   R   R   R   R    R!   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   DetachVectsMatchingBit¹   s
    
c         C   ss  i  } x3 |  j  j ƒ  D]" \ } } t | j ƒ  ƒ | | <q W|  j  j ƒ  } t | ƒ } |  j  j ƒ  } x£ t | ƒ D]• } | | }	 |	 | k rs | |	 }
 | j |	 ƒ } x] t | d | ƒ D]E } | | } | | k r¼ | | } |
 | k r| j | ƒ qq¼ q¼ Wqs qs Wt	 |  _
 i  } x | D] } |  j  | | | <q"W| rfd Gt |  j  ƒ Gd Gt | ƒ GHn  | |  _  d  S(   Ni   s	   uniquify:s   ->(   R   R   R   R   R   R   R   t   indext   removeR   t   _VectCollection__needsReset(   R   t   verboset   oblsR    R!   R   t   nKeyst   keepR   t   k1t   obl1t   idxt   jt   k2t   obl2t   tmp(    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   UniquifyÀ   s0    



	 #c         C   s   |  j  r |  j ƒ  n  |  j S(   N(   R   R
   R   (   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   __len__Ü   s    	c         C   s&   |  j  r |  j ƒ  n  |  j j | ƒ S(   N(   R   R
   R   R   (   R   R   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   __getitem__à   s    	c         C   s�   t  j d t |  j ƒ ƒ } x{ |  j j ƒ  D]j \ } } | t  j d | ƒ 7} | j ƒ  } t | ƒ } | t  j d | ƒ 7} | t  j d | | ƒ 7} q+ W| S(   Ns   <Is   %ds(   t   structt   packR   R   R   t   ToBinary(   R   t   pklR    R!   t   pt   l(    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   __getstate__è   s    c   
      C   s0  i  |  _  d  |  _ d |  _ t |  _ t j d ƒ } d } t j d | | | | !ƒ d } | | 7} xÅ t	 | ƒ D]· } t j d | | | | !ƒ d } | | 7} t j d | | | | !ƒ d } | | 7} t j d | ƒ } t
 j t j d | | | | | !ƒ d ƒ }	 | | 7} |  j | |	 ƒ qq Wd  S(   Niÿÿÿÿt   Ii    s   <Is   %ds(   R   R   R   R   R   R   R5   t   calcsizet   unpackR   R    t   ExplicitBitVectR   (
   R   R8   t   szIt   offsett   nToReadR   R    R:   t   szt   bv(    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   __setstate__ò   s"    				!
!
!
.
(   t   __name__t
   __module__t   __doc__R	   R   t   propertyt   orVectR   R
   R   R   R   R   R   R"   R#   R   R2   R3   R4   R;   RE   (    (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyR      s$   s														
c          C   s,   d d  l  }  d d  l } |  j | j d ƒ S(   Niÿÿÿÿt   __main__(   t   doctestt   syst   testmodt   modules(   RL   RM   (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   _test  s    RK   (   t   rdkitR    R   R5   t   cPicklet   objectR   RP   RF   RM   t   failedt   triedt   exit(    (    (    sb   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/DataStructs/VectCollection.pyt   <module>   s   $ý	