/************************************************************************* * * * This file is part of the 20n/act project. * * 20n/act enables DNA prediction for synthetic biology/bioengineering. * * Copyright (C) 2017 20n Labs, Inc. * * * * Please direct all queries to act@20n.com. * * * * 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 3 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, see <http://www.gnu.org/licenses/>. * * * *************************************************************************/ package com.act.lcms.v2.fullindex; import java.nio.ByteBuffer; /** * (time, mass/charge, intensity) triples. * * The three axes (XYZ) from MS1 are stored as binary triples in our index, so that we can recover the individual * readings from the LCMS instrument in any m/z and time ranges. * * This could be called XYZ, but T(ime, )Mz(, and) I(ntensity) makes more sense to me. */ public class TMzI { /* Note: we are cheating here. We usually throw around Doubles for time and intensity. To save (a whole bunch of) * of bytes, we pare down our time intensity values to floats, knowing they were actually floats to begin with * in the NetCDF file but were promoted to doubles to be compatible with the LCMS parser API. */ public static final int BYTES = Float.BYTES + Double.BYTES + Float.BYTES; // TODO: we might get better compression out of using an index for time. private float time; private double mz; private float intensity; public TMzI(float time, double mz, float intensity) { this.time = time; this.mz = mz; this.intensity = intensity; } public float getTime() { return time; } public double getMz() { return mz; } public float getIntensity() { return intensity; } public void writeToByteBuffer(ByteBuffer buffer) { buffer.putFloat(time); buffer.putDouble(mz); buffer.putFloat(intensity); } // Write the fields without bothering to create an object. static void writeToByteBuffer(ByteBuffer buffer, float time, double mz, float intensity) { buffer.putFloat(time); buffer.putDouble(mz); buffer.putFloat(intensity); } static TMzI readNextFromByteBuffer(ByteBuffer buffer) { float time = buffer.getFloat(); double mz = buffer.getDouble(); float intensity = buffer.getFloat(); return new TMzI(time, mz, intensity); } }