All Downloads are FREE. Search and download functionalities are using the official Maven repository.
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.align.gui.AlignmentGui 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 Jul 16, 2006
*
*/
package org.biojava.nbio.structure.align.gui;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.io.File;
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.Structure;
import org.biojava.nbio.structure.StructureException;
import org.biojava.nbio.structure.align.StructureAlignment;
import org.biojava.nbio.structure.align.StructureAlignmentFactory;
import org.biojava.nbio.structure.align.ce.AbstractUserArgumentProcessor;
import org.biojava.nbio.structure.align.util.ResourceManager;
import org.biojava.nbio.structure.align.util.UserConfiguration;
import org.biojava.nbio.structure.align.webstart.AligUIManager;
import org.biojava.nbio.structure.align.webstart.WebStartMain;
import org.biojava.nbio.structure.gui.util.PDBUploadPanel;
import org.biojava.nbio.structure.gui.util.ScopSelectPanel;
import org.biojava.nbio.structure.gui.util.StructurePairSelector;
/** A JFrame that allows to trigger a pairwise structure alignment,
* either from files in a directory,
* or after manual upload.
*
* @author Andreas Prlic
*
* @since 1.7
*
*
*
*/
public class AlignmentGui extends JFrame{
private final static long serialVersionUID =0l;
StructureAlignment algorithm;
JButton abortB;
SelectPDBPanel tab1 ;
PDBUploadPanel tab2;
ScopSelectPanel tab3;
Thread thread;
AlignmentCalculationRunnable alicalc;
JTabbedPane masterPane;
JTabbedPane tabPane;
JProgressBar progress;
private DBSearchGUI dbsearch;
public static void main(String[] args){
AlignmentGui.getInstance();
}
static final ResourceManager resourceManager = ResourceManager.getResourceManager("ce");
private static final String MAIN_TITLE = "Pairwise Structure Alignment - Main - V." + resourceManager.getString("ce.version");;
private static final AlignmentGui me = new AlignmentGui();
public static AlignmentGui getInstance(){
AbstractUserArgumentProcessor.printAboutMe();
AligUIManager.setLookAndFeel();
if (! me.isVisible())
me.setVisible(true);
if ( ! me.isActive())
me.requestFocus();
return me;
}
public static AlignmentGui getInstanceNoVisibilityChange(){
return me;
}
protected AlignmentGui() {
super();
thread = null;
JMenuBar menu = MenuCreator.initAlignmentGUIMenu(this);
this.setJMenuBar(menu);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle(MAIN_TITLE);
tab1 = new SelectPDBPanel();
tab2 = new PDBUploadPanel();
tab3 = new ScopSelectPanel();
// setup tabPane
tabPane = new JTabbedPane();
tabPane.addTab("Select PDB ID", null, tab1, "Select PDB ID to align");
tabPane.addTab("Domains",null, tab3,"Select domains to align.");
tabPane.addTab("Custom files",null, tab2,"Align your own files.");
Box hBoxAlgo = setupAlgorithm();
Box vBox = Box.createVerticalBox();
//vBox.add(hBoxAlgo);
vBox.add(tabPane);
vBox.add(Box.createGlue());
//vBox.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
masterPane = new JTabbedPane();
masterPane.addTab("Pairwise Comparison", vBox);
dbsearch = new DBSearchGUI();
masterPane.addTab("Database Search",dbsearch);
//JPanel dir = tab1.getPDBDirPanel(pdbDir);
Box vBoxMain = Box.createVerticalBox();
vBoxMain.add(hBoxAlgo);
// pairwise or db search
vBoxMain.add(masterPane);
// algorithm selection
// PDB install config
//vBoxMain.add(dir);
// buttons
vBoxMain.add(initButtons());
this.getContentPane().add(vBoxMain);
//SwingUtilities.updateComponentTreeUI( me);
this.pack();
this.setVisible(true);
}
private Box setupAlgorithm()
{
String[] algorithms = StructureAlignmentFactory.getAllAlgorithmNames();
try {
algorithm = StructureAlignmentFactory.getAlgorithm(algorithms[0]);
} catch (StructureException e){
e.printStackTrace();
}
JLabel algoLabel = new JLabel("Select alignment algorithm: ");
JComboBox algorithmList = new JComboBox(algorithms);
algorithmList.setSelectedIndex(0);
Action actionAlgorithm = new AbstractAction("Algorithm") {
public static final long serialVersionUID = 0l;
// This method is called when the button is pressed
@Override
public void actionPerformed(ActionEvent evt) {
JComboBox cb = (JComboBox)evt.getSource();
String algorithmName = (String)cb.getSelectedItem();
// Perform action...
//System.out.println("calc structure alignment");
updateAlgorithm(algorithmName);
}
};
algorithmList.addActionListener(actionAlgorithm);
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...
//System.out.println("calc structure alignment");
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(){
// Box hBox42 = Box.createHorizontalBox();
progress =new JProgressBar();
progress.setIndeterminate(false);
progress.setMaximumSize(new Dimension(10,100));
progress.setVisible(false);
// hBox42.add(Box.createGlue());
// hBox42.add(progress);
// hBox42.add(Box.createGlue());
// vBox.add(hBox42);
Action action1 = new AbstractAction("Align") {
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 if ( selectedIndex == 1)
calcDBSearch();
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() {
StructureAlignment algorithm = getStructureAlignment();
System.out.println("configure parameters for " + algorithm.getAlgorithmName());
// show a new config GUI
new ParameterGUI(algorithm.getParameters(), algorithm.getAlgorithmName());
}
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 s1 = tab.getStructure1();
Structure s2 = tab.getStructure2();
if ( s1 == null) {
System.err.println("please select structure 1");
return ;
}
if ( s2 == null) {
System.err.println("please select structure 2");
return;
}
String name1 = "custom1";
String name2 = "custom2";
if ( pos == 0){
name1 = tab1.getName1().getIdentifier();
name2 = tab1.getName2().getIdentifier();
} else {
name1 = s1.getName();
name2 = s2.getName();
}
System.out.println("aligning: " + name1 + " " + name2);
alicalc = new AlignmentCalc(this,s1,s2, name1, name2);
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());
}
}
private void calcDBSearch() {
JTabbedPane tabPane = dbsearch.getTabPane();
System.out.println("run DB search " + tabPane.getSelectedIndex());
Structure s = null;
boolean domainSplit = dbsearch.isDomainSplit();
StructurePairSelector tab = null;
int pos = tabPane.getSelectedIndex();
if (pos == 0 ){
tab = dbsearch.getSelectPDBPanel();
} else if (pos == 1){
tab = dbsearch.getScopSelectPanel();
} else if (pos == 2){
tab = dbsearch.getPDBUploadPanel();
}
try {
s = tab.getStructure1();
if ( s == null) {
JOptionPane.showMessageDialog(null,"please select structure 1");
return ;
}
} catch (Exception e){
e.printStackTrace();
}
String name1 = s.getName();
if ( name1 == null || name1.equals(""))
name1 = s.getPDBCode();
System.out.println("name1 in alig gui:" + name1);
String file = dbsearch.getOutFileLocation();
if ( file == null || file.equals("") ){
JOptionPane.showMessageDialog(null,"Please select a directory to contain the DB search results.");
return;
}
File outFile = new File(file);
if( !outFile.exists() ) {
outFile.mkdirs();
}
if( !outFile.isDirectory() || !outFile.canWrite()) {
JOptionPane.showMessageDialog(null,"Unable to write to "+outFile.getAbsolutePath());
return;
}
UserConfiguration config = WebStartMain.getWebStartConfig();
int totalNrCPUs = Runtime.getRuntime().availableProcessors();
int useNrCPUs = 1;
if ( totalNrCPUs > 1){
Object[] options = new Integer[totalNrCPUs];
int posX = 0;
for ( int i = totalNrCPUs; i> 0 ; i--){
options[posX] = i;
posX++;
}
int n = JOptionPane.showOptionDialog(null,
"How many would you like to use for the calculations?",
"We detected " + totalNrCPUs + " processors on your system.",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[0]);
if ( n < 0)
return;
useNrCPUs = (Integer) options[n];
System.out.println("will use " + useNrCPUs + " CPUs." );
}
System.out.println("using domainSplit data");
alicalc = new AlignmentCalcDB(this, s, name1,config,file, domainSplit);
alicalc.setNrCPUs(useNrCPUs);
abortB.setEnabled(true);
progress.setIndeterminate(true);
ProgressThreadDrawer drawer = new ProgressThreadDrawer(progress);
drawer.start();
Thread t = new Thread(alicalc);
t.start();
}
public DBSearchGUI getDBSearch(){
return dbsearch;
}
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 StructureAlignment getStructureAlignment() {
return algorithm;
}
private void updateAlgorithm(String algorithmName) {
//String algorithmName = (String)algorithmList.getSelectedItem();
try {
algorithm = StructureAlignmentFactory.getAlgorithm(algorithmName);
} catch (StructureException ex){
ex.printStackTrace();
}
}
}
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;
}
}