B
    ž3RcÕ   ã               @   sr   d Z ddlmZ ddlZddlZddlZyddlmZ W n  ek
rX   ddl	mZ Y nX da
G dd„ deƒZdS )z( uses pymol to interact with molecules

é    )ÚChemN)ÚServerc               @   sì   e Zd Zd?dd„Zdd„ Zdd	„ Zd
d„ Zd@dd„Zddg dddddfdd„ZdAdd„Z	dBdd„Z
dCdd„ZdDdd„ZdEd d!„ZdFd#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdGd5d6„ZdHd9d:„Zd;d<„ ZdId=d>„ZdS )JÚ	MolViewerNé£#  r   c             K   sX   |st d k	rt | _n8|s&tj dd¡}d a td||f ƒ}| ¡  |a || _|  ¡  d S )NZPYMOL_RPCHOSTZ	localhostzhttp://%s:%d)Ú_serverÚserverÚosÚenvironÚgetr   ZpingÚInitializePyMol)ÚselfZhostZportZforceÚkwargsZserv© r   ú/lib/python3.7/site-packages/rdkit/Chem/PyMol.pyÚ__init__   s    zMolViewer.__init__c             C   sL   | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ dS )zL does some initializations to set up PyMol according to our
    tastes

    zset valence,1zset stick_rad,0.15zset mouse_selection_mode,0zset line_width,2zset selection_width,10zset auto_zoom,0N)r   Údo)r   r   r   r   r   *   s    zMolViewer.InitializePyMolc             C   s   | j  ¡  dS )z$ blows out everything in the viewer N)r   Z	deleteAll)r   r   r   r   Ú	DeleteAll6   s    zMolViewer.DeleteAllc             C   s4   | j  dd¡}x |D ]}||kr| j  |¡ qW dS )zG deletes everything except the items in the provided list of arguments Ú*FN)r   ÚgetNamesZdeleteObject)r   ZexcludesZallNamesÚnmr   r   r   ÚDeleteAllExcept:   s    
zMolViewer.DeleteAllExceptFc             C   s   |r|   ¡  | j ||¡}|S )zk calls pymol's "load" command on the given filename; the loaded object
    is assigned the name "name"
    )r   r   ZloadFile)r   ÚfilenameÚnameÚshowOnlyÚidr   r   r   ÚLoadFileA   s    zMolViewer.LoadFileZmoleculeTÚ éÿÿÿÿc
             C   sV  | j }
|s| j  d¡ |r"|  ¡  |sR| ¡ dk rR|sDtj||d}|
 ||¡}n|sdtj||d}|
 ||¡}|r|d }| 	|¡}x’|D ]Š}dddg}xj|D ]b}| 
|¡}|d  |d t|ƒ 7  < |d  |d t|ƒ 7  < |d  |d t|ƒ 7  < q¢W |
 |d	d
|¡ qŽW |r.|
 d¡ n| j  d¡ |	rR| j  d |¡¡ |S )z5 special case for displaying a molecule or mol block zview rdinterface,storeiç  )ÚconfIdz	-featuresg        r   é   é   gš™™™™™É?)r   r   r   Zvisiblezview rdinterface,recallzshow sticks, {})r   r   r   ZGetNumAtomsr   ZMolToMolBlockZloadMolBlockZMolToPDBBlockZloadPDBZGetConformerZGetAtomPositionÚlenÚsphereÚzoomÚformat)r   Zmolr   r   ZhighlightFeaturesZmolBr   r#   ZforcePDBZ
showSticksr   Zmidr   ZconfZfeatZptÚidxÚlocr   r   r   ÚShowMolJ   s:    




 zMolViewer.ShowMolc             C   s<   |s"| j  d¡}|r|d }nd}|r4| j  |¡}ng }|S )z returns the selected atoms Z
selectionsr   N)r   r   Úindex)r   ZwhichSelectionÚselsÚitemsr   r   r   ÚGetSelectedAtomsp   s    
zMolViewer.GetSelectedAtomsÚ	selectionc             C   sB   d}|d  dd„ |D ƒ¡7 }|d7 }d|||f }| j |¡ dS )z selects a set of atoms z(id ú,c             S   s   g | ]}d |d  ‘qS )z%dr   r   )Ú.0Úxr   r   r   ú
<listcomp>   s    z)MolViewer.SelectAtoms.<locals>.<listcomp>ú)zselect %s,%s and %sN)Újoinr   r   )r   ZitemIdZatomIndicesZselNameZidsÚcmdr   r   r   ÚSelectAtoms~   s
    zMolViewer.SelectAtomsc                sZ   |r.d  ‡ fdd„|D ƒ¡}| j d| ¡ n(d  dd„ |D ƒ¡}| j dˆ |f ¡ dS )	z highlights a set of atoms r-   c                s   g | ]}d ˆ |f ‘qS )z%s and (id %d)r   )r.   r/   )Úwherer   r   r0   ‰   s    z,MolViewer.HighlightAtoms.<locals>.<listcomp>zedit %sz or c             S   s   g | ]}d | ‘qS )zid %dr   )r.   r/   r   r   r   r0   Œ   s    zselect selection, %s and (%s)N)r2   r   r   )r   Úindicesr5   ZextraHighlightZidxTextr   )r5   r   ÚHighlightAtoms†   s
    zMolViewer.HighlightAtomsc             C   s.   | j  d|f ¡ |r*| j  d||f ¡ dS )z2 change the display style of the specified object zhide everything,%sz
