/**
* GeDBIT.type.TandemSpectra 2003.08.13
*
* The GeDBIT Library
* Copyright (c) 2006 The GeDBIT Group and The University of Texas at Austin.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Change Log:
* 2003.08.13: Modified from the original GeDBIT package, by Rui Mao
* 2003.11.06: Modified toString method for performance, by Willard
* 2004.05.13: Modified for performance, Willard
* 2004.05.12: Modified to use arrays instead of ArrayList, Willard
* 2004.08.15: Modified constructor to fix initialization bug with String input data, by Smriti Ramakrishnan
* 2004.09.01: Added sortAsc() method, Smriti Ramakrishnan
* 2004.09.11: Added call to sortAsc() method in all constructors - all objects are are sorted mandatorily, by Smriti Ramakrishnan
*/
package GeDBIT.type;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Arrays;
import GeDBIT.type.Table;
//import GeDBIT.db.TandemSpectraTable;
/**
* TandemSpectra represents a given spectra and its attached precursor mass.
*
* @author Smriti Ramakrishnan, Willard
* @version 2004.11.29
*/
public class TandemSpectra extends Spectra {
private static final long serialVersionUID = 1247643270939539788L;
private double precursorMass;
/**
* Necessary for readExternal() and writeExternal().
*/
public TandemSpectra() {
}
/**
* Constructs a TandemSpectra object from a {@link String representing
* the tandem spectra. The only difference between a Spectra and a
* TandemSpectra is that a TandemSpectra includes the precursor mass.
*
* @param table
* the corresponding {@link TandemSpectraTable} for this object
* @param rowID
* the rowID in the {@link TandemSpectraTable}.
* @param precursorMass
* the precursor mass of the spectra itself.
* @param spectra
* a space-seperated {@link String} representation of a single fragmentation spectra.
*/
public TandemSpectra(Table table, int rowID, double precursorMass,
String spectra) {
super(table, rowID, spectra);
this.precursorMass = precursorMass;
}
/**
* Main constructor using an array of doubles to define the Spectra.
*
* @param table
* the corresponding {@link TandemSpectraTable} for this object
* @param rowID
* the rowID in the {@link TandemSpectraTable}.
* @param precursorMass
* the precursor mass of the spectra itself.
* @param spectra
*/
public TandemSpectra(Table table, int rowID, double precursorMass,
double[] spectra) {
super(table, rowID, spectra);
this.precursorMass = precursorMass;
}
/**
* @return the precursor mass for this tandem spectra.
*/
public double getPrecursorMass() {
return precursorMass;
}
/*
* (non-Javadoc)
*
* @see GeDBIT.type.Spectra#expand()
*/
public IndexObject[] expand() {
IndexObject[] dbO = new IndexObject[rowIDLength];
for (int i = 0; i < rowIDLength; i++) {
dbO[i] = new TandemSpectra(table, rowIDStart + i, precursorMass,
data);
}
return dbO;
}
/*
* (non-Javadoc)
*
* @see GeDBIT.type.DoubleVector#compareTo(GeDBIT.type.IndexObject)
*/
public int compareTo(IndexObject oThat) {
if (!(oThat instanceof TandemSpectra))
throw new Error("not compatible");
TandemSpectra that = (TandemSpectra) oThat;
if (this == that)
return 0;
if (this.precursorMass < that.precursorMass)
return -1;
if (this.precursorMass > that.precursorMass)
return 1;
else {
if (this.size() < that.size())
return -1;
else if (this.size() > that.size())
return 1;
else {
for (int i = 0; i < this.size(); i++) {
double double1 = data[i];
double double2 = that.data[i];
if (double1 < double2)
return -1;
else if (double1 > double2)
return 1;
}
return 0;
}
}
}
/*
* (non-Javadoc)
*
* @see GeDBIT.type.DoubleVector#equals(java.lang.Object)
*/
public boolean equals(Object that) {
if (!(that instanceof TandemSpectra))
return false;
else {
TandemSpectra sWPMass = (TandemSpectra) that;
if (this.precursorMass != sWPMass.precursorMass)
return false;
return Arrays.equals(this.data, ((TandemSpectra) that).data);
}
}
// taken from Joshua Bloch's Effective Java
public int hashCode() {
int result = super.hashCode();
long _long = Double.doubleToLongBits(precursorMass);
return 37 * result + (int) (_long ^ (_long >>> 32));
}
/*
* (non-Javadoc)
*
* @see GeDBIT.type.DoubleVector#toString()
*/
public String toString() {
StringBuffer rowIDs = new StringBuffer("rowIDs: ");
for (int i = 0; i < rowIDLength; i++) {
rowIDs.append(table.getOriginalRowID(rowIDStart + i));
}
final int dataSize = data.length;
rowIDs.append("data(size=" + dataSize + ", pMass= " + precursorMass
+ ") :[");
for (int i = 0; i < dataSize; i++)
rowIDs.append(data[i]).append(", ");
rowIDs.append("]\n");
return rowIDs.toString();
}
/*
* (non-Javadoc)
*
* @see GeDBIT.type.DoubleVector#readExternal(java.io.ObjectInput)
*/
public void readExternal(ObjectInput in) throws ClassNotFoundException,
IOException {
super.readExternal(in);
precursorMass = in.readDouble();
}
/*
* (non-Javadoc)
*
* @see GeDBIT.type.DoubleVector#writeExternal(java.io.ObjectOutput)
*/
public void writeExternal(ObjectOutput out) throws IOException {
super.writeExternal(out);
out.writeDouble(precursorMass);
}
}