io.github.msdk.util.MsSpectrumUtil.java Source code

Java tutorial

Introduction

Here is the source code for io.github.msdk.util.MsSpectrumUtil.java

Source

/* 
 * (C) Copyright 2015-2016 by MSDK Development Team
 *
 * This software is dual-licensed under either
 *
 * (a) the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation
 *
 * or (per the licensee's choosing)
 *
 * (b) the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation.
 */

package io.github.msdk.util;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import com.google.common.base.Preconditions;
import com.google.common.collect.Range;

import io.github.msdk.datamodel.msspectra.MsSpectrum;

/**
 * <p>
 * MsSpectrumUtil class.
 * </p>
 */
public class MsSpectrumUtil {

    /**
     * Returns the m/z range of given data points. Can return null if the data
     * point list is empty.
     *
     * @return a {@link com.google.common.collect.Range} object.
     * @param mzValues
     *            an array of double.
     * @param size
     *            a {@link java.lang.Integer} object.
     */
    @Nullable
    public static Range<Double> getMzRange(@Nonnull double mzValues[], @Nonnull Integer size) {

        // Parameter check
        Preconditions.checkNotNull(mzValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, mzValues.length);

        if (size == 0)
            return null;

        double min = mzValues[0];
        double max = mzValues[size - 1];
        return Range.closed(min, max);
    }

    /**
     * Calculates the total ion current (=sum of all intensity values)
     *
     * @return a {@link java.lang.Float} object.
     * @param intensityValues
     *            an array of float.
     * @param size
     *            a {@link java.lang.Integer} object.
     */
    public static @Nonnull Float getTIC(@Nonnull float intensityValues[], @Nonnull Integer size) {

        // Parameter check
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, intensityValues.length);

