package com.compomics.util.protein;
import com.compomics.util.enumeration.MolecularElement;
import com.compomics.util.interfaces.Sequence;
import org.apache.log4j.Logger;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
/**
* This class represents the molecular formula. Basically it count the number of atoms.
* Created by IntelliJ IDEA.
*
* User: Niklaas
* Date: 16-Aug-2010
* Time: 08:25:22
*/
public class MolecularFormula {
// Class specific log4j logger for MolecularFormula instances.
Logger logger = Logger.getLogger(MolecularFormula.class);
/**
* The hashmap collecting all the MolecularElements
*/
private HashMap<MolecularElement,Integer> iFormula = new HashMap<MolecularElement,Integer>();
/**
* Default constructor
*/
public MolecularFormula(){
}
/**
* Constructor.
*
* @param lSequence the amino acid sequence
*/
public MolecularFormula(Sequence lSequence){
HashMap<String, MolecularFormula> iElements = new HashMap<String, MolecularFormula>();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("elements.txt")));
String line;
String[] lHeaderElements = null;
while ((line = br.readLine()) != null) {
if(line.startsWith("#")){
//do nothing
} else if(line.startsWith("Header")){
String lTemp = line.substring(line.indexOf("=") + 1);
lHeaderElements = lTemp.split(",");
} else {
String lAa = line.substring(0, line.indexOf("="));
String[] lContribution = line.substring(line.indexOf("=") + 1).split(",");
MolecularFormula lAaFormula = new MolecularFormula();
for(int i = 0; i<lHeaderElements.length; i ++){
for (MolecularElement lMolecularElement : MolecularElement.values()) {
if(lMolecularElement.toString().equalsIgnoreCase(lHeaderElements[i])){
lAaFormula.addElement(lMolecularElement, Integer.valueOf(lContribution[i]));
}
}
}
iElements.put(lAa, lAaFormula);
}
}
br.close();
} catch(Exception e){
logger.error(e);
}
//add the N-terminus
this.addElement(MolecularElement.H, 2);
for(int i = 0; i<lSequence.getSequence().length(); i ++){
String lAa = String.valueOf(lSequence.getSequence().charAt(i));
MolecularFormula lFormula = iElements.get(lAa);
this.addMolecularFormula(lFormula);
}
//add the C-terminus
this.addElement(MolecularElement.H, 1);
this.addElement(MolecularElement.O, 1);
}
/**
* Method to add MolecularElements to this formula
* @param lMolecularElement The molecular element
* @param lCount The count
*/
public void addElement(MolecularElement lMolecularElement, Integer lCount){
Integer lOldCount = iFormula.get(lMolecularElement);
if(lOldCount == null){
lOldCount = lCount;
} else {
lOldCount = lOldCount + lCount;
}
iFormula.put(lMolecularElement, lOldCount);
}
/**
* Method to add whole formulas to this formula
* @param lMolecularFormula The MolecularFormula to add
*/
public void addMolecularFormula(MolecularFormula lMolecularFormula){
for (MolecularElement lMolecularElement : MolecularElement.values()) {
this.addElement(lMolecularElement, lMolecularFormula.getElementCount(lMolecularElement));
}
}
/**
* Getter for the count of a specific element
* @param lMolecularElement The MolecularElement to get to count for
* @return Int with the count
*/
public int getElementCount(MolecularElement lMolecularElement){
Integer lCount = iFormula.get(lMolecularElement);
if(lCount == null){
return 0;
}
return lCount;
}
/**
* To string method
* @return String
*/
public String toString(){
String lResult = "";
for (MolecularElement lMolecularElement : MolecularElement.values()) {
int lCount = this.getElementCount(lMolecularElement);
if(lCount > 0){
lResult = lResult + lMolecularElement + this.getElementCount(lMolecularElement) + " ";
}
}
return lResult;
}
}