Spaces:
No application file
No application file
# Copyright (C) 2002, Thomas Hamelryck (thamelry@binf.ku.dk) | |
# | |
# This file is part of the Biopython distribution and governed by your | |
# choice of the "Biopython License Agreement" or the "BSD 3-Clause License". | |
# Please see the LICENSE file that should have been included as part of this | |
# package. | |
"""Superimpose two structures.""" | |
import numpy | |
from Bio.SVDSuperimposer import SVDSuperimposer | |
from Bio.PDB.PDBExceptions import PDBException | |
class Superimposer: | |
"""Rotate/translate one set of atoms on top of another to minimize RMSD.""" | |
def __init__(self): | |
"""Initialize the class.""" | |
self.rotran = None | |
self.rms = None | |
def set_atoms(self, fixed, moving): | |
"""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},...] | |
""" | |
if not len(fixed) == len(moving): | |
raise PDBException("Fixed and moving atom lists differ in size") | |
length = len(fixed) | |
fixed_coord = numpy.zeros((length, 3)) | |
moving_coord = numpy.zeros((length, 3)) | |
for i in range(0, length): | |
fixed_coord[i] = fixed[i].get_coord() | |
moving_coord[i] = moving[i].get_coord() | |
sup = SVDSuperimposer() | |
sup.set(fixed_coord, moving_coord) | |
sup.run() | |
self.rms = sup.get_rms() | |
self.rotran = sup.get_rotran() | |
def apply(self, atom_list): | |
"""Rotate/translate a list of atoms.""" | |
if self.rotran is None: | |
raise PDBException("No transformation has been calculated yet") | |
rot, tran = self.rotran | |
rot = rot.astype("f") | |
tran = tran.astype("f") | |
for atom in atom_list: | |
atom.transform(rot, tran) | |