JAL-2136 New Phyre2 branch + attempt to resynced with develop
[jalview.git] / src / jalview / gui / StructureChooser.java
index 3e516a6..a3f739a 100644 (file)
@@ -38,6 +38,8 @@ import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 import jalview.ws.DBRefFetcher;
+import jalview.ws.phyre2.Phyre2Client;
+import jalview.ws.phyre2.Phyre2SummaryPojo;
 import jalview.ws.sifts.SiftsSettings;
 
 import java.awt.event.ItemEvent;
@@ -79,7 +81,7 @@ public class StructureChooser extends GStructureChooser implements
 
   private FTSRestClientI pdbRestCleint;
 
-  private String selectedPdbFileName;
+  private String selectedStructureFileName;
 
   private boolean isValidPBDEntry;
 
@@ -198,7 +200,7 @@ public class StructureChooser extends GStructureChooser implements
             && !discoveredStructuresSet.isEmpty())
     {
       getResultTable().setModel(
-              FTSRestResponse.getTableModel(lastPdbRequest,
+              JvSummaryTable.getTableModel(lastPdbRequest,
                       discoveredStructuresSet));
       noOfStructuresFound = discoveredStructuresSet.size();
       mainFrame.setTitle(MessageManager.formatMessage(
@@ -459,10 +461,10 @@ public class StructureChooser extends GStructureChooser implements
           reorderedStructuresSet.addAll(filteredResponse);
           reorderedStructuresSet.addAll(discoveredStructuresSet);
           getResultTable().setModel(
-                  FTSRestResponse.getTableModel(lastPdbRequest,
+                  JvSummaryTable.getTableModel(lastPdbRequest,
                           reorderedStructuresSet));
 
-          FTSRestResponse.configureTableColumn(getResultTable(),
+          JvSummaryTable.configureTableColumn(getResultTable(),
                   wantedFields, tempUserPrefs);
           getResultTable().getColumn("Ref Sequence").setPreferredWidth(120);
           getResultTable().getColumn("Ref Sequence").setMinWidth(100);
@@ -519,8 +521,9 @@ public class StructureChooser extends GStructureChooser implements
     int value = chooser.showOpenDialog(null);
     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
     {
-      selectedPdbFileName = chooser.getSelectedFile().getPath();
-      jalview.bin.Cache.setProperty("LAST_DIRECTORY", selectedPdbFileName);
+      selectedStructureFileName = chooser.getSelectedFile().getPath();
+      jalview.bin.Cache.setProperty("LAST_DIRECTORY",
+              selectedStructureFileName);
       validateSelections();
     }
   }
@@ -564,6 +567,9 @@ public class StructureChooser extends GStructureChooser implements
       cmb_filterOption.setSelectedItem(cachedOption);
     }
 
+    cmb_filterOption.addItem(new FilterOption(
+            "Predict 3D Model with Phyre2", "-", VIEWS_PHYRE2_PREDICTION,
+            false));
     cmb_filterOption.addItemListener(this);
   }
 
@@ -585,6 +591,12 @@ public class StructureChooser extends GStructureChooser implements
       chk_invertFilter.setVisible(true);
       filterResultSet(selectedFilterOpt.getValue());
     }
+    else if (selectedFilterOpt.getView() == VIEWS_PHYRE2_PREDICTION)
+    {
+      mainFrame.setTitle(MessageManager
+              .getString("label.phyre2_model_prediction"));
+      phyre2InputAssSeqPanel.loadCmbAssSeq();
+    }
     else if (selectedFilterOpt.getView() == VIEWS_ENTER_ID
             || selectedFilterOpt.getView() == VIEWS_FROM_FILE)
     {
@@ -629,6 +641,14 @@ public class StructureChooser extends GStructureChooser implements
     {
       validateAssociationFromFile();
     }
+    else if (currentView == VIEWS_PHYRE2_PREDICTION)
+    {
+      validateAssociationFromPhyre2();
+      if (getPhyreResultTable().getSelectedRows().length > 0)
+      {
+        btn_view.setEnabled(true);
+      }
+    }
   }
 
   /**
@@ -687,7 +707,8 @@ public class StructureChooser extends GStructureChooser implements
                     "-Select Associated Seq-")))
     {
       btn_pdbFromFile.setEnabled(true);
-      if (selectedPdbFileName != null && selectedPdbFileName.length() > 0)
+      if (selectedStructureFileName != null
+              && selectedStructureFileName.length() > 0)
       {
         btn_view.setEnabled(true);
         lbl_fromFileStatus.setIcon(goodImage);
@@ -700,6 +721,25 @@ public class StructureChooser extends GStructureChooser implements
     }
   }
 
+  /**
+   * Validates inputs for Phyre2 3D Model prediction
+   */
+  public void validateAssociationFromPhyre2()
+  {
+    AssociateSeqOptions assSeqOpt = (AssociateSeqOptions) phyre2InputAssSeqPanel
+            .getCmb_assSeq().getSelectedItem();
+    if (selectedSequences.length == 1
+            || (assSeqOpt != null && !assSeqOpt.getName().equalsIgnoreCase(
+                    "-Select Associated Seq-")))
+    {
+      btn_runPhyre2Prediction.setEnabled(true);
+    }
+    else
+    {
+      btn_runPhyre2Prediction.setEnabled(false);
+    }
+  }
+
   @Override
   public void cmbAssSeqStateChanged()
   {
@@ -733,11 +773,8 @@ public class StructureChooser extends GStructureChooser implements
   @Override
   public void ok_ActionPerformed()
   {
-    final long progressSessionId = System.currentTimeMillis();
     final StructureSelectionManager ssm = ap.getStructureSelectionManager();
     final int preferredHeight = pnl_filter.getHeight();
-    ssm.setProgressIndicator(this);
-    ssm.setProgressSessionId(progressSessionId);
     new Thread(new Runnable()
     {
       @Override
@@ -835,28 +872,114 @@ public class StructureChooser extends GStructureChooser implements
           PDBEntry[] pdbEntriesToView = new PDBEntry[] { pdbEntry };
           launchStructureViewer(ssm, pdbEntriesToView, ap,
                   new SequenceI[] { selectedSequence });
-    }
-    else if (currentView == VIEWS_FROM_FILE)
-    {
-      SequenceI userSelectedSeq = ((AssociateSeqOptions) fileChooserAssSeqPanel
-              .getCmb_assSeq().getSelectedItem()).getSequence();
-      if (userSelectedSeq != null)
-      {
-        selectedSequence = userSelectedSeq;
-      }
-      PDBEntry fileEntry = new AssociatePdbFileWithSeq()
-              .associatePdbWithSeq(selectedPdbFileName,
-                          DataSourceType.FILE,
-                      selectedSequence, true, Desktop.instance);
+        }
+        else if (currentView == VIEWS_FROM_FILE)
+        {
+          SequenceI userSelectedSeq = ((AssociateSeqOptions) fileChooserAssSeqPanel
+                  .getCmb_assSeq().getSelectedItem()).getSequence();
+          if (userSelectedSeq != null)
+          {
+            selectedSequence = userSelectedSeq;
+          }
+          PDBEntry fileEntry = new AssociateStructureFileWithSeq()
+                  .associateStructureWithSeq(selectedStructureFileName,
+                          DataSourceType.FILE, selectedSequence, true,
+                          Desktop.instance);
 
           launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap,
                   new SequenceI[] { selectedSequence });
         }
+        else if (currentView == VIEWS_PHYRE2_PREDICTION)
+        {
+          SequenceI userSelectedSeq = ((AssociateSeqOptions) phyre2InputAssSeqPanel
+                  .getCmb_assSeq().getSelectedItem()).getSequence();
+          if (userSelectedSeq != null)
+          {
+            selectedSequence = userSelectedSeq;
+          }
+          int templateColIndex = getPhyreResultTable()
+                  .getColumn("Template").getModelIndex();
+          int[] selectedRows = getPhyreResultTable().getSelectedRows();
+          PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length];
+          int count = 0;
+          for (int row : selectedRows)
+          {
+            String templateId = getPhyreResultTable().getValueAt(row,
+                    templateColIndex).toString();
+            String structureFile = phyre2ResultDirectory + templateId;
+            String fastaMapping = phyre2ResultDirectory
+                    + templateId.replaceAll(".pdb", ".fasta");
+            // System.out.println("structure file >>>>> " + structureFile);
+            // System.out.println("fasta mapping  >>>>> " + fastaMapping);
+            pdbEntriesToView[count++] = new AssociateStructureFileWithSeq()
+                    .associateStructureWithSeq(structureFile,
+                            DataSourceType.FILE, selectedSequence, true,
+                            Desktop.instance);
+            ssm.registerPhyre2Template(structureFile, fastaMapping);
+          }
+
+          final StructureSelectionManager ssm = ap
+                  .getStructureSelectionManager();
+          final long progressSessionId = System.currentTimeMillis();
+          ssm.setProgressSessionId(progressSessionId);
+
+          SequenceI[] sequences = new SequenceI[] { selectedSequence };
+
+          ssm.setProgressBar(MessageManager
+                  .getString("status.launching_3d_structure_viewer"));
+          final StructureViewer sViewer = new StructureViewer(ssm);
+          if (pdbEntriesToView.length > 1)
+          {
+            ArrayList<SequenceI[]> seqsMap = new ArrayList<SequenceI[]>();
+            for (SequenceI seq : sequences)
+            {
+              seqsMap.add(new SequenceI[] { seq });
+            }
+            SequenceI[][] collatedSeqs = seqsMap
+                    .toArray(new SequenceI[0][0]);
+            ssm.setProgressBar(null);
+            ssm.setProgressBar(MessageManager
+                    .getString("status.fetching_3d_structures_for_selected_entries"));
+            sViewer.viewStructures(pdbEntriesToView, collatedSeqs, ap);
+          }
+          else
+          {
+            ssm.setProgressBar(null);
+            ssm.setProgressBar(MessageManager.formatMessage(
+                    "status.fetching_3d_structures_for",
+                    pdbEntriesToView[0].getId()));
+            sViewer.viewStructures(pdbEntriesToView[0], sequences, ap);
+          }
+        }
         closeAction(preferredHeight);
       }
     }).start();
   }
 
