org.biojava.nbio.structure.symmetry.gui.SymmetryGui 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/
*
*/
package org.biojava.nbio.structure.symmetry.gui;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTabbedPane;
import org.biojava.nbio.structure.PassthroughIdentifier;
import org.biojava.nbio.structure.Structure;
import org.biojava.nbio.structure.StructureException;
import org.biojava.nbio.structure.StructureIdentifier;
import org.biojava.nbio.structure.align.ce.AbstractUserArgumentProcessor;
import org.biojava.nbio.structure.align.gui.AlignmentCalculationRunnable;
import org.biojava.nbio.structure.align.gui.MenuCreator;
import org.biojava.nbio.structure.align.gui.ParameterGUI;
import org.biojava.nbio.structure.align.gui.SelectPDBPanel;
import org.biojava.nbio.structure.align.util.ResourceManager;
import org.biojava.nbio.structure.align.webstart.AligUIManager;
import org.biojava.nbio.structure.gui.util.PDBUploadPanel;
import org.biojava.nbio.structure.gui.util.ScopSelectPanel;
import org.biojava.nbio.structure.gui.util.StructurePairSelector;
import org.biojava.nbio.structure.symmetry.internal.CESymmParameters;
import org.biojava.nbio.structure.symmetry.internal.CeSymm;
/**
* A JFrame that allows to trigger a symmetry analysis, either from files
* in a directory or after manual upload
* Adapted from the AlignmentGui class in biojava.
* Only one structure is inputted and only the CeSymm algorihm can be chosen.
*
* @author Aleix Lafita
* @since 4.2.0
*
*/
public class SymmetryGui extends JFrame {
private final static long serialVersionUID = 0l;
private CESymmParameters params = new CESymmParameters();
private JButton abortB;
private SelectPDBPanel tab1 ;
private PDBUploadPanel tab2;
private ScopSelectPanel tab3;
private Thread thread;
private AlignmentCalculationRunnable alicalc;
private JTabbedPane masterPane;
private JTabbedPane tabPane;
private JProgressBar progress;
public static void main(String[] args){
SymmetryGui.getInstance();
}
static final ResourceManager resourceManager =
ResourceManager.getResourceManager("ce");
private static final String MAIN_TITLE =
"Symmetry Analysis Tool: CE-Symm - V.1.0";
private static final SymmetryGui me = new SymmetryGui();
public static SymmetryGui getInstance(){
AbstractUserArgumentProcessor.printAboutMe();
AligUIManager.setLookAndFeel();
if (!me.isVisible()) me.setVisible(true);
if (! me.isActive()) me.requestFocus();
return me;
}
public static SymmetryGui getInstanceNoVisibilityChange(){
return me;
}
private SymmetryGui() {
super();
thread = null;
JMenuBar menu = MenuCreator.initAlignmentGUIMenu(this);
this.setJMenuBar(menu);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle(MAIN_TITLE);
tab1 = new SelectPDBPanel(false);
tab2 = new PDBUploadPanel(false);
tab3 = new ScopSelectPanel(false);
//setup tabPane
tabPane = new JTabbedPane();
tabPane.addTab("Select PDB ID", null, tab1, "Select PDB ID to analyze");
tabPane.addTab("Domain",null, tab3,"Select domain to analyze.");
tabPane.addTab("Custom file",null, tab2,"Analyze your own file.");
Box hBoxAlgo = setupAlgorithm();
Box vBox = Box.createVerticalBox();
vBox.add(tabPane);
vBox.add(Box.createGlue());
masterPane = new JTabbedPane();
masterPane.addTab("Symmetry Analysis", vBox);
Box vBoxMain = Box.createVerticalBox();
vBoxMain.add(hBoxAlgo);
vBoxMain.add(masterPane);
vBoxMain.add(initButtons());
this.getContentPane().add(vBoxMain);
this.pack();
this.setVisible(true);
}
private Box setupAlgorithm() {
String[] algorithms = {"JCE-symmetry"};
JLabel algoLabel = new JLabel("Symmetry algorithm: ");
JComboBox algorithmList = new JComboBox(algorithms);
algorithmList.setSelectedIndex(0);
Action paramAction = new AbstractAction("Parameters") {
public static final long serialVersionUID = 0l;
// This method is called when the button is pressed
@Override
public void actionPerformed(ActionEvent evt) {
// Perform action...
configureParameters();
}
};
JButton parameterButton = new JButton(paramAction);
Box hBoxAlgo = Box.createHorizontalBox();
hBoxAlgo.add(Box.createGlue());
hBoxAlgo.add(algoLabel);
hBoxAlgo.add(algorithmList);
hBoxAlgo.add(Box.createGlue());
hBoxAlgo.add(parameterButton);
hBoxAlgo.add(Box.createGlue());
return hBoxAlgo;
}
private Box initButtons(){
progress =new JProgressBar();
progress.setIndeterminate(false);
progress.setMaximumSize(new Dimension(10,100));
progress.setVisible(false);
Action action1 = new AbstractAction("Analyze") {
public static final long serialVersionUID = 0l;
// This method is called when the button is pressed
@Override
public void actionPerformed(ActionEvent evt) {
// Perform action...
//System.out.println("calc structure alignment");
int selectedIndex = masterPane.getSelectedIndex();
if (selectedIndex == 0)
calcAlignment();
else {
System.err.println("Unknown TAB: " + selectedIndex);
}
}
};
JButton submitB = new JButton(action1);
Action action3 = new AbstractAction("Abort") {
public static final long serialVersionUID = 0l;
// This method is called when the button is pressed
@Override
public void actionPerformed(ActionEvent evt) {
// Perform action...
abortCalc();
}
};
abortB = new JButton(action3);
abortB.setEnabled(false);
Action action2 = new AbstractAction("Exit") {
public static final long serialVersionUID = 0l;
// This method is called when the button is pressed
@Override
public void actionPerformed(ActionEvent evt) {
// Perform action...
abortCalc();
dispose();
System.exit(0);
}
};
JButton closeB = new JButton(action2);
Box hBox = Box.createHorizontalBox();
hBox.add(closeB);
hBox.add(Box.createGlue());
hBox.add(progress);
hBox.add(abortB);
//hBox.add(Box.createGlue());
hBox.add(submitB);
return hBox;
}
protected void configureParameters() {
System.out.println("configure parameters for " +
CeSymm.algorithmName);
// show a new config GUI
new ParameterGUI(params, CeSymm.algorithmName);
}
public void cleanUp() {
if ( alicalc != null) {
alicalc.cleanup();
}
}
private void calcAlignment() {
int pos = tabPane.getSelectedIndex();
StructurePairSelector tab = null;
if (pos == 0 ){
tab = tab1;
} else if (pos == 1){
tab = tab3;
} else if (pos == 2){
tab = tab2;
}
try {
Structure s = tab.getStructure1();
if ( s == null) {
System.err.println("Please select structure");
return ;
}
StructureIdentifier name = new PassthroughIdentifier("custom");
if ( pos == 0){
name = tab1.getName1();
} else {
name = s.getStructureIdentifier();
}
System.out.println("Analyzing: " + name);
alicalc = new SymmetryCalc(this, s);
thread = new Thread(alicalc);
thread.start();
abortB.setEnabled(true);
progress.setIndeterminate(true);
ProgressThreadDrawer drawer = new ProgressThreadDrawer(progress);
drawer.start();
} catch (StructureException e){
JOptionPane.showMessageDialog(null,
"Could not align structures. Exception: " + e.getMessage());
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Could not align structures. Exception: " + e.getMessage());
}
}
public void notifyCalcFinished(){
abortB.setEnabled(false);
thread = null;
progress.setIndeterminate(false);
this.repaint();
}
private void abortCalc(){
System.err.println("Interrupting alignment ...");
if ( alicalc != null )
alicalc.interrupt();
notifyCalcFinished();
}
public CESymmParameters getParameters() {
return params;
}
}
class ProgressThreadDrawer extends Thread {
JProgressBar progress;
static int interval = 300;
public ProgressThreadDrawer(JProgressBar progress) {
this.progress = progress;
}
@Override
public void run() {
progress.setVisible(true);
boolean finished = false;
while ( ! finished) {
try {
progress.repaint();
if ( ! progress.isIndeterminate() ){
finished =false;
break;
}
sleep(interval);
} catch (InterruptedException e){
}
progress.repaint();
}
progress.setVisible(false);
progress = null;
}
}