B
    ž3Rc1  ã               @   sv   d dl mZ d dlmZ dd„ Ze d¡Ze d¡Ze d¡Ze d¡Z	eeee	fZ
d	d
„ Zdd„ Zedkrreƒ  dS )é    )ÚChem)Ú
namedtuplec             C   sv   t ƒ }xL|D ]D}|  |¡}x4| ¡ D ](}| ¡ }||kr$| |¡ | |¡ q$W qW |s\d S t| ||ƒ | |¡ d S )N)ÚsetÚGetAtomWithIdxÚGetNeighborsÚGetIdxÚremoveÚaddÚmergeÚupdate)ÚmolÚmarkedZasetZbsetÚidxÚatomZnbrZjdx© r   úshare/RDKit/Contrib/IFG/ifg.pyr
      s    


r
   z	A=,#[!#6]zC=,#Cz[CX4](-[O,N,S])-[O,N,S]z[O,N,S]1CC1c             C   sD  t ƒ }x*|  ¡ D ]}| ¡ dkr| | ¡ ¡ qW x8tD ]0}x*|  |¡D ]}x|D ]}| |¡ qRW qHW q8W g }x,|rœt | ¡ gƒ}t| ||ƒ | 	|¡ qrW t
ddddgƒ}g }	xŒ|D ]„}
t ƒ }x>|
D ]6}x0|  |¡ ¡ D ]}| ¡ dkrÜ| | ¡ ¡ qÜW qÈW |	 	|tt|
ƒƒtj| |
ddtj| |
 |¡ddd	¡ q¸W |	S )
N)é   é   ZIFGÚatomIdsÚatomsÚtyper   T)Z	canonical)r   r   r   )r   ZGetAtomsZGetAtomicNumr	   r   Ú
PATT_TUPLEZGetSubstructMatchesÚpopr
   Úappendr   r   r   ÚtupleÚlistr   ZMolFragmentToSmilesÚunion)r   r   r   ZpattÚpathZ	atomindexÚgroupsZgrpZifgZifgsÚgZucaZatomidxÚnr   r   r   Úidentify_functional_groups,   s.    



>r!   c              C   sn   xht ddddddddd	d
ddddddddddgƒD ]4\} }t |¡}t|ƒ}td| d t|ƒf |ƒ q2W d S )Nz#Cc1nc(NS(=O)(=O)c2ccc(N)cc2)nc(C)c1z$NC(=N)c1ccc(C=Cc2ccc(cc2O)C(=N)N)cc1zCC(=O)Nc1nnc(s1)S(=O)(=O)Nz"NS(=O)(=O)c1cc2c(NCNS2(=O)=O)cc1Clz%CNC1=Nc2ccc(Cl)cc2C(=N(=O)C1)c3ccccc3z3Cc1onc(c1C(=O)NC2C3SC(C)(C)C(N3C2=O)C(=O)O)c4ccccc4z'Clc1ccccc1C2=NCC(=O)Nc3ccc(cc23)N(=O)=Oz,COc1cc(cc(C(=O)NCC2CCCN2CC=C)c1OC)S(=O)(=O)Nz Cc1ccc(Cl)c(Nc2ccccc2C(=O)O)c1Clz"Clc1ccc2Oc3ccccc3N=C(N4CCNCC4)c2c1z+FC(F)(F)CN1C(=O)CN=C(c2ccccc2)c3cc(Cl)ccc13zOCC1OC(CC1O)n2cnc3C(O)CNC=Nc32z'CCNC1CC(C)S(=O)(=O)c2sc(cc12)S(=O)(=O)Nz4CC(O)C1C2C(C)C(=C(N2C1=O)C(=O)O)SC3CNC(C3)C(=O)N(C)Cz6CC1CN(CC(C)N1)c2c(F)c(N)c3c(=O)c(cn(C4CC4)c3c2F)C(=O)Oz)CC(=CCC1C(=O)N(N(C1=O)c2ccccc2)c3ccccc3)CzClc1ccc2N=C3NC(=O)CN3Cc2c1Clz+CC(=O)NC1C(NC(=N)N)C=C(OC1C(O)C(O)CO)C(=O)OzCC(O)C(O)C1CNc2nc(N)nc(O)c2N1z3NC1CCCCN(C1)c2c(Cl)cc3c(=O)c(cn(C4CC4)c3c2Cl)C(=O)Oz%2d: %d fgsr   )Ú	enumerater   ZMolFromSmilesr!   ÚprintÚlen)ZixZsmilesÚmZfgsr   r   r   ÚmainL   s0    
r&   Ú__main__N)Zrdkitr   Úcollectionsr   r
   ZMolFromSmartsZPATT_DOUBLE_TRIPLEZPATT_CC_DOUBLE_TRIPLEZPATT_ACETALZPATT_OXIRANE_ETCr   r!   r&   Ú__name__r   r   r   r   Ú<module>   s   



 