JAL-1705 handle case of sequence with no dataset sequence
[jalview.git] / src / jalview / structure / StructureSelectionManager.java
index e9053ed..b6bb70d 100644 (file)
@@ -32,11 +32,13 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SearchResults;
 import jalview.datamodel.SequenceI;
+import jalview.gui.IProgressIndicator;
 import jalview.io.AppletFormatAdapter;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
 import jalview.ws.sifts.SiftsClient;
 import jalview.ws.sifts.SiftsException;
+import jalview.ws.sifts.SiftsSettings;
 
 import java.io.PrintStream;
 import java.util.ArrayList;
@@ -45,10 +47,8 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Vector;
 
 import MCview.Atom;
@@ -69,10 +69,16 @@ public class StructureSelectionManager
 
   private boolean addTempFacAnnot = false;
 
+  private IProgressIndicator progressIndicator;
+
+  private SiftsClient siftsClient = null;
+
+  private long progressSessionId;
+
   /*
    * Set of any registered mappings between (dataset) sequences.
    */
-  public Set<AlignedCodonFrame> seqmappings = new LinkedHashSet<AlignedCodonFrame>();
+  private List<AlignedCodonFrame> seqmappings = new ArrayList<AlignedCodonFrame>();
 
   private List<CommandListener> commandListeners = new ArrayList<CommandListener>();
 
@@ -373,9 +379,7 @@ public class StructureSelectionManager
       }
     }
     PDBfile pdb = null;
-    boolean isMapUsingSIFTs = Boolean.valueOf(jalview.bin.Cache.getDefault(
-            "MAP_WITH_SIFTS", "false"));
-    SiftsClient siftsClient = null;
+    boolean isMapUsingSIFTs = SiftsSettings.isMapWithSifts();
     try
     {
       pdb = new PDBfile(addTempFacAnnot, parseSecStr, secStructServices,
@@ -482,63 +486,73 @@ public class StructureSelectionManager
         pdbFile = "INLINE" + pdb.id;
       }
 
-      ArrayList<StructureMapping> seqToStrucMapping = null;
+      ArrayList<StructureMapping> seqToStrucMapping = new ArrayList<StructureMapping>();
       if (isMapUsingSIFTs)
       {
-        try
+        setProgressBar(null);
+        setProgressBar("Obtaining mapping with SIFTS");
+        jalview.datamodel.Mapping sqmpping = maxAlignseq
+                .getMappingFromS1(false);
+        if (targetChainId != null && !targetChainId.trim().isEmpty())
+        {
+          StructureMapping mapping = getStructureMapping(seq, pdbFile,
+                  targetChainId, pdb, maxChain, sqmpping, maxAlignseq);
+          seqToStrucMapping.add(mapping);
+        }
+        else
         {
-          jalview.datamodel.Mapping sqmpping = maxAlignseq
-                  .getMappingFromS1(false);
-          seqToStrucMapping = new ArrayList<StructureMapping>();
-          if (targetChainId != null && !targetChainId.trim().isEmpty())
+          for (PDBChain chain : pdb.chains)
           {
-            StructureMapping curChainMapping = siftsClient
-                    .getSiftsStructureMapping(seq, pdbFile, targetChainId);
-            seqToStrucMapping.add(curChainMapping);
-            maxChainId = targetChainId;
-            PDBChain chain = pdb.findChain(targetChainId);
-            if (chain != null)
-            {
-              chain.transferResidueAnnotation(curChainMapping, sqmpping);
-            }
+            StructureMapping mapping = getStructureMapping(seq, pdbFile,
+                    chain.id, pdb, chain, sqmpping, maxAlignseq);
+            seqToStrucMapping.add(mapping);
           }
-          else
-          {
-            for (PDBChain chain : pdb.chains)
-            {
-              StructureMapping curChainMapping = siftsClient
-                      .getSiftsStructureMapping(seq, pdbFile, chain.id);
-              seqToStrucMapping.add(curChainMapping);
-              maxChainId = chain.id;
-              chain.transferResidueAnnotation(curChainMapping, sqmpping);
-            }
-          }
-        } catch (SiftsException e)
-        {
-          e.printStackTrace();
-          System.err
-                  .println(">>>>>>> SIFTs mapping could not be obtained... Now mapping with NW alignment");
-          seqToStrucMapping = getNWMappings(seq, pdbFile, maxChainId,
-                  maxChain, pdb, maxAlignseq);
         }
       }
       else
       {
-        seqToStrucMapping = getNWMappings(seq, pdbFile,
-                maxChainId, maxChain, pdb,
-                maxAlignseq);
+        setProgressBar(null);
+        setProgressBar("Obtaining mapping with NW alignment");
+        seqToStrucMapping.add(getNWMappings(seq, pdbFile, maxChainId,
+                maxChain, pdb, maxAlignseq));
       }
 
       if (forStructureView)
       {
-        // mappings.add(seqToStrucMapping);
         mappings.addAll(seqToStrucMapping);
       }
     }
     return pdb;
   }
 
