/* * The MIT License (MIT) * * Copyright (c) 2007-2015 Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* * Created by JFormDesigner on Wed Oct 26 22:35:11 EDT 2011 */ package org.broad.igv.charts; import org.broad.igv.track.TrackType; import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; import java.util.List; import javax.swing.*; import javax.swing.border.*; /** * @author Stan Diamond */ public class ScatterPlotFrame extends JFrame { static String lastClassifySelection = null; ScatterPlotData scatterPlotData; private boolean deferUpdate; public ScatterPlotFrame() { initComponents(); } public ScatterPlotFrame(ScatterPlotData scatterPlotData) { deferUpdate = true; this.scatterPlotData = scatterPlotData; setTitle(scatterPlotData.getTitle()); initComponents(); List<String> categoryList = scatterPlotData.getCategories(); // Add data names (e.g. copy #, expression) for (String dn : scatterPlotData.getDataNames()) { categoryList.add(dn); } if (categoryList.size() > 0) { String[] categories = categoryList.toArray(new String[categoryList.size()]); classifyComboBox.setModel(new DefaultComboBoxModel(categories)); } else { classifyComboBox.setEnabled(false); } List<String> dataTypeList = scatterPlotData.getDataNames(); String[] dataTypes = dataTypeList.toArray(new String[dataTypeList.size()]); xAxisComboBox.setModel(new DefaultComboBoxModel(dataTypes)); yAxisComboBox.setModel(new DefaultComboBoxModel(dataTypes)); if (classifyComboBox.getItemCount() > 0) { if (lastClassifySelection != null) { classifyComboBox.setSelectedItem(lastClassifySelection); } else { classifyComboBox.setSelectedIndex(0); } } xAxisComboBox.setSelectedIndex(0); yAxisComboBox.setSelectedIndex(dataTypes.length > 1 ? 1 : 0); deferUpdate = false; updateModel(); } private void closeMenuItemActionPerformed(ActionEvent e) { setVisible(false); } private void axisChanged(ActionEvent e) { updateModel(); } private void attributeChanged(ActionEvent e) { lastClassifySelection = (String) classifyComboBox.getSelectedItem(); updateModel(); } /* * createChart - method creates a JFree ChartPanel (derived from JPanel) * which plots the XYDataset assigned form ScatterPlotData selections. * * Parameters: * title - string contains title of plot * igvData - ScatterPlotFrame container class for IGV data samples * xAxisName - IGV data measurement name for x Axis coordinate; * must be a key defined in igvData dataMap. * yAxisName - IGV data measurement name for y Axis coordinate; * must be a key defined in igvData dataMap. * attribute - sample attribute selected for series symbol display * symbolSettings - symbol settings for series symbol display. * * Returns: * Scatterplot chart * * */ private void updateModel() { if (deferUpdate) return; String xAxisName = (String) xAxisComboBox.getSelectedItem(); String yAxisName = (String) yAxisComboBox.getSelectedItem(); String[] sampleNames = scatterPlotData.getSampleNames(); double[] xValues = scatterPlotData.getDataValues(xAxisName); double[] yValues = scatterPlotData.getDataValues(yAxisName); int[] mutationCount = scatterPlotData.getMutationCount(); double[] methylation = scatterPlotData.getDataValues(TrackType.DNA_METHYLATION.toString()); double[] expression = scatterPlotData.getDataValues(TrackType.GENE_EXPRESSION.toString()); double[] copyNumber = scatterPlotData.getDataValues(TrackType.COPY_NUMBER.toString()); // check for valid data and axis selection - and if error, return null if (yValues == null | xValues == null | yValues.length != xValues.length) return; //classifyComboBox.setVisible(scatterPlotData.getCategories().size() > 0); // Note: Currently only one attribute can be selected for scatter plot, // therefore using the 1st series (key = index 0) to identify the attribute String selectedCategory = (String) classifyComboBox.getSelectedItem(); DecimalFormat formatter = new DecimalFormat("0.00"); XYDataModel model = new XYDataModel(selectedCategory, xAxisName, yAxisName, scatterPlotData); if (selectedCategory == null || ScatterPlot.isDataCategory(selectedCategory)) { XYSeries xySeries = new XYSeries(""); for (int idx = 0; idx < xValues.length; ++idx) { // get tooltips and assign data point to series StringBuffer tooltip = new StringBuffer("<html>"); tooltip.append(sampleNames[idx]); tooltip.append("<br>"); for (String dn : scatterPlotData.getDataNames()) { double value = scatterPlotData.getDataKeyValue(dn, idx); if (!Double.isNaN(value)) { tooltip.append(dn); tooltip.append("="); tooltip.append(formatter.format(value)); tooltip.append("<br>"); } } tooltip.append("Mutation count="); tooltip.append(String.valueOf(mutationCount[idx])); xySeries.add(idx, xValues[idx], yValues[idx], mutationCount[idx], tooltip.toString()); } model.addSeries(xySeries); } else { String[] seriesNames = scatterPlotData.getAttributeCategories(selectedCategory); // extract sample categories for the selected attribute name String[] attributeValues = scatterPlotData.getSymbolValues(selectedCategory); // create series collection to hold xy series datasets for JFreeChart for (String series : seriesNames) { XYSeries xySeries = new XYSeries(series); // create plot series for (int idx = 0; idx < xValues.length; ++idx) { // if attribute value is same as category - assign data point to the series String attributeValue = attributeValues[idx]; if (attributeValue == null) attributeValue = ""; if (series.equals(attributeValue)) { // get tooltips and assign data point to series StringBuffer tooltip = new StringBuffer("<html>"); tooltip.append(sampleNames[idx]); tooltip.append("<br>"); if (selectedCategory != null && !selectedCategory.equals("")) { tooltip.append(selectedCategory); tooltip.append("="); tooltip.append(series); tooltip.append("<br>"); } for (String dn : scatterPlotData.getDataNames()) { double value = scatterPlotData.getDataKeyValue(dn, idx); if (!Double.isNaN(value)) { tooltip.append(dn); tooltip.append("="); tooltip.append(formatter.format(value)); tooltip.append("<br>"); } } tooltip.append("Mutation count="); tooltip.append(String.valueOf(mutationCount[idx])); xySeries.add(idx, xValues[idx], yValues[idx], mutationCount[idx], tooltip.toString()); } model.addSeries(xySeries); } // add series dataset to series collection } } ScatterPlot scatterPlot = new ScatterPlot(scatterPlotData); scatterPlot.setModel(model); chartPanel.setScatterPlotModel(scatterPlot); } private void initComponents() { // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents // Generated using JFormDesigner non-commercial license menuBar = new JMenuBar(); fileMenu = new JMenu(); closeMenuItem = new JMenuItem(); commandBar = new JPanel(); hSpacer3 = new JPanel(null); panel2 = new JPanel(); label1 = new JLabel(); xAxisComboBox = new JComboBox(); hSpacer1 = new JPanel(null); panel3 = new JPanel(); label2 = new JLabel(); yAxisComboBox = new JComboBox(); hSpacer2 = new JPanel(null); panel4 = new JPanel(); label3 = new JLabel(); classifyComboBox = new JComboBox(); hSpacer4 = new JPanel(null); chartPanel = new ChartPanel(); //======== this ======== setFocusTraversalPolicyProvider(true); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); //======== menuBar ======== { //======== fileMenu ======== { fileMenu.setText("File"); //---- closeMenuItem ---- closeMenuItem.setText("Close"); closeMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { closeMenuItemActionPerformed(e); } }); fileMenu.add(closeMenuItem); } menuBar.add(fileMenu); } setJMenuBar(menuBar); //======== commandBar ======== { commandBar.setBorder(new BevelBorder(BevelBorder.LOWERED)); commandBar.setPreferredSize(new Dimension(420, 45)); commandBar.setLayout(new BoxLayout(commandBar, BoxLayout.X_AXIS)); commandBar.add(hSpacer3); //======== panel2 ======== { panel2.setBorder(null); panel2.setPreferredSize(new Dimension(180, 41)); panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS)); //---- label1 ---- label1.setText("X: "); panel2.add(label1); //---- xAxisComboBox ---- xAxisComboBox.setBorder(null); xAxisComboBox.setPreferredSize(new Dimension(120, 27)); xAxisComboBox.setToolTipText("Set data type for X axis"); xAxisComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { axisChanged(e); } }); panel2.add(xAxisComboBox); } commandBar.add(panel2); commandBar.add(hSpacer1); //======== panel3 ======== { panel3.setBorder(null); panel3.setPreferredSize(new Dimension(180, 41)); panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS)); //---- label2 ---- label2.setText("Y:"); panel3.add(label2); //---- yAxisComboBox ---- yAxisComboBox.setPreferredSize(new Dimension(120, 27)); yAxisComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { axisChanged(e); } }); panel3.add(yAxisComboBox); } commandBar.add(panel3); commandBar.add(hSpacer2); //======== panel4 ======== { panel4.setBorder(null); panel4.setPreferredSize(new Dimension(250, 27)); panel4.setLayout(new BoxLayout(panel4, BoxLayout.X_AXIS)); //---- label3 ---- label3.setText("Classify By:"); panel4.add(label3); //---- classifyComboBox ---- classifyComboBox.setPreferredSize(new Dimension(150, 27)); classifyComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { attributeChanged(e); } }); panel4.add(classifyComboBox); } commandBar.add(panel4); commandBar.add(hSpacer4); } contentPane.add(commandBar, BorderLayout.NORTH); contentPane.add(chartPanel, BorderLayout.CENTER); setSize(815, 660); setLocationRelativeTo(getOwner()); // JFormDesigner - End of component initialization //GEN-END:initComponents } // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables // Generated using JFormDesigner non-commercial license private JMenuBar menuBar; private JMenu fileMenu; private JMenuItem closeMenuItem; private JPanel commandBar; private JPanel hSpacer3; private JPanel panel2; private JLabel label1; private JComboBox xAxisComboBox; private JPanel hSpacer1; private JPanel panel3; private JLabel label2; private JComboBox yAxisComboBox; private JPanel hSpacer2; private JPanel panel4; private JLabel label3; private JComboBox classifyComboBox; private JPanel hSpacer4; private ChartPanel chartPanel; // JFormDesigner - End of variables declaration //GEN-END:variables }