package au.com.acpfg.misc.spectra; import java.awt.Component; import java.awt.Dimension; import java.util.Arrays; import java.util.Comparator; import javax.swing.JList; import javax.swing.JTable; import org.knime.core.data.DataColumnSpec; import org.knime.core.data.renderer.DefaultDataValueRenderer; /** * Reports the top-ten m/z values based on intensity in the peak list. * m/z values are rounded to 3 decimal places. * * @author andrew.cassin * */ public class SpectraTop10Renderer extends DefaultDataValueRenderer { @Override public boolean accepts(DataColumnSpec spec) { return (spec != null && spec.getType() == AbstractSpectraCell.TYPE); } @Override public String getDescription() { return "Top 10 Peaks"; } @Override public Dimension getPreferredSize() { return new Dimension(200, 20); } @Override protected void setValue(final Object value) { if (value instanceof SpectralDataInterface) { // 1. compute the tenth-biggest intensity (dont worry about ties) SpectralDataInterface si = (SpectralDataInterface) value; double[] intensities = si.getIntensity(); double[] mz = si.getMZ(); SortablePeak[] big_peaks = new SortablePeak[mz.length]; for (int i=0; i<mz.length; i++) { big_peaks[i] = new SortablePeak(mz[i], intensities[i], true); // true == sort by intensity } StringBuilder sb = new StringBuilder(); Arrays.sort(big_peaks); // 3. sort peaks by ascending mz for (int i= big_peaks.length-10; i<big_peaks.length; i++) { sb.append(big_peaks[i].getMZ()); sb.append(' '); sb.append(big_peaks[i].getIntensity()); sb.append('\n'); } super.setValue("<html><pre>"+sb.toString()); } else { super.setValue(value); } } /** * Sorts solely on the basis of mz and not intensity * @author andrew.cassin * */ private class SortablePeak implements Comparator,Comparable { private double m_mz, m_intensity; private boolean m_sort_by_intensity; @Override public int compare(Object a, Object b) { SortablePeak oa = (SortablePeak) a; SortablePeak ob = (SortablePeak) b; if (oa == null || ob == null || a == b ) return 0; assert(oa.m_sort_by_intensity == ob.m_sort_by_intensity); if (m_sort_by_intensity) { if (oa.m_intensity == ob.m_intensity) return 0; else if (oa.m_intensity < ob.m_intensity) return -1; else return 1; } else { if (oa.m_mz == ob.m_mz) return 0; else if (oa.m_mz < ob.m_mz) return -1; else return 1; } } public SortablePeak(double mz, double intensity, boolean sort_by_intensity) { m_mz = mz; m_intensity = intensity; m_sort_by_intensity = sort_by_intensity; } public double getMZ() { return m_mz; } public double getIntensity() { return m_intensity; } @Override public int compareTo(Object arg0) { return compare(this, arg0); } } }