+  private String phyre2ResultDirectory;
+
+  @Override
+  public void predict3DModelWithPhyre2()
+  {
+    // TODO implement code for submitting sequence to Phyre2 service, and code
+    // for getting the result directory when the job completes, this is
+    // currently hard-wired to the directory of result for FER_CAPAN/1-144
+    phyre2ResultDirectory = "examples/testdata/phyre2results/56da5616b4559c93/";
+    // String summaryhtml = phyre2ResultDirectory + "summary.html";
+    // // TODO ditch HTML parsing once appropriated data file (i.e. JSON) for
+    // // Phyre2 result summary is made available
+    // List<Phyre2SummaryPojo> phyreResults = Phyre2Client
+    // .parsePhyre2ResultSummaryTable(summaryhtml);
+
+    String crudeListFile = phyre2ResultDirectory + "crudelist";
+    List<Phyre2SummaryPojo> phyreResults = Phyre2Client
+            .parsePhyreCrudeList(crudeListFile);
+
+    getPhyreResultTable()
+            .setModel(Phyre2Client.getTableModel(phyreResults));
+    Phyre2Client.configurePhyreResultTable(getPhyreResultTable());
+  }
+
   private PDBEntry getFindEntry(String id, Vector<PDBEntry> pdbEntries)
   {
     Objects.requireNonNull(id);
@@ -876,9 +999,13 @@ public class StructureChooser extends GStructureChooser implements
           final PDBEntry[] pdbEntriesToView,
           final AlignmentPanel alignPanel, SequenceI[] sequences)
   {
-    ssm.setProgressBar(MessageManager
-            .getString("status.launching_3d_structure_viewer"));
+    long progressId = sequences.hashCode();
+    setProgressBar(
+            MessageManager
+                    .getString("status.launching_3d_structure_viewer"),
+            progressId);
     final StructureViewer sViewer = new StructureViewer(ssm);
+    setProgressBar(null, progressId);
 
     if (SiftsSettings.isMapWithSifts())
     {
@@ -887,6 +1014,7 @@ public class StructureChooser extends GStructureChooser implements
       // TODO: skip PDBEntry:Sequence pairs where PDBEntry doesn't look like a
       // real PDB ID. For moment, we can also safely do this if there is already
       // a known mapping between the PDBEntry and the sequence.
+
       for (SequenceI seq : sequences)
       {
         PDBEntry pdbe = pdbEntriesToView[p++];
@@ -904,7 +1032,8 @@ public class StructureChooser extends GStructureChooser implements
             }
           }
         }
