def test_superimpose(): from mglutil.math.rigidFit import RigidfitBodyAligner rigidfitAligner = RigidfitBodyAligner() refCoords=[[0,0,0] , [1,0,0], [0,1,0], [0,0,1]] mobCoords=[[10,0,0] , [11,0,0], [10,1,0], [10,0,1]] rigidfitAligner.setRefCoords(refCoords) rigidfitAligner.rigidFit(mobCoords) rmsd=rigidfitAligner.rmsdAfterSuperimposition(mobCoords) assert diff(rmsd, 0.0 )
def test_superimpose(): from mglutil.math.rigidFit import RigidfitBodyAligner rigidfitAligner = RigidfitBodyAligner() refCoords = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]] mobCoords = [[10, 0, 0], [11, 0, 0], [10, 1, 0], [10, 0, 1]] rigidfitAligner.setRefCoords(refCoords) rigidfitAligner.rigidFit(mobCoords) rmsd = rigidfitAligner.rmsdAfterSuperimposition(mobCoords) assert diff(rmsd, 0.0)
def doit(self, refAtoms, mobAtoms, updateGeom=True, showRMSD=True): """ The SuperImposeAtomsCommand takes two set of Atoms of the same length compute the rotation and translation matrices to superimpose the mobAtoms onto the refAtoms using rigidFit module and then transform the corresponding geometry. updateGeom = True : transform the masterGeom of mobAtoms. showRMSD = True : print and return RMSD """ if refAtoms is None or mobAtoms is None: return assert isinstance(refAtoms, TreeNodeSet) assert isinstance(mobAtoms, TreeNodeSet) refAtoms = refAtoms.findType(Atom) mobAtoms = mobAtoms.findType(Atom) # validate the inputs if len(refAtoms) !=len(mobAtoms): print "The two atomSet are not of equal length" return if len(refAtoms) < 3 : print "At least three atoms are needed for superimposition" return refCoords = refAtoms.coords mobCoords = mobAtoms.coords rigidfitAligner = RigidfitBodyAligner() rigidfitAligner.setRefCoords(refCoords) rigidfitAligner.rigidFit(mobCoords) if updateGeom: rotMat = Numeric.identity(4).astype('d') rotMat[:3,:3] = rigidfitAligner.rotationMatrix transMat = Numeric.array(rigidfitAligner.translationMatrix) rotMat[3,:3] = transMat #print rotMat # the matrix mGeom = mobAtoms[0].top.geomContainer.masterGeom mGeom.SetRotation(Numeric.reshape(rotMat, (16,)).astype('f')) mGeom.viewer.Redraw() if showRMSD: rmsd=rigidfitAligner.rmsdAfterSuperimposition(mobCoords) print "RMSD = ", rmsd return rmsd else: return
def doit(self, refAtoms, mobAtoms, updateGeom=True, showRMSD=True): """ The SuperImposeAtomsCommand takes two set of Atoms of the same length compute the rotation and translation matrices to superimpose the mobAtoms onto the refAtoms using rigidFit module and then transform the corresponding geometry. updateGeom = True : transform the masterGeom of mobAtoms. showRMSD = True : print and return RMSD """ if refAtoms is None or mobAtoms is None: return assert isinstance(refAtoms, TreeNodeSet) assert isinstance(mobAtoms, TreeNodeSet) refAtoms = refAtoms.findType(Atom) mobAtoms = mobAtoms.findType(Atom) # validate the inputs if len(refAtoms) != len(mobAtoms): print "The two atomSet are not of equal length" return if len(refAtoms) < 3: print "At least three atoms are needed for superimposition" return refCoords = refAtoms.coords mobCoords = mobAtoms.coords rigidfitAligner = RigidfitBodyAligner() rigidfitAligner.setRefCoords(refCoords) rigidfitAligner.rigidFit(mobCoords) if updateGeom: rotMat = Numeric.identity(4).astype('d') rotMat[:3, :3] = rigidfitAligner.rotationMatrix transMat = Numeric.array(rigidfitAligner.translationMatrix) rotMat[3, :3] = transMat #print rotMat # the matrix mGeom = mobAtoms[0].top.geomContainer.masterGeom mGeom.SetRotation(Numeric.reshape(rotMat, (16, )).astype('f')) mGeom.viewer.Redraw() if showRMSD: rmsd = rigidfitAligner.rmsdAfterSuperimposition(mobCoords) print "RMSD = ", rmsd return rmsd else: return