
:>"^É  ã               @   s\   d  Z  d d l m Z d d l Z d d l m Z d d l m Z Gd d „  d e ƒ Z	 d S)zSuperimpose two structures.é    )Úprint_functionN)Ú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	   ú9/tmp/pip-build-ww9dw3qa/biopython/Bio/PDB/Superimposer.pyÚ__init__   s    	zSuperimposer.__init__c             C   sá   t  | ƒ t  | ƒ k s$ t d ƒ ‚ t  | ƒ } t j | d f ƒ } t j | d f ƒ } x? t d | ƒ D]. } | | j ƒ  | | <| | j ƒ  | | <qj Wt ƒ  } | j | | ƒ | j ƒ  | j	 ƒ  |  _
 | j ƒ  |  _ 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ÚiÚsupr	   r	   r
   Ú	set_atoms   s    
	
zSuperimposer.set_atomsc             C   sm   |  j  d k r t d ƒ ‚ |  j  \ } } | j d ƒ } | j d ƒ } x | D] } | j | | ƒ qO Wd 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
   Úapply2   s    zSuperimposer.applyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r	   r	   r	   r
   r      s   r   )
r   Ú
__future__r   r   ZBio.SVDSuperimposerr   ZBio.PDB.PDBExceptionsr   Úobjectr   r	   r	   r	   r
   Ú<module>   s
   