Class SVDSuperimposer


  • public class SVDSuperimposer
    extends java.lang.Object
    A class that calculates the superimposition between two sets of atoms inspired by the biopython SVDSuperimposer class... example usage:
     try{
    
                // get some arbitrary amino acids from somewhere
                String filename   =  "/Users/ap3/WORK/PDB/5pti.pdb" ;
    
                PDBFileReader pdbreader = new PDBFileReader();
                Structure struc = pdbreader.getStructure(filename);
                Group g1 = (Group)struc.getChain(0).getGroup(21).clone();
                Group g2 = (Group)struc.getChain(0).getGroup(53).clone();
    
                if ( g1.getPDBName().equals("GLY")){
                    if ( g1 instanceof AminoAcid){
                        Atom cb = Calc.createVirtualCBAtom((AminoAcid)g1);
                        g1.addAtom(cb);
                    }
                }
    
                if ( g2.getPDBName().equals("GLY")){
                    if ( g2 instanceof AminoAcid){
                        Atom cb = Calc.createVirtualCBAtom((AminoAcid)g2);
                        g2.addAtom(cb);
                    }
                }
    
                Structure struc2 = new StructureImpl((Group)g2.clone());
    
                System.out.println(g1);
                System.out.println(g2);
    
    
                Atom[] atoms1 = new Atom[3];
                Atom[] atoms2 = new Atom[3];
    
                atoms1[0] = g1.getAtom("N");
                atoms1[1] = g1.getAtom("CA");
                atoms1[2] = g1.getAtom("CB");
    
    
                atoms2[0] = g2.getAtom("N");
                atoms2[1] = g2.getAtom("CA");
                atoms2[2] = g2.getAtom("CB");
    
    
                SVDSuperimposer svds = new SVDSuperimposer(atoms1,atoms2);
    
    
                Matrix rotMatrix = svds.getRotation();
                Atom tranMatrix = svds.getTranslation();
    
    
                // now we have all the info to perform the rotations ...
    
                Calc.rotate(struc2,rotMatrix);
    
                //          shift structure 2 onto structure one ...
                Calc.shift(struc2,tranMatrix);
    
                //
                // write the whole thing to a file to view in a viewer
    
                String outputfile = "/Users/ap3/WORK/PDB/rotated.pdb";
    
                FileOutputStream out= new FileOutputStream(outputfile);
                PrintStream p =  new PrintStream( out );
    
                Structure newstruc = new StructureImpl();
    
                Chain c1 = new ChainImpl();
                c1.setName("A");
                c1.addGroup(g1);
                newstruc.addChain(c1);
    
                Chain c2 = struc2.getChain(0);
                c2.setName("B");
                newstruc.addChain(c2);
    
                // show where the group was originally ...
                Chain c3 = new ChainImpl();
                c3.setName("C");
                //c3.addGroup(g1);
                c3.addGroup(g2);
    
                newstruc.addChain(c3);
                p.println(newstruc.toPDB());
    
                p.close();
    
                System.out.println("wrote to file " + outputfile);
    
            } catch (Exception e){
                e.printStackTrace();
            }
            
    Since:
    1.5
    Version:
    %I% %G%
    Author:
    Andreas Prlic
    • Constructor Summary

      Constructors 
      Constructor Description
      SVDSuperimposer​(Atom[] atomSet1, Atom[] atomSet2)
      Create a SVDSuperimposer object and calculate a SVD superimposition of two sets of atoms.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      static double getRMS​(Atom[] atomSet1, Atom[] atomSet2)
      Calculate the RMS (root mean square) deviation of two sets of atoms.
      Matrix getRotation()
      Get the Rotation matrix that is required to superimpose the two atom sets.
      Atom getTranslation()
      Get the shift vector.
      void printMatrix​(Matrix m)
      Simple debug method to print a Matrix object on System.out.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • SVDSuperimposer

        public SVDSuperimposer​(Atom[] atomSet1,
                               Atom[] atomSet2)
                        throws StructureException
        Create a SVDSuperimposer object and calculate a SVD superimposition of two sets of atoms.
        Parameters:
        atomSet1 - Atom array 1
        atomSet2 - Atom array 2
        Throws:
        StructureException
    • Method Detail

      • getRMS

        public static double getRMS​(Atom[] atomSet1,
                                    Atom[] atomSet2)
                             throws StructureException
        Calculate the RMS (root mean square) deviation of two sets of atoms.
        Parameters:
        atomSet1 - atom array 1
        atomSet2 - atom array 2
        Returns:
        the RMS of two atom sets
        Throws:
        StructureException
      • getRotation

        public Matrix getRotation()
        Get the Rotation matrix that is required to superimpose the two atom sets.
        Returns:
        a rotation matrix.
      • getTranslation

        public Atom getTranslation()
        Get the shift vector.
        Returns:
        the shift vector
      • printMatrix

        public void printMatrix​(Matrix m)
        Simple debug method to print a Matrix object on System.out.
        Parameters:
        m - a Matrix