[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();

                 // shift the structure.

>  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;


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...


  *                  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() {


     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();

                 Structure struc = pdbreader.getStructure(filename);

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

                 // mutate the original structure and create a new one.
                 Mutator m = new Mutator();
                 Structure newstruc = 

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

                 p.println (newstruc.toPDB());


         } catch (Exception e) {

class Mutator{
     List supportedAtoms;

     public Mutator(){
         supportedAtoms = new ArrayList();

     /** creates a new structure which is identical with the original 
      * 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();

                  List groups = c.getGroups();

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

                 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) && 

                         // create the mutated amino acid and add it to 
our new chain
                         AminoAcid newgroup = 
                     else {
                         // add the group  to the new chain unmodified.

                 // add the newly constructed chain to the structure;
             } else {
                 // this chain is not requested, add it to the new 
structure unmodified.

         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();


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

         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