Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.biojava.nbio.structure.gui.ScaleableMatrixPanel Maven / Gradle / Ivy
/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
* Created on Aug 3, 2007
*
*/
package org.biojava.nbio.structure.gui;
import org.biojava.nbio.structure.Structure;
import org.biojava.nbio.structure.align.StrucAligParameters;
import org.biojava.nbio.structure.align.StructurePairAligner;
import org.biojava.nbio.structure.align.pairwise.AlternativeAlignment;
import org.biojava.nbio.structure.align.pairwise.FragmentPair;
import org.biojava.nbio.structure.gui.util.color.*;
import org.biojava.nbio.structure.gui.util.color.LinearColorInterpolator.InterpolationDirection;
import org.biojava.nbio.structure.io.PDBFileReader;
import org.biojava.nbio.structure.jama.Matrix;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
/** A JPanel that can display the underlying distance matrix
* data of the protein structure alignment algorithm. It adds a
* JSlider to a JMatrixPanel.
*
* see also JMatrixPanel.
*
*/
public class ScaleableMatrixPanel
extends JPanel
implements ChangeListener, ActionListener {
/**
*
*/
private static final long serialVersionUID = -8082261434322968652L;
protected JMatrixPanel mPanel;
protected JSlider slider;
protected JScrollPane scroll;
protected JComboBox coloring;
protected Map gradients;
protected static final int SLIDER_STEPS = 8; // Number of minor ticks per unit scaled
public static void main(String[] args){
PDBFileReader pdbr = new PDBFileReader();
pdbr.setPath("/tmp/");
//String pdb1 = "1crl";
//String pdb2 = "1ede";
String pdb1 = "1buz";
String pdb2 = "1ali";
//String pdb1 = "5pti";
//String pdb2 = "5pti";
// NO NEED TO DO CHANGE ANYTHING BELOW HERE...
StructurePairAligner sc = new StructurePairAligner();
StrucAligParameters params = new StrucAligParameters();
params.setMaxIter(1);
sc.setParams(params);
// step1 : read molecules
try {
Structure s1 = pdbr.getStructureById(pdb1);
Structure s2 = pdbr.getStructureById(pdb2);
System.out.println("aligning " + pdb1 + " vs. " + pdb2);
System.out.println(s1);
System.out.println();
System.out.println(s2);
// step 2 : do the calculations
sc.align(s1,s2);
ScaleableMatrixPanel smp = new ScaleableMatrixPanel();
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
JFrame f = (JFrame) e.getSource();
f.setVisible(false);
f.dispose();
}
});
smp.setMatrix(sc.getDistMat());
smp.setFragmentPairs(sc.getFragmentPairs());
smp.setAlternativeAligs(sc.getAlignments());
for (int i = 0; i < sc.getAlignments().length; i++) {
AlternativeAlignment aa =sc.getAlignments()[i];
System.out.println(aa);
}
frame.getContentPane().add(smp);
frame.pack();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public ScaleableMatrixPanel(){
mPanel = new JMatrixPanel();
Box vBox = Box.createVerticalBox();
Box gradientBox = Box.createHorizontalBox();
vBox.add(gradientBox);
gradientBox.add(new JLabel("Coloring:"));
gradients = createGradients(); //sets gradients
//Set first gradient
this.setCellColor(gradients.values().iterator().next());
coloring = new JComboBox(gradients.keySet().toArray(new String[] {}));
coloring.setRenderer(new GradientRenderer());
coloring.addActionListener(this);
coloring.setMaximumSize(new Dimension(1000,30));
gradientBox.add(coloring);
int RES_MIN = 0*SLIDER_STEPS;
int RES_MAX = 8*SLIDER_STEPS;
int RES_INIT = 1*SLIDER_STEPS;
slider = new JSlider(JSlider.HORIZONTAL, RES_MIN,RES_MAX,RES_INIT);
slider.setInverted(false);
slider.setPaintTicks(true);
//slider.setMinorTickSpacing(1);
slider.setMajorTickSpacing(SLIDER_STEPS);
slider.setSnapToTicks(false);
slider.setPaintLabels(false);
slider.setPaintTrack(true);
//slider.setLabelTable(slider.createStandardLabels(SLIDER_STEPS));
slider.addChangeListener(this);
slider.setPreferredSize(new Dimension(100,slider.getPreferredSize().height));
vBox.add(slider);
scroll = new JScrollPane(mPanel);
scroll.getHorizontalScrollBar().setUnitIncrement(60);
scroll.getVerticalScrollBar().setUnitIncrement(60);
scroll.getHorizontalScrollBar().setBlockIncrement(60);
scroll.getVerticalScrollBar().setBlockIncrement(60);
vBox.add(scroll);
this.setPreferredSize(new Dimension(400,400));
this.add(vBox);
mPanel.setLayout(new BoxLayout(mPanel,BoxLayout.Y_AXIS));
this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
}
protected static Map createGradients() {
SortedMap gradients = new TreeMap();
int i = 0; //prepend number, since sorted alphabetically
ColorSpace hsv = HSVColorSpace.getHSVColorSpace();
LinearColorInterpolator interp;
GradientMapper gradient;
/*
DefaultMatrixMapper defaultMapper = new DefaultMatrixMapper(10., .9f);
gradients.put((++i)+". Default", defaultMapper);
defaultMapper = new DefaultMatrixMapper(5., .9f);
gradients.put((++i)+". Sensitive", defaultMapper);
gradients.put((++i)+". Rainbow", GradientMapper.getGradientMapper(GradientMapper.RAINBOW_INTENSITY_GRADIENT, 0, 10));
gradients.put((++i)+". Rainbow", GradientMapper.getGradientMapper(GradientMapper.RAINBOW_INTENSITY_GRADIENT, 10, 0));
*/
interp = new LinearColorInterpolator(hsv);
interp.setInterpolationDirection(0, InterpolationDirection.INNER);
gradient = new GradientMapper(Color.green, Color.black, hsv);
gradient.put( -50., new Color(hsv,new float[] {0f, .9f, 0f},1f));
gradient.put( 10., new Color(hsv,new float[] {1f, .9f, 1f},1f));
gradient.setInterpolator(interp);
gradients.put((++i)+". -50 to 10", gradient);
// Mimic DefaultMapper
interp = new LinearColorInterpolator(hsv);
interp.setInterpolationDirection(0, InterpolationDirection.INNER);
gradient = new GradientMapper(Color.green, Color.black, hsv);
gradient.put( 0., new Color(hsv,new float[] {1f, .9f, 1f},1f));
gradient.put(10., new Color(hsv,new float[] {0f, .9f, 0f},1f));
gradient.setInterpolator(interp);
gradients.put((++i)+". Default", gradient);
// Sensitive DefaultMapper
interp = new LinearColorInterpolator(hsv);
interp.setInterpolationDirection(0, InterpolationDirection.INNER);
gradient = new GradientMapper(Color.green, Color.black, hsv);
gradient.put( 0., new Color(hsv,new float[] {1f, .9f, 1f},1f));
gradient.put( 5., new Color(hsv,new float[] {0f, .9f, 0f},1f));
gradient.setInterpolator(interp);
gradients.put((++i)+". Sensitive", gradient);
// color [0,1]import java.awt.Color;
interp = new LinearColorInterpolator(hsv);
interp.setInterpolationDirection(0, InterpolationDirection.INNER);
gradient = new GradientMapper(Color.green, Color.black, hsv);
gradient.put( 0., new Color(hsv,new float[] {1f, .9f, 1f},1f));
gradient.put( 1., new Color(hsv,new float[] {.2f, .9f, 1f},1f));
gradient.put( 1+1e-6, Color.white);
gradient.put(5., Color.black);
gradient.setInterpolator(interp);
gradients.put((++i)+". Emphasize low", gradient);
interp = new LinearColorInterpolator(hsv);
interp.setInterpolationDirection(0, InterpolationDirection.INNER);
gradient = new GradientMapper(Color.green, Color.black, hsv);
gradient.put( 0., new Color(hsv,new float[] {0f, .9f, 0f},1f));
gradient.put( 100., new Color(hsv,new float[] {1f, .9f, 1f},1f));
gradient.setInterpolator(interp);
gradients.put((++i)+". 0 to 100", gradient);
// log color
interp = new LinearColorInterpolator(hsv);
interp.setInterpolationDirection(0, InterpolationDirection.INNER);
gradient = new GradientMapper(Color.red, Color.black, hsv);
gradient.put( 0., new Color(hsv,new float[] {1f, .9f, 1f},1f));
gradient.put( 10., new Color(hsv,new float[] {0f, .9f, 0f},1f));
gradient.setInterpolator(interp);
ContinuousColorMapper logGradient = new LogColorMapper(gradient,2);
gradients.put((++i)+". Logorithmic", logGradient);
// sqrt color
interp = new LinearColorInterpolator(hsv);
interp.setInterpolationDirection(0, InterpolationDirection.INNER);
gradient = new GradientMapper(Color.red, Color.black, hsv);
gradient.put( 0., new Color(hsv,new float[] {1f, .9f, 1f},1f));
gradient.put( 4., new Color(hsv,new float[] {0f, .9f, 0f},1f));
gradient.setInterpolator(interp);
ContinuousColorMapper sqrtGradient = new SqrtColorMapper(gradient);
gradients.put((++i)+". Square Root", sqrtGradient);
GradientMapper black = new GradientMapper(Color.BLACK, Color.BLACK);
gradients.put((++i)+". Black", black);
return gradients;
}
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
if ( source.getValueIsAdjusting()) {
//return;
}
//System.out.println("Changed scale to "+source.getValue());
mPanel.setScale((float)source.getValue()/SLIDER_STEPS);
scroll.repaint();
scroll.updateUI();
}
public Matrix getMatrix() {
return mPanel.getMatrix();
}
public void setMatrix(Matrix matrix) {
mPanel.setMatrix(matrix);
}
public JMatrixPanel getMatrixPanel(){
return mPanel;
}
public FragmentPair[] getFragmentPairs(){
return mPanel.getFragmentPairs();
}
public void setFragmentPairs(FragmentPair[] pairs){
mPanel.setFragmentPairs(pairs);
}
public AlternativeAlignment[] getAlternativeAligs() {
return mPanel.getAlternativeAligs();
}
public void setAlternativeAligs(AlternativeAlignment[] aligs) {
mPanel.setAlternativeAligs(aligs);
}
public int getSelectedAlignmentPos() {
return mPanel.getSelectedAlignmentPos();
}
public void setSelectedAlignmentPos(int selectedAlignmentPos) {
mPanel.setSelectedAlignmentPos(selectedAlignmentPos);
}
/**
* @return the color mapping of the JMatrixPanel
*/
public ContinuousColorMapper getCellColor() {
return mPanel.getCellColor();
}
/**
* @param cellColor the color mapping of the JMatrixPanel
*/
public void setCellColor(ContinuousColorMapper cellColor) {
mPanel.setCellColor(cellColor);
}
/**
* A renderer for the the gradient dropdown menu at the top of scaleableMatrixPanes.
* Knows how to draw a gradient and nicely label it.
*
* @author Spencer Bliven
*
*/
protected class GradientRenderer extends JPanel
implements ListCellRenderer {
private static final long serialVersionUID = -2000575579184232365L;
private int min,max;
JLabel title;
JPanel gradientContainer;
public GradientRenderer() {
this.setPreferredSize(new Dimension(100,25));
this.setLayout(new BorderLayout());
this.min = -1;
this.max = 10;
JPanel gradientBounds = new JPanel();
gradientBounds.setLayout(new BorderLayout());
//gradientBounds.setBorder(BorderFactory.createLineBorder(Color.GRAY));
gradientBounds.add(new JLabel(Integer.toString(min)),BorderLayout.WEST);
gradientContainer = new JPanel();
gradientContainer.setLayout(new BorderLayout());
gradientContainer.setOpaque(false);
gradientContainer.add(new JLabel(""),BorderLayout.CENTER);
//gradientContainer.setMinimumSize(new Dimension(50,20));
//gradientContainer.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
//gradientBounds.setPreferredSize(new Dimension(200,25));
gradientBounds.add(gradientContainer,BorderLayout.CENTER);
gradientBounds.setOpaque(false);
gradientBounds.add(new JLabel(Integer.toString(max)),BorderLayout.EAST);
this.add(gradientBounds, BorderLayout.EAST);
this.title = new JLabel("No gradient");
//this.title.setOpaque(true);
this.title.setHorizontalAlignment(JLabel.CENTER);
this.title.setVerticalAlignment(JLabel.CENTER);
this.add(this.title,BorderLayout.CENTER);
}
/*
* This method finds the image and text corresponding
* to the selected value and returns the label, set up
* to display the text and image.
*/
@Override
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
//Get the selected index. (The index param isn't
//always valid, so just use the value.)
String gradientLabel = (String)value;
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
//Set the icon and text. If icon was null, say so.
GradientPanel gradPanel = new GradientPanel(gradients.get(gradientLabel),min,max);
gradPanel.setPreferredSize(new Dimension(100,20));
//gradPanel.setBorder(BorderFactory.createLineBorder(Color.cyan));
gradientContainer.removeAll();
gradientContainer.add(gradPanel,BorderLayout.CENTER);
title.setText(gradientLabel);
this.validate();
return this;
}
}
/**
* @param e
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource(); // == coloring
String gradientName = (String)cb.getSelectedItem();
ContinuousColorMapper gradient = gradients.get(gradientName);
assert(gradient != null);
this.setCellColor(gradient);
this.repaint();
}
}