        float tic = 0f;
        for (int i = 0; i < size; i++) {
            tic += intensityValues[i];
        }
        return tic;
    }

    /**
     * Calculates the total ion current (=sum of all intensity values)
     *
     * @return a {@link java.lang.Float} object.
     * @param intensityValues
     *            an array of float.
     * @param size
     *            a {@link java.lang.Integer} object.
     * @param mzValues
     *            an array of double.
     * @param mzRange
     *            a {@link com.google.common.collect.Range} object.
     */
    public static @Nonnull Float getTIC(@Nonnull double mzValues[], @Nonnull float intensityValues[],
            @Nonnull Integer size, @Nonnull Range<Double> mzRange) {

        // Parameter check
        Preconditions.checkNotNull(mzValues);
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, mzValues.length);
        Preconditions.checkPositionIndex(size, intensityValues.length);
        Preconditions.checkNotNull(mzRange);

        float tic = 0f;
        for (int i = 0; i < size; i++) {
            if (mzRange.contains(mzValues[i]))
                tic += intensityValues[i];
        }
        return tic;
    }

    /**
     * Returns the highest intensity value. Returns 0 if the list has no data
     * points.
     *
     * @return a {@link java.lang.Float} object.
     * @param intensityValues
     *            an array of float.
     * @param size
     *            a {@link java.lang.Integer} object.
     */
    public static @Nonnull Float getMaxIntensity(@Nonnull float intensityValues[], @Nonnull Integer size) {

        // Parameter check
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, intensityValues.length);

        Integer topIndex = getBasePeakIndex(intensityValues, size);
        if (topIndex == null)
            return 0f;
        return intensityValues[topIndex];
    }

    /**
     * Returns the highest intensity value. Returns 0 if the list has no data
     * points.
     *
     * @return a {@link java.lang.Float} object.
     * @param intensityValues
     *            an array of float.
     * @param size
     *            a {@link java.lang.Integer} object.
     * @param mzValues
     *            an array of double.
     * @param mzRange
     *            a {@link com.google.common.collect.Range} object.
     */
    public static @Nonnull Float getMaxIntensity(@Nonnull double mzValues[], @Nonnull float intensityValues[],
            @Nonnull Integer size, @Nonnull Range<Double> mzRange) {

        // Parameter check
        Preconditions.checkNotNull(mzValues);
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, mzValues.length);
        Preconditions.checkPositionIndex(size, intensityValues.length);
        Preconditions.checkNotNull(mzRange);

        Integer topIndex = getBasePeakIndex(mzValues, intensityValues, size, mzRange);
        if (topIndex == null)
            return 0f;
        return intensityValues[topIndex];
    }

    /**
     * Returns the index of the highest intensity value. Returns null if the
     * list has no data points.
     *
     * @return a {@link java.lang.Integer} object.
     * @param intensityValues
     *            an array of float.
     * @param size
     *            a {@link java.lang.Integer} object.
     */
    public static @Nullable Integer getBasePeakIndex(@Nonnull float intensityValues[], @Nonnull Integer size) {

        // Parameter check
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, intensityValues.length);

        Integer topIndex = null;
        for (int i = 0; i < size; i++) {
            if ((topIndex == null) || ((intensityValues[i] > intensityValues[topIndex])))
                topIndex = i;
        }
        return topIndex;
    }

    /**
     * Returns the index of the highest intensity value. Returns null if the
     * list has no data points or if no data point was found within the mz
     * range.
     *
     * @param mzRange
     *            a {@link com.google.common.collect.Range} object.
     * @return a {@link java.lang.Integer} object.
     * @param mzValues
     *            an array of double.
     * @param intensityValues
     *            an array of float.
     * @param size
     *            a {@link java.lang.Integer} object.
     */
    public static @Nullable Integer getBasePeakIndex(@Nonnull double mzValues[], @Nonnull float intensityValues[],
            @Nonnull Integer size, @Nonnull Range<Double> mzRange) {

        // Parameter check
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(mzValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, mzValues.length);
        Preconditions.checkPositionIndex(size, intensityValues.length);
        Preconditions.checkNotNull(mzRange);

        Integer topIndex = null;
        for (int i = 0; i < size; i++) {
            if ((topIndex == null || intensityValues[i] > intensityValues[topIndex])
                    && mzRange.contains(mzValues[i]))
                topIndex = i;
        }
        return topIndex;
    }

    /**
     * <p>normalizeIntensity.</p>
     *
     * @param intensityValues an array of float.
     * @param size a {@link java.lang.Integer} object.
     * @param scale a {@link java.lang.Float} object.
     */
    public static void normalizeIntensity(@Nonnull float intensityValues[], @Nonnull Integer size,
            @Nonnull Float scale) {

        // Parameter check
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, intensityValues.length);
        Preconditions.checkNotNull(scale);

        final float max = getMaxIntensity(intensityValues, size);

        for (int i = 0; i < intensityValues.length; i++) {
            intensityValues[i] = intensityValues[i] / max * scale;
        }

    }

    /**
     * <p>msSpectrumToString.</p>
     *
     * @param spectrum a {@link io.github.msdk.datamodel.msspectra.MsSpectrum} object.
     * @return a {@link java.lang.String} object.
     */
    public static @Nonnull String msSpectrumToString(MsSpectrum spectrum) {

        return msSpectrumToString(spectrum.getMzValues(), spectrum.getIntensityValues(),
                spectrum.getNumberOfDataPoints());

    }

    /**
     * <p>msSpectrumToString.</p>
     *
     * @param mzValues an array of double.
     * @param intensityValues an array of float.
     * @param size a {@link java.lang.Integer} object.
     * @return a {@link java.lang.String} object.
     */
    @SuppressWarnings("null")
    public static @Nonnull String msSpectrumToString(@Nonnull double mzValues[], @Nonnull float intensityValues[],
            @Nonnull Integer size) {

        // Parameter check
        Preconditions.checkNotNull(mzValues);
        Preconditions.checkNotNull(intensityValues);
        Preconditions.checkNotNull(size);
        Preconditions.checkPositionIndex(size, mzValues.length);
        Preconditions.checkPositionIndex(size, intensityValues.length);

        StringBuilder b = new StringBuilder();
        for (int i = 0; i < size; i++) {
            b.append(mzValues[i]);
            b.append(" ");
            b.append(intensityValues[i]);
            if (i < size - 1)
                b.append("\n");
        }

        return b.toString();

    }

}