package jalview.gui; import jalview.datamodel.DBRefEntry; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.jbgui.GStructureChooser; 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 java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import javax.swing.JOptionPane; @SuppressWarnings("serial") public class StructureChooser extends GStructureChooser { private boolean structuresWereFound = false; private SequenceI selectedSequence; private SequenceI[] selectedSequences; public StructureChooser(AlignmentPanel ap, final SequenceI sequence) { this.ap = ap; this.selectedSequence = sequence; selectedSequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[] { sequence } : ap.av.getSequenceSelection()); fetchStructures(); populateFilterOptions(); updateCurrentView(); } @Override public void ok_ActionPerformed() { // TODO code to load selected structures to jmol or chimera } protected void populateFilterOptions() { if (structuresWereFound) { filterOptionsComboBox.addItem(new FilterOptions( "- Filter Criteria -", "", VIEWS_FILTER)); filterOptionsComboBox.addItem(new FilterOptions("All", "all", VIEWS_FILTER)); filterOptionsComboBox.addItem(new FilterOptions("Best Coverage", "coverage", VIEWS_FILTER)); filterOptionsComboBox.addItem(new FilterOptions("Best Resolution", PDBDocField.RESOLUTION.getCode(), VIEWS_FILTER)); filterOptionsComboBox.addItem(new FilterOptions("Best Quality", PDBDocField.OVERALL_QUALITY.getCode(), VIEWS_FILTER)); // "number_of_polymers"), PROTEIN_CHAIN_COUNT( // "Protein Chain Count", "number_of_protein_chains"), // BOUND_MOLECULE_COUNT( // "Bound Molecule Count", "number_of_bound_molecules"), // POLYMER_RESIDUE_COUNT( // "Polymer Residue Count", "number_of_polymer_residues"), // UNIPROT_COVERAGE( } filterOptionsComboBox.addItem(new FilterOptions("Enter PDB Id", "-", VIEWS_ENTER_ID)); filterOptionsComboBox.addItem(new FilterOptions("From File", "-", VIEWS_FROM_FILE)); } private void fetchStructures() { long startTime = System.currentTimeMillis(); // final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new // SequenceI[] // { sequence } // : ap.av.getSequenceSelection()); int foundStructures = 0; List wantedFields = new ArrayList(); 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(500); request.setSearchTarget("(text:"); request.setWantedFields(wantedFields); Collection searchSummaries = new HashSet(); for (SequenceI seq : selectedSequences) { request.setSearchTerm(buildQuery(seq) + ")"); PDBRestClient pdbRestCleint = new PDBRestClient(); PDBSearchResponse resultList = pdbRestCleint .executeRequest(request); if (resultList.getSearchSummary() != null && !resultList.getSearchSummary().isEmpty()) { searchSummaries.addAll(resultList.getSearchSummary()); } } foundStructures = searchSummaries.size(); if (searchSummaries != null) { jListFoundStructures.setModel(PDBSearchResponse .getListModel(searchSummaries)); structuresWereFound = true; } String totalTime = (System.currentTimeMillis() - startTime) + " milli secs"; mainFrame.setTitle("Structure Chooser - " + foundStructures + " Found (" + totalTime + ")"); } private String buildQuery(SequenceI seq) { String query = seq.getName(); StringBuilder queryBuilder = new StringBuilder(); int count = 0; if (seq.getDBRef() != null && seq.getDBRef().length != 0) { for (DBRefEntry dbRef : seq.getDBRef()) { queryBuilder.append("text:").append(dbRef.getAccessionId()) .append(" OR "); ++count; if (count > 10) { break; } } int endIndex = queryBuilder.lastIndexOf(" OR "); query = queryBuilder.toString().substring(5, endIndex); } return query; } @Override protected void stateChanged() { updateCurrentView(); } int debounceCount = 0; protected void updateCurrentView() { FilterOptions currentOption = ((FilterOptions) filterOptionsComboBox .getSelectedItem()); switchableViewsLayout.show(switchableViewsPanel, currentOption.getView()); ++debounceCount; if (currentOption.getView() == VIEWS_FILTER && debounceCount % 2 == 0) { filterResultSet(currentOption.getValue()); } } public void filterResultSet(String filterTarget) { System.out.println("-----------------> Filter by : " + filterTarget); List wantedFields = new ArrayList(); 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.setSearchTarget("(text:"); request.setSortTarget(filterTarget, true); request.setWantedFields(wantedFields); Collection searchSummaries = new HashSet(); for (SequenceI seq : selectedSequences) { request.setSearchTerm(buildQuery(seq) + ")"); PDBRestClient pdbRestCleint = new PDBRestClient(); PDBSearchResponse resultList = pdbRestCleint.executeRequest(request); if (resultList.getSearchSummary() != null && !resultList.getSearchSummary().isEmpty()) { searchSummaries.addAll(resultList.getSearchSummary()); } } for (PDBResponseSummary summary : searchSummaries) { jListFoundStructures.setSelectedValue(summary, true); // jListFoundStructures. break; } System.out.println("Found item count : " + searchSummaries.size()); } public void pdbFromFile_actionPerformed() { jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser( jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new jalview.io.JalviewFileView()); chooser.setDialogTitle(MessageManager.formatMessage( "label.select_pdb_file_for", new String[] { selectedSequence.getDisplayId(false) })); chooser.setToolTipText(MessageManager.formatMessage( "label.load_pdb_file_associate_with_sequence", new String[] { selectedSequence.getDisplayId(false) })); int value = chooser.showOpenDialog(null); if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION) { String choice = chooser.getSelectedFile().getPath(); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); new AssociatePdbFileWithSeq().associatePdbWithSeq(choice, 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)); // } // }); public void enterPDB_actionPerformed() { String id = JOptionPane.showInternalInputDialog(Desktop.desktop, MessageManager.getString("label.enter_pdb_id"), MessageManager.getString("label.enter_pdb_id"), JOptionPane.QUESTION_MESSAGE); if (id != null && id.length() > 0) { PDBEntry entry = new PDBEntry(); entry.setId(id.toUpperCase()); selectedSequence.getDatasetSequence().addPDBId(entry); } } // public static void main(String[] args) // { // SwingUtilities.invokeLater(new Runnable() // { // public void run() // { // new StructureChooser(null, null); // } // }); // } }