## org.biojava.bio.structure
Class SVDSuperimposer

    java.lang.Object
      org.biojava.bio.structure.SVDSuperimposer

    public class SVDSuperimposer

extends 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
`SVDSuperimposer(Atom[] atomSet1, Atom[] atomSet2)` Create a SVDSuperimposer object and calculate a SVD superimposition of two sets of atoms.

Method Summary
`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