B
    ‰°b›  ã               @   s6   d Z ddlZddlmZ ddlmZ G dd„ dƒZdS )zSuperimpose two structures.é    N)ÚSVDSuperimposer)ÚPDBExceptionc               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚSuperimposerzERotate/translate one set of atoms on top of another to minimize RMSD.c             C   s   d| _ d| _dS )zInitialize the class.N)ÚrotranÚrms)Úself© r   ú3lib/python3.7/site-packages/Bio/PDB/Superimposer.pyÚ__init__   s    zSuperimposer.__init__c             C   s¢   t |ƒt |ƒkstdƒ‚t |ƒ}t |df¡}t |df¡}x2td|ƒD ]$}||  ¡ ||< ||  ¡ ||< qHW tƒ }| ||¡ | ¡  | 	¡ | _
| ¡ | _dS )aP  Prepare translation/rotation to minimize RMSD between atoms.

        Put (translate/rotate) the atoms in fixed on the atoms in
        moving, in such a way that the RMSD is minimized.

        :param fixed: list of (fixed) atoms
        :param moving: list of (moving) atoms
        :type fixed,moving: [L{Atom}, L{Atom},...]
        z*Fixed and moving atom lists differ in sizeé   r   N)Úlenr   ÚnumpyZzerosÚrangeZ	get_coordr   ÚsetÚrunZget_rmsr   Z
get_rotranr   )r   ZfixedZmovingÚlengthZfixed_coordZmoving_coordÚiZsupr   r   r	   Ú	set_atoms   s    

zSuperimposer.set_atomsc             C   sN   | j dkrtdƒ‚| j \}}| d¡}| d¡}x|D ]}| ||¡ q6W dS )z!Rotate/translate a list of atoms.Nz)No transformation has been calculated yetÚf)r   r   ZastypeZ	transform)r   Z	atom_listZrotZtranZatomr   r   r	   Úapply1   s    




zSuperimposer.applyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r	   r      s   r   )r   r   ZBio.SVDSuperimposerr   ZBio.PDB.PDBExceptionsr   r   r   r   r   r	   Ú<module>   s   