Merge branch 'develop' into update_212_Dec_merge_with_21125_chamges
[jalview.git] / src / jalview / gui / StructureViewer.java
index 4db6140..cc4a033 100644 (file)
@@ -28,10 +28,18 @@ import java.util.Map;
 import java.util.Map.Entry;
 import jalview.api.structures.JalviewStructureDisplayI;
 import jalview.bin.Cache;
+import jalview.bin.Console;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.StructureViewerModel;
+import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.ws.DBRefFetcher;
+import jalview.ws.seqfetcher.DbSourceProxy;
+import jalview.ws.sifts.SiftsSettings;
+
 
 
 /**
@@ -73,7 +81,8 @@ public class StructureViewer
    * 
    * @param structureSelectionManager
    */
-  public StructureViewer(StructureSelectionManager structureSelectionManager)
+  public StructureViewer(
+          StructureSelectionManager structureSelectionManager)
   {
     ssm = structureSelectionManager;
   }
@@ -90,7 +99,6 @@ public class StructureViewer
     return sv;
   }
 
-  
   @Override
   public String toString()
   {
@@ -100,9 +108,10 @@ public class StructureViewer
     }
     return "New View";
   }
+
   /**
    * 
-   * @return ViewerType for currently configured structure viewer 
+   * @return ViewerType for currently configured structure viewer
    */
   public static ViewerType getViewerType()
   {
@@ -140,10 +149,10 @@ public class StructureViewer
 
     Map<PDBEntry, SequenceI[]> seqsForPdbs = getSequencesForPdbs(pdbs,
             seqs);
-    PDBEntry[] pdbsForFile = seqsForPdbs.keySet().toArray(
-            new PDBEntry[seqsForPdbs.size()]);
-    SequenceI[][] theSeqs = seqsForPdbs.values().toArray(
-            new SequenceI[seqsForPdbs.size()][]);
+    PDBEntry[] pdbsForFile = seqsForPdbs.keySet()
+            .toArray(new PDBEntry[seqsForPdbs.size()]);
+    SequenceI[][] theSeqs = seqsForPdbs.values()
+            .toArray(new SequenceI[seqsForPdbs.size()][]);
     if (sview != null)
     {
       sview.setAlignAddedStructures(superposeAdded);
@@ -190,7 +199,7 @@ public class StructureViewer
     }
     else
     {
-      Cache.log.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString());
+      Console.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString());
     }
     return sview;
   }
@@ -338,7 +347,7 @@ public class StructureViewer
     }
     else
     {
-      Cache.log.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString());
+      Console.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString());
     }
     return sview;
   }
@@ -380,7 +389,7 @@ public class StructureViewer
       viewer = new PymolViewer(viewerData, alignPanel, sessionFile, vid);
       break;
     default:
-      Cache.log.error(UNKNOWN_VIEWER_TYPE + type.toString());
+      Console.error(UNKNOWN_VIEWER_TYPE + type.toString());
     }
     return viewer;
   }
@@ -422,4 +431,119 @@ public class StructureViewer
     superposeAdded = alignAddedStructures;
   }
 
+  /**
+   * Launch a minimal implementation of a StructureViewer.
+   * 
+   * @param alignPanel
+   * @param pdb
+   * @param seqs
+   * @return
+   */
+  public static StructureViewer launchStructureViewer(
+          AlignmentPanel alignPanel, PDBEntry pdb, SequenceI[] seqs)
+  {
+    return launchStructureViewer(alignPanel, new PDBEntry[] { pdb }, seqs,
+            false, null, null);
+  }
+
+  /**
+   * Adds PDB structures to a new or existing structure viewer
+   * 
+   * @param ssm
+   * @param pdbEntriesToView
+   * @param alignPanel
+   * @param sequences
+   * @return
+   */
+  protected static StructureViewer launchStructureViewer(
+          final AlignmentPanel ap, final PDBEntry[] pdbEntriesToView,
+          SequenceI[] sequences, boolean superimpose,
+          StructureViewer theViewer, IProgressIndicator pb)
+  {
+    final StructureSelectionManager ssm = ap.getStructureSelectionManager();
+    if (theViewer == null)
+      theViewer = new StructureViewer(ssm);
+    long progressId = sequences.hashCode();
+    if (pb != null)
+      pb.setProgressBar(MessageManager.getString(
+              "status.launching_3d_structure_viewer"), progressId);
+    theViewer.setSuperpose(superimpose);
+  
+    /*
+     * remember user's choice of superimpose or not
+     */
+    Cache.setProperty(StructureChooser.AUTOSUPERIMPOSE,
+            Boolean.valueOf(superimpose).toString());
+  
+    if (pb != null)
+      pb.setProgressBar(null, progressId);
+    if (SiftsSettings.isMapWithSifts())
+    {
+      List<SequenceI> seqsWithoutSourceDBRef = new ArrayList<>();
+      int p = 0;
+      // 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++];
+        if (pdbe != null && pdbe.getFile() != null)
+        {
+          StructureMapping[] smm = ssm.getMapping(pdbe.getFile());
+          if (smm != null && smm.length > 0)
+          {
+            for (StructureMapping sm : smm)
+            {
+              if (sm.getSequence() == seq)
+              {
+                continue;
+              }
+            }
+          }
+        }
+        if (seq.getPrimaryDBRefs().isEmpty())
+        {
+          seqsWithoutSourceDBRef.add(seq);
+          continue;
+        }
+      }
+      if (!seqsWithoutSourceDBRef.isEmpty())
+      {
+        int y = seqsWithoutSourceDBRef.size();
+        if (pb != null)
+          pb.setProgressBar(MessageManager.formatMessage(
+                  "status.fetching_dbrefs_for_sequences_without_valid_refs",
+                  y), progressId);
+        SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef
+                .toArray(new SequenceI[y]);
+        DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef);
+        dbRefFetcher.fetchDBRefs(true);
+  
+        if (pb != null)
+          pb.setProgressBar("Fetch complete.", progressId); // todo i18n
+      }
+    }
+    if (pdbEntriesToView.length > 1)
+    {
+      if (pb != null)
+        pb.setProgressBar(MessageManager.getString(
+                "status.fetching_3d_structures_for_selected_entries"),
+                progressId);
+      theViewer.viewStructures(pdbEntriesToView, sequences, ap);
+    }
+    else
+    {
+      if (pb != null)
+        pb.setProgressBar(MessageManager.formatMessage(
+                "status.fetching_3d_structures_for",
+                pdbEntriesToView[0].getId()), progressId);
+      theViewer.viewStructures(pdbEntriesToView[0], sequences, ap);
+    }
+    if (pb != null)
+      pb.setProgressBar(null, progressId);
+    // remember the last viewer we used...
+    StructureChooser.lastTargetedView = theViewer;
+    return theViewer;
+  }
+
 }