B
    ž3Rc-  ã               @   sf  d dl Z d dlZd dlmZ dd„ Zddd„Zedkrbeejƒd	k rXe	d
ƒ e 
d¡ e ejd ¡Zi ZxDeD ]<ZeeƒZejeddZeekr¤ee  e¡ qregee< qrW d ZeddƒZxŽe ¡ D ]‚\ZZed7 Ze eeƒd ¡Zx2eD ]*Ze de¡ e deeƒ¡ e e¡ qòW e	eeeƒƒ e ed eeeƒƒ d ¡ qÊW ej e	de ƒ dS )é    N)ÚAllChemc             C   sD   g }x:| D ]2}t |dƒr2t|tƒs2| t|ƒ¡ q
| |¡ q
W |S )a\  flatten(sequence) -> list
    Returns a single, flat list which contains all elements retrieved
    from the sequence and all nested sub-sequences (iterables).
    Examples:
    >>> [1, 2, [3,4], (5,6)]
    [1, 2, [3, 4], (5, 6)]
    >>> flatten([[[1,2,3], (42,None)], [4,5], [6], 7, MyVector(8,9,10)])
    [1, 2, 3, 42, None, 4, 5, 6, 7, 8, 9, 10]Ú__iter__)ÚhasattrÚ
isinstanceÚstrÚextendÚflattenÚappend)ÚxÚresultZel© r   ú'share/RDKit/Contrib/M_Kossner/Frames.pyr      s    	
r   ÚScaffc                sÖ  |   ¡ }t| ¡ ƒ‰ ‡ fdd„|  ¡ D ƒ}g ‰g }xN|D ]F}x@|  |¡ ¡ D ].}| ¡ ˆ krLˆ |¡ | | ¡ |g¡ P qLW q8W ‡fdd„|D ƒ}dd„ ˆ D ƒ}g }	xæt|ƒdkrŒg }
xÂ|D ]º}|dkrÖt	dƒ qÀx¢|  |d ¡ ¡ D ]Œ}| ¡ |krê| ¡ |kr6|dd… }| | ¡ ¡ |
 |dd… ¡ qê| ¡ ˆ krê|dd… }| | ¡ ¡ |	 |¡ ||dd…  }qêW qÀW |
dd… }q¨W |d	krNt
t|ƒƒ}g }|jd
d t | ¡}dd„ |	D ƒ}g }x<|D ]4}||krÖ| |d |d tjj¡ | |¡ qÖW x|D ]}| |¡ qW x|D ]}| |¡ q.W | ¡ }|S |dkrÒt
t|ƒƒ}g }|jd
d x,|D ]$}|dk	rz||krz| |¡ qzW t | ¡}x|D ]}| |¡ q²W | ¡ }|S dS )a$  return a ganeric molecule defining the reduced scaffold of the input mol.
    mode can be 'Scaff' or 'RedScaff':

    Scaff	->	chop off the side chains and return the scaffold

    RedScaff	->	remove all linking chains and connect the rings
    directly at the atoms where the linker was
    c                s    g | ]}|  ¡ ˆ kr|  ¡ ‘qS r   )ÚGetIdx)Ú.0Zatom)Ú	RingAtomsr   r   ú
<listcomp>8   s    zGetFrame.<locals>.<listcomp>c                s   g | ]}|ˆ kr|‘qS r   r   )r   r
   )ÚRingNeighborsr   r   r   B   s    c             S   s   g | ]}|‘qS r   r   )r   r
   r   r   r   r   F   s    r   NZoohéÿÿÿÿZRedScaffT)Úreversec             S   s    g | ]}t |d  |d gƒ‘qS )r   r   )Úsorted)r   Úir   r   r   r   h   s    é   r   )ZGetRingInfor   Z	AtomRingsZGetAtomsZGetAtomWithIdxZGetNeighborsr   r	   ÚlenÚprintÚlistÚsetÚsortÚChemZEditableMolZAddBondZBondTypeZSINGLEZ
RemoveAtomZGetMol)ÚmolÚmodeZringZNonRingAtomsZPathsZNonRingAtomZneighborZPosConnectorsZ	FrameworkZLinkersZNewPathsÚPÚnZtodelZemZ
BondsToAddZmemr   Úmr   )r   r   r   ÚGetFrame,   sz    


















r$   Ú__main__é   z4No input file provided: Frames.py filetosprocess.extr   T)ZisomericSmilesz
frames.smiÚwz.sdfZScaffoldZClusterú	Ú
znumber of Clusters: %d)r   ) ÚosÚsysr   r   r   r$   Ú__name__r   Úargvr   ÚexitZSDMolSupplierZsupplZ	FrameDictr   r#   ZMolToSmilesZ	cansmilesr	   ZcounterÚopenr'   ÚitemsÚkeyÚitemZSDWriterr   Údr   ZSetPropÚwriteÚcloser   r   r   r   Ú<module>   s8   
n




"