/* * Copyright (c) 2003-2012 Fred Hutchinson Cancer Research Center * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fhcrc.cpl.toolbox.chem; import java.util.List; import java.util.ArrayList; /** * * Describes a chemical element * * Created by IntelliJ IDEA. * User: tholzman * Date: Mar 25, 2010 * Time: 11:56:50 AM * To change this template use File | Settings | File Templates. */ public class Element { protected String symbol; protected double commonestIsotopeMass; protected double averageMass; protected int atomicNumber; protected int nominalMass; protected double[] isotopicPeakMassesWithoutMissing; protected double[] isotopicPeakFrequenciesWithoutMissing; protected double[] isotopicPeakMassesWithMissing; protected double[] isotopicPeakFrequenciesWithMissing; public String getSymbol() { return symbol; } public void setSymbol(String symbol) { this.symbol = symbol; } public int getAtomicNumber() { return atomicNumber; } public void setAtomicNumber(int atomicNumber) { this.atomicNumber = atomicNumber; } public Element(String symbol, double commonestIsotopeMass, double averageMass, int atomicNumber) { this.symbol = symbol; this.commonestIsotopeMass = commonestIsotopeMass; this.averageMass = averageMass; this.atomicNumber = atomicNumber; nominalMass = (int) Math.round(commonestIsotopeMass); } /** * Constructor that takes isotope masses and frequencies and calculates commonest isotope mass * and average mass. * isotope masses should /not/ include 0-frequency (missing) peaks. * @param symbol * @param atomicNumber * @param isotopeMasses * @param isotopeFrequencies */ public Element(String symbol, int atomicNumber, double[] isotopeMasses, double[] isotopeFrequencies) { this.symbol = symbol; this.atomicNumber = atomicNumber; setIsotopicPeakMassesAndFrequencies(isotopeMasses, isotopeFrequencies); double massesSum = 0; double weightsSum = 0; double highestFrequency = 0; for (int i=0; i<isotopeMasses.length; i++) { massesSum += isotopeMasses[i] * isotopeFrequencies[i]; weightsSum += isotopeFrequencies[i]; if (isotopeFrequencies[i] > highestFrequency) { commonestIsotopeMass = isotopeMasses[i]; highestFrequency = isotopeFrequencies[i]; } } this.averageMass = massesSum / weightsSum; nominalMass = (int) Math.round(commonestIsotopeMass); } public double getCommonestIsotopeMass() { return commonestIsotopeMass; } public void setCommonestIsotopeMass(double commonestIsotopeMass) { this.commonestIsotopeMass = commonestIsotopeMass; } public double getAverageMass() { return averageMass; } public void setAverageMass(double averageMass) { this.averageMass = averageMass; } /** * Created arrays of masses and frequencies including non-occurring masses with frequency 0 * @param isotopicPeakMasses * @param isotopicPeakFrequencies */ public void setIsotopicPeakMassesAndFrequencies(double[] isotopicPeakMasses, double[] isotopicPeakFrequencies) { this.isotopicPeakMassesWithoutMissing = isotopicPeakMasses; this.isotopicPeakFrequenciesWithoutMissing = isotopicPeakFrequencies; List<Double> isotopicPeakMassesPadded = new ArrayList<Double>(); List<Double> isotopicPeakFrequenciesPadded = new ArrayList<Double>(); double previousMass = 0; for (int i=0; i<isotopicPeakMasses.length; i++) { double consecutivePeakMassDiff = isotopicPeakMasses[i] - previousMass; if (i>0 && consecutivePeakMassDiff > 1.3) { int numMissingPeaks = (int) Math.round(consecutivePeakMassDiff / 1.0078) - 1; for (int j=1; j <= numMissingPeaks; j++) { isotopicPeakMassesPadded.add(previousMass + (j * (consecutivePeakMassDiff / (double) (numMissingPeaks+1)))); isotopicPeakFrequenciesPadded.add(0.0); } } isotopicPeakMassesPadded.add(isotopicPeakMasses[i]); isotopicPeakFrequenciesPadded.add(isotopicPeakFrequencies[i]); previousMass = isotopicPeakMasses[i]; } double[] freqsPadded = new double[isotopicPeakFrequenciesPadded.size()]; double[] massesPadded = new double[isotopicPeakFrequenciesPadded.size()]; for (int i=0; i<freqsPadded.length; i++) { freqsPadded[i] = isotopicPeakFrequenciesPadded.get(i); massesPadded[i] = isotopicPeakMassesPadded.get(i); } setIsotopicPeakMassesWithMissing(massesPadded); setIsotopicPeakFrequenciesWithMissing(freqsPadded); } /** * IMPORTANT! These isotopic peak masses do NOT include 0-frequency peaks! If you * want those, use getIsotopicPeakMassesPadded() * @return */ public double[] getIsotopicPeakMassesWithoutMissing() { return isotopicPeakMassesWithoutMissing; } /** * IMPORTANT! These isotopic peak frequencies do NOT include 0-frequency peaks! If you * want those, use getIsotopicPeakFrequenciesPadded() * @return */ public double[] getIsotopicPeakFrequenciesWithoutMissing() { return isotopicPeakFrequenciesWithoutMissing; } public void setIsotopicPeakFrequenciesWithoutMissing(double[] isotopicPeakFrequencies) { this.isotopicPeakFrequenciesWithoutMissing = isotopicPeakFrequencies; } public double[] getIsotopicPeakMassesWithMissing() { return isotopicPeakMassesWithMissing; } /** * Includes 0-frequency masses * @param isotopicPeakMassesWithMissing */ public void setIsotopicPeakMassesWithMissing(double[] isotopicPeakMassesWithMissing) { this.isotopicPeakMassesWithMissing = isotopicPeakMassesWithMissing; } /** * Includes 0-frequency peaks * @return */ public double[] getIsotopicPeakFrequenciesWithMissing() { return isotopicPeakFrequenciesWithMissing; } public void setIsotopicPeakFrequenciesWithMissing(double[] isotopicPeakFrequenciesWithMissing) { this.isotopicPeakFrequenciesWithMissing = isotopicPeakFrequenciesWithMissing; } public String toString() { StringBuffer buf = new StringBuffer("Element: " + symbol + ", anumber=" + atomicNumber + ", monomass=" + getCommonestIsotopeMass() + ", avemass=" + getAverageMass()); if (isotopicPeakFrequenciesWithMissing != null) { buf.append(" all masses (frequencies): "); for (int i=0; i< isotopicPeakFrequenciesWithMissing.length; i++) { if (i>0) buf.append(", "); buf.append(isotopicPeakMassesWithMissing[i] + " (" + isotopicPeakFrequenciesWithMissing[i] + ")"); } } return buf.toString(); } public int getNominalMass() { return nominalMass; } }