package com.compomics.util.gui.spectrum;
import com.compomics.util.experiment.biology.*;
import com.compomics.util.experiment.biology.ions.ElementaryIon;
import com.compomics.util.experiment.biology.ions.PeptideFragmentIon;
import com.compomics.util.experiment.identification.spectrum_annotation.NeutralLossesMap;
import com.compomics.util.experiment.identification.matches.IonMatch;
import com.compomics.util.experiment.massspectrometry.MSnSpectrum;
import com.compomics.util.gui.renderers.AlignedTableCellRenderer;
import com.compomics.util.gui.renderers.FragmentIonTableCellRenderer;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import no.uib.jsparklines.renderers.JSparklinesBarChartTableCellRenderer;
import no.uib.jsparklines.renderers.JSparklinesErrorBarChartTableCellRenderer;
import org.apache.commons.math.stat.descriptive.SummaryStatistics;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.statistics.DefaultStatisticalCategoryDataset;
/**
* Creates a fragment ion table with the detected fragment ions. Either shows a
* traditional ion table with the theoretical fragment ions, or a novel version
* showing the intensities as bar charts for each ion type.
*
* @author Harald Barsnes
*/
public class FragmentIonTable extends JTable {
/**
* The list of currently selected fragment ion types.
*/
private HashSet<Integer> currentFragmentIonTypes;
/**
* The list of the currently selected neutral loss types.
*/
private NeutralLossesMap neutralLosses;
/**
* If true, singly charge ions are included in the table.
*/
private boolean singleCharge;
/**
* If true, doubly charged ions are included in the table.
*/
private boolean twoCharges;
/**
* The table tooltips.
*/
private ArrayList<String> tooltips = new ArrayList<String>();
/**
* The current peptide.
*/
private Peptide currentPeptide;
/**
* The current peptide sequence.
*/
private String peptideSequence;
/**
* The spectrum annotations map.
*/
private ArrayList<ArrayList<IonMatch>> allAnnotations;
/**
* The list of spectra. Needed for intensity normalization.
*/
private ArrayList<MSnSpectrum> allSpectra;
/**
* Creates a traditional fragment ion table with the theoretical mz values
* and the detected fragment ions highlighted.
*
* @param currentPeptide the peptide to show the table for
* @param allAnnotations the spectrum annotations (from SpectrumAnnotator)
* @param currentFragmentIonTypes the list of currently selected fragment
* ion types
* @param neutralLosses the list of the currently selected neutral loss
* types
* @param singleCharge if true, singly charge ions are included in the table
* @param twoCharges if true, doubly charged ions are included in the table
*/
public FragmentIonTable(
Peptide currentPeptide,
ArrayList<ArrayList<IonMatch>> allAnnotations,
HashSet<Integer> currentFragmentIonTypes,
NeutralLossesMap neutralLosses,
boolean singleCharge, boolean twoCharges) {
super();
this.currentPeptide = currentPeptide;
this.currentFragmentIonTypes = currentFragmentIonTypes;
this.neutralLosses = neutralLosses;
this.singleCharge = singleCharge;
this.twoCharges = twoCharges;
this.allAnnotations = allAnnotations;
peptideSequence = currentPeptide.getSequence();
// set up table properties
setUpTable(java.lang.Double.class);
// add the peptide sequence and indexes to the table
addPeptideSequenceAndIndexes();
// add the values to the table
insertMzValues();
}
/**
* Creates a novel fragment ion table displaying bar charts with the
* intensity of each fragment ion type. If more than one spectrum annotation
* set is provided the bars show the average intensities.
*
* @param currentPeptide the peptide to show the table for
* @param allAnnotations the spectrum annotations (from SpectrumAnnotator)
* @param allSpectra the list of spectra
* @param currentFragmentIonTypes the list of currently selected fragment
* ion types
* @param neutralLosses the list of the currently selected neutral loss
* types
* @param singleCharge if true, singly charge ions are included in the table
* @param twoCharges if true, doubly charged ions are included in the table
*
* @throws java.lang.InterruptedException exception thrown if the thread is
* interrupted
*/
public FragmentIonTable(
Peptide currentPeptide,
ArrayList<ArrayList<IonMatch>> allAnnotations,
ArrayList<MSnSpectrum> allSpectra,
HashSet<Integer> currentFragmentIonTypes,
NeutralLossesMap neutralLosses,
boolean singleCharge, boolean twoCharges) throws InterruptedException {
super();
this.currentPeptide = currentPeptide;
this.currentFragmentIonTypes = currentFragmentIonTypes;
this.neutralLosses = neutralLosses;
this.singleCharge = singleCharge;
this.twoCharges = twoCharges;
this.allAnnotations = allAnnotations;
this.allSpectra = allSpectra;
peptideSequence = currentPeptide.getSequence();
// set up table properties
if (allAnnotations.size() == 1) {
setUpTable(java.lang.Double.class);
} else {
setUpTable(DefaultStatisticalCategoryDataset.class);
}
// add the peptide sequence and indexes to the table
addPeptideSequenceAndIndexes();
// add the values to the table
insertBarCharts();
}
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int index = columnModel.getColumnIndexAtX(p.x);
int realIndex = columnModel.getColumn(index).getModelIndex();
return (String) tooltips.get(realIndex);
}
};
}
/**
* Set up the table properties.
*/
private void setUpTable(Class valueClass) {
// disallow column reordering
getTableHeader().setReorderingAllowed(false);
getTableHeader().setReorderingAllowed(false);
// control the cell selection
setColumnSelectionAllowed(false);
setRowSelectionAllowed(false);
setCellSelectionEnabled(true);
setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// centrally align the column headers in the fragment ions table
TableCellRenderer renderer = getTableHeader().getDefaultRenderer();
JLabel label = (JLabel) renderer;
label.setHorizontalAlignment(JLabel.CENTER);
// set up the column headers, types and tooltips
Vector columnHeaders = new Vector();
ArrayList<Class> tempColumnTypes = new ArrayList<Class>();
tooltips = new ArrayList<String>();
columnHeaders.add(" ");
tempColumnTypes.add(java.lang.Integer.class);
tooltips.add("a, b and c ion index");
// @TODO: add H2O and NH3 losses for a,c,x and z ions
if (currentFragmentIonTypes.contains(PeptideFragmentIon.A_ION)) {
columnHeaders.add("a");
tempColumnTypes.add(valueClass);
tooltips.add("a-ion");
}
if (currentFragmentIonTypes.contains(PeptideFragmentIon.B_ION)) {
if (singleCharge) {
columnHeaders.add("b");
tempColumnTypes.add(valueClass);
tooltips.add("b-ion");
}
if (twoCharges) {
columnHeaders.add("b++");
tempColumnTypes.add(valueClass);
tooltips.add("b-ion doubly charged");
}
if (neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (singleCharge) {
columnHeaders.add("b-H2O");
tempColumnTypes.add(valueClass);
tooltips.add("b-ion with water loss");
}
if (twoCharges) {
columnHeaders.add("b++-H2O");
tempColumnTypes.add(valueClass);
tooltips.add("b-ion with water loss, doubly charged");
}
}
if (neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (singleCharge) {
columnHeaders.add("b-NH3");
tempColumnTypes.add(valueClass);
tooltips.add("b-ion with ammonia loss");
}
if (twoCharges) {
columnHeaders.add("b++-NH3");
tempColumnTypes.add(valueClass);
tooltips.add("b-ion with ammonia loss, doubly charged");
}
}
}
if (currentFragmentIonTypes.contains(PeptideFragmentIon.C_ION)) {
columnHeaders.add("c");
tempColumnTypes.add(valueClass);
tooltips.add("c-ion");
}
columnHeaders.add("AA");
tempColumnTypes.add(java.lang.String.class);
tooltips.add("amino acid sequence");
if (currentFragmentIonTypes.contains(PeptideFragmentIon.Z_ION)) {
columnHeaders.add("z");
tempColumnTypes.add(valueClass);
tooltips.add("z-ion");
}
if (currentFragmentIonTypes.contains(PeptideFragmentIon.Y_ION)) {
if (singleCharge) {
columnHeaders.add("y");
tempColumnTypes.add(valueClass);
tooltips.add("y-ion");
}
if (twoCharges) {
columnHeaders.add("y++");
tempColumnTypes.add(valueClass);
tooltips.add("y-ion, doubly charged");
}
if (neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (singleCharge) {
columnHeaders.add("y-H2O");
tempColumnTypes.add(valueClass);
tooltips.add("y-ion with water loss");
}
if (twoCharges) {
columnHeaders.add("y++-H2O");
tempColumnTypes.add(valueClass);
tooltips.add("y-ion with water loss, doubly charged");
}
}
if (neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (singleCharge) {
columnHeaders.add("y-NH3");
tempColumnTypes.add(valueClass);
tooltips.add("y-ion with ammonia loss");
}
if (twoCharges) {
columnHeaders.add("y++-NH3");
tempColumnTypes.add(valueClass);
tooltips.add("y-ion with ammonia loss, doubly charged");
}
}
}
if (currentFragmentIonTypes.contains(PeptideFragmentIon.X_ION)) {
columnHeaders.add("x");
tempColumnTypes.add(valueClass);
tooltips.add("x-ion");
}
columnHeaders.add(" ");
tempColumnTypes.add(java.lang.Integer.class);
tooltips.add("x, y and z ion index");
final ArrayList<Class> columnTypes = tempColumnTypes;
// set the table model
setModel(new javax.swing.table.DefaultTableModel(
new Vector(),
columnHeaders) {
public Class getColumnClass(int columnIndex) {
return columnTypes.get(columnIndex);
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
});
int tempWidth = 30; // @TODO: maybe this should not be hardcoded?
// set the max column widths
getColumn(" ").setMaxWidth(tempWidth);
getColumn(" ").setMinWidth(tempWidth);
getColumn(" ").setMaxWidth(tempWidth);
getColumn(" ").setMinWidth(tempWidth);
getColumn("AA").setMaxWidth(tempWidth);
getColumn("AA").setMinWidth(tempWidth);
// centrally align the columns in the fragment ions table
getColumn(" ").setCellRenderer(new AlignedTableCellRenderer(SwingConstants.CENTER, Color.LIGHT_GRAY));
getColumn(" ").setCellRenderer(new AlignedTableCellRenderer(SwingConstants.CENTER, Color.LIGHT_GRAY));
getColumn("AA").setCellRenderer(new AlignedTableCellRenderer(SwingConstants.CENTER, Color.LIGHT_GRAY));
}
/**
* Add the peptide and sequence indexes to the table.
*/
private void addPeptideSequenceAndIndexes() {
// add the peptide sequence and indexes to the table
for (int i = 0; i < peptideSequence.length(); i++) {
((DefaultTableModel) getModel()).addRow(new Object[]{(i + 1)});
}
for (int i = 0; i < peptideSequence.length(); i++) {
setValueAt(peptideSequence.charAt(i), i, getColumn("AA").getModelIndex());
setValueAt(peptideSequence.length() - i, i, getColumn(" ").getModelIndex());
}
}
/**
* Add the theoretical mz values to the table.
*/
private void insertMzValues() {
// get all fragmentions for the peptide
IonFactory fragmentFactory = IonFactory.getInstance();
HashMap<Integer, HashMap<Integer, ArrayList<Ion>>> ions = fragmentFactory.getFragmentIons(currentPeptide);
HashMap<Integer, ArrayList<Ion>> fragmentIons = ions.get(Ion.IonType.PEPTIDE_FRAGMENT_ION.index);
// add the theoretical masses to the table
for (Integer subType : fragmentIons.keySet()) {
for (Ion ion : fragmentIons.get(subType)) {
// @TODO: implement neutral losses
if (!ion.hasNeutralLosses()) {
PeptideFragmentIon fragmention = (PeptideFragmentIon) ion;
double fragmentMzChargeOne = (ion.getTheoreticMass() + 1 * ElementaryIon.proton.getTheoreticMass()) / 1;
double fragmentMzChargeTwo = (ion.getTheoreticMass() + 2 * ElementaryIon.proton.getTheoreticMass()) / 2;
int fragmentNumber = fragmention.getNumber();
if (currentFragmentIonTypes.contains(fragmention.getSubType())) {
if (fragmention.getSubType() == PeptideFragmentIon.A_ION) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, fragmentNumber - 1, getColumn("a").getModelIndex());
}
} else if (fragmention.getSubType() == PeptideFragmentIon.B_ION) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, fragmentNumber - 1, getColumn("b").getModelIndex());
}
if (twoCharges) {
setValueAt(fragmentMzChargeTwo, fragmentNumber - 1, getColumn("b++").getModelIndex());
}
if (neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, fragmentNumber - 1, getColumn("b-H2O").getModelIndex());
}
if (twoCharges) {
setValueAt(fragmentMzChargeTwo, fragmentNumber - 1, getColumn("b++-H2O").getModelIndex());
}
}
if (neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, fragmentNumber - 1, getColumn("b-NH3").getModelIndex());
}
if (twoCharges) {
setValueAt(fragmentMzChargeTwo, fragmentNumber - 1, getColumn("b++-NH3").getModelIndex());
}
}
} else if (fragmention.getSubType() == PeptideFragmentIon.C_ION) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, fragmentNumber - 1, getColumn("c").getModelIndex());
}
} else if (fragmention.getSubType() == PeptideFragmentIon.Y_ION) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, peptideSequence.length() - fragmentNumber, getColumn("y").getModelIndex());
}
if (twoCharges) {
setValueAt(fragmentMzChargeTwo, peptideSequence.length() - fragmentNumber, getColumn("y++").getModelIndex());
}
if (neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, peptideSequence.length() - fragmentNumber, getColumn("y-H2O").getModelIndex());
}
if (twoCharges) {
setValueAt(fragmentMzChargeTwo, peptideSequence.length() - fragmentNumber, getColumn("y++-H2O").getModelIndex());
}
}
if (neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, peptideSequence.length() - fragmentNumber, getColumn("y-NH3").getModelIndex());
}
if (twoCharges) {
setValueAt(fragmentMzChargeTwo, peptideSequence.length() - fragmentNumber, getColumn("y++-NH3").getModelIndex());
}
}
} else if (fragmention.getSubType() == PeptideFragmentIon.X_ION) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, peptideSequence.length() - fragmentNumber, getColumn("x").getModelIndex());
}
} else if (fragmention.getSubType() == PeptideFragmentIon.Z_ION) {
if (singleCharge) {
setValueAt(fragmentMzChargeOne, peptideSequence.length() - fragmentNumber, getColumn("z").getModelIndex());
}
}
}
}
}
}
// @TODO: implement a better way to handle charge
ArrayList<Integer> aIonsSinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> bIonsSinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> bIonsDoublyCharged = new ArrayList<Integer>();
ArrayList<Integer> bIonsH2OSinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> bIonsH2ODoublyCharged = new ArrayList<Integer>();
ArrayList<Integer> bIonsNH3SinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> bIonsNH3DoublyCharged = new ArrayList<Integer>();
ArrayList<Integer> cIonsSinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> yIonsSinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> yIonsDoublyCharged = new ArrayList<Integer>();
ArrayList<Integer> yIonsH2OSinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> yIonsH2ODoublyCharged = new ArrayList<Integer>();
ArrayList<Integer> yIonsNH3SinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> yIonsNH3DoublyCharged = new ArrayList<Integer>();
ArrayList<Integer> xIonsSinglyCharged = new ArrayList<Integer>();
ArrayList<Integer> zIonsSinglyCharged = new ArrayList<Integer>();
// highlight the detected ions
for (int i = 0; i < allAnnotations.size(); i++) {
ArrayList<IonMatch> currentAnnotations = allAnnotations.get(i);
for (IonMatch ionMatch : currentAnnotations) {
if (ionMatch.ion.getType() == Ion.IonType.PEPTIDE_FRAGMENT_ION) {
int currentCharge = ionMatch.charge;
PeptideFragmentIon fragmentIon = ((PeptideFragmentIon) ionMatch.ion);
int fragmentNumber = fragmentIon.getNumber();
if (currentFragmentIonTypes.contains(fragmentIon.getSubType())) {
if (fragmentIon.getSubType() == PeptideFragmentIon.A_ION) {
if (currentCharge == 1 && singleCharge) {
aIonsSinglyCharged.add(fragmentNumber - 1);
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.B_ION) {
if (!fragmentIon.hasNeutralLosses()) {
if (currentCharge == 1 && singleCharge) {
bIonsSinglyCharged.add(fragmentNumber - 1);
} else if (twoCharges) {
bIonsDoublyCharged.add(fragmentNumber - 1);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-H2O") && neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (currentCharge == 1 && singleCharge) {
bIonsH2OSinglyCharged.add(fragmentNumber - 1);
} else if (twoCharges) {
bIonsH2ODoublyCharged.add(fragmentNumber - 1);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-NH3") && neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (currentCharge == 1 && singleCharge) {
bIonsNH3SinglyCharged.add(fragmentNumber - 1);
} else if (twoCharges) {
bIonsNH3DoublyCharged.add(fragmentNumber - 1);
}
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.C_ION) {
if (currentCharge == 1 && singleCharge) {
cIonsSinglyCharged.add(fragmentNumber - 1);
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.Y_ION) {
if (!fragmentIon.hasNeutralLosses()) {
if (currentCharge == 1 && singleCharge) {
yIonsSinglyCharged.add(peptideSequence.length() - fragmentNumber);
} else if (twoCharges) {
yIonsDoublyCharged.add(peptideSequence.length() - fragmentNumber);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-H2O") && neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (currentCharge == 1 && singleCharge) {
yIonsH2OSinglyCharged.add(peptideSequence.length() - fragmentNumber);
} else if (twoCharges) {
yIonsH2ODoublyCharged.add(peptideSequence.length() - fragmentNumber);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-NH3") && neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (currentCharge == 1 && singleCharge) {
yIonsNH3SinglyCharged.add(peptideSequence.length() - fragmentNumber);
} else if (twoCharges) {
yIonsNH3DoublyCharged.add(peptideSequence.length() - fragmentNumber);
}
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.X_ION) {
if (currentCharge == 1 && singleCharge) {
xIonsSinglyCharged.add(peptideSequence.length() - fragmentNumber);
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.Z_ION) {
if (currentCharge == 1 && singleCharge) {
zIonsSinglyCharged.add(peptideSequence.length() - fragmentNumber);
}
}
}
}
}
}
// highlight the detected fragment ions in the table
try {
getColumn("a").setCellRenderer(new FragmentIonTableCellRenderer(aIonsSinglyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("b").setCellRenderer(new FragmentIonTableCellRenderer(bIonsSinglyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("b++").setCellRenderer(new FragmentIonTableCellRenderer(bIonsDoublyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("b-H2O").setCellRenderer(new FragmentIonTableCellRenderer(bIonsH2OSinglyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("b++-H2O").setCellRenderer(new FragmentIonTableCellRenderer(bIonsH2ODoublyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("b-NH3").setCellRenderer(new FragmentIonTableCellRenderer(bIonsNH3SinglyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("b++-NH3").setCellRenderer(new FragmentIonTableCellRenderer(bIonsNH3DoublyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("c").setCellRenderer(new FragmentIonTableCellRenderer(cIonsSinglyCharged, Color.BLUE, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("y").setCellRenderer(new FragmentIonTableCellRenderer(yIonsSinglyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("y++").setCellRenderer(new FragmentIonTableCellRenderer(yIonsDoublyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("y-H2O").setCellRenderer(new FragmentIonTableCellRenderer(yIonsH2OSinglyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("y++-H2O").setCellRenderer(new FragmentIonTableCellRenderer(yIonsH2ODoublyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("y-NH3").setCellRenderer(new FragmentIonTableCellRenderer(yIonsNH3SinglyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("y++-NH3").setCellRenderer(new FragmentIonTableCellRenderer(yIonsNH3DoublyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("x").setCellRenderer(new FragmentIonTableCellRenderer(xIonsSinglyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
try {
getColumn("z").setCellRenderer(new FragmentIonTableCellRenderer(zIonsSinglyCharged, Color.RED, Color.WHITE));
} catch (IllegalArgumentException e) {
// do nothing
}
}
/**
* Insert bar charts into the table.
*
* @throws java.lang.InterruptedException exception thrown if the thread is
* interrupted
*/
private void insertBarCharts() throws InterruptedException {
HashMap<String, ArrayList<Double>> values = new HashMap<String, ArrayList<Double>>();
double maxIntensity = 0.0;
for (int i = 0; i < allAnnotations.size(); i++) {
ArrayList<IonMatch> currentAnnotations = allAnnotations.get(i);
if (i < allSpectra.size()) { // escape possible null pointer
double totalIntensity = allSpectra.get(i).getTotalIntensity();
for (IonMatch ionMatch : currentAnnotations) {
if (ionMatch.ion.getType() == Ion.IonType.PEPTIDE_FRAGMENT_ION) {
int currentCharge = ionMatch.charge;
double peakIntensity = ionMatch.peak.intensity;
if (allAnnotations.size() > 1) {
peakIntensity /= totalIntensity;
}
if (maxIntensity < peakIntensity) {
maxIntensity = peakIntensity;
}
PeptideFragmentIon fragmentIon = ((PeptideFragmentIon) ionMatch.ion);
int fragmentNumber = fragmentIon.getNumber();
if (currentFragmentIonTypes.contains(fragmentIon.getSubType())) {
if (fragmentIon.getSubType() == PeptideFragmentIon.A_ION) {
if (currentCharge == 1 && singleCharge) {
String key = "a" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.B_ION) {
if (!fragmentIon.hasNeutralLosses()) {
if (currentCharge == 1 && singleCharge) {
String key = "b" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
} else if (twoCharges) {
String key = "b++" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-H2O") && neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (currentCharge == 1 && singleCharge) {
String key = "b-H2O" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
} else if (twoCharges) {
String key = "b++-H2O" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-NH3") && neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (currentCharge == 1 && singleCharge) {
String key = "b-NH3" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
} else if (twoCharges) {
String key = "b++-NH3" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
}
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.C_ION) {
if (currentCharge == 1 && singleCharge) {
String key = "c" + "_" + (fragmentNumber - 1);
addValue(values, key, peakIntensity);
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.Y_ION) {
if (!fragmentIon.hasNeutralLosses()) {
if (currentCharge == 1 && singleCharge) {
String key = "y" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
} else if (twoCharges) {
String key = "y++" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-H2O") && neutralLosses.containsLoss(NeutralLoss.H2O.name)) {
if (currentCharge == 1 && singleCharge) {
String key = "y-H2O" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
} else if (twoCharges) {
String key = "y++-H2O" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
}
} else if (fragmentIon.getNeutralLossesAsString().equalsIgnoreCase("-NH3") && neutralLosses.containsLoss(NeutralLoss.NH3.name)) {
if (currentCharge == 1 && singleCharge) {
String key = "y-NH3" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
} else if (twoCharges) {
String key = "y++-NH3" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
}
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.X_ION) {
if (currentCharge == 1 && singleCharge) {
String key = "x" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
}
} else if (fragmentIon.getSubType() == PeptideFragmentIon.Z_ION) {
if (currentCharge == 1 && singleCharge) {
String key = "z" + "_" + (peptideSequence.length() - fragmentNumber);
addValue(values, key, peakIntensity);
}
}
}
}
}
}
}
Iterator<String> valuesIterator = values.keySet().iterator();
while (valuesIterator.hasNext()) {
String ionType = valuesIterator.next();
String[] ionTypeSplit = ionType.split("_");
String ion = ionTypeSplit[0];
Integer ionNumber = new Integer(ionTypeSplit[1]);
ArrayList<Double> allCurrentIonValues = values.get(ionType);
SummaryStatistics stats = new SummaryStatistics();
for (int i = 0; i < allCurrentIonValues.size(); i++) {
stats.addValue(allCurrentIonValues.get(i));
}
while (stats.getN() < allAnnotations.size()) {
stats.addValue(0);
}
double meanValue = stats.getMean();
double standardDeviation = stats.getStandardDeviation();
if (allAnnotations.size() > 1 && meanValue + standardDeviation > maxIntensity) {
maxIntensity = meanValue + standardDeviation;
}
DefaultStatisticalCategoryDataset dataset = new DefaultStatisticalCategoryDataset();
dataset.add(meanValue, standardDeviation, ion, ionNumber);
if (allAnnotations.size() > 1) {
setValueAt(dataset, ionNumber, getColumn(ion).getModelIndex());
} else {
setValueAt(meanValue, ionNumber, getColumn(ion).getModelIndex());
}
}
// set the column renderers
try {
if (allAnnotations.size() > 1) {
getColumn("a").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.A_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("a").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("a").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.A_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("a").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
if (allAnnotations.size() > 1) {
getColumn("b").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.B_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("b").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("b").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.B_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("b").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
if (allAnnotations.size() > 1) {
getColumn("b++").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.B_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("b++").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("b++").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.B_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("b++").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.H2O);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.B_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("b-H2O").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("b-H2O").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("b-H2O").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("b-H2O").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.H2O);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.B_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("b++-H2O").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("b++-H2O").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("b++-H2O").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("b++-H2O").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.NH3);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.B_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("b-NH3").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("b-NH3").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("b-NH3").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("b-NH3").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.NH3);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.B_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("b++-NH3").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("b++-NH3").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("b++-NH3").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("b++-NH3").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
if (allAnnotations.size() > 1) {
getColumn("c").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.C_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("c").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("c").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.C_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("c").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
if (allAnnotations.size() > 1) {
getColumn("y").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.Y_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("y").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("y").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.Y_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("y").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
if (allAnnotations.size() > 1) {
getColumn("y++").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.Y_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("y++").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("y++").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.Y_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("y++").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.H2O);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.Y_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("y-H2O").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("y-H2O").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("y-H2O").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("y-H2O").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.H2O);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.Y_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("y++-H2O").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("y++-H2O").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("y++-H2O").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("y++-H2O").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.NH3);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.Y_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("y-NH3").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("y-NH3").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("y-NH3").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("y-NH3").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
ArrayList<NeutralLoss> tempNeutralLosses = new ArrayList<NeutralLoss>();
tempNeutralLosses.add(NeutralLoss.NH3);
PeptideFragmentIon tempPeptideFragmentIon = new PeptideFragmentIon(PeptideFragmentIon.Y_ION, tempNeutralLosses);
if (allAnnotations.size() > 1) {
getColumn("y++-NH3").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("y++-NH3").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("y++-NH3").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(tempPeptideFragmentIon, false)));
((JSparklinesBarChartTableCellRenderer) getColumn("y++-NH3").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
if (allAnnotations.size() > 1) {
getColumn("x").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.X_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("x").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("x").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.X_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("x").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
try {
if (allAnnotations.size() > 1) {
getColumn("z").setCellRenderer(new JSparklinesErrorBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.Z_ION), false)));
((JSparklinesErrorBarChartTableCellRenderer) getColumn("z").getCellRenderer()).setMinimumChartValue(0);
} else {
getColumn("z").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, maxIntensity,
SpectrumPanel.determineFragmentIonColor(new PeptideFragmentIon(PeptideFragmentIon.Z_ION), false)));
((JSparklinesBarChartTableCellRenderer) getColumn("z").getCellRenderer()).setMinimumChartValue(0);
}
} catch (IllegalArgumentException e) {
// do nothing
}
}
/**
* Helper method adding a fragment ion annotation to the total list.
*
* @param values the map to add the annotation to
* @param key the key for the current annotation
* @param peakIntensity the peak intensity
*/
private void addValue(HashMap<String, ArrayList<Double>> values, String key, Double peakIntensity) {
if (values.containsKey(key)) {
values.get(key).add(peakIntensity);
} else {
ArrayList<Double> tempArray = new ArrayList<Double>();
tempArray.add(peakIntensity);
values.put(key, tempArray);
}
}
}