[Biojava-l] modify structure

Andreas Prlic ap3 at sanger.ac.uk
Fri Dec 2 05:17:49 EST 2005


Hi Tamas!


> If I've got a Group , which is an amino acid, and I want to shift it 
> by a 3D vector (or 3 2D vectors), how may I do it?

There is the org.biojava.bio.structure.Calc class that allows to do 
calculations with the structure.

e.g. to shift a structure do:


                 double x = 2.0;
                 double y = 0.2;
                 double z = 12.3;

                 Atom vector = new AtomImpl();
                 vector.setX(x);
                 vector.setY(y);
                 vector.setZ(z);

                 // shift the structure.
                 Calc.shift(structure,vector);



>  Similarly, if i want to rotate the same structure, how may I do it?

	      double[][] matrix = new double[3][3];

                 matrix[0][0] = 0.1;
                 matrix[0][1] = 0.2;
                 matrix[0][2] = 0.3;
                 matrix[1][0] = 0.4;
                 matrix[1][1] = 0.5;
                 matrix[1][2] = 0.6;
                 matrix[2][0] = 0.7;
                 matrix[2][1] = 0.8;
                 matrix[2][2] = 0.9;

                 Calc.rotate(structure,matrix);


And here is an example regarding your questions from yesterday,
how to do mutations. most of the code actually deals with finding the 
right  chain and residue.
I will add the "mutator" class to cvs,  so in future doing mutations 
will be a two liner...

Cheers,
Andreas


/*
  *                  BioJava development code
  *
  * This code may be freely distributed and modified under the
  * terms of the GNU Lesser General Public Licence.  This should
  * be distributed with the code.  If you do not have a copy,
  * see:
  *
  *      http://www.gnu.org/copyleft/lesser.html
  *
  * Copyright for this code is held jointly by the individual
  * authors.  These should be listed in @author doc comments.
  *
  * For more information on the BioJava project and its aims,
  * or to join the biojava-l mailing list, visit the home page
  * at:
  *
  *      http://www.biojava.org/
  *
  * Created on Nov 30, 2005
  *
  */

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.biojava.bio.structure.AminoAcid;
import org.biojava.bio.structure.AminoAcidImpl;
import org.biojava.bio.structure.Atom;
import org.biojava.bio.structure.AtomIterator;
import org.biojava.bio.structure.Chain;
import org.biojava.bio.structure.ChainImpl;
import org.biojava.bio.structure.Group;
import org.biojava.bio.structure.Structure;
import org.biojava.bio.structure.StructureImpl;
import org.biojava.bio.structure.io.PDBFileReader;
import org.biojava.bio.structure.io.PDBParseException;


public class structureTest {

     public structureTest() {
         super();

     }

     public static void main (String[] args){
         String filename   =  "/Users/ap3/WORK/PDB/5pti.pdb" ;
         String outputfile =  "/Users/ap3/WORK/PDB/mutated.pdb" ;

         PDBFileReader pdbreader = new PDBFileReader();

         try{
                 Structure struc = pdbreader.getStructure(filename);
                 System.out.println(struc);


                 String chainId = " ";
                 String pdbResnum = "2";
                 String newType = "ARG";

                 // mutate the original structure and create a new one.
                 Mutator m = new Mutator();
                 Structure newstruc = 
m.mutate(struc,chainId,pdbResnum,newType);

                 FileOutputStream out= new FileOutputStream(outputfile);
                 PrintStream p =  new PrintStream( out );

                 p.println (newstruc.toPDB());

                 p.close();


         } catch (Exception e) {
             e.printStackTrace();
         }
     }
}

class Mutator{
     List supportedAtoms;

     public Mutator(){
         supportedAtoms = new ArrayList();
         supportedAtoms.add("N");
         supportedAtoms.add("CA");
         supportedAtoms.add("C");
         supportedAtoms.add("O");
         supportedAtoms.add("CB");
     }

     /** creates a new structure which is identical with the original 
one.
      * only one amino acid will be different.
      *
      * @param struc
      * @param chainId
      * @param pdbResnum
      * @param newType
      * @return
      * @throws PDBParseException
      */
     public Structure  mutate(Structure struc, String chainId, String 
pdbResnum, String newType)
     throws PDBParseException{


         // create a  container for the new structure
         Structure newstruc = new StructureImpl();

         // first we need to find our corresponding chain

         // get the chains for model nr. 0
         // if structure is xray there will be only one "model".
         List chains = struc.getChains(0);

         // iterate over all chains.
         Iterator iter = chains.iterator();
         while (iter.hasNext()){
             Chain c = (Chain)iter.next();
             if (c.getName().equals(chainId)) {
                 // here is our chain!

                 Chain newchain = new ChainImpl();
                 newchain.setName(c.getName());

                  List groups = c.getGroups();

                 // now iterate over all groups in this chain.
                 // in order to find the amino acid that has this 
pdbRenum.

                 Iterator giter = groups.iterator();
                 while (giter.hasNext()){
                     Group g = (Group) giter.next();
                     String rnum = g.getPDBCode();

                     // we only mutate amino acids
                     // and ignore hetatoms and nucleotides in this case
                     if (rnum.equals(pdbResnum) && 
(g.getType().equals("amino"))){

                         // create the mutated amino acid and add it to 
our new chain
                         AminoAcid newgroup = 
mutateResidue((AminoAcid)g,newType);
                         newchain.addGroup(newgroup);
                     }
                     else {
                         // add the group  to the new chain unmodified.
                         newchain.addGroup(g);
                     }
                 }

                 // add the newly constructed chain to the structure;
                 newstruc.addChain(newchain);
             } else {
                 // this chain is not requested, add it to the new 
structure unmodified.
                 newstruc.addChain(c);
             }

         }
         return newstruc;
     }

     /** create a new residue which is of the new type.
      * Only the atoms N, Ca, C, O, Cb will be considered.
      * prolines are not mutated...
      * @param oldAmino
      * @param newType
      * @return
      */
     public AminoAcid mutateResidue(AminoAcid oldAmino, String newType)
     throws PDBParseException {

         AminoAcid newgroup = new AminoAcidImpl();

         newgroup.setPDBCode(oldAmino.getPDBCode());
         newgroup.setPDBName(newType);


         AtomIterator aiter =new AtomIterator(oldAmino);
         while (aiter.hasNext()){
             Atom a = (Atom)aiter.next();
             if ( supportedAtoms.contains(a.getName())){
                 newgroup.addAtom(a);
             }
         }

         return newgroup;

     }

}

-----------------------------------------------------------------------

Andreas Prlic      Wellcome Trust Sanger Institute
                               Hinxton, Cambridge CB10 1SA, UK
			 +44 (0) 1223 49 6891



More information about the Biojava-l mailing list