org.fhcrc.cpl.viewer.mrm.Utils.java Source code

Java tutorial

Introduction

Here is the source code for org.fhcrc.cpl.viewer.mrm.Utils.java

Source

/*
 * 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.viewer.mrm;

import org.fhcrc.cpl.toolbox.proteomics.MSRun;
import org.fhcrc.cpl.viewer.gui.MRMDialog;
import org.fhcrc.cpl.viewer.mrm.utilities.PeaksTableModel;
import org.jfree.chart.annotations.XYLineAnnotation;
import org.jfree.chart.plot.DefaultDrawingSupplier;
import org.jfree.chart.plot.DrawingSupplier;
import org.jfree.data.xy.XYDataItem;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import java.awt.*;
import java.awt.geom.Line2D;

/**
 * Created by IntelliJ IDEA.
 * User: tholzman
 * Date: May 10, 2007
 * Time: 11:42:06 AM
 * To change this template use File | Settings | File Templates.
 */
public class Utils {
    /**
    * For a given scan, within an MZ range, feed back the highest peak found.
    *
    * TODO: This could be faster, if necessary: we could do a binary search and then expand up and down.
    *  @param scan
    * @param minMZ
    * @param maxMZ
    * @return
    */
    public static double getMaxIntensityForScan(MSRun.MSScan scan, double minMZ, double maxMZ) {
        double maxIntensityThisScan = 0;

        float[][] data = scan.getSpectrum();

        for (int j = 0; j < data[0].length; j++) {
            //since MZ values are monotonically increasing with j, when we
            // hit the max we can stop.
            if (data[0][j] > maxMZ)
                break;
            if (data[0][j] >= minMZ) {
                maxIntensityThisScan = Math.max(maxIntensityThisScan, data[1][j]);
            }
        }
        //_log.debug("       max intensity: scanIndex " + scanIndex + ", scanNumber " + run.getScan(scanIndex).getNum() + ", maxInt=" + maxIntensityThisScan);

        return maxIntensityThisScan;
    }

    private static final int PALE_CONSTANT = 100;

    public static Color paleColor(Color origColor) {

        int origRed = origColor.getRed();
        int origGreen = origColor.getGreen();
        int origBlue = origColor.getBlue();

        int maxColorVal = Math.max(Math.max(origRed, origGreen), origBlue);
        if (maxColorVal + PALE_CONSTANT > 255) {
            int adjust = (maxColorVal + PALE_CONSTANT) - 255;
            origRed = Math.max(0, origRed - adjust);
            origGreen = Math.max(0, origGreen - adjust);
            origBlue = Math.max(0, origBlue - adjust);
        }

        Color paleColor = new Color(origRed + PALE_CONSTANT, origGreen + PALE_CONSTANT, origBlue + PALE_CONSTANT);
        return paleColor;
    }

    public static DrawingSupplier plainDrawingSupplier(Color c) {
        Paint black[] = new Paint[1];
        black[0] = c;
        return new DefaultDrawingSupplier(black, DefaultDrawingSupplier.DEFAULT_OUTLINE_PAINT_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE);
    }

    public static boolean allYsAreLEVal(PlotDataSupplier pds, double val) {
        XYSeries xys = pds.getGraphData();
        int i = 0;
        for (Object oitem : xys.getItems()) {
            i++;
            if (((XYDataItem) oitem).getY().doubleValue() > val) {
                return false;
            }
        }
        return true;
    }

    public static boolean allYsAre0(PlotDataSupplier pds) {
        return allYsAreLEVal(pds, 0.0);
    }

    public static int allYsGEVal(XYSeries xys, double val) {
        int retVal = 0;
        for (Object oitem : xys.getItems()) {
            if (((XYDataItem) oitem).getY().doubleValue() > val) {
                retVal++;
            }
        }
        return retVal;
    }

    public static int allYsGEArr(PlotDataSupplier pds, float arr[][]) {
        int retVal = 0;
        XYSeries xys = pds.getGraphData();
        float xysarr[][] = PDStoArray(pds);
        for (int i = 0; i < xysarr[0].length; i++) {
            if (xysarr[1][i] > arr[1][i]) {
                retVal++;
            }
        }
        return retVal;
    }

    public static int allYsGEArr(XYSeries xys, float arr[][]) {
        int retVal = 0;
        for (int i = 0; i < xys.getItemCount(); i++) {
            if (xys.getY(i).floatValue() > arr[1][i]) {
                retVal++;
            }
        }
        return retVal;
    }

    public static Polygon legendThing(int width, int height) {
        int[] xes = new int[100];
        int[] yes = new int[100];
        int leftX = -1 * (width / 2);
        int bottomY = -1 * (height / 2);
        int pointCounter = 0;
        xes[0] = leftX;
        yes[0] = bottomY;
        int curX = leftX;
        int curY = bottomY;
        while (curY <= height / 2) {
            xes[pointCounter] = curX;
            yes[pointCounter] = curY;
            pointCounter++;
            curX = width / 2;
            xes[pointCounter] = curX;
            yes[pointCounter] = curY;
            pointCounter++;
            curY++;
            xes[pointCounter] = curX;
            yes[pointCounter] = curY;
            pointCounter++;
            curX = leftX;
        }
        return new Polygon(xes, yes, pointCounter - 1);
    }

