package org.openscience.cdk.formula;
import java.util.List;
import org.openscience.cdk.annotations.TestClass;
import org.openscience.cdk.annotations.TestMethod;
/**
* Class to manipulate IsotopePattern objects.
*
* @author Miguel Rojas Cherto
*
* @cdk.module formula
*/
@TestClass("org.openscience.cdk.formula.IsotopePatternManipulatorTest")
public class IsotopePatternManipulator {
/**
* Return the isotope pattern normalized to the highest abundance
*
* @param isotopeP The IsotopePattern object to normalize
* @return The IsotopePattern normalized
*/
@TestMethod("testNormalize_IsotopePattern")
public static IsotopePattern normalize(IsotopePattern isotopeP){
IsotopeContainer isoHighest = null;
double biggestAbundance = 0;
/*Extraction of the isoContainer with the highest abundance*/
for(IsotopeContainer isoContainer: isotopeP.getIsotopes()){
double abundance = isoContainer.getIntensity();
if(biggestAbundance < abundance){
biggestAbundance = abundance;
isoHighest = isoContainer;
}
}
/*Normalize*/
IsotopePattern isoNormalized = new IsotopePattern();
for(IsotopeContainer isoContainer: isotopeP.getIsotopes()){
double inten = isoContainer.getIntensity()/isoHighest.getIntensity();
IsotopeContainer icClone;
try {
icClone = (IsotopeContainer) isoContainer.clone();
icClone.setIntensity(inten);
if(isoHighest.equals(isoContainer))
isoNormalized.setMonoIsotope(icClone);
else
isoNormalized.addIsotope(icClone);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
isoNormalized.setCharge(isotopeP.getCharge());
return isoNormalized;
}
/**
* Return the isotope pattern sorted and normalized by intensity
* to the highest abundance.
*
* @param isotopeP The IsotopePattern object to sort
* @return The IsotopePattern sorted
*/
@TestMethod("testSortAndNormalizedByIntensity_IsotopePattern")
public static IsotopePattern sortAndNormalizedByIntensity(IsotopePattern isotopeP){
IsotopePattern isoNorma = normalize(isotopeP);
return sortByIntensity(isoNorma);
}
/**
* Return the isotope pattern sorted by intensity
* to the highest abundance.
*
* @param isotopeP The IsotopePattern object to sort
* @return The IsotopePattern sorted
*/
@TestMethod("testSortByIntensity_IsotopePattern")
public static IsotopePattern sortByIntensity(IsotopePattern isotopeP){
try {
IsotopePattern isoSort = new IsotopePattern();
List<IsotopeContainer> listISO = ((IsotopePattern)isotopeP.clone()).getIsotopes();
int length = listISO.size()-1;
for(int i = length ; i >= 0 ; i--){
double intensity = 0;
IsotopeContainer isoHighest = null;
for(IsotopeContainer isoContainer: listISO){
if(isoContainer.getIntensity() > intensity){
isoHighest = isoContainer;
intensity = isoContainer.getIntensity();
}
}
if(i == length)
isoSort.setMonoIsotope((IsotopeContainer) isoHighest.clone());
else
isoSort.addIsotope((IsotopeContainer) isoHighest.clone());
listISO.remove(isoHighest);
}
isoSort.setCharge(isotopeP.getCharge());
return isoSort;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
/**
* Return the isotope pattern sorted by mass
* to the highest abundance.
*
* @param isotopeP The IsotopePattern object to sort
* @return The IsotopePattern sorted
*/
@TestMethod("testSortByMass_IsotopePattern")
public static IsotopePattern sortByMass(IsotopePattern isotopeP){
try {
IsotopePattern isoSort = new IsotopePattern();
List<IsotopeContainer> listISO = ((IsotopePattern)isotopeP.clone()).getIsotopes();
int length = listISO.size()-1;
for(int i = length ; i >= 0 ; i--){
double mass = 100000;
IsotopeContainer isoHighest = null;
for(IsotopeContainer isoContainer: listISO){
if(isoContainer.getMass() < mass){
isoHighest = isoContainer;
mass = isoContainer.getMass();
}
}
if(i == length)
isoSort.setMonoIsotope((IsotopeContainer) isoHighest.clone());
else
isoSort.addIsotope((IsotopeContainer) isoHighest.clone());
listISO.remove(isoHighest);
}
isoSort.setCharge(isotopeP.getCharge());
return isoSort;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}