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:
                            // 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);
    
                    
    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.
      static double getTMScore​(Atom[] atomSet1, Atom[] atomSet2, int len1, int len2)
      Calculate the TM-Score for the superposition.
      static double getTMScoreAlternate​(Atom[] atomSet1, Atom[] atomSet2, int len1, int len2)
      Calculate the TM-Score for the superposition.
      javax.vecmath.Matrix4d getTransformation()  
      Atom getTranslation()
      Get the shift vector.
      • 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. Atom sets must be pre-rotated.
        Parameters:
        atomSet1 - atom array 1
        atomSet2 - atom array 2
        Returns:
        the RMS of two atom sets
        Throws:
        StructureException
      • getTMScore

        public static double getTMScore​(Atom[] atomSet1,
                                        Atom[] atomSet2,
                                        int len1,
                                        int len2)
                                 throws StructureException
        Calculate the TM-Score for the superposition. Normalizes by the minimum-length structure (that is, min\{len1,len2\}). Atom sets must be pre-rotated.

        Citation:
        Zhang Y and Skolnick J (2004). "Scoring function for automated assessment of protein structure template quality". Proteins 57: 702 - 710.

        Parameters:
        atomSet1 - atom array 1
        atomSet2 - atom array 2
        len1 - The full length of the protein supplying atomSet1
        len2 - The full length of the protein supplying atomSet2
        Returns:
        The TM-Score
        Throws:
        StructureException
      • getTMScoreAlternate

        public static double getTMScoreAlternate​(Atom[] atomSet1,
                                                 Atom[] atomSet2,
                                                 int len1,
                                                 int len2)
                                          throws StructureException
        Calculate the TM-Score for the superposition. Normalizes by the maximum-length structure (that is, max\{len1,len2\}) rather than the minimum. Atom sets must be pre-rotated.

        Citation:
        Zhang Y and Skolnick J (2004). "Scoring function for automated assessment of protein structure template quality". Proteins 57: 702 - 710.

        Parameters:
        atomSet1 - atom array 1
        atomSet2 - atom array 2
        len1 - The full length of the protein supplying atomSet1
        len2 - The full length of the protein supplying atomSet2
        Returns:
        The TM-Score
        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
      • getTransformation

        public javax.vecmath.Matrix4d getTransformation()