    public static float[][] PDStoArray(PlotDataSupplier pds) {
        float retval[][] = null;
        if (pds == null)
            return retval;
        XYSeries xys = pds.getGraphData();
        int itemCount = xys.getItemCount();
        retval = new float[2][itemCount];
        for (int i = 0; i < itemCount; i++) {
            retval[0][i] = xys.getX(i).floatValue();
            Number y = xys.getY(i);
            if (y != null) {
                retval[1][i] = y.floatValue();
            } else {
                retval[1][i] = Float.NaN;
            }
        }
        return retval;
    }

    public static float[][] XYSeriesToArray(XYSeries xys) {
        /*
               float retval[][] = null;
               if(xys == null) return retval;
               int itemCount = xys.getItemCount();
               retval = new float[2][itemCount];
               for (int i = 0; i < itemCount; i++) {
                  retval[0][i] = xys.getX(i).floatValue();
                  Number y = xys.getY(i);
                  if (y != null) {
         retval[1][i] = y.floatValue();
                  }  else {
         retval[1][i] = Float.NaN;
                  }
               }
        */ double tmp[][] = xys.toArray();
        float retval[][] = new float[2][tmp[0].length];
        for (int i = 0; i < 2; i++)
            for (int j = 0; j < tmp[0].length; j++)
                retval[i][j] = (float) tmp[i][j];
        return retval;
    }

    public static XYSeries ArrayToXYSeries(float farr[][], Comparable name) {
        XYSeries retval = new XYSeries(name);
        if (farr == null || farr[0].length == 0 || farr.length != 2)
            return retval;
        for (int i = 0; i < farr[0].length; i++) {
            retval.add(farr[0][i], farr[1][i], false);
        }
        return retval;
    }

    public static void ArrayRefillPDS(PlotDataSupplier pds, float newVals[][]) {
        if (pds == null || newVals == null)
            return;
        XYSeries xys = pds.getGraphData();
        xys.clear();
        for (int i = 0; i < newVals[0].length; i++)
            xys.add(newVals[0][i], newVals[1][i], false);
    }

    public static XYLineAnnotation line2Annotation(Line2D.Double l2dd, Stroke s, Paint p) {
        return new XYLineAnnotation(l2dd.getX1(), l2dd.getY1(), l2dd.getX2(), l2dd.getY2(), s, p);
    }

    public static int getMinScanForPlot(MRMTransition plot) {
        if (plot == null)
            return 1;
        int min = 10000000;
        for (MRMDaughter d : plot.getDaughters().values()) {
            if (d.getStartScan() < min)
                min = d.getStartScan();
        }
        return min;
    }

    public static int getMaxScanForPlot(MRMTransition plot) {
        if (plot == null)
            return 100;
        int max = 0;
        for (MRMDaughter d : plot.getDaughters().values()) {
            if (d.getEndScan() > max)
                max = d.getEndScan();
        }

        return max;
    }

    public static double getWeightedAverageDaughtersTime(XYSeriesCollection daughterSet) {
        double retVal = 0.0;
        double yTot = 0.0;
        double xWeight = 0.0;
        for (Object xyso : daughterSet.getSeries()) {
            XYSeries xys = (XYSeries) xyso;
            for (Object xydio : xys.getItems()) {
                XYDataItem xydi = (XYDataItem) xydio;
                xWeight += (xydi.getX().doubleValue() * xydi.getY().doubleValue());
                yTot += xydi.getY().doubleValue();
            }
        }
        if (yTot > 0)
            retVal = xWeight / yTot;
        return retVal;
    }

    public static int findIndexLEXvalue(PlotDataSupplier pds, float xvalue) {
        XYSeries xys = pds.getGraphData();
        if (xys.getItems().size() == 0)
            return -1;
        float curx = -1;
        int i;
        for (i = 0; i < xys.getItemCount(); i++) {
            curx = xys.getDataItem(i).getX().floatValue();
            if (curx >= xvalue)
                break;
        }
        if (i == 0 && curx > xvalue)
            return 0;
        if (curx == xvalue)
            return i;
        return i - 1;
    }

    public static boolean qualColIsEmpty() {
        boolean retVal = true;
        for (int i = 0; i < ((PeaksTableModel) (MRMDialog.peaksTable.getModel())).data.length; i++) {
            Object curQual = ((PeaksTableModel) (MRMDialog.peaksTable
                    .getModel())).data[i][MRMDialog.peaksData.Quality.colno];
            if (curQual != null && (curQual instanceof Float && ((Float) curQual).floatValue() != -1.0F)) {
                return false;
            }
        }
        return retVal;
    }

}