ó
Í%�Tc        F   @   sD  d  d l  Z  d  d l m Z m Z d  d l Z d  d l m Z d  d l m Z m	 Z	 m
 Z
 d Z d Z d Z e j d ƒ Z i e j d	 6e j d
 6e j d 6e j d 6Z i d d 6d d 6d  d	 6Z i d d 6d d 6i d d 6d d 6i d d 6d d 6i d d 6d d 6i d d 6d d 6i d d 6d d 6i d d 6d  d 6i d! d 6d" d 6i d# d 6d$ d 6i d% d 6d& d 6i d' d 6d( d 6i d) d 6d* d 6i d+ d 6d, d 6i d- d 6d. d 6i d/ d 6d0 d 6i d1 d 6d2 d 6i d3 d 6d4 d 6i d5 d 6d6 d 6i d7 d 6d8 d 6i d9 d 6d: d 6i d; d 6d< d 6d= d> 6i d? d 6d@ d 6dA d> 6i dB d 6dC d 6i dD d 6dE d 6i dF d 6dG d 6i dH d 6dI d 6i dJ d 6dK d 6i dL d 6dM d 6i dN d 6dO d 6dA d> 6i dP d 6dQ d 6d= d> 6i dR d 6dS d 6dT d> 6i dU d 6dV d 6dT d> 6i dW d 6dX d 6d d> 6dY dZ 6i d[ d 6d\ d 6d d> 6dY dZ 6i d] d 6d^ d 6d
 d> 6i d_ d 6d` d 6d	 d> 6g$ Z x. e D]& Z e j e d j da ƒ ƒ e d <q‰Wi db d 6dc d 6dd de 6i df d 6dg d 6dh de 6i di d 6dj d 6dk de 6i dl d 6dm d 6dk de 6i dn d 6do d 6dk de 6i dp d 6dq d 6d de 6i dr d 6ds d 6d de 6i dt d 6du d 6d de 6i dv d 6dw d 6dk de 6i dx d 6dy d 6dz de 6g
 Z x% e D] Z e j e d ƒ e d <q°Wd{ „  Z d| d} „ Z d| d~ „ Z d „  Z d€ d� d‚ dƒ h f d€ d„ d‚ dƒ h f d… d† d‡ dˆ h f d‰ dŠ dŠ d‹ h f dŒ d� dŽ d� d� h f d‘ d’ d“ d” d• h f d– d— d˜ d™ dš d› dœ d� h f d– dž dŸ d  d¡ d¢ d£ h f d– d¤ dŸ d  d¡ d¢ d£ h f d¥ d¦ d§ d¨ h f d¥ d© d§ d¨ h f dª d« d¬ d­ d® h f dª d¯ d¬ d­ d® h f d° d± d² d± h f d° d² d² d± h f d° d³ d³ d´ h f d' dµ d¶ d· d¸ h f d' d· d¶ d· d¸ h f d' d¹ dº d» h f d' d¼ dº d» h f d' d½ d¾ d¿ h f d' dÀ dÁ dÂ dÃ h f d) dÄ dÅ dÄ h f d) dÅ dÅ dÄ h f d) dÆ dÇ dÆ dÈ dÉ dÊ dË h f d) dÊ dÇ dÆ dÈ dÉ dÊ dË h f d) dÌ dÌ dÍ h f d) dÎ dÏ dÐ dÑ h f dÒ dÓ dÔ dÕ dÖ h f d) d× dØ dÙ dÚ dÛ dÜ dÝ dÞ dß dà dá dâ dã dä då dæ h f d) dç dØ dÙ dÚ dÛ dÜ dÝ dÞ dß dà dá dâ dã dä då dæ h f d) dè dé dê dë h f d) dì dí dî dï h f d) dð dñ dò dó h f d) dô dõ dö h f d) d÷ dÁ dÂ dÃ h f dø dù dú dù dû dü dý dþ h f dø dþ dú dù dû dü dý dþ h f dÿ d dddd h f dÿ ddddd h f ddddddh f ddddddh f d	d
ddh f d	ddí dî dï h f d	dddh f d	dddh f d	dddh f ddddh f ddddh f ddddh f ddddh f ddd d!h f dd"d d!h f d#d$d%d$d&h f d#d%d%d$d&h f d'd(d)d*d(h f d'd*d)d*d(h f d+d,d-d.h f d+d/d-d.h f d0d1d2d1h f d0d2d2d1h f d3d4d“ d• d” h f d3d5d6d7d8d9d:h f d3d;d6d7d8d9d:h f g@ Z  dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒg? Z! e" d@k r@e j# dAe j$ ƒ xh e  D]` \ Z% Z& Z' e j( e& ƒ Z) e j* e) ƒ dB„  e e) ƒ Dƒ e' k s¶t+ ‚ e j, dCe& e' ƒ qiWxp e! D]e \ Z% Z& Z- e j( e& ƒ Z) e j* e) ƒ e j. e e) ƒ dDe/ ƒe- k s&t+ ‚ e j, dCe& e- ƒ qÔWn  d S(„  iÿÿÿÿN(   t   teet   izip(   t   Chem(   t   BondTypet
   BondStereot   BondDirs
   Matt Swains   m.swain@me.comt   MITt   tautomert   -t   =t   #t   :i   t   +i    t   0s   1,3 (thio)keto/enol ft   names   [CX4!H0][C]=[O,S,Se,Te;X1]t   smartss   1,3 (thio)keto/enol rs   [O,S,Se,Te;X2!H0][C]=[C]s   1,5 (thio)keto/enol fs(   [CX4,NX3;!H0][C]=[C][CH0]=[O,S,Se,Te;X1]s   1,5 (thio)keto/enol rs'   [O,S,Se,Te;X2!H0][CH0]=,:[C][C]=,:[C,N]s   aliphatic imine fs   [CX4!H0][C]=[NX2]s   aliphatic imine rs   [NX3!H0][C]=[CX3]s   special imine fs   [N!H0][C]=[CX3R0]s   special imine rs   [CX4!H0][c]=,:[n]s!   1,3 aromatic heteroatom H shift fs   [#7!H0][#6R1]=[O,#7X2]s!   1,3 aromatic heteroatom H shift rs   [O,#7;!H0][#6R1]=,:[#7X2]s   1,3 heteroatom H shifts1   [#7,S,O,Se,Te;!H0][#7X2,#6,#15]=[#7,#16,#8,Se,Te]s   1,5 aromatic heteroatom H shifts&   [n,s,o;!H0]:[c,n]:[c]:[c,n]:[n,s,o;H0]s!   1,5 aromatic heteroatom H shift fsD   [#7,#16,#8,Se,Te;!H0][#6,nX2]=,:[#6,nX2][#6,#7X2]=,:[#7X2,S,O,Se,Te]s!   1,5 aromatic heteroatom H shift rsB   [#7,S,O,Se,Te;!H0][#6,#7X2]=,:[#6,nX2][#6,nX2]=,:[#7,#16,#8,Se,Te]s!   1,7 aromatic heteroatom H shift fsZ   [#7,#8,#16,Se,Te;!H0][#6,#7X2]=,:[#6,#7X2][#6,#7X2]=,:[#6][#6,#7X2]=,:[#7X2,S,O,Se,Te,CX3]s!   1,7 aromatic heteroatom H shift rsV   [#7,S,O,Se,Te,CX4;!H0][#6,#7X2]=,:[#6][#6,#7X2]=,:[#6,#7X2][#6,#7X2]=,:[NX2,S,O,Se,Te]s!   1,9 aromatic heteroatom H shift fs[   [#7,O;!H0][#6,#7X2]=,:[#6,#7X2][#6,#7X2]=,:[#6,#7X2][#6,#7X2]=,:[#6,#7X2][#6,#7X2]=,:[#7,O]s"   1,11 aromatic heteroatom H shift fsi   [#7,O;!H0][#6,nX2]=,:[#6,nX2][#6,nX2]=,:[#6,nX2][#6,nX2]=,:[#6,nX2][#6,nX2]=,:[#6,nX2][#6,nX2]=,:[#7X2,O]s
   furanone fs+   [O,S,N;!H0][#6X3r5;$([#6][!#6])]=,:[#6X3r5]s
   furanone rs&   [#6r5!H0][#6X3r5;$([#6][!#6])]=[O,S,N]s   keten/ynol fs   [C!H0]=[C]=[O,S,Se,Te;X1]s   #-t   bondss   keten/ynol rs   [O,S,Se,Te;!H0X2][C]#[C]s   ==s   ionic nitro/aci-nitro fs   [C!H0][N+;$([N][O-])]=[O]s   ionic nitro/aci-nitro rs   [O!H0][N+;$([N][O-])]=[C]s   oxim/nitroso fs   [O!H0][N]=[C]s   oxim/nitroso rs   [C!H0][N]=[O]s   oxim/nitroso via phenol fs   [O!H0][N]=[C][C]=[C][C]=[OH0]s   oxim/nitroso via phenol rs   [O!H0][c]:[c]:[c]:[c][N]=[OH0]s   cyano/iso-cyanic acid fs   [O!H0][C]#[N]s   cyano/iso-cyanic acid rs   [N!H0]=[C]=[O]s   formamidinesulfinic acid fs   [O,N;!H0][C][S,Se,Te]=[O]s   =--s   formamidinesulfinic acid rs   [O!H0][S,Se,Te][C]=[O,N]s   isocyanide fs   [C-0!H0]#[N+0]s   -+t   chargess   isocyanide rs   [N+!H0]#[C-]s   phosphonic acid fs	   [OH][PH0]s   phosphonic acid rs   [PH]=[O]t   utf8t   benzoquinones4   [#6]1([#6]=[#6][#6]([#6]=[#6]1)=,:[N,S,O])=,:[N,S,O]i   t   scoret   oxims   [#6]=[N][OH]i   s   C=Os   [#6]=,:[#8]i   s   N=Os   [#7]=,:[#8]s   P=Os   [#15]=,:[#8]s   C=heteros   [#6]=[!#1;!#6]t   methyls   [CX4H3]s   guanidine terminal=Ns   [#7][#6](=[NR0])[#7H0]s   guanidine endocyclic=Ns   [#7;R][#6;R]([N])=[#7;R]s	   aci-nitros   [#6]=[N+]([O-])[OH]iüÿÿÿc            sŸ  t  j ˆ  d t ƒ} t j d | ƒ d } t  j ˆ  ƒ } x• | D]� } ‡  f d †  t | ƒ Dƒ } ‡  f d †  | Dƒ } | t j h k rA t j d ƒ | d 7} | d h k rÎ t j d	 ƒ | d
 7} qÎ qA qA WxU t	 D]M } xD ˆ  j
 | d ƒ D]/ } t j d | d | d ƒ | | d 7} qó WqÙ Wxn ˆ  j ƒ  D]` }	 |	 j ƒ  d d d d h k r7|	 j ƒ  }
 |
 r—t j d |
 |	 j ƒ  ƒ | |
 8} q—q7q7W| S(   Nt   isomericSmiless   Tautomer: %si    c            s%   h  |  ] } ˆ  j  | Œ  j ƒ  ’ q S(    (   t   GetBondBetweenAtomst   GetBondType(   t   .0t   pair(   t   mol(    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pys	   <setcomp>S   s   	 c            s%   h  |  ] } ˆ  j  | ƒ j ƒ  ’ q S(    (   t   GetAtomWithIdxt   GetAtomicNum(   R   t   idx(   R   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pys	   <setcomp>T   s   	 s   Score +100 (aromatic ring)id   i   s&   Score +150 (carbocyclic aromatic ring)i–   R   s   Score %+d (%s)R   R   i   i   i"   i4   s   Score %+d (%s-H bonds)(   R   t   MolToSmilest   Truet   logt   debugt   GetSymmSSSRt	   _pairwiseR   t   AROMATICt   tautomer_scorest   GetSubstructMatchest   GetAtomsR   t   GetTotalNumHst	   GetSymbol(   R   t   smilesR   t   ssrt   ringt   btypest   elementst   tscoret   matcht   atomt   hs(    (   R   sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pyt   tautomer_scoreK   s0    
iè  c            sK  t  |  | ƒ } t | ƒ d k r) | d Sd } x| D]	‰  t j ˆ  d t ƒ} t j d | ƒ d } t j ˆ  ƒ } x• | D]� } ‡  f d †  t	 | ƒ Dƒ } ‡  f d †  | Dƒ }	 | t
 j h k r} t j d ƒ | d 7} |	 d	 h k r
t j d
 ƒ | d 7} q
q} q} WxU t D]M }
 xD ˆ  j |
 d ƒ D]/ } t j d |
 d |
 d ƒ | |
 d 7} q/WqWxn ˆ  j ƒ  D]` } | j ƒ  d d d d h k rs| j ƒ  } | rÓt j d | | j ƒ  ƒ | | 8} qÓqsqsW| s| d | k  s| d | k r6 | | d k  r6 t j d | | ƒ i | d 6ˆ  d 6| d 6} q6 q6 W| d S(   sø   Enumerate all possible tautomers and return a canonical tautomer based on a scoring system.

    :param mol: An RDKit Mol object.
    :param max_tautomers: The maximum number of tautomers to enumerate (limit to prevent combinatorial explosion)
    i   i    R   s   Tautomer: %sc            s%   h  |  ] } ˆ  j  | Œ  j ƒ  ’ q S(    (   R   R   (   R   R   (   t   t(    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pys	   <setcomp>}   s   	 c            s%   h  |  ] } ˆ  j  | ƒ j ƒ  ’ q S(    (   R   R   (   R   R   (   R6   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pys	   <setcomp>~   s   	 s   Score +100 (aromatic ring)id   i   s&   Score +150 (carbocyclic aromatic ring)i–   R   s   Score %+d (%s)R   R   i   i   i"   i4   s   Score %+d (%s-H bonds)R,   s   New highest tautomer: %s (%s)R   N(   t   enumerate_tautomerst   lent   NoneR   R    R!   R"   R#   R$   R%   R   R&   R'   R(   R)   R   R*   R+   (   R   t   max_tautomerst	   tautomerst   highestR,   R   R-   R.   R/   R0   R1   R2   R3   R4   (    (   R6   sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pyt   canonical_tautomerk   s@    
7"c      	   C   s+  i t  j |  ƒ t j |  d t ƒ6} t ƒ  } x˜t | ƒ | k  r¸xSt | ƒ D]E} | | k rh qP n  xt D]} x| | j	 | d ƒ D]ó} t  j | | ƒ } | j
 | d ƒ } | j
 | d ƒ }	 | j t d | j ƒ  d ƒ ƒ |	 j |	 j ƒ  d ƒ xƒ t t | ƒ ƒ D]o \ }
 } d | k rS| j | Œ  j t | d |
 ƒ q| j | Œ  j |
 d d k r{t j n t j ƒ qWd | k rçxO t | ƒ D]> \ } } | j
 | ƒ } | j | j ƒ  t | d | ƒ q¢Wn  yx t j | ƒ t j | d t ƒ} t j d	 | d
 | ƒ | | k rMt j d | ƒ | | | <n t j d | ƒ Wq� t k
 rt j d ƒ q� Xq� Wqo W| j | ƒ qP Wt | ƒ t | ƒ k r1 Pq1 q1 Wt j d | ƒ xU| j  ƒ  D]G} t j! | d t d t ƒx%| j" ƒ  D]} | j# ƒ  t j k r| j$ ƒ  t% j& k r| j' ƒ  } | j( ƒ  } xÌ | j  ƒ  D]» } | j | | ƒ j# ƒ  t j k sW| j
 | ƒ j" ƒ  | j
 | ƒ j" ƒ  } x? | D]7 } | j) ƒ  t* j+ t* j, h k r­| j- t* j. ƒ q­q­Wt j! | d t d t ƒt j d ƒ PqWqWWqqWqÖW| j  ƒ  S(   sØ   Enumerate all possible tautomers and return them as a list.

    :param mol: An RDKit Mol object.
    :param max_tautomers: The maximum number of tautomers to enumerate (limit to prevent combinatorial explosion)
    R   R   i    iÿÿÿÿi   R   i   R   s   Applied rule: %s to %sR   s   New tautomer produced: %ss$   Previous tautomer produced again: %st
   ValueErrors*   Tautomer enumeration stopped at maximum %st   forcet   cleanIts0   Removed stereochemistry from unfixed double bond(/   t   copyt   deepcopyR   R    R!   t   setR8   t   sortedt   tautomer_transformsR(   R   t   SetNumExplicitHst   maxt   GetNumExplicitHsR*   t	   enumerateR%   R   t   SetBondTypet   BONDMAPR   t   DOUBLEt   SINGLEt   SetFormalCharget   GetFormalCharget	   CHARGEMAPt   SanitizeMolR"   R#   R>   t   addt   warnt   valuest   AssignStereochemistryt   GetBondsR   t	   GetStereoR   t	   STEREOANYt   GetBeginAtomIdxt   GetEndAtomIdxt
   GetBondDirR   t
   ENDUPRIGHTt   ENDDOWNRIGHTt
   SetBondDirt   NONE(   R   R:   R;   t   donet   tsmilest	   transformR2   t   productt   firstt   lastt   biR   t   ciR   R3   R,   R   t   bondt   begint   endt   othertautomert
   neighbourst	   otherbond(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pyR7   ˜   sf    %	 %6**!(c         C   s,   t  |  ƒ \ } } t | d ƒ t | | ƒ S(   s2   Utility function to iterate in a pairwise fashion.N(   R    t   nextR9   R   (   t   iterablet   at   b(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pyR%   Ú   s    s   1,3 keto/enol tautomers   C1(=CCCCC1)Os
   OC1=CCCCC1s
   O=C1CCCCC1s   C1(CCCCC1)=Os   Acetophenone keto/enol tautomers   C(=C)(O)C1=CC=CC=C1s   C=C(O)c1ccccc1s   CC(=O)c1ccccc1s   Acetone keto/enol tautomers   CC(C)=Os   C=C(C)Os   keto/enol tautomers   OC(C)=C(C)Cs   C=C(O)C(C)Cs   CC(C)=C(C)Os   CC(=O)C(C)Cs   1-phenyl-2-propanone enol/ketos   c1(ccccc1)CC(=O)Cs   C=C(O)Cc1ccccc1s   CC(=O)Cc1ccccc1s   CC(O)=Cc1ccccc1s   1,5 keto/enol tautomers   Oc1nccc2cc[nH]c(=N)c12s   Nc1nccc2ccnc(O)c12s   N=c1nccc2cc[nH]c(O)c1-2s   Nc1[nH]ccc2ccnc(=O)c1-2s   N=c1[nH]ccc2ccnc(O)c21s   Nc1nccc2cc[nH]c(=O)c12s   N=c1[nH]ccc2cc[nH]c(=O)c21s   C1(C=CCCC1)=Os   O=C1C=CCCC1s   OC1=CCC=CC1s   OC1=CC=CCC1s   O=C1CC=CCC1s   OC1=CCCC=C1s   C1(=CC=CCC1)Os   aliphatic imine tautomers   C1(CCCCC1)=Ns
   N=C1CCCCC1s
   NC1=CCCCC1s   C1(=CCCCC1)Ns   special imine tautomers   C1(C=CC=CN1)=CCs   CC=C1C=CC=CN1t
   CCc1ccccn1s   CC=C1C=CCC=N1s   C1(=NC=CC=C1)CCs   1,3 aromatic heteroatom H shifts   O=c1cccc[nH]1t	   Oc1ccccn1s   Oc1ncc[nH]1s   O=c1[nH]cc[nH]1s   OC(C)=NCs   CN=C(C)Os   CNC(C)=Os   C=C(O)NCs   S=C(N)Ns   N=C(N)Ss   NC(N)=Ss   SC(N)=Ns   N=c1[nH]ccn(C)1t	   Cn1ccnc1Ns   Cn1cc[nH]c1=Ns   CN=c1[nH]cncc1s   CN=c1ccnc[nH]1t
   CNc1ccncn1s   CN=c1cc[nH]cn1t   Oc1cccc2ccncc12s   O=c1cccc2cc[nH]cc1-2s   Cc1n[nH]c2ncnn12s   C=C1NNc2ncnn21s   Cc1nnc2[nH]cnn12s   C=C1NN=C2N=CNN12s   Cc1nnc2nc[nH]n12s   C=C1NN=C2NC=NN12t	   Oc1ccncc1s   O=c1cc[nH]cc1s   Oc1c(cccc3)c3nc2ccncc12t   Oc1c2ccccc2nc2ccncc12s   O=c1c2ccccc2nc2cc[nH]cc1-2s   O=c1c2ccccc2[nH]c2ccncc21s'   1,3 and 1,5 aromatic heteroatom H shiftt	   Oc1ncncc1t	   Oc1ccncn1s   O=c1ccnc[nH]1s   O=c1cc[nH]cn1s   C2(=C1C(=NC=N1)[NH]C(=N2)N)Os   N=c1[nH]c2ncnc-2c(O)[nH]1s   Nc1nc2nc[nH]c2c(O)n1s   N=c1nc(O)c2nc[nH]c2[nH]1s   N=c1[nH]c2[nH]cnc2c(=O)[nH]1s   Nc1nc2ncnc-2c(O)[nH]1s   N=c1nc2nc[nH]c2c(O)[nH]1s   N=c1nc(O)c2[nH]cnc2[nH]1s   Nc1nc(O)c2ncnc-2[nH]1s   Nc1nc(=O)c2nc[nH]c2[nH]1s   Nc1nc(=O)c2[nH]cnc2[nH]1s   Nc1nc2[nH]cnc2c(O)n1s   N=c1nc2[nH]cnc2c(O)[nH]1s   Nc1nc2[nH]cnc2c(=O)[nH]1s   Nc1nc2nc[nH]c2c(=O)[nH]1s   N=c1[nH]c2nc[nH]c2c(=O)[nH]1s   C2(C1=C([NH]C=N1)[NH]C(=N2)N)=Os   Oc1n(C)ncc1t	   Cn1nccc1Os   CN1N=CCC1=Os   Cn1[nH]ccc1=Os   O=c1nc2[nH]ccn2cc1s   O=c1ccn2cc[nH]c2n1t   Oc1ccn2ccnc2n1s   O=c1ccn2ccnc2[nH]1s   N=c1nc[nH]cc1s   N=c1cc[nH]cn1s   N=c1ccnc[nH]1t	   Nc1ccncn1s   N=c(c1)ccn2cc[nH]c12s   N=c1ccn2cc[nH]c2c1t   Nc1ccn2ccnc2c1s   CN=c1nc[nH]cc1s   1,7 aromatic heteroatom H shifts#   c1ccc2[nH]c(-c3nc4ccccc4[nH]3)nc2c1s$   c1ccc2c(c1)=NC(C1=NC3C=CC=CC3=N1)N=2s#   c1ccc2[nH]c(C3=NC4C=CC=CC4=N3)nc2c1s!   c1ccc2[nH]c(C3N=c4ccccc4=N3)nc2c1s$   c1ccc2c(c1)=NC(=C1N=C3C=CC=CC3N1)N=2s!   c1ccc2c(c1)NC(=C1N=c3ccccc3=N1)N2s   1,9 aromatic heteroatom H shiftt   CNc1ccnc2ncnn21s   CN=c1cc[nH]c2ncnn21s   CN=c1ccnc2[nH]cnn21s   CN=c1ccnc2nc[nH]n21s    1,11 aromatic heteroatom H shifts   Nc1ccc(C=C2C=CC(=O)C=C2)cc1s   N=C1C=CC(=CC2C=CC(=O)C=C2)C=C1s   N=C1C=CC(=Cc2ccc(O)cc2)C=C1s   N=C1C=CC(C=C2C=CC(=O)C=C2)C=C1s   heterocyclic tautomers   n1ccc2ccc[nH]c12s   c1cc2cccnc2[nH]1s   c1cc2ccc[nH]c-2n1s   c1cc(=O)[nH]c2nccn12s   c1cnc2c[nH]ccc12s   c1cc2cc[nH]cc-2n1s   c1cc2ccncc2[nH]1s   n1ccc2c[nH]ccc12s   c1cc2cnccc2[nH]1s   c1cc2c[nH]ccc-2n1s   c1cnc2ccc[nH]c12s   c1cc2[nH]cccc-2n1s   c1cc2ncccc2[nH]1s   furanone tautomers   C1=CC=C(O1)Ot   Oc1ccco1s
   O=C1CC=CO1s   keten/ynol tautomers   CC=C=Os   CC#COs   ionic nitro/aci-nitro tautomers   C([N+](=O)[O-])Cs   CC[N+](=O)[O-]s   CC=[N+]([O-])Os   C(=[N+](O)[O-])Cs   oxim nitroso tautomers   CC(C)=NOs   CC(C)N=Os   C=C(C)NOs    oxim/nitroso tautomer via phenols   O=Nc1ccc(O)cc1s   O=NC1C=CC(=O)C=C1s   O=C1C=CC(=NO)C=C1s   cyano/iso-cyanic acid tautomers   C(#N)Os   N#COs   N=C=Os   C(=N)=Os   isocyanide tautomers   C#Ns
   [C-]#[NH+]s/   Remove stereochemistry from mobile double bondss   c1(ccccc1)/C=C(/O)\Cs   C/C=C/C(C)=Os
   C=C(O)C=CCs
   C=CCC(=C)Os
   CC=CC(C)=Os
   C=CCC(C)=Os
   C=CC=C(C)Os   C/C=C\C(C)=Os!   formamidinesulfinic acid tautomers   [S](=O)(=O)C(N)Ns   N=C(N)S(=O)Os   [S](=O)(O)C(=N)Nt   __main__t   levelc         C   s%   h  |  ] } t  j | d  t ƒ’ q S(   R   (   R   R    R!   (   R   R6   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pys	   <setcomp>k  s   	 s   %s => %sR   (   s   1,3 keto/enol tautomers   C1(=CCCCC1)Os
   O=C1CCCCC1(   s   1,3 keto/enol tautomers   C1(CCCCC1)=Os
   O=C1CCCCC1(   s   Acetophenone keto/enol tautomers   C(=C)(O)C1=CC=CC=C1s   CC(=O)c1ccccc1(   s   Acetone keto/enol tautomers   CC(C)=Os   CC(C)=O(   s   keto/enol tautomers   OC(C)=C(C)Cs   CC(=O)C(C)C(   s   1-phenyl-2-propanone enol/ketos   c1(ccccc1)CC(=O)Cs   CC(=O)Cc1ccccc1(   s   1,5 keto/enol tautomers   Oc1nccc2cc[nH]c(=N)c12s   N=c1[nH]ccc2cc[nH]c(=O)c21(   s   1,5 keto/enol tautomers   C1(C=CCCC1)=Os   O=C1C=CCCC1(   s   1,5 keto/enol tautomers   C1(=CC=CCC1)Os   O=C1C=CCCC1(   s   aliphatic imine tautomers   C1(CCCCC1)=Ns
   N=C1CCCCC1(   s   aliphatic imine tautomers   C1(=CCCCC1)Ns
   N=C1CCCCC1(   s   special imine tautomers   C1(C=CC=CN1)=CCRr   (   s   special imine tautomers   C1(=NC=CC=C1)CCRr   (   s   1,3 aromatic heteroatom H shifts   O=c1cccc[nH]1s   O=c1cccc[nH]1(   s   1,3 aromatic heteroatom H shiftRs   s   O=c1cccc[nH]1(   s   1,3 aromatic heteroatom H shifts   Oc1ncc[nH]1s   O=c1[nH]cc[nH]1(   s   1,3 heteroatom H shifts   OC(C)=NCs   CNC(C)=O(   s   1,3 heteroatom H shifts   CNC(C)=Os   CNC(C)=O(   s   1,3 heteroatom H shifts   S=C(N)Ns   NC(N)=S(   s   1,3 heteroatom H shifts   SC(N)=Ns   NC(N)=S(   s   1,3 heteroatom H shifts   N=c1[nH]ccn(C)1s   Cn1cc[nH]c1=N(   s   1,3 heteroatom H shifts   CN=c1[nH]cncc1s   CN=c1cc[nH]cn1(   s   1,5 aromatic heteroatom H shiftRv   Rv   (   s   1,5 aromatic heteroatom H shifts   O=c1cccc2cc[nH]cc1-2Rv   (   s   1,5 aromatic heteroatom H shifts   Cc1n[nH]c2ncnn12s   Cc1n[nH]c2ncnn12(   s   1,5 aromatic heteroatom H shifts   Cc1nnc2nc[nH]n12s   Cc1n[nH]c2ncnn12(   s   1,5 aromatic heteroatom H shiftRw   s   O=c1cc[nH]cc1(   s   1,5 aromatic heteroatom H shifts   Oc1c(cccc3)c3nc2ccncc12s   O=c1c2ccccc2[nH]c2ccncc21(   s'   1,3 and 1,5 aromatic heteroatom H shiftRy   s   O=c1cc[nH]cn1(   s   1,5 aromatic heteroatom H shifts   C2(=C1C(=NC=N1)[NH]C(=N2)N)Os   N=c1[nH]c2[nH]cnc2c(=O)[nH]1(   s   1,5 aromatic heteroatom H shifts   C2(C1=C([NH]C=N1)[NH]C(=N2)N)=Os   N=c1[nH]c2[nH]cnc2c(=O)[nH]1(   s   1,5 aromatic heteroatom H shifts   Oc1n(C)ncc1s   Cn1[nH]ccc1=O(   s   1,5 aromatic heteroatom H shifts   O=c1nc2[nH]ccn2cc1s   O=c1ccn2cc[nH]c2n1(   s   1,5 aromatic heteroatom H shifts   N=c1nc[nH]cc1s   N=c1cc[nH]cn1(   s   1,5 aromatic heteroatom H shifts   N=c(c1)ccn2cc[nH]c12s   N=c1ccn2cc[nH]c2c1(   s   1,5 aromatic heteroatom H shifts   CN=c1nc[nH]cc1s   CN=c1cc[nH]cn1(   s   1,7 aromatic heteroatom H shifts#   c1ccc2[nH]c(-c3nc4ccccc4[nH]3)nc2c1s#   c1ccc2[nH]c(-c3nc4ccccc4[nH]3)nc2c1(   s   1,7 aromatic heteroatom H shifts!   c1ccc2c(c1)NC(=C1N=c3ccccc3=N1)N2s#   c1ccc2[nH]c(-c3nc4ccccc4[nH]3)nc2c1(   s   1,9 aromatic heteroatom H shiftR   s   CN=c1cc[nH]c2ncnn21(   s   1,9 aromatic heteroatom H shifts   CN=c1ccnc2nc[nH]n21s   CN=c1cc[nH]c2ncnn21(   s    1,11 aromatic heteroatom H shifts   Nc1ccc(C=C2C=CC(=O)C=C2)cc1s   Nc1ccc(C=C2C=CC(=O)C=C2)cc1(   s    1,11 aromatic heteroatom H shifts   N=C1C=CC(=Cc2ccc(O)cc2)C=C1s   Nc1ccc(C=C2C=CC(=O)C=C2)cc1(   s   heterocyclic tautomers   n1ccc2ccc[nH]c12s   c1cc2cccnc2[nH]1(   s   heterocyclic tautomers   c1cc(=O)[nH]c2nccn12s   O=c1ccn2cc[nH]c2n1(   s   heterocyclic tautomers   c1cnc2c[nH]ccc12s   c1cc2ccncc2[nH]1(   s   heterocyclic tautomers   n1ccc2c[nH]ccc12s   c1cc2cnccc2[nH]1(   s   heterocyclic tautomers   c1cnc2ccc[nH]c12s   c1cc2ncccc2[nH]1(   s   furanone tautomers   C1=CC=C(O1)OR€   (   s   furanone tautomers
   O=C1CC=CO1R€   (   s   keten/ynol tautomers   CC=C=Os   CC=C=O(   s   keten/ynol tautomers   CC#COs   CC=C=O(   s   ionic nitro/aci-nitro tautomers   C([N+](=O)[O-])Cs   CC[N+](=O)[O-](   s   ionic nitro/aci-nitro tautomers   C(=[N+](O)[O-])Cs   CC[N+](=O)[O-](   s   oxim nitroso tautomers   CC(C)=NOs   CC(C)=NO(   s   oxim nitroso tautomers   CC(C)N=Os   CC(C)=NO(   s    oxim/nitroso tautomer via phenols   O=Nc1ccc(O)cc1s   O=Nc1ccc(O)cc1(   s    oxim/nitroso tautomer via phenols   O=C1C=CC(=NO)C=C1s   O=Nc1ccc(O)cc1(   s   cyano/iso-cyanic acid tautomers   C(#N)Os   N=C=O(   s   cyano/iso-cyanic acid tautomers   C(=N)=Os   N=C=O(   s!   formamidinesulfinic acid tautomers   [S](=O)(=O)C(N)Ns   N=C(N)S(=O)O(   s!   formamidinesulfinic acid tautomers   [S](=O)(O)C(=N)Ns   N=C(N)S(=O)O(   s   isocyanide tautomers   C#Ns   C#N(   s   isocyanide tautomers
   [C-]#[NH+]s   C#N(0   RA   t	   itertoolsR    R   t   loggingt   rdkitR   t   rdkit.Chem.rdchemR   R   R   t
   __author__t	   __email__t   __license__t	   getLoggerR"   RM   RL   t   TRIPLER&   RK   RP   RE   Rb   t   MolFromSmartst   encodeR'   R1   R5   R=   R7   R%   t   tautomer_enumeration_testst   tautomer_canonicalization_testst   __name__t   basicConfigt   DEBUGt   descR,   R;   t   MolFromSmilesR   RQ   t   AssertionErrort   infoR   R    R!   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/coot/tautomer.pyt   <module>   s–  .$	 -B	99!	"'