BioJava:CookBookItaliano:Proteomics

From BioJava

Jump to: navigation, search

Come posso calcolare la massa e il pI di un aminoacido?

Se si sta lavorando ad un progetto sulla proteomica è importante conoscere quale è approssimativamente la massa e il pI di ogni gene putativo. Biojava contiene 2 classi (MassCalc e IsoelectricPointCalc) che fanno parte del package proteomics che calcolano questi valori.

Il programma seguente mostra un primo utilizzo di queste classi. Questo semplice esempio utilizza entrambe le classi MassCalc e IsoelectricPointCalc con le proprietà di default, ma entrambe hanno delle proprietà particolare che sarebbe meglio approfondire utilizzando le API docs.

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
 
import org.biojava.bio.BioException;
import org.biojava.bio.proteomics.IsoelectricPointCalc;
import org.biojava.bio.proteomics.MassCalc;
import org.biojava.bio.seq.ProteinTools;
import org.biojava.bio.seq.RNATools;
import org.biojava.bio.seq.Sequence;
import org.biojava.bio.seq.SequenceIterator;
import org.biojava.bio.seq.io.SeqIOTools;
import org.biojava.bio.symbol.Edit;
import org.biojava.bio.symbol.IllegalAlphabetException;
import org.biojava.bio.symbol.IllegalSymbolException;
import org.biojava.bio.symbol.SimpleSymbolList;
import org.biojava.bio.symbol.SymbolList;
import org.biojava.bio.symbol.SymbolPropertyTable;
 
/**
 * Calcola la massa e il punto isoelettrico di una collezione di sequenze.
 */
 
public class CalcMass {
 
  /**
   * Chiama questo metodo per sapere come utilizzare questa classe, il programma termina dopo l'esecuzioned i questo metodo.
   */
  public static void help(){
    System.out.println(
        "usage: java calcMass <file> <format> <DNA|RNA|PROTEIN> <out file>");
    System.exit( -1);
 
  }
 
  public CalcMass() {
  }
 
  /**
   * Calcola la massa dell'aminoacido in Daltons. Utilizzando la media della massa degli isotopi
   * @param protein the peptide
   * @throws IllegalSymbolException if <code>protein</code> is not a protein
   * @return the mass
   */
  public double mass(SymbolList protein)throws IllegalSymbolException{
    double mass = 0.0;
    MassCalc mc = new MassCalc(SymbolPropertyTable.AVG_MASS, true);
    mass = mc.getMass(protein);
    return mass;
  }
 
  /**
   * Calcola il punto isoelettrico assumento un libero NH e COOH
   * @param protein the peptide
   * @throws IllegalAlphabetException if <code>protein</code> is not a peptide
   * @throws BioException
   * @return double the PI
   */
  public double pI(SymbolList protein)
      throws IllegalAlphabetException, BioException{
 
    double pI = 0.0;
    IsoelectricPointCalc ic = new IsoelectricPointCalc();
    pI = ic.getPI(protein, true, true);
    return pI;
  }
 
  public static void main(String[] args) throws Exception{
    if(args.length != 4)
      help();
 
    BufferedReader br = null;
    PrintWriter out = null;
    try{
      //leggo la sequenza
      br = new BufferedReader(new FileReader(args[0]));
      SequenceIterator seqi =
          (SequenceIterator)SeqIOTools.fileToBiojava(args[1], args[2], br);
 
      out = new PrintWriter(new FileOutputStream(args[3]));
 
      //scrivo l'header
      out.println("name, mass, pI, size, sequence");
 
 
      CalcMass calcMass = new CalcMass();
 
      while (seqi.hasNext()) {
        SymbolList syms = seqi.nextSequence();
        String name = null;
 
        //prendo il nome corretto dell'aminoacido
        if(args[1].equalsIgnoreCase("fasta")){
          name = ((Sequence) syms).getAnnotation().
              getProperty("description_line").toString();
        }else{
          name = ((Sequence)syms).getName();
        }
        out.print(name+",");
 
        //Se non è una proteina abbiamo bisogno di tradurla
        if(syms.getAlphabet() != ProteinTools.getAlphabet() &&
           syms.getAlphabet() != ProteinTools.getTAlphabet()){
          if(syms.getAlphabet() != RNATools.getRNA()){
            syms = RNATools.transcribe(syms);
          }
 
          //Se non è divisibile per 3 bisogna troncarla
          if(syms.length() % 3 != 0){
            syms = syms.subList(1, syms.length() - (syms.length() %3));
          }
 
          syms = RNATools.translate(syms);
 
         /*
          * La traduzione di GTG o TTG attualmente è la Metionina se
          * se è il codone di start(tutte le sequenze partono con f-Met). Altrimenti
          * dobbiamo modificare la sequenza.
          */      
          if(syms.symbolAt(1) != ProteinTools.met()){
 
            //SimpleSymbolLists sono editabili altri no
            syms = new SimpleSymbolList(syms);
            Edit e = new Edit(1, syms.getAlphabet(), ProteinTools.met());
            syms.edit(e);
          }
        }
        //Se la sequenza finisce con una * (terminazione) abbiamo bisogno di rimuovere l'*
        if (syms.symbolAt(syms.length()) == ProteinTools.ter()) {
          syms = syms.subList(1, syms.length()-1);
        }
 
        //effettuo i calcoli
        double mass = calcMass.mass(syms);
        double pI = calcMass.pI(syms);
 
        //stampo i risultati per questa proteina
        out.println(mass+","+pI+","+syms.length()+","+syms.seqString());
      }
    }
    finally{ //tidy up
      if(br != null){
        br.close();
      }
      if(out != null){
        out.flush();
        out.close();
      }
    }
  }
}
Personal tools