-  private ArrayList<StructureMapping> getNWMappings(SequenceI seq,
+  private StructureMapping getStructureMapping(SequenceI seq,
+          String pdbFile, String targetChainId, PDBfile pdb,
+          PDBChain maxChain, jalview.datamodel.Mapping sqmpping,
+          AlignSeq maxAlignseq)
+  {
+    String maxChainId = targetChainId;
+    try
+    {
+      StructureMapping curChainMapping = siftsClient
+              .getSiftsStructureMapping(seq, pdbFile, targetChainId);
+      PDBChain chain = pdb.findChain(targetChainId);
+      if (chain != null)
+      {
+        chain.transferResidueAnnotation(curChainMapping, sqmpping);
+      }
+      return curChainMapping;
+    } catch (SiftsException e)
+    {
+      System.err.println(e.getMessage());
+      System.err.println(">>> Now switching mapping with NW alignment...");
+      setProgressBar(null);
+      setProgressBar(">>> Now switching mapping with NW alignment...");
+      return getNWMappings(seq, pdbFile, maxChainId, maxChain, pdb,
+              maxAlignseq);
+    }
+  }
+
+  private StructureMapping getNWMappings(SequenceI seq,
           String pdbFile,
           String maxChainId, PDBChain maxChain, PDBfile pdb,
           AlignSeq maxAlignseq)
@@ -613,9 +627,7 @@ public class StructureSelectionManager
     StructureMapping nwMapping = new StructureMapping(seq, pdbFile,
             pdb.id, maxChainId, mapping, mappingDetails.toString());
     maxChain.transferResidueAnnotation(nwMapping, sqmpping);
-    ArrayList<StructureMapping> mappings = new ArrayList<StructureMapping>();
-    mappings.add(nwMapping);
-    return mappings;
+    return nwMapping;
   }
 
   public void removeStructureViewerListener(Object svl, String[] pdbfiles)
@@ -756,19 +768,19 @@ public class StructureSelectionManager
    *          the sequence that the mouse over occurred on
    * @param indexpos
    *          the absolute position being mouseovered in seq (0 to seq.length())
-   * @param index
+   * @param seqPos
    *          the sequence position (if -1, seq.findPosition is called to
    *          resolve the residue number)
    */
-  public void mouseOverSequence(SequenceI seq, int indexpos, int index,
+  public void mouseOverSequence(SequenceI seq, int indexpos, int seqPos,
           VamsasSource source)
   {
     boolean hasSequenceListeners = handlingVamsasMo
             || !seqmappings.isEmpty();
     SearchResults results = null;
-    if (index == -1)
+    if (seqPos == -1)
     {
-      index = seq.findPosition(indexpos);
+      seqPos = seq.findPosition(indexpos);
     }
     for (int i = 0; i < listeners.size(); i++)
     {
@@ -781,7 +793,7 @@ public class StructureSelectionManager
       }
       if (listener instanceof StructureListener)
       {
-        highlightStructure((StructureListener) listener, seq, index);
+        highlightStructure((StructureListener) listener, seq, seqPos);
       }
       else
       {
@@ -795,12 +807,12 @@ public class StructureSelectionManager
             {
               if (results == null)
               {
-                results = MappingUtils.buildSearchResults(seq, index,
+                results = MappingUtils.buildSearchResults(seq, seqPos,
                         seqmappings);
               }
               if (handlingVamsasMo)
               {
-                results.addResult(seq, index, index);
+                results.addResult(seq, seqPos, seqPos);
 
               }
               if (!results.isEmpty())
@@ -818,7 +830,7 @@ public class StructureSelectionManager
         else if (listener instanceof SecondaryStructureListener)
         {
           ((SecondaryStructureListener) listener).mouseOverSequence(seq,
-                  indexpos, index);
+                  indexpos, seqPos);
         }
       }
     }
@@ -826,14 +838,14 @@ public class StructureSelectionManager
 
   /**
    * Send suitable messages to a StructureListener to highlight atoms
-   * corresponding to the given sequence position.
+   * corresponding to the given sequence position(s)
    * 
    * @param sl
    * @param seq
-   * @param index
+   * @param positions
    */
-  protected void highlightStructure(StructureListener sl, SequenceI seq,
-          int index)
+  public void highlightStructure(StructureListener sl, SequenceI seq,
+          int... positions)
   {
     if (!sl.isListeningFor(seq))
     {
@@ -845,12 +857,15 @@ public class StructureSelectionManager
     {
       if (sm.sequence == seq || sm.sequence == seq.getDatasetSequence())
       {
-        atomNo = sm.getAtomNum(index);
-
-        if (atomNo > 0)
+        for (int index : positions)
         {
-          atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, sm
-                  .getPDBResNum(index), atomNo));
+          atomNo = sm.getAtomNum(index);
+
+          if (atomNo > 0)
+          {
+            atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, sm
+                    .getPDBResNum(index), atomNo));
+          }
         }
       }
     }
@@ -1006,13 +1021,13 @@ public class StructureSelectionManager
   /**
    * Add each of the given codonFrames to the stored set, if not aready present.
    * 
-   * @param set
+   * @param mappings
    */
-  public void registerMappings(Set<AlignedCodonFrame> set)
+  public void registerMappings(List<AlignedCodonFrame> mappings)
   {
-    if (set != null)
+    if (mappings != null)
     {
-      for (AlignedCodonFrame acf : set)
+      for (AlignedCodonFrame acf : mappings)
       {
         registerMapping(acf);
       }
@@ -1224,4 +1239,35 @@ public class StructureSelectionManager
     }
     return null;
   }
+
+  public IProgressIndicator getProgressIndicator()
+  {
+    return progressIndicator;
+  }
+
+  public void setProgressIndicator(IProgressIndicator progressIndicator)
+  {
+    this.progressIndicator = progressIndicator;
+  }
+
+  public long getProgressSessionId()
+  {
+    return progressSessionId;
+  }
+
+  public void setProgressSessionId(long progressSessionId)
+  {
+    this.progressSessionId = progressSessionId;
+  }
+
+  public void setProgressBar(String message)
+  {
+    progressIndicator.setProgressBar(message, progressSessionId);
+  }
+
+  public List<AlignedCodonFrame> getSequenceMappings()
+  {
+    return seqmappings;
+  }
+
 }