B
    ž3RcÑ  ã               @   sª   d dl mZ d dlmZ d dlZd dlmZ ddd„Zddd	„Ze	d
kr¦ej
dddZeddƒZxDeD ]<ZeeƒZeeƒ ¡  ¡ Zeed ƒZeee ƒdk sft‚qfW dS )é    )ÚChem)ÚAllChemN)Úlinalgc          	   C   sN  |d krt | ƒ}t | d¡}|| }d}d}d}d}d}d}	t dtj¡}
xž| D ]–}|| }xˆtdƒD ]|}|
||f  || ||  7  < xVt|d dƒD ]D}|
||f  || ||  7  < |
||f  || ||  7  < qšW qfW qPW |
| }
t |
¡\}}t |¡}|d d …|d f }t dtj¡}||d d…< d| 	|¡ |d< |S )Nr   )é   r   r   é   )é   éÿÿÿÿ)
ÚlenÚnpÚsumZzerosZdoubleÚranger   ZeighZargsortÚdot)ÚptsZweightsZwSumÚoriginZsumXXZsumXYZsumXZZsumYYZsumYZZsumZZZsumsÚptZdpÚiÚjZvalsZvectsÚorderZnormalÚplane© r   úshare/RDKit/Contrib/PBF/pbf.pyÚGetBestFitPlane   s4    
  ,
r   r   c          	      s°   |   |¡‰ ˆ  ¡ sdS t ‡ fdd„t|  ¡ ƒD ƒ¡}t|ƒ}t |d d… |d d… ¡}|d }d}x0|D ](}|t | |d d… ¡|d  ¡7 }qlW || }|t	|ƒ }|S )Nr   c                s   g | ]}t ˆ  |¡ƒ‘qS r   )ÚlistZGetAtomPosition)Ú.0Úx)Úconfr   r   ú
<listcomp>3   s    zPBFRD.<locals>.<listcomp>r   g      à?g        )
ZGetConformerZIs3Dr
   Zarrayr   ZGetNumAtomsr   r   Úabsr	   )ZmolZconfIdr   r   ZdenomÚresr   r   )r   r   ÚPBFRD.   s    
 
(r   Ú__main__z./testData/egfr.sdfF)ZremoveHsz./testData/egfr.outÚrr   g-Cëâ6?)N)r   )Zrdkitr   Z
rdkit.Chemr   Znumpyr
   r   r   r   Ú__name__ZSDMolSupplierZsupplÚopenZexpectedÚmr   ÚnextÚstripÚsplitZinlÚfloatZexpectr   ÚAssertionErrorr   r   r   r   Ú<module>
   s   



