+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Copyright (C) 2014 The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
package jalview.gui;
import jalview.datamodel.DBRefEntry;
import jalview.util.MessageManager;
import jalview.ws.dbsources.PDBRestClient;
import jalview.ws.dbsources.PDBRestClient.PDBDocField;
-import jalview.ws.uimodel.PDBSearchRequest;
-import jalview.ws.uimodel.PDBSearchResponse;
-import jalview.ws.uimodel.PDBSearchResponse.PDBResponseSummary;
+import jalview.ws.uimodel.PDBRestRequest;
+import jalview.ws.uimodel.PDBRestResponse;
+import jalview.ws.uimodel.PDBRestResponse.PDBResponseSummary;
-import java.awt.Component;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
+import java.util.Vector;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
-import javax.swing.JTable;
import javax.swing.ListSelectionModel;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumnModel;
+/**
+ * Provides the behaviors for the Structure chooser Panel
+ *
+ * @author tcnofoegbu
+ *
+ */
@SuppressWarnings("serial")
public class StructureChooser extends GStructureChooser
{
-
- private boolean structuresWereFound = false;
+ private boolean structuresDiscovered = false;
private SequenceI selectedSequence;
private SequenceI[] selectedSequences;
- IProgressIndicator af;
+ private IProgressIndicator progressIndicator;
+
+ private Collection<PDBResponseSummary> discoveredStructuresSet = new HashSet<PDBResponseSummary>();
+
+ private PDBRestRequest pdbRequest;
- Collection<PDBResponseSummary> discoveredStructuresSet = new HashSet<PDBResponseSummary>();
+ private PDBRestClient pdbRestCleint;
- public StructureChooser(AlignmentPanel ap, final SequenceI sequence)
+
+ public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq,
+ AlignmentPanel ap)
{
this.ap = ap;
- this.af = ap.alignFrame;
- this.selectedSequence = sequence;
- this.selectedSequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]
- { sequence }
- : ap.av.getSequenceSelection());
+ this.selectedSequence = selectedSeq;
+ this.selectedSequences = selectedSeqs;
+ this.progressIndicator = (ap == null) ? null : ap.alignFrame;
init();
}
- private void init()
+ /**
+ * Initializes parameters used by the Structure Chooser Panel
+ */
+ public void init()
{
- Thread discPDBThread = new Thread(new Runnable()
+ Thread discoverPDBStructuresThread = new Thread(new Runnable()
{
@Override
public void run()
{
long startTime = System.currentTimeMillis();
- af.setProgressBar(
- MessageManager.getString("status.fetching_db_refs"),
- startTime);
-
- fetchStructures();
- populateFilterOptions();
- af.setProgressBar(null, startTime);
+ String msg = MessageManager.getString("status.fetching_db_refs");
+ updateProgressIndicator(msg, startTime);
+ fetchStructuresMetaData();
+ populateFilterComboBox();
+ updateProgressIndicator(null, startTime);
mainFrame.setVisible(true);
updateCurrentView();
}
});
- discPDBThread.start();
+ discoverPDBStructuresThread.start();
+ }
+
+ /**
+ * Updates the progress indicator with the specified message
+ *
+ * @param message
+ * displayed message for the operation
+ * @param id
+ * unique handle for this indicator
+ */
+ public void updateProgressIndicator(String message, long id)
+ {
+ if (progressIndicator != null)
+ {
+ progressIndicator.setProgressBar(message, id);
+ }
}
- private void fetchStructures()
+ /**
+ * Retrieve meta-data for all the structure(s) for a given sequence(s) in a
+ * selection group
+ */
+ public void fetchStructuresMetaData()
{
long startTime = System.currentTimeMillis();
List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
// wantedFields.add(PDBDocField.GENUS);
// wantedFields.add(PDBDocField.GENE_NAME);
wantedFields.add(PDBDocField.TITLE);
-
- PDBSearchRequest request = new PDBSearchRequest();
- request.setAllowEmptySeq(false);
- request.setResponseSize(500);
- request.setFieldToSearchBy("(text:");
- request.setWantedFields(wantedFields);
-
+ pdbRequest = new PDBRestRequest();
+ pdbRequest.setAllowEmptySeq(false);
+ pdbRequest.setResponseSize(500);
+ pdbRequest.setFieldToSearchBy("(text:");
+ pdbRequest.setWantedFields(wantedFields);
for (SequenceI seq : selectedSequences)
{
- request.setSearchTerm(buildQuery(seq) + ")");
- request.setAssociatedSequence(seq.getName());
- PDBRestClient pdbRestCleint = new PDBRestClient();
- PDBSearchResponse resultList = pdbRestCleint.executeRequest(request);
+ pdbRequest.setSearchTerm(buildQuery(seq) + ")");
+ pdbRequest.setAssociatedSequence(seq.getName());
+ pdbRestCleint = new PDBRestClient();
+ PDBRestResponse resultList = pdbRestCleint.executeRequest(pdbRequest);
if (resultList.getSearchSummary() != null
&& !resultList.getSearchSummary().isEmpty())
{
discoveredStructuresSet.addAll(resultList.getSearchSummary());
+ updateSequenceDbRef(seq, resultList.getSearchSummary());
}
}
int noOfStructuresFound = 0;
- if (discoveredStructuresSet != null)
+ if (discoveredStructuresSet != null
+ && !discoveredStructuresSet.isEmpty())
{
- jListFoundStructures.setModel(PDBSearchResponse
+ jList_FoundStructures.setModel(PDBRestResponse
.getListModel(discoveredStructuresSet));
- summaryTable.setModel(PDBSearchResponse.getTableModel(request,
+ tbl_summary.setModel(PDBRestResponse.getTableModel(pdbRequest,
discoveredStructuresSet));
// resizeColumnWidth(summaryTable);
- structuresWereFound = true;
+ structuresDiscovered = true;
noOfStructuresFound = discoveredStructuresSet.size();
}
String totalTime = (System.currentTimeMillis() - startTime)
+ " Found (" + totalTime + ")");
}
- public void resizeColumnWidth(JTable table)
- {
- // table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
- final TableColumnModel columnModel = table.getColumnModel();
- for (int column = 0; column < table.getColumnCount(); column++)
- {
- int width = 50; // Min width
- for (int row = 0; row < table.getRowCount(); row++)
- {
- TableCellRenderer renderer = table.getCellRenderer(row, column);
- Component comp = table.prepareRenderer(renderer, row, column);
- width = Math.max(comp.getPreferredSize().width, width);
- }
- columnModel.getColumn(column).setPreferredWidth(width);
- }
- }
-
- protected void populateFilterOptions()
+ /**
+ * Update the DBRef entry for a given sequence with values retrieved from
+ * PDBResponseSummary
+ *
+ * @param seq
+ * the Sequence to update its DBRef entry
+ * @param responseSummaries
+ * a collection of PDBResponseSummary
+ */
+ public void updateSequenceDbRef(SequenceI seq,
+ Collection<PDBResponseSummary> responseSummaries)
{
- if (structuresWereFound)
+ for (PDBResponseSummary response : responseSummaries)
{
- filterOptionsComboBox.addItem(new FilterOptions("Best Quality",
- PDBDocField.OVERALL_QUALITY.getCode(), VIEWS_FILTER));
- filterOptionsComboBox.addItem(new FilterOptions(
- "Best UniProt Coverage", PDBDocField.UNIPROT_COVERAGE
- .getCode(), VIEWS_FILTER));
- filterOptionsComboBox.addItem(new FilterOptions("Highest Resolution",
- PDBDocField.RESOLUTION.getCode(), VIEWS_FILTER));
- filterOptionsComboBox.addItem(new FilterOptions(
- "Highest Protein Chain", PDBDocField.PROTEIN_CHAIN_COUNT
- .getCode(), VIEWS_FILTER));
- filterOptionsComboBox.addItem(new FilterOptions(
- "Highest Bound Molecules", PDBDocField.BOUND_MOLECULE_COUNT
- .getCode(), VIEWS_FILTER));
- filterOptionsComboBox.addItem(new FilterOptions(
- "Highest Polymer Residues", PDBDocField.POLYMER_RESIDUE_COUNT
- .getCode(), VIEWS_FILTER));
+ PDBEntry newEntry = new PDBEntry();
+ newEntry.setId(response.getPdbId());
+ newEntry.setType("PDB");
+ seq.getDatasetSequence().addPDBId(newEntry);
}
- filterOptionsComboBox.addItem(new FilterOptions("Enter PDB Id", "-",
- VIEWS_ENTER_ID));
- filterOptionsComboBox.addItem(new FilterOptions("From File", "-",
- VIEWS_FROM_FILE));
}
- private String buildQuery(SequenceI seq)
+ /**
+ * Builds a query string for a given sequences using its DBRef entries
+ *
+ * @param seq
+ * the sequences to build a query for
+ * @return the built query string
+ */
+ @SuppressWarnings("unchecked")
+ public static String buildQuery(SequenceI seq)
{
String query = seq.getName();
StringBuilder queryBuilder = new StringBuilder();
int count = 0;
+
+ if (seq.getPDBId() != null)
+ {
+ for (PDBEntry entry : (Vector<PDBEntry>) seq.getPDBId())
+ {
+ queryBuilder.append("text:").append(entry.getId()).append(" OR ");
+ }
+ }
+
if (seq.getDBRef() != null && seq.getDBRef().length != 0)
{
for (DBRefEntry dbRef : seq.getDBRef())
{
- queryBuilder.append("text:").append(dbRef.getAccessionId())
+ queryBuilder.append("text:")
+ .append(dbRef.getAccessionId().replaceAll("GO:", ""))
.append(" OR ");
++count;
if (count > 10)
int endIndex = queryBuilder.lastIndexOf(" OR ");
query = queryBuilder.toString().substring(5, endIndex);
}
+ // System.out.println("Query -----> " + query);
return query;
}
- protected void updateCurrentView()
- {
- FilterOptions currentOption = ((FilterOptions) filterOptionsComboBox
- .getSelectedItem());
- switchableViewsLayout.show(switchableViewsPanel,
- currentOption.getView());
- invertFilter.setEnabled(false);
- if (currentOption.getView() == VIEWS_FILTER)
- {
- invertFilter.setEnabled(true);
- filterResultSet(currentOption.getValue());
- }
- }
-
+ /**
+ * Filters a given list of discovered structures based on supplied argument
+ *
+ * @param fieldToFilterBy
+ * the field to filter by
+ */
public void filterResultSet(final String fieldToFilterBy)
{
Thread filterThread = new Thread(new Runnable()
{
try
{
- loadingImageLabel.setVisible(true);
- List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
- // wantedFields.add(PDBDocField.MOLECULE_TYPE);
- wantedFields.add(PDBDocField.PDB_ID);
- // wantedFields.add(PDBDocField.GENUS);
- // wantedFields.add(PDBDocField.GENE_NAME);
- wantedFields.add(PDBDocField.TITLE);
-
- PDBSearchRequest request = new PDBSearchRequest();
- request.setAllowEmptySeq(false);
- request.setResponseSize(1);
- request.setFieldToSearchBy("(text:");
- request.setFieldToSortBy(fieldToFilterBy,
- !invertFilter.isSelected());
-
- request.setWantedFields(wantedFields);
-
- Collection<PDBResponseSummary> filteredResponse = new HashSet<PDBResponseSummary>();
- for (SequenceI seq : selectedSequences)
- {
- request.setSearchTerm(buildQuery(seq) + ")");
- request.setAssociatedSequence(seq.getName());
- PDBRestClient pdbRestCleint = new PDBRestClient();
- PDBSearchResponse resultList = pdbRestCleint
- .executeRequest(request);
- if (resultList.getSearchSummary() != null
- && !resultList.getSearchSummary().isEmpty())
+ lbl_loading.setVisible(true);
+ pdbRequest.setResponseSize(1);
+ pdbRequest.setFieldToSearchBy("(text:");
+ pdbRequest.setFieldToSortBy(fieldToFilterBy,
+ !chk_invertFilter.isSelected());
+
+ Collection<PDBResponseSummary> filteredResponse = new HashSet<PDBResponseSummary>();
+ for (SequenceI seq : selectedSequences)
{
- filteredResponse.addAll(resultList.getSearchSummary());
+ pdbRequest.setSearchTerm(buildQuery(seq) + ")");
+ pdbRequest.setAssociatedSequence(seq.getName());
+ pdbRestCleint = new PDBRestClient();
+ PDBRestResponse resultList = pdbRestCleint
+ .executeRequest(pdbRequest);
+ if (resultList.getSearchSummary() != null
+ && !resultList.getSearchSummary().isEmpty())
+ {
+ filteredResponse.addAll(resultList.getSearchSummary());
+ }
}
- }
-
- if (filteredResponse != null)
- {
- //
- // for (PDBResponseSummary s : filteredResponse)
- // {
- // System.out.println("-----------> " + s.getPdbId());
- // }
-
- int filterResponseCount = filteredResponse.size();
- List<PDBResponseSummary> list = new ArrayList<PDBResponseSummary>(
- discoveredStructuresSet);
- list.removeAll(filteredResponse);
-
- Collection<PDBResponseSummary> newSet = new ArrayList<PDBResponseSummary>();
- newSet.addAll(filteredResponse);
- newSet.addAll(list);
-
- jListFoundStructures.setModel(PDBSearchResponse
- .getListModel(newSet));
- summaryTable.setModel(PDBSearchResponse.getTableModel(request,
- newSet));
- // resizeColumnWidth(summaryTable);
- list = null;
- newSet = null;
-
- int[] filterIndice = new int[filterResponseCount];
- ListSelectionModel model = summaryTable.getSelectionModel();
- model.clearSelection();
- // int x = 0;
- for (int x = 0; x < filterResponseCount; x++)
+ if (filteredResponse != null)
{
- filterIndice[x] = x;
- model.addSelectionInterval(x, x);
+ int filterResponseCount = filteredResponse.size();
+ List<PDBResponseSummary> originalDiscoveredStructuresList = new ArrayList<PDBResponseSummary>(
+ discoveredStructuresSet);
+ originalDiscoveredStructuresList.removeAll(filteredResponse);
+
+ Collection<PDBResponseSummary> reorderedStructuresSet = new ArrayList<PDBResponseSummary>();
+ reorderedStructuresSet.addAll(filteredResponse);
+ reorderedStructuresSet.addAll(originalDiscoveredStructuresList);
+
+ jList_FoundStructures.setModel(PDBRestResponse
+ .getListModel(reorderedStructuresSet));
+ tbl_summary.setModel(PDBRestResponse.getTableModel(pdbRequest,
+ reorderedStructuresSet));
+
+ // int[] filterIndice = new int[filterResponseCount];
+ ListSelectionModel model = tbl_summary.getSelectionModel();
+ model.clearSelection();
+ for (int x = 0; x < filterResponseCount; x++)
+ {
+ // filterIndice[x] = x;
+ model.addSelectionInterval(x, x);
+ }
+
+ // Discard unwanted objects to make them eligible for garbage
+ // collection
+ originalDiscoveredStructuresList = null;
+ reorderedStructuresSet = null;
+
+ // jListFoundStructures.setSelectedIndices(filterIndice);
}
- jListFoundStructures.setSelectedIndices(filterIndice);
- }
- loadingImageLabel.setVisible(false);
+ lbl_loading.setVisible(false);
} catch (Exception e)
{
e.printStackTrace();
}
});
filterThread.start();
-
}
- @Override
- protected void stateChanged(ItemEvent e)
+ /**
+ * Determines the column index for the pdb id in the summary table. The pdb id
+ * serves as a unique identifier for a given row in the summary table
+ *
+ * @param wantedFeilds
+ * the available table columns in no particular order
+ * @return the pdb id field column index
+ */
+ public static int getPDBIdColumIndex(Collection<PDBDocField> wantedFeilds)
{
- if (e.getSource() instanceof JCheckBox)
+ int pdbFeildIndex = 1;
+ for (PDBDocField feild : wantedFeilds)
{
- updateCurrentView();
- }
- else
- {
- if (e.getStateChange() == ItemEvent.SELECTED)
+ if (feild.equals(PDBDocField.PDB_ID))
{
- updateCurrentView();
+ break;
}
+ ++pdbFeildIndex;
}
-
- }
-
- @Override
- public void ok_ActionPerformed()
- {
- // TODO code to load selected structures to jmol or chimera
+ return pdbFeildIndex;
}
+ /**
+ * Handles action event for btn_pdbFromFile
+ */
public void pdbFromFile_actionPerformed()
{
jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
{ selectedSequence.getDisplayId(false) }));
int value = chooser.showOpenDialog(null);
-
if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
{
String choice = chooser.getSelectedFile().getPath();
jalview.io.AppletFormatAdapter.FILE, selectedSequence, true,
Desktop.instance);
}
-
}
- // rpdbview.addActionListener(new ActionListener()
- // {
- //
- // @Override
- // public void actionPerformed(ActionEvent e)
- // {
- // new StructureViewer(ap.getStructureSelectionManager())
- // .viewStructures(ap, pr, ap.av.collateForPDB(pr));
- // }
- // });
+ /**
+ * Handles action event for btn_ok
+ */
+ @Override
+ public void ok_ActionPerformed()
+ {
+ int pdbIdCol = getPDBIdColumIndex(pdbRequest.getWantedFields());
+ int[] selectedRows = tbl_summary.getSelectedRows();
+ PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length];
+ int count = 0;
+ for (int summaryRow : selectedRows)
+ {
+ String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
+ .toString();
+ PDBEntry pdbEntry = new PDBEntry();
+ pdbEntry.setId(pdbIdStr);
+ pdbEntry.setType("PDB");
+ pdbEntriesToView[count++] = pdbEntry;
+ }
+ new StructureViewer(ap.getStructureSelectionManager()).viewStructures(
+ ap, pdbEntriesToView, ap.av.collateForPDB(pdbEntriesToView));
+ }
+ /**
+ * Handles action event for manual entry of pdb ids
+ */
public void enterPDB_actionPerformed()
{
String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
}
}
+ /**
+ * Populates the filter combo-box options dynamically depending on discovered
+ * structures
+ */
+ protected void populateFilterComboBox()
+ {
+ if (isStructuresDiscovered())
+ {
+ cmb_filterOption.addItem(new FilterOption("Best Quality",
+ PDBDocField.OVERALL_QUALITY.getCode(), VIEWS_FILTER));
+ cmb_filterOption.addItem(new FilterOption("Best UniProt Coverage",
+ PDBDocField.UNIPROT_COVERAGE.getCode(), VIEWS_FILTER));
+ cmb_filterOption.addItem(new FilterOption("Highest Resolution",
+ PDBDocField.RESOLUTION.getCode(), VIEWS_FILTER));
+ cmb_filterOption.addItem(new FilterOption("Highest Protein Chain",
+ PDBDocField.PROTEIN_CHAIN_COUNT.getCode(), VIEWS_FILTER));
+ cmb_filterOption.addItem(new FilterOption("Highest Bound Molecules",
+ PDBDocField.BOUND_MOLECULE_COUNT.getCode(), VIEWS_FILTER));
+ cmb_filterOption.addItem(new FilterOption("Highest Polymer Residues",
+ PDBDocField.POLYMER_RESIDUE_COUNT.getCode(), VIEWS_FILTER));
+ }
+ cmb_filterOption.addItem(new FilterOption("Enter PDB Id", "-",
+ VIEWS_ENTER_ID));
+ cmb_filterOption.addItem(new FilterOption("From File", "-",
+ VIEWS_FROM_FILE));
+ }
+
+ /**
+ * Updates the displayed view based on the selected filter option
+ */
+ protected void updateCurrentView()
+ {
+ FilterOption selectedOption = ((FilterOption) cmb_filterOption
+ .getSelectedItem());
+ layout_switchableViews.show(pnl_switchableViews,
+ selectedOption.getView());
+ chk_invertFilter.setEnabled(false);
+ if (selectedOption.getView() == VIEWS_FILTER)
+ {
+ chk_invertFilter.setEnabled(true);
+ filterResultSet(selectedOption.getValue());
+ }
+ }
+
+ /**
+ * Handles the state change event for the 'filter' combo-box and 'invert'
+ * check-box
+ */
+ @Override
+ protected void stateChanged(ItemEvent e)
+ {
+ if (e.getSource() instanceof JCheckBox)
+ {
+ updateCurrentView();
+ }
+ else
+ {
+ if (e.getStateChange() == ItemEvent.SELECTED)
+ {
+ updateCurrentView();
+ }
+ }
+
+ }
+
+
+ public boolean isStructuresDiscovered()
+ {
+ return structuresDiscovered;
+ }
+
+ public void setStructuresDiscovered(boolean structuresDiscovered)
+ {
+ this.structuresDiscovered = structuresDiscovered;
+ }
+
+ public Collection<PDBResponseSummary> getDiscoveredStructuresSet()
+ {
+ return discoveredStructuresSet;
+ }
}