org.fhcrc.cpl.viewer.ms2.gui.MS2ScanViewer.java Source code

Java tutorial

Introduction

Here is the source code for org.fhcrc.cpl.viewer.ms2.gui.MS2ScanViewer.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.ms2.gui;

import org.apache.log4j.Logger;
import org.fhcrc.cpl.toolbox.Rounder;
import org.fhcrc.cpl.toolbox.datastructure.Pair;
import org.fhcrc.cpl.toolbox.proteomics.MSRun;
import org.fhcrc.cpl.toolbox.gui.chart.PanelWithPeakChart;
import org.fhcrc.cpl.toolbox.gui.chart.PanelWithChart;
import org.fhcrc.cpl.toolbox.gui.ListenerHelper;
import org.jfree.chart.annotations.XYTextAnnotation;
import org.jfree.chart.plot.XYPlot;

import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import java.awt.*;

/**
 * Enables viewing of a single MS2 scan, with the ability to change the scan being viewed
 */
public class MS2ScanViewer extends JPanel {
    protected static Logger _log = Logger.getLogger(MS2ScanViewer.class);

    protected MSRun.MSScan scanInViewer = null;
    protected PanelWithPeakChart chartInViewer = null;

    public static final int DEFAULT_RESAMPLING_RESOLUTION = 50;
    protected int resamplingResolution = DEFAULT_RESAMPLING_RESOLUTION;

    protected int numHighestPeaksToLabel = 0;

    public MS2ScanViewer() {

    }

    protected void buildChart() {
        if (scanInViewer == null)
            return;
        if (chartInViewer != null) {
            remove(chartInViewer);
        }
        float[][] spectrum = scanInViewer.getSpectrum();
        float[] mzValues = new float[spectrum[0].length];
        float[] intensityValues = new float[spectrum[0].length];

        for (int i = 0; i < mzValues.length; i++) {
            mzValues[i] = spectrum[0][i];
            intensityValues[i] = spectrum[1][i];
        }

        chartInViewer = new PanelWithPeakChart(mzValues, intensityValues, "ms2scan");

        //add labels for highest peaks
        if (numHighestPeaksToLabel > 0) {
            XYPlot xyPlot = chartInViewer.getChart().getXYPlot();
            List<Pair<Float, Float>> peaksAsPairs = new ArrayList<Pair<Float, Float>>();
            for (int i = 0; i < mzValues.length; i++)
                peaksAsPairs.add(new Pair<Float, Float>(mzValues[i], intensityValues[i]));
            Collections.sort(peaksAsPairs, new Comparator<Pair<Float, Float>>() {
                @Override
                public int compare(Pair<Float, Float> pair1, Pair<Float, Float> pair2) {
                    float diff = pair1.second - pair2.second;
                    if (diff > 0)
                        return -1;
                    if (diff < 0)
                        return 1;
                    return 0;
                }
            });
            for (int i = 0; i < numHighestPeaksToLabel; i++) {
                Pair<Float, Float> pair = peaksAsPairs.get(i);
                xyPlot.addAnnotation(
                        new XYTextAnnotation("" + Rounder.round(pair.first, 3), pair.first, pair.second));
            }
        }

        add(chartInViewer);
        updateUI();
    }

    public MSRun.MSScan getScanInViewer() {
        return scanInViewer;
    }

    public void setScanInViewer(MSRun.MSScan scanInViewer) {
        this.scanInViewer = scanInViewer;
        buildChart();
    }

    public PanelWithChart getChartInViewer() {
        return chartInViewer;
    }

    public void setChartInViewer(PanelWithPeakChart chartInViewer) {
        this.chartInViewer = chartInViewer;
    }

    public int getResamplingResolution() {
        return resamplingResolution;
    }

    public void setResamplingResolution(int resamplingResolution) {
        this.resamplingResolution = resamplingResolution;
    }

    /**
     * View multiple MS/MS scans.  Buttons to navigate through the scans.
     */
    public static class MultiMS2ScanViewer extends JPanel {
        protected MS2ScanViewer ms2ScanViewer = null;
        protected int currentScanIndex;

        protected MSRun.MSScan[] scans = null;

        JButton forwardButton = null;
        JButton backButton = null;

        List<ChangeListener> changeListeners = new ArrayList<ChangeListener>();

        public MultiMS2ScanViewer() {
            ms2ScanViewer = new MS2ScanViewer();

            ListenerHelper helper = new ListenerHelper(this);

            backButton = new JButton("<-");
            helper.addListener(backButton, "backButton_actionPerformed");

            forwardButton = new JButton("->");
            helper.addListener(forwardButton, "forwardButton_actionPerformed");

            JPanel buttonPanel = new JPanel();

            GridBagConstraints fullRowGBC = new GridBagConstraints();
            fullRowGBC.gridwidth = GridBagConstraints.REMAINDER;
            setLayout(new GridBagLayout());

            add(ms2ScanViewer, fullRowGBC);
            buttonPanel.add(backButton);
            buttonPanel.add(forwardButton, fullRowGBC);
            add(buttonPanel, fullRowGBC);
        }

        public MultiMS2ScanViewer(MSRun run, List<Integer> ms2ScanNumbers, int numPeaksToLabel) {
            this();

            MSRun.MSScan[] scans = new MSRun.MSScan[ms2ScanNumbers.size()];
            for (int i = 0; i < ms2ScanNumbers.size(); i++) {
                scans[i] = run.getMS2Scan(run.getIndexForMS2ScanNum(ms2ScanNumbers.get(i)));
            }

            init(scans, numPeaksToLabel);
        }

        public MultiMS2ScanViewer(MSRun.MSScan[] scans, int numPeaksToLabel) {
            this();
            init(scans, numPeaksToLabel);
        }

        protected void init(MSRun.MSScan[] scans, int numPeaksToLabel) {
            ms2ScanViewer.setNumHighestPeaksToLabel(numPeaksToLabel);

            this.scans = scans;
            this.currentScanIndex = 0;

            ms2ScanViewer.setScanInViewer(scans[0]);
        }

        public void forwardButton_actionPerformed(ActionEvent event) {
            currentScanIndex++;
            displayScan(scans[currentScanIndex]);
        }

        public void backButton_actionPerformed(ActionEvent event) {
            currentScanIndex--;
            displayScan(scans[currentScanIndex]);
        }

        protected void updateButtonUI() {
            if (currentScanIndex < scans.length - 1)
                forwardButton.setEnabled(true);
            else
                forwardButton.setEnabled(false);
            forwardButton.updateUI();

            if (currentScanIndex > 0)
                backButton.setEnabled(true);
            else
                backButton.setEnabled(false);
            backButton.updateUI();
        }

        public void displayScan(MSRun.MSScan scan) {
            _log.debug("MultiMS2ScanViewer displaying scan " + scan.getNum());

            ms2ScanViewer.setScanInViewer(scan);
            updateButtonUI();
            for (ChangeListener listener : changeListeners) {
                listener.stateChanged(new ChangeEvent("changed"));
            }
        }

        public void addChangeListener(ChangeListener listener) {
            changeListeners.add(listener);
        }

        public MS2ScanViewer getMs2ScanViewer() {
            return ms2ScanViewer;
        }
    }

    public int getNumHighestPeaksToLabel() {
        return numHighestPeaksToLabel;
    }

    public void setNumHighestPeaksToLabel(int numHighestPeaksToLabel) {
        this.numHighestPeaksToLabel = numHighestPeaksToLabel;
    }
}