show %s,%sN)r   r   )r   ÚobjZstyler   r   r   ÚSetDisplayStyle   s    zMolViewer.SetDisplayStyleç      @Úneighborhoodc             C   s:   | j  dtƒ  ¡ |r6| j  d| ¡ | j  d| ¡ dS )zo selects the area of a protein around a specified object/selection name;
    optionally adds a surface to that zGselect %(name)s,byres (%(aroundObj)s around %(distance)f) and %(inObj)szshow surface,%sz
disable %sN)r   r   Úlocals)r   Z	aroundObjZinObjZdistancer   ZshowSurfacer   r   r   ÚSelectProteinNeighborhood•   s
    
z#MolViewer.SelectProteinNeighborhoodç      à?c             C   sf   | j  d¡ | j  |¡ x,t|ƒD ] \}}| j  |||| |d¡ q"W | j  d| ¡ | j  d¡ dS )z adds a set of spheres zview rdinterface,storer   z	enable %szview rdinterface,recallN)r   r   ZresetCGOÚ	enumerater"   )r   ZlocsZcolorsÚlabelZ	sphereRadÚir&   r   r   r   ÚAddPharmacophore    s    zMolViewer.AddPharmacophorec             C   s"   |s| j  d¡ n| j  d¡ d S )Nzset defer_update,1zset defer_update,0)r   r   )r   Úvalr   r   r   ÚSetDisplayUpdate©   s    zMolViewer.SetDisplayUpdatec             C   s:   i }x0|D ](\}}| j  d||f ¡}||||f< q
W |S )z/ returns the coordinates of the selected atoms z(%s and id %d))r   ZgetAtomCoords)r   r)   Zresr@   r%   Zcoordsr   r   r   ÚGetAtomCoords¯   s
    zMolViewer.GetAtomCoordsc             C   s   | j  d¡ d S )Nzdisable all)r   r   )r   r   r   r   ÚHideAll·   s    zMolViewer.HideAllc             C   s   | j  d| ¡ d S )Nz
disable %s)r   r   )r   ÚobjNamer   r   r   Ú
HideObjectº   s    zMolViewer.HideObjectc             C   s   | j  d| ¡ d S )Nz	enable %s)r   r   )r   rG   r   r   r   ÚDisplayObject½   s    zMolViewer.DisplayObjectc             C   s   | j  d¡ d S )NZrefresh)r   r   )r   r   r   r   ÚRedrawÀ   s    zMolViewer.Redrawc             C   s   | j  |¡ d S )N)r   r#   )r   rG   r   r   r   ÚZoomÃ   s    zMolViewer.Zoomú(%(molName)s)ú(%(proteinName)s and not het)c             C   s>   d}|d| d | d 7 }|d7 }|t ƒ  }| j |¡ dS )zI toggles display of h bonds between the protein and a specified molecule zdelete %(objName)s;
zdist %(objName)s,r-   z	,mode=2;
zenable %(objName)s;N)r<   r   r   )r   rG   ÚmolNameÚproteinNameÚ
molSelTextÚproteinSelTextr3   r   r   r   ÚDisplayHBondsÆ   s
    
zMolViewer.DisplayHBondsç      @Úredc       	      C   s>   d}|d| d | d 7 }|d7 }|t ƒ  }| j |¡ dS )zL toggles display of collisions between the protein and a specified molecule zdelete %(objName)s;
zdist %(objName)s,r-   z,%(distCutoff)f,mode=0;
z3enable %(objName)s
    color %(color)s, %(objName)sN)r<   r   r   )	r   rG   rN   rO   Z
distCutoffZcolorrP   rQ   r3   r   r   r   ÚDisplayCollisionsÐ   s    
zMolViewer.DisplayCollisionsc             C   s(   |st dƒ‚tj |¡}| j |¡ d S )Nzempty filename)Ú
ValueErrorr   ÚpathÚabspathr   Zsave)r   r   r   r   r   ÚSaveFileÚ   s    zMolViewer.SaveFilec          	   C   sª  ydd l }W n  tk
r,   ddlm } Y nX dd l}|dkrH| |¡ tjddd}| ¡  | j 	d|j
 ¡ | d¡ xBtdƒD ]6}y| |j
¡}P W q„ tk
r¸   | d	¡ Y q„X q„W yt |j
¡ W n ttfk
ræ   Y nX d }|d k	sþ|d k	r¦|j}	|d kr|	d
 }|d kr(|	d }||	d
 k rht|ƒ|	d
  }
||
9 }t|ƒ}| ||fd¡}n>||	d k r¦t|ƒ|	d  }
||
9 }t|ƒ}| ||fd¡}|S )Nr   )ÚImagez.pngF)ÚsuffixÚdeletezpng %sgš™™™™™É?é
   gš™™™™™¹?r   T)rZ   ÚImportErrorZPILÚtimeZsleepÚtempfileZNamedTemporaryFileÚcloser   r   r   ÚrangeÚopenÚIOErrorr   ÚunlinkÚOSErrorÚPermissionErrorÚsizeÚfloatÚintZresize)r   ÚhÚwZpreDelayrZ   r_   ÚfdrA   ZimgZszZfracr   r   r   ÚGetPNGâ   sN    



zMolViewer.GetPNG)Nr   r   )F)N)r,   )F)r   )r:   r;   F)r>   )rL   rM   )rS   rT   rL   rM   )NNr   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r'   r+   r4   r7   r9   r=   rB   rD   rE   rF   rH   rI   rJ   rK   rR   rU   rY   rn   r   r   r   r   r      s6   

	
%


	
 


	 
	 
	r   )Ú__doc__Zrdkitr   r   r`   ÚsysZ	xmlrpclibr   r^   Zxmlrpc.clientr   Úobjectr   r   r   r   r   Ú<module>   s   