JAL-2694 StructureSelectionManager.getMapping takes a list of Chain IDs per sequence...
[jalview.git] / src / jalview / structure / StructureSelectionManager.java
index a98738f..a8c6ecf 100644 (file)
@@ -324,7 +324,8 @@ public class StructureSelectionManager
    * @return null or the structure data parsed as a pdb file
    */
   synchronized public StructureFile setMapping(SequenceI[] sequence,
-          String[] targetChains, String pdbFile, DataSourceType protocol)
+          List<String>[] targetChains, String pdbFile,
+          DataSourceType protocol)
   {
     return setMapping(true, sequence, targetChains, pdbFile, protocol);
   }
@@ -350,7 +351,7 @@ public class StructureSelectionManager
    * @return null or the structure data parsed as a pdb file
    */
   synchronized public StructureFile setMapping(boolean forStructureView,
-          SequenceI[] sequenceArray, String[] targetChainIds,
+          SequenceI[] sequenceArray, List<String>[] targetChainIds,
           String pdbFile, DataSourceType sourceType)
   {
     /*
@@ -416,7 +417,8 @@ public class StructureSelectionManager
       e.printStackTrace();
     }
 
-    String targetChainId;
+    List<String> targetChainId = new ArrayList();
+    String _targetChainId;
     for (int s = 0; s < sequenceArray.length; s++)
     {
       boolean infChain = true;
@@ -434,25 +436,28 @@ public class StructureSelectionManager
       }
       else if (seq.getName().indexOf("|") > -1)
       {
-        targetChainId = seq.getName()
+        targetChainId = new ArrayList();
+        _targetChainId=seq.getName()
                 .substring(seq.getName().lastIndexOf("|") + 1);
-        if (targetChainId.length() > 1)
+        if (_targetChainId.length() > 1)
         {
-          if (targetChainId.trim().length() == 0)
+          if (_targetChainId.trim().length() == 0)
           {
-            targetChainId = " ";
+            _targetChainId = " ";
           }
           else
           {
             // not a valid chain identifier
-            targetChainId = "";
+            _targetChainId = "";
           }
         }
+        targetChainId.add(_targetChainId);
       }
       else
       {
-        targetChainId = "";
+        _targetChainId = "";
       }
+      
 
       /*
        * Attempt pairwise alignment of the sequence with each chain in the PDB,
@@ -468,7 +473,7 @@ public class StructureSelectionManager
       List<String> maximalChainIds = new ArrayList<>();
       for (PDBChain chain : pdb.getChains())
       {
-        if (targetChainId.length() > 0 && !targetChainId.equals(chain.id)
+        if (targetChainId.size() > 0 && !targetChainId.contains(chain.id)
                 && !infChain)
         {
           continue; // don't try to map chains don't match.
@@ -483,7 +488,7 @@ public class StructureSelectionManager
         // as.calcScoreMatrix();
         // as.traceAlignment();
 
-        if (targetChainId.length() > 0 && chain.id.equals(targetChainId))
+        if (targetChainId.size() > 0 && targetChainId.contains(chain.id))
         {
           // Don't care - just pick this chain as the mapping
           maxChain = chain;
@@ -536,19 +541,22 @@ public class StructureSelectionManager
                 .getString("status.obtaining_mapping_with_sifts"));
         jalview.datamodel.Mapping sqmpping = maxAlignseq
                 .getMappingFromS1(false);
-        if (targetChainId != null && !targetChainId.trim().isEmpty())
+        if (targetChainId != null && !targetChainId.isEmpty())
         {
-          StructureMapping siftsMapping;
+          List<StructureMapping> siftsMappings;
           try
           {
-            siftsMapping = getStructureMapping(seq, pdbFile, targetChainId,
+            siftsMappings = getStructureMapping(seq, pdbFile, targetChainId,
                     pdb, maxChain, sqmpping, maxAlignseq);
-            seqToStrucMapping.add(siftsMapping);
+            for (StructureMapping siftsMapping : siftsMappings)
+            {
+              seqToStrucMapping.add(siftsMapping);
             maxChain.makeExactMapping(maxAlignseq, seq);
             maxChain.transferRESNUMFeatures(seq, null);// FIXME: is this
                                                        // "IEA:SIFTS" ?
             maxChain.transferResidueAnnotation(siftsMapping, sqmpping);
             ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+            }
 
           } catch (SiftsException e)
           {
@@ -572,9 +580,9 @@ public class StructureSelectionManager
           {
             try
             {
-              StructureMapping siftsMapping = getStructureMapping(seq,
-                      pdbFile, chain.id, pdb, chain, sqmpping, maxAlignseq);
-              foundSiftsMappings.add(siftsMapping);
+              foundSiftsMappings.addAll(getStructureMapping(seq, pdbFile,
+                      Arrays.asList(new String[]
+                      { chain.id }), pdb, chain, sqmpping, maxAlignseq));
             } catch (SiftsException e)
             {
               System.err.println(e.getMessage());
@@ -646,12 +654,20 @@ public class StructureSelectionManager
    * @return
    * @throws SiftsException
    */
-  private StructureMapping getStructureMapping(SequenceI seq,
-          String pdbFile, String targetChainId, StructureFile pdb,
+  private List<StructureMapping> getStructureMapping(SequenceI seq,
+          String pdbFile, List<String> targetChainIdList, StructureFile pdb,
           PDBChain maxChain, jalview.datamodel.Mapping sqmpping,
           AlignSeq maxAlignseq) throws SiftsException
   {
-    StructureMapping curChainMapping = siftsClient
+    List<StructureMapping> currChainMappingList = new ArrayList();
+    int p = 0;
+    do
+    {
+      String targetChainId = (targetChainIdList == null
+              || p >= targetChainIdList.size()) ? null
+                      : targetChainIdList.get(p);
+      StructureMapping curChainMapping = siftsClient
+
             .getSiftsStructureMapping(seq, pdbFile, targetChainId);
     try
     {
@@ -659,12 +675,14 @@ public class StructureSelectionManager
       if (chain != null)
       {
         chain.transferResidueAnnotation(curChainMapping, sqmpping);
+          currChainMappingList.add(curChainMapping);
       }
     } catch (Exception e)
     {
       e.printStackTrace();
     }
-    return curChainMapping;
+    } while (targetChainIdList != null && ++p < targetChainIdList.size());
+    return currChainMappingList;
   }
 
   private List<StructureMapping> getNWMappings(SequenceI seq,