ó
a#nSc           @   s’   d  d l  m Z d  d l Z d  d l Z d  d l  m 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   ChemN(   t   RDConfigt   SaltRemoverc           B   s\   e  Z e j j e j d  ƒ Z d Z	 d Z
 d d d „ Z d „  Z e d „ Z e d „ Z RS(   s	   Salts.txtc         C   s)   | r | |  _  n  | |  _ |  j ƒ  d  S(   N(   t   defnFilenamet   defnDatat   _initPatterns(   t   selfR   R   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyt   __init__,   s    	c         C   së   t  j d ƒ } |  j r: d d l m } | |  j ƒ } n t |  j d ƒ } g  |  _ x� | D]‡ } | j ƒ  j	 d ƒ d } | r\ | j	 | ƒ } y t
 j | d ƒ } Wn& d d l } | j ƒ  t | ‚ n X|  j j | ƒ q\ q\ Wd S(   s¥   

    >>> remover = SaltRemover()
    >>> len(remover.salts)>0
    True

    >>> remover = SaltRemover(defnData="[Cl,Br]")
    >>> len(remover.salts)
    1
    
    s   [\t ]+iÿÿÿÿ(   t   StringIOt   rs   //i    N(   t   ret   compileR   t	   cStringIOR   t   fileR   t   saltst   stript   splitR    t   MolFromSmartst	   tracebackt	   print_exct
   ValueErrort   append(   R   t
   whitespaceR   t   inFt   linet   splitLt   saltR   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyR   2   s"    		
c         C   sÒ   d „  } | r. t  t j | ƒ ƒ d k r. | St } xo t |  j ƒ D]^ \ } } | | | | ƒ } | | k	 rD | } t } | r¢ t  t j | ƒ ƒ d k r¢ Pq¢ qD qD W| rÎ | j ƒ  d k rÎ t j | ƒ n  | S(   së  

    >>> remover = SaltRemover(defnData="[Cl,Br]")
    >>> len(remover.salts)
    1

    >>> mol = Chem.MolFromSmiles('CN(C)C.Cl')
    >>> res = remover.StripMol(mol)
    >>> res is not None
    True
    >>> res.GetNumAtoms()
    4

    Notice that all salts are removed:
    >>> mol = Chem.MolFromSmiles('CN(C)C.Cl.Cl.Br')
    >>> res = remover.StripMol(mol)
    >>> res.GetNumAtoms()
    4

    Matching (e.g. "salt-like") atoms in the molecule are unchanged:
    >>> mol = Chem.MolFromSmiles('CN(Br)Cl')
    >>> res = remover.StripMol(mol)
    >>> res.GetNumAtoms()
    4

    >>> mol = Chem.MolFromSmiles('CN(Br)Cl.Cl')
    >>> res = remover.StripMol(mol)
    >>> res.GetNumAtoms()
    4

    Charged salts are handled reasonably:
    >>> mol = Chem.MolFromSmiles('C[NH+](C)(C).[Cl-]')
    >>> res = remover.StripMol(mol)
    >>> res.GetNumAtoms()
    4


    Watch out for this case (everything removed):
    >>> remover = SaltRemover()
    >>> len(remover.salts)>1
    True
    >>> mol = Chem.MolFromSmiles('CC(=O)O.[Na]')
    >>> res = remover.StripMol(mol)
    >>> res.GetNumAtoms()
    0

    dontRemoveEverything helps with this by leaving the last salt:
    >>> res = remover.StripMol(mol,dontRemoveEverything=True)
    >>> res.GetNumAtoms()
    4

    but in cases where the last salts are the same, it can't choose
    between them, so it returns all of them:
    >>> mol = Chem.MolFromSmiles('Cl.Cl')
    >>> res = remover.StripMol(mol,dontRemoveEverything=True)
    >>> res.GetNumAtoms()
    2

    c         S   sÆ   |  j  ƒ  } | s |  S|  } t j | | t ƒ } | sP | rT | j  ƒ  d k rT | S| } xe | j  ƒ  rÁ | | j  ƒ  k rÁ | j  ƒ  } t j | | t ƒ } | r¸ | j  ƒ  d k r¸ Pq] | } q] W| S(   Ni    (   t   GetNumAtomsR    t   DeleteSubstructst   True(   t   mR   t   notEverythingt   nAtst   rest   t(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyt   _applyPattern�   s    !
i   i    (	   t   lenR    t   GetMolFragst   Falset	   enumerateR   R   R   t   SanitizeMol(   R   t   molt   dontRemoveEverythingR#   t   modifiedt   iR   t   tMol(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyt   StripMolQ   s    <	!!c         C   s   |  j  | d | ƒS(   så   

    >>> remover = SaltRemover(defnData="[Cl,Br]")
    >>> len(remover.salts)
    1

    >>> mol = Chem.MolFromSmiles('CN(C)C.Cl')
    >>> res = remover(mol)
    >>> res is not None
    True
    >>> res.GetNumAtoms()
    4

    R*   (   R.   (   R   R)   R*   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyt   __call__¯   s    N(   t   __name__t
   __module__t   ost   patht   joinR   t	   RDDataDirR   t   NoneR   R   R   R   R&   R.   R/   (    (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyR   (   s   	^c          C   s,   d d  l  }  d d  l } |  j | j d ƒ S(   Niÿÿÿÿt   __main__(   t   doctestt   syst   testmodt   modules(   R8   R9   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyt   _testÅ   s    R7   (   t   rdkitR    R2   R
   R   t   objectR   R<   R0   R9   t   failedt   triedt   exit(    (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Chem/SaltRemover.pyt   <module>#   s   �	