B
    ž3Rc]/  ã               @   s¦   d Z ddlmZ ddlmZ ddlZddlZdaG dd„ deƒZ	G dd	„ d	eƒZ
ed
kr¢ddlmZ ddlmZmZ e d¡Ze e¡ e e¡ e
ƒ Ze e¡ dS )z+ uses DSViewer to interact with molecules

é    )ÚChem)ÚDispatchNé   c               @   sL   e Zd Zddd„Zg ddfdd„Zddd	„Zdd
d„Zddd„Zdd„ ZdS )ÚDisplayableéÿÿÿÿc             C   s0   |dk rt }t d7 a || _|| _d| _g | _d S )Nr   r   T)Ú_nextDisplayIdÚdocÚidZvisibleÚchildren)Úselfr   r	   © r   ú2lib/python3.7/site-packages/rdkit/Chem/DSViewer.pyÚ__init__   s    zDisplayable.__init__TFc       	      C   sÒ   |r
d}nd}|r|dkr d}ndd„ |D ƒ}dd  |¡ }d	| j||f }tt| j |¡ƒƒ}|s|sd
}d	| j||f }tt| j |¡ƒƒ}|rªd| j }| j |¡ |rÎx| jD ]}|j||dd q¶W |S )NÚtrueZfalseÚ*z
; atom "*"c             S   s   g | ]}d | ‘qS )zid=%dr   )Ú.0Úxr   r   r   ú
<listcomp>+   s    z&Displayable.Select.<locals>.<listcomp>z	; atom %sú,z-SetProperty object RD_Visual=%d %s: select=%sÚ z;SetProperty object RD_Visual=%d; bond index="*": select=offT)ÚatomsÚstateÚrecurse)Újoinr	   ÚintÚstrr   Ú	DoCommandr
   ÚSelect)	r   r   r   r   ZselTextZatomStrÚcmdÚrZchildr   r   r   r   "   s(    
zDisplayable.Selectc             C   s,   | j ddd | j d¡ | j ddd d S )NT)r   r   ZhideF)r   r   r   )r   r   r   r   r   ÚHideD   s    zDisplayable.Hidec             C   s,   | j ddd | j d¡ | j ddd d S )NT)r   r   ÚShowF)r   r   r   )r   r   r   r   r   r!   I   s    zDisplayable.Showc             C   s8   | j  d¡ | jddd | j  d¡ | jddd d S )NÚHideAllT)r   r   r!   F)r   r   r   )r   r   r   r   r   ÚShowOnlyN   s    zDisplayable.ShowOnlyc             C   s.   | j  d¡ | jddd}|r*| j  d¡ d S )NZUnselectAllT)r   r   ÚDelete)r   r   r   )r   Úcountr   r   r   Ú__del__T   s    zDisplayable.__del__N)r   )T)T)T)	Ú__name__Ú
__module__Ú__qualname__r   r   r    r!   r#   r&   r   r   r   r   r      s   
"


r   c               @   sº   e Zd Zd1dd„Zdd„ Zdd„ Zd	d
g ddd
fdd„Zd2dd„Zd3dd„Zd4dd„Z	d5dd„Z
dd„ Zdd„ Zd6dd„Zd7d d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd8d,d-„Zd.d/„ Zd0S )9Ú	MolViewerr   ÚUntitledc             K   sF   t dƒ| _d| j_|s"| jjd kr2| j |¡| _n
| jj| _i | _d S )NzWebLabViewerPro.Applicationr   )r   ZappZVisibleZActiveDocumentZNewr   Údisplayables)r   ZforceÚtitleÚkwargsr   r   r   r   ]   s    

zMolViewer.__init__c             C   s"   | j  d¡ | j  d¡ i | _d S )NZ	SelectAllr$   )r   r   r,   )r   r   r   r   Ú	DeleteAllg   s    zMolViewer.DeleteAllc             C   s:   dd„ |D ƒ}| j  ¡ }x|D ]}||kr| j |= qW d S )Nc             S   s   g | ]}|  ¡ ‘qS r   )Úlower)r   r   r   r   r   r   m   s    z-MolViewer.DeleteAllExcept.<locals>.<listcomp>)r,   Úkeys)r   ZexcludesZallNamesÚnmr   r   r   ÚDeleteAllExceptl   s
    

zMolViewer.DeleteAllExceptZmoleculeTr   r   c          	   C   s0  |r|   ¡  d }n| j | ¡ d ¡}|s6tj||d}|d || d¡d d …  }	|	}|sft| jƒ}t	|dƒrz|j
|krè||_
tjddd}
|
 |¡ W d Q R X | j d|	j ¡ | j d	|j ¡ | j d
