JAL-1720 renamed Structure Chooser filters according to suggestions from Jim. Also...
[jalview.git] / src / jalview / gui / StructureChooser.java
index 63a8654..5d381b9 100644 (file)
@@ -21,7 +21,9 @@
 
 package jalview.gui;
 
+import jalview.bin.Jalview;
 import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.DBRefSource;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.jbgui.GStructureChooser;
@@ -30,6 +32,7 @@ import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 import jalview.ws.dbsources.PDBRestClient;
 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
+import jalview.ws.sifts.SiftsSettings;
 import jalview.ws.uimodel.PDBRestRequest;
 import jalview.ws.uimodel.PDBRestResponse;
 import jalview.ws.uimodel.PDBRestResponse.PDBResponseSummary;
@@ -54,7 +57,8 @@ import javax.swing.table.AbstractTableModel;
  *
  */
 @SuppressWarnings("serial")
-public class StructureChooser extends GStructureChooser
+public class StructureChooser extends GStructureChooser implements
+        IProgressIndicator
 {
   private boolean structuresDiscovered = false;
 
@@ -89,6 +93,11 @@ public class StructureChooser extends GStructureChooser
    */
   public void init()
   {
+    if (!Jalview.isHeadlessMode())
+    {
+      progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+    }
+
     Thread discoverPDBStructuresThread = new Thread(new Runnable()
     {
       @Override
@@ -145,7 +154,7 @@ public class StructureChooser extends GStructureChooser
       PDBRestRequest pdbRequest = new PDBRestRequest();
       pdbRequest.setAllowEmptySeq(false);
       pdbRequest.setResponseSize(500);
-      pdbRequest.setFieldToSearchBy("(text:");
+      pdbRequest.setFieldToSearchBy("(");
       pdbRequest.setWantedFields(wantedFields);
       pdbRequest.setSearchTerm(buildQuery(seq) + ")");
       pdbRequest.setAssociatedSequence(seq);
@@ -233,18 +242,10 @@ public class StructureChooser extends GStructureChooser
 
   public static String buildQuery(SequenceI seq)
   {
+    boolean isPDBRefsFound = false;
+    boolean isUniProtRefsFound = false;
+    StringBuilder queryBuilder = new StringBuilder();
     HashSet<String> seqRefs = new LinkedHashSet<String>();
-    String seqName = seq.getName();
-    String[] names = seqName.toLowerCase().split("\\|");
-    for (String name : names)
-    {
-      // System.out.println("Found name : " + name);
-      name.trim();
-      if (isValidSeqName(name))
-      {
-        seqRefs.add(name);
-      }
-    }
 
     if (seq.getAllPDBEntries() != null)
     {
@@ -252,40 +253,77 @@ public class StructureChooser extends GStructureChooser
       {
         if (isValidSeqName(entry.getId()))
         {
-          seqRefs.add(entry.getId());
+          queryBuilder.append(PDBRestClient.PDBDocField.PDB_ID.getCode())
+                  .append(":")
+.append(entry.getId().toLowerCase())
+                  .append(" OR ");
+          isPDBRefsFound = true;
+          // seqRefs.add(entry.getId());
         }
       }
     }
 
-    if (seq.getDBRef() != null && seq.getDBRef().length != 0)
+    if (seq.getDBRefs() != null && seq.getDBRefs().length != 0)
     {
-      int count = 0;
-      for (DBRefEntry dbRef : seq.getDBRef())
+      for (DBRefEntry dbRef : seq.getDBRefs())
       {
         if (isValidSeqName(getDBRefId(dbRef)))
         {
-          seqRefs.add(getDBRefId(dbRef));
-        }
-        ++count;
-        if (count > 10)
-        {
-          break;
+          if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT))
+          {
+            queryBuilder
+                    .append(PDBRestClient.PDBDocField.UNIPROT_ACCESSION
+                            .getCode()).append(":")
+                    .append(getDBRefId(dbRef))
+                    .append(" OR ");
+            queryBuilder
+                    .append(PDBRestClient.PDBDocField.UNIPROT_ID.getCode())
+                    .append(":")
+                    .append(getDBRefId(dbRef)).append(" OR ");
+            isUniProtRefsFound = true;
+          }
+          else if (dbRef.getSource().equalsIgnoreCase(DBRefSource.PDB))
+          {
+
+            queryBuilder.append(PDBRestClient.PDBDocField.PDB_ID.getCode())
+                    .append(":").append(getDBRefId(dbRef).toLowerCase())
+                    .append(" OR ");
+            isPDBRefsFound = true;
+          }
+          else
+          {
+            seqRefs.add(getDBRefId(dbRef));
+          }
         }
       }
     }
 
-    StringBuilder queryBuilder = new StringBuilder();
-    for (String seqRef : seqRefs)
+    if (!isPDBRefsFound && !isUniProtRefsFound)
     {
-      queryBuilder.append("text:").append(seqRef).append(" OR ");
+      String seqName = seq.getName();
+      String[] names = seqName.toLowerCase().split("\\|");
+      for (String name : names)
+      {
+        // System.out.println("Found name : " + name);
+        name.trim();
+        if (isValidSeqName(name))
+        {
+          seqRefs.add(name);
+        }
+      }
+
+      for (String seqRef : seqRefs)
+      {
+        queryBuilder.append("text:").append(seqRef).append(" OR ");
+      }
     }
-    int endIndex = queryBuilder.lastIndexOf(" OR ");
 
+    int endIndex = queryBuilder.lastIndexOf(" OR ");
     if (queryBuilder.toString().length() < 6)
     {
       return null;
     }
-    String query = queryBuilder.toString().substring(5, endIndex);
+    String query = queryBuilder.toString().substring(0, endIndex);
     return query;
   }
 
@@ -344,17 +382,46 @@ public class StructureChooser extends GStructureChooser
                 .getStructureSummaryFields();
         Collection<PDBResponseSummary> filteredResponse = new HashSet<PDBResponseSummary>();
         HashSet<String> errors = new HashSet<String>();
+        // try
+        // {
+        // PDBDocField fiterField = PDBRestClient
+        // .getPDBDocFieldByCode(fieldToFilterBy);
+        // if (!wantedFields.contains(fiterField))
+        // {
+        // wantedFields.add(fiterField);
+        // }
+        // } catch (Exception e)
+        // {
+        // e.printStackTrace();
+        // }
+
         for (SequenceI seq : selectedSequences)
         {
           PDBRestRequest pdbRequest = new PDBRestRequest();
-          pdbRequest.setAllowEmptySeq(false);
-          pdbRequest.setResponseSize(1);
-          pdbRequest.setFieldToSearchBy("(text:");
-          pdbRequest.setFieldToSortBy(fieldToFilterBy,
-                  !chk_invertFilter.isSelected());
-          pdbRequest.setSearchTerm(buildQuery(seq) + ")");
-          pdbRequest.setWantedFields(wantedFields);
-          pdbRequest.setAssociatedSequence(seq);
+          if (fieldToFilterBy.equalsIgnoreCase("uniprot_coverage"))
+          {
+            System.out.println(">>>>>> Filtering with uniprot coverate");
+            pdbRequest.setAllowEmptySeq(false);
+            pdbRequest.setResponseSize(1);
+            pdbRequest.setFieldToSearchBy("(");
+            pdbRequest.setSearchTerm(buildQuery(seq) + ")");
+            pdbRequest.setWantedFields(wantedFields);
+            pdbRequest.setAssociatedSequence(seq);
+            pdbRequest.setFacet(true);
+            pdbRequest.setFacetPivot(fieldToFilterBy + ",entry_entity");
+            pdbRequest.setFacetPivotMinCount(1);
+          }
+          else
+          {
+            pdbRequest.setAllowEmptySeq(false);
+            pdbRequest.setResponseSize(1);
+            pdbRequest.setFieldToSearchBy("(");
+            pdbRequest.setFieldToSortBy(fieldToFilterBy,
+                    !chk_invertFilter.isSelected());
+            pdbRequest.setSearchTerm(buildQuery(seq) + ")");
+            pdbRequest.setWantedFields(wantedFields);
+            pdbRequest.setAssociatedSequence(seq);
+          }
           pdbRestCleint = new PDBRestClient();
           PDBRestResponse resultList;
           try
@@ -420,6 +487,7 @@ public class StructureChooser extends GStructureChooser
   /**
    * Handles action event for btn_pdbFromFile
    */
+  @Override
   public void pdbFromFile_actionPerformed()
   {
     jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
@@ -445,21 +513,22 @@ public class StructureChooser extends GStructureChooser
    * Populates the filter combo-box options dynamically depending on discovered
    * structures
    */
+  @Override
   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",
+      cmb_filterOption.addItem(new FilterOption("Most UniProt Coverage",
               PDBDocField.UNIPROT_COVERAGE.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Resolution",
+      cmb_filterOption.addItem(new FilterOption("Best Resolution",
               PDBDocField.RESOLUTION.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Protein Chain",
+      cmb_filterOption.addItem(new FilterOption("Most Protein Chain",
               PDBDocField.PROTEIN_CHAIN_COUNT.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Bound Molecules",
+      cmb_filterOption.addItem(new FilterOption("Most Bound Molecules",
               PDBDocField.BOUND_MOLECULE_COUNT.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Polymer Residues",
+      cmb_filterOption.addItem(new FilterOption("Most Polymer Residues",
               PDBDocField.POLYMER_RESIDUE_COUNT.getCode(), VIEWS_FILTER));
     }
     cmb_filterOption.addItem(new FilterOption("Enter PDB Id", "-",
@@ -473,6 +542,7 @@ public class StructureChooser extends GStructureChooser
   /**
    * Updates the displayed view based on the selected filter option
    */
+  @Override
   protected void updateCurrentView()
   {
     FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption
@@ -503,6 +573,7 @@ public class StructureChooser extends GStructureChooser
    * Validates user selection and activates the view button if all parameters
    * are correct
    */
+  @Override
   public void validateSelections()
   {
     FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption
@@ -635,6 +706,15 @@ public class StructureChooser extends GStructureChooser
   @Override
   public void ok_ActionPerformed()
   {
+    final long progressSessionId = System.currentTimeMillis();
+    final StructureSelectionManager ssm = ap.getStructureSelectionManager();
+    ssm.setProgressIndicator(this);
+    ssm.setProgressSessionId(progressSessionId);
+    new Thread(new Runnable()
+    {
+      @Override
+      public void run()
+      {
     FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption
             .getSelectedItem());
     String currentView = selectedFilterOpt.getView();
@@ -667,8 +747,7 @@ public class StructureChooser extends GStructureChooser
       }
       SequenceI[] selectedSeqs = selectedSeqsToView
               .toArray(new SequenceI[selectedSeqsToView.size()]);
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              pdbEntriesToView, ap, selectedSeqs);
+          launchStructureViewer(ssm, pdbEntriesToView, ap, selectedSeqs);
     }
     else if (currentView == VIEWS_LOCAL_PDB)
     {
@@ -691,8 +770,7 @@ public class StructureChooser extends GStructureChooser
       }
       SequenceI[] selectedSeqs = selectedSeqsToView
               .toArray(new SequenceI[selectedSeqsToView.size()]);
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              pdbEntriesToView, ap, selectedSeqs);
+          launchStructureViewer(ssm, pdbEntriesToView, ap, selectedSeqs);
     }
     else if (currentView == VIEWS_ENTER_ID)
     {
@@ -714,8 +792,8 @@ public class StructureChooser extends GStructureChooser
       }
 
       PDBEntry[] pdbEntriesToView = new PDBEntry[] { pdbEntry };
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              pdbEntriesToView, ap, new SequenceI[] { selectedSequence });
+          launchStructureViewer(ssm, pdbEntriesToView, ap,
+                  new SequenceI[] { selectedSequence });
     }
     else if (currentView == VIEWS_FROM_FILE)
     {
@@ -730,22 +808,35 @@ public class StructureChooser extends GStructureChooser
                       jalview.io.AppletFormatAdapter.FILE,
                       selectedSequence, true, Desktop.instance);
 
-      launchStructureViewer(ap.getStructureSelectionManager(),
-              new PDBEntry[] { fileEntry }, ap,
-              new SequenceI[] { selectedSequence });
+          launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap,
+                  new SequenceI[] { selectedSequence });
     }
     mainFrame.dispose();
+      }
+    }).start();
   }
 
-  private void launchStructureViewer(final StructureSelectionManager ssm,
+  private void launchStructureViewer(StructureSelectionManager ssm,
           final PDBEntry[] pdbEntriesToView,
-          final AlignmentPanel alignPanel, final SequenceI[] sequences)
+          final AlignmentPanel alignPanel, SequenceI[] sequences)
   {
+    ssm.setProgressBar("Launching PDB structure viewer..");
     final StructureViewer sViewer = new StructureViewer(ssm);
-    new Thread(new Runnable()
+
+    if (SiftsSettings.isMapWithSifts())
     {
-      public void run()
+      for (SequenceI seq : sequences)
       {
+        if (seq.getSourceDBRef() == null)
+        {
+          ssm.setProgressBar(null);
+          ssm.setProgressBar("Fetching Database refs..");
+          new jalview.ws.DBRefFetcher(sequences, null, null, null, false)
+                  .fetchDBRefs(true);
+          break;
+        }
+      }
+    }
         if (pdbEntriesToView.length > 1)
         {
           ArrayList<SequenceI[]> seqsMap = new ArrayList<SequenceI[]>();
@@ -754,20 +845,24 @@ public class StructureChooser extends GStructureChooser
             seqsMap.add(new SequenceI[] { seq });
           }
           SequenceI[][] collatedSeqs = seqsMap.toArray(new SequenceI[0][0]);
+      ssm.setProgressBar(null);
+      ssm.setProgressBar("Fetching PDB Structures for selected entries..");
           sViewer.viewStructures(pdbEntriesToView, collatedSeqs, alignPanel);
         }
         else
         {
+      ssm.setProgressBar(null);
+      ssm.setProgressBar("Fetching PDB Structure for "
+              + pdbEntriesToView[0].getId());
           sViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel);
         }
-      }
-    }).start();
   }
 
   /**
    * Populates the combo-box used in associating manually fetched structures to
    * a unique sequence when more than one sequence selection is made.
    */
+  @Override
   public void populateCmbAssociateSeqOptions(
           JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq)
   {
@@ -812,6 +907,7 @@ public class StructureChooser extends GStructureChooser
   {
     new Thread()
     {
+      @Override
       public void run()
       {
         errorWarning.setLength(0);
@@ -968,4 +1064,24 @@ public class StructureChooser extends GStructureChooser
     }
 
   }
+
+  private IProgressIndicator progressBar;
+
+  @Override
+  public void setProgressBar(String message, long id)
+  {
+    progressBar.setProgressBar(message, id);
+  }
+
+  @Override
+  public void registerHandler(long id, IProgressIndicatorHandler handler)
+  {
+    progressBar.registerHandler(id, handler);
+  }
+
+  @Override
+  public boolean operationInProgress()
+  {
+    return progressBar.operationInProgress();
+  }
 }