JAL-2465 bugfix and rerefactor renamed getPdbFile() method to getStructureFile()
[jalview.git] / src / jalview / structure / StructureSelectionManager.java
index b0c185b..c91317e 100644 (file)
@@ -50,6 +50,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
@@ -79,7 +80,6 @@ public class StructureSelectionManager
 
   private long progressSessionId;
 
-  private boolean mappingForPhyre2Model;
 
   /*
    * Set of any registered mappings between (dataset) sequences.
@@ -90,6 +90,8 @@ public class StructureSelectionManager
 
   private List<SelectionListener> sel_listeners = new ArrayList<SelectionListener>();
 
+  private Map<String, String> phyre2ModelTemplates = new Hashtable<String, String>();
+
   /**
    * @return true if will try to use external services for processing secondary
    *         structure
@@ -511,9 +513,9 @@ public class StructureSelectionManager
       {
         pdbFile = "INLINE" + pdb.getId();
       }
-
+      boolean phyre2Template = isPhyre2Template(pdbFile);
       List<StructureMapping> seqToStrucMapping = new ArrayList<StructureMapping>();
-      if (!isMappingForPhyre2Model() && isMapUsingSIFTs && seq.isProtein())
+      if (!phyre2Template && isMapUsingSIFTs && seq.isProtein())
       {
         if (progress!=null) {
           progress.setProgressBar(MessageManager
@@ -593,15 +595,20 @@ public class StructureSelectionManager
           }
         }
       }
-      else if (isMappingForPhyre2Model())
+      else if (phyre2Template)
       {
         setProgressBar(null);
         setProgressBar(MessageManager
                 .getString("status.obtaining_mapping_with_phyre2_template_alignment"));
+        String fastaFile = getPhyre2FastaFileFor(pdbFile);
         StructureMapping phyre2ModelMapping = new Phyre2Client(pdb)
-                .getStructureMapping(seq, pdbFile, " ");
-
+                .getStructureMapping(seq, pdbFile, fastaFile, " ");
         seqToStrucMapping.add(phyre2ModelMapping);
+        maxChain.makeExactMapping(maxAlignseq, seq);
+        maxChain.transferRESNUMFeatures(seq, null);
+        jalview.datamodel.Mapping sqmpping = maxAlignseq
+                .getMappingFromS1(false);
+        maxChain.transferResidueAnnotation(phyre2ModelMapping, sqmpping);
         ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
       }
       else
@@ -627,11 +634,10 @@ public class StructureSelectionManager
     return pdb;
   }
 
-  private boolean isCIFFile(String filename)
+  public void registerPhyre2Template(String phyre2Template,
+          String fastaMappingFile)
   {
-    String fileExt = filename.substring(filename.lastIndexOf(".") + 1,
-            filename.length());
-    return "cif".equalsIgnoreCase(fileExt);
+    phyre2ModelTemplates.put(phyre2Template, fastaMappingFile);
   }
 
   /**
@@ -779,7 +785,7 @@ public class StructureSelectionManager
       if (listeners.elementAt(i) instanceof StructureListener)
       {
         sl = (StructureListener) listeners.elementAt(i);
-        for (String pdbfile : sl.getPdbFile())
+        for (String pdbfile : sl.getStructureFiles())
         {
           pdbs.remove(pdbfile);
         }
@@ -844,6 +850,27 @@ public class StructureSelectionManager
       return;
     }
 
+    SearchResultsI results = findAlignmentPositionsForStructurePositions(atoms);
+    for (Object li : listeners)
+    {
+      if (li instanceof SequenceListener)
+      {
+        ((SequenceListener) li).highlightSequence(results);
+      }
+    }
+  }
+
+  /**
+   * Constructs a SearchResults object holding regions (if any) in the Jalview
+   * alignment which have a mapping to the structure viewer positions in the
+   * supplied list
+   * 
+   * @param atoms
+   * @return
+   */
+  public SearchResultsI findAlignmentPositionsForStructurePositions(
+          List<AtomSpec> atoms)
+  {
     SearchResultsI results = new SearchResults();
     for (AtomSpec atom : atoms)
     {
@@ -869,13 +896,7 @@ public class StructureSelectionManager
         }
       }
     }
-    for (Object li : listeners)
-    {
-      if (li instanceof SequenceListener)
-      {
-        ((SequenceListener) li).highlightSequence(results);
-      }
-    }
+    return results;
   }
 
   /**
@@ -1394,19 +1415,31 @@ public class StructureSelectionManager
     return seqmappings;
   }
 
-  public boolean isMappingForPhyre2Model()
+  public boolean isPhyre2Template(String structureFile)
   {
-    return mappingForPhyre2Model;
+    if (structureFile == null || phyre2ModelTemplates == null
+            || phyre2ModelTemplates.isEmpty())
+    {
+      return false;
+    }
+    return phyre2ModelTemplates.get(structureFile) != null
+            && !phyre2ModelTemplates.get(structureFile).isEmpty();
   }
 
-  public void setMappingForPhyre2Model(boolean mappingForPhyre2Model)
+  public String getPhyre2FastaFileFor(String structureFile)
   {
-    this.mappingForPhyre2Model = mappingForPhyre2Model;
+    return phyre2ModelTemplates.get(structureFile);
   }
 
+
   public static StructureSelectionManager getStructureSelectionManager()
   {
     return instances.values().iterator().next();
   }
 
+  public void addStructureMapping(StructureMapping smapping)
+  {
+    mappings.add(smapping);
+  }
+
 }