[Biojava-l] modify structure

Tamas Horvath hotafin at gmail.com
Fri Dec 2 08:02:38 EST 2005


Thanks for the codes! I've noticed the methods in Calc, but my main questionis the following. Let's say I've got a primitive library of AminoAcides.They stored as a group, they have all the atoms. When I'm mutating thechain, I want to keep the backbone atoms in place, so as far as your mutatemethod goes it's ok. But now I want to replace the sidechain. In order to dothat, I'd shift and rotate the desired AA in place (Cbs would be identicaland the other backbone atoms as close as possible), and then copy thesidechain atoms to the mutated AA... (I hope that's clear)
So do I have to wrap my Group objects to a Chain/Structure object in orderto shift and rotate them?
I don't really get how the rotation is supposed to work... what is exactlythe matrix it asks for?
On 12/2/05, Andreas Prlic <ap3 at sanger.ac.uk> wrote:>> 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>> _______________________________________________> Biojava-l mailing list  -  Biojava-l at biojava.org> http://biojava.org/mailman/listinfo/biojava-l>


More information about the Biojava-l mailing list