BioJava:CookBookItaliano:Proteomics
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.
```java 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
}
public CalcMass() {
}
/**
* Calcola la massa dell'aminoacido in Daltons. Utilizzando la media della massa degli isotopi
* @param protein the peptide
* @throws IllegalSymbolException if
protein
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
protein
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();
}
}
}
} ```