|j ¡ | j d¡ n|jdd | j d¡ || j| ¡ < |r,| j d¡ | j d¡ d S )N)ÚconfIdÚ
r   Ú	_molBlockzw+z.mol)ÚsuffixzPasteFrom %sz(SetProperty molecule id=0 : RD_Visual=%dz!SetProperty molecule id=0 : id=%dz&SetProperty molecule id=0 : select=offT)r   r!   ÚCenterÚFitView)r/   r,   Úgetr0   r   ZMolToMolBlockÚindexr   r   Úhasattrr6   ÚtempfileZNamedTemporaryFileÚwriter   Únamer	   r   )r   Zmolr?   ÚshowOnlyZhighlightFeaturesZmolBr4   ZzoomÚobjÚtmpZtmpfr   r   r   ÚShowMols   s2    
zMolViewer.ShowMolFc             C   sŠ   |r|   ¡  | j d| ¡ t| jƒ}| j d|j ¡ | j d¡ | j d|j ¡}|rft|ƒdkrx| j d|j ¡}|| j| ¡ < |S )NzPasteFrom %sz!SetProperty molecule id=0 : id=%dz&SetProperty molecule id=0 : select=offz.SetProperty AminoAcidChain id=0 : RD_Visual=%dr   z(SetProperty molecule id=0 : RD_Visual=%d)r/   r   r   r   r	   r   r,   r0   )r   Úfilenamer?   r@   rA   r%   r   r   r   ÚLoadFile›   s    
zMolViewer.LoadFilec             C   s˜  |s¾t | j d¡ƒ}t | j d¡ƒ}|r¨g }i }xŠ| d¡D ]f}t| d¡d ƒd }||krn| || ¡ q<x2| j ¡ D ]$\}}||jkrz|||< | |¡ qzW q<W ndg| 	d¡d  }nV| 
¡ | jkr| 
¡ }| j| j}t | j d| ¡ƒ}|g| 	d¡d  }nd }d }|r| d¡}	y>g }
x4tt|	ƒƒD ]$}t|	| ƒ}|
 || |f¡ q8W W n* tk
rŒ   dd l}| ¡  g }
Y nX ng }
|
S )	Nz'GetPropertyValue atom select=true: id=?z-GetPropertyValue atom select=true: molecule=?r   ú/r   r   z>GetPropertyValue molecule RD_Visual=%d; atom select=true: id=?r   )r   r   r   Úsplitr   Úappendr,   Z	iteritemsr	   r%   r0   ÚrangeÚlenÚ	ExceptionÚ	tracebackÚ	print_exc)r   ÚwhichSelectionÚdZd2ZmolIdsZtmpDr	   ÚkÚvZsplitDÚresÚiÚidxrL   r   r   r   ÚGetSelectedAtoms¨   sJ    


zMolViewer.GetSelectedAtomsc             C   s   | j  d¡ |  ||¡ d S )NÚUnSelectAll)r   r   ÚSelectAtoms)r   ÚindicesÚwhereZextraHighlightr   r   r   ÚHighlightAtomsØ   s    zMolViewer.HighlightAtomsÚ	selectionc             C   s>   | j  d¡ | j  d¡ | j | ¡ d ¡}|r:|j|d d S )NrV   z#SetProperty atom id="*": select=off)r   )r   r   r,   r:   r0   r   )r   ZitemIdZatomIndicesZselNameÚor   r   r   rW   Ü   s
    zMolViewer.SelectAtomsc             C   s"   |s| j  d¡ n| j  d¡ d S )NzUpdateView offzUpdateView on)r   r   )r   Úvalr   r   r   ÚSetDisplayUpdateä   s    zMolViewer.SetDisplayUpdatec             C   sn   i }xd|D ]\\}}|  ¡ }| j| j}|d7 }d||f }| j |¡}dd„ | d¡D ƒ}||||f< q
W |S )Nr   z9GetPropertyValue molecule RD_Visual=%d; atom id=%d: xyz=?c             S   s   g | ]}t |ƒ‘qS r   )Úfloat)r   r   r   r   r   r   ó   s    z+MolViewer.GetAtomCoords.<locals>.<listcomp>ú )r0   r,   r	   r   r   rG   )r   ZselsrR   ÚlabelrT   rN   r   Zcoordsr   r   r   ÚGetAtomCoordsê   s    zMolViewer.GetAtomCoordsç      à?c          	   C   s  |  ¡ }|  d¡ t| jƒ}xÌt|ƒD ]À\}}|| }d dd„ |D ƒ¡}t| jƒ}	d|	j }
| j d|
 ¡ | j d|
|d |d	 |d
 f ¡ | j d|