-        if (seq.getPrimaryDBRefs().size() == 0)
+        if (seq.getPrimaryDBRefs().size() == 0
+                && !ssm.isPhyre2Template(pdbe.getFile()))
         {
           seqsWithoutSourceDBRef.add(seq);
           continue;
@@ -913,18 +1042,17 @@ public class StructureChooser extends GStructureChooser implements
       if (!seqsWithoutSourceDBRef.isEmpty())
       {
         int y = seqsWithoutSourceDBRef.size();
-        ssm.setProgressBar(null);
-        ssm.setProgressBar(MessageManager.formatMessage(
+        setProgressBar(MessageManager.formatMessage(
                 "status.fetching_dbrefs_for_sequences_without_valid_refs",
-                y));
+                y), progressId);
         SequenceI[] seqWithoutSrcDBRef = new SequenceI[y];
         int x = 0;
         for (SequenceI fSeq : seqsWithoutSourceDBRef)
         {
           seqWithoutSrcDBRef[x++] = fSeq;
         }
-        DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef);
-        dbRefFetcher.fetchDBRefs(true);
+        new DBRefFetcher(seqWithoutSrcDBRef).fetchDBRefs(true);
+        setProgressBar("Fetch complete.", progressId); // todo i18n
       }
     }
     if (pdbEntriesToView.length > 1)
@@ -935,19 +1063,20 @@ public class StructureChooser extends GStructureChooser implements
         seqsMap.add(new SequenceI[] { seq });
       }
       SequenceI[][] collatedSeqs = seqsMap.toArray(new SequenceI[0][0]);
-      ssm.setProgressBar(null);
-      ssm.setProgressBar(MessageManager
-              .getString("status.fetching_3d_structures_for_selected_entries"));
+      setProgressBar(
+              MessageManager
+                      .getString("status.fetching_3d_structures_for_selected_entries"),
+              progressId);
       sViewer.viewStructures(pdbEntriesToView, collatedSeqs, alignPanel);
     }
     else
     {
-      ssm.setProgressBar(null);
-      ssm.setProgressBar(MessageManager.formatMessage(
+      setProgressBar(MessageManager.formatMessage(
               "status.fetching_3d_structures_for",
-              pdbEntriesToView[0].getId()));
+              pdbEntriesToView[0].getId()), progressId);
       sViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel);
     }
+    setProgressBar(null, progressId);
   }
 
   /**