org.biojava.bio.structure
Class SVDSuperimposer

java.lang.Object
  extended by 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