|f ¡ | j d|
|f ¡ | j d|
|jf ¡ | j d|
|jf ¡ q&W || j|< |  d¡ d S )NFr`   c             S   s   g | ]}t td | ƒƒ‘qS )éÿ   )r   r   )r   r   r   r   r   r   þ   s    z.MolViewer.AddPharmacophore.<locals>.<listcomp>z	sphere-%dz	Sphere %sz)SetProperty Object name=%s : xyz=%f %f %fr   r   é   z&SetProperty Object name=%s : radius=%fz%SetProperty Object name=%s : color=%sz)SetProperty Object name=%s : RD_Visual=%dz"SetProperty Object name=%s : id=%dT)	r0   r^   r   r   Ú	enumerater   r	   r   r,   )r   ZlocsZcolorsra   Z	sphereRadÚparentrS   ZlocZcolorrA   r2   r   r   r   ÚAddPharmacophoreø   s     



$
zMolViewer.AddPharmacophorec             C   s‚   | j  d¡ | ¡ }| j |d ¡}|r~|jdd |dkrH| j  d¡ n*|dkr^| j  d¡ n|dkrr| j  d	¡ |jd
d d S )NrV   T)r   ZstickszDisplayStyle Atom StickÚlineszDisplayStyle Atom Liner   zDisplayStyle Atom OffF)r   r   r0   r,   r:   r   )r   rA   Zstyler\   r   r   r   ÚSetDisplayStyle  s    zMolViewer.SetDisplayStylec             C   s   | j  d¡ d S )Nr"   )r   r   )r   r   r   r   r"     s    zMolViewer.HideAllc             C   s2   | j  d¡ | ¡ }| j |d ¡}|r.| ¡  d S )NrV   )r   r   r0   r,   r:   r    )r   ÚobjNamer\   r   r   r   Ú
HideObject  s
    zMolViewer.HideObjectc             C   s2   | j  d¡ | ¡ }| j |d ¡}|r.| ¡  d S )NrV   )r   r   r0   r,   r:   r!   )r   rk   r\   r   r   r   ÚDisplayObject#  s
    zMolViewer.DisplayObjectc             C   sZ   | j  d¡ | ¡ }| j |d ¡}|rV|jdd}| j  d¡ | j  d¡ |jdd d S )NrV   T)r   r8   r9   F)r   r   r0   r,   r:   r   )r   rk   r\   r   r   r   r   ÚZoom*  s    zMolViewer.Zoomç      @Úneighborhoodc             C   sb  | j  d¡ | j | ¡ d¡}| j | ¡ d¡}|r^|r^|  d¡ | ¡  | j  d¡ | j  d|j ¡}| j  d| ¡}x0| j ¡ D ]"}	|	j|jkrˆ| j  d|	j ¡ qˆW | j  d¡}
|
r|
 	d¡}
i }x|
D ]}d	||< qÔW d 
d
d„ | ¡ D ƒ¡}d| }| j  |¡}|rT| j  d¡ t| j ƒ}	|	| j|< | j  d|	j ¡ | j  d¡ |  d¡ dS )a§   FIX: the surface display stuff here is all screwed up due to
    differences between the way PyMol and DSViewer handle surfaces.
    In PyMol they are essentially a display mode for the protein, so
    they don't need to be managed separately.
    In DSViewer, on the other hand, the surface is attached to the
    protein, but it needs to be hidden or shown on its own.  I haven't
    figured out how to do that yet.
    rV   NFz7SetProperty object RD_Visual=%d;object id="*":select=onzSelectByRadius inside %f atomz8SetProperty object RD_Visual=%d;object id="*":select=offz+GetPropertyValue atom select=true: parent=?r   r   c             S   s   g | ]}d | ‘qS )zparent="%s"r   )r   r   r   r   r   r   W  s    z7MolViewer.SelectProteinNeighborhood.<locals>.<listcomp>zSetProperty atom %s: select=onZSurfacez'SetProperty surface id="*":RD_Visual=%dT)r   r   r,   r:   r0   r^   r!   r	   ÚvaluesrG   r   r1   r   )r   Z	aroundObjZinObjZdistancer?   ZshowSurfacer\   ÚprB   rA   ZrsZresiduesr   Úparentsr   r   r   r   ÚSelectProteinNeighborhood4  s8    





z#MolViewer.SelectProteinNeighborhoodc             C   s   |   d¡ d S )NT)r^   )r   r   r   r   ÚRedrawe  s    zMolViewer.RedrawN)r   r+   )F)r   )F)r[   )rc   )r   )ro   rp   F)r'   r(   r)   r   r/   r3   rC   rE   rU   rZ   rW   r^   rb   rh   rj   r"   rl   rm   rn   rt   ru   r   r   r   r   r*   [   s(   


'

0




 
0r*   Ú__main__)Ú
rdDistGeomÚrdForceFieldHelpersZc1cccc2c1cccc2)Ú__doc__Zrdkitr   Zwin32com.clientr   r=   Úosr   Úobjectr   r*   r'   Z
rdkit.Chemrw   rx   ZMolFromSmilesÚmZEmbedMoleculeZUFFOptimizeMoleculeÚsrC   r   r   r   r   Ú<module>   s    F  


