JAL-4410 quick patch to explore multichain mapping
authorJim Procter <jprocter@dundee.ac.uk>
Fri, 10 May 2024 15:55:17 +0000 (16:55 +0100)
committerJim Procter <jprocter@dundee.ac.uk>
Fri, 10 May 2024 15:55:17 +0000 (16:55 +0100)
src/jalview/structure/StructureSelectionManager.java

index 9a9e2a2..a8ee9fe 100644 (file)
@@ -27,6 +27,7 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -556,9 +557,8 @@ public class StructureSelectionManager
        * and remember the highest scoring chain
        */
       float max = -10;
-      AlignSeq maxAlignseq = null;
-      String maxChainId = " ";
-      PDBChain maxChain = null;
+      List<AlignSeq> maxAlignSeqs = new ArrayList<AlignSeq>();
+      List<PDBChain> maxChain = new ArrayList<PDBChain>();
       boolean first = true;
       for (PDBChain chain : pdb.getChains())
       {
@@ -577,19 +577,27 @@ public class StructureSelectionManager
         // as.calcScoreMatrix();
         // as.traceAlignment();
 
-        if (first || as.maxscore > max
-                || (as.maxscore == max && chain.id.equals(targetChainId)))
+        if (first || (targetChainId != null
+                && chain.id.equals(targetChainId)))
         {
           first = false;
-          maxChain = chain;
+          maxChain.add(chain);
           max = as.maxscore;
-          maxAlignseq = as;
-          maxChainId = chain.id;
+          maxAlignSeqs.add(as);
+          if (targetChainId != null && chain.id.equals(targetChainId))
+          {
+            continue;
+          }
+        }
+        else
+        {
+          if (as.maxscore >= max)
+          {
+            maxChain.add(chain);
+            max = as.maxscore;
+            maxAlignSeqs.add(as);
+          }
         }
-      }
-      if (maxChain == null)
-      {
-        continue;
       }
 
       if (sourceType == DataSourceType.PASTE)
@@ -607,36 +615,39 @@ public class StructureSelectionManager
                           .getString("status.obtaining_mapping_with_sifts"),
                   progressSessionId);
         }
+        AlignSeq maxAlignseq = maxAlignSeqs.get(0);
+
         jalview.datamodel.Mapping sqmpping = maxAlignseq
                 .getMappingFromS1(false);
         if (targetChainId != null && !targetChainId.trim().isEmpty())
         {
+          PDBChain mchain = maxChain.get(0);
           StructureMapping siftsMapping;
           try
           {
             siftsMapping = getStructureMapping(seq, pdbFile, targetChainId,
-                    pdb, maxChain, sqmpping, maxAlignseq, siftsClient);
+                    pdb, mchain, sqmpping, maxAlignseq, siftsClient);
             seqToStrucMapping.add(siftsMapping);
-            maxChain.makeExactMapping(siftsMapping, seq);
-            maxChain.transferRESNUMFeatures(seq, "IEA: SIFTS",
+            mchain.makeExactMapping(siftsMapping, seq);
+            mchain.transferRESNUMFeatures(seq, "IEA: SIFTS",
                     pdb.getId().toLowerCase(Locale.ROOT));
-            maxChain.transferResidueAnnotation(siftsMapping, null);
-            ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+            mchain.transferResidueAnnotation(siftsMapping, null);
+            ds.addPDBId(mchain.sequence.getAllPDBEntries().get(0));
 
           } catch (SiftsException e)
           {
             // fall back to NW alignment
             Console.error(e.getMessage());
             StructureMapping nwMapping = getNWMappings(seq, pdbFile,
-                    targetChainId, maxChain, pdb, maxAlignseq);
+                    targetChainId, mchain, pdb, maxAlignseq);
             seqToStrucMapping.add(nwMapping);
-            maxChain.makeExactMapping(maxAlignseq, seq);
-            maxChain.transferRESNUMFeatures(seq, "IEA:Jalview",
+            mchain.makeExactMapping(maxAlignseq, seq);
+            mchain.transferRESNUMFeatures(seq, "IEA:Jalview",
                     pdb.getId().toLowerCase(Locale.ROOT)); // FIXME: is
             // this
             // "IEA:Jalview" ?
-            maxChain.transferResidueAnnotation(nwMapping, sqmpping);
-            ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+            mchain.transferResidueAnnotation(nwMapping, sqmpping);
+            ds.addPDBId(mchain.sequence.getAllPDBEntries().get(0));
           }
         }
         else
@@ -672,14 +683,19 @@ public class StructureSelectionManager
           }
           else
           {
-            StructureMapping nwMapping = getNWMappings(seq, pdbFile,
-                    maxChainId, maxChain, pdb, maxAlignseq);
-            seqToStrucMapping.add(nwMapping);
-            maxChain.transferRESNUMFeatures(seq, null,
-                    pdb.getId().toLowerCase(Locale.ROOT)); // FIXME: is this
-            // "IEA:Jalview" ?
-            maxChain.transferResidueAnnotation(nwMapping, sqmpping);
-            ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+            Iterator<AlignSeq> as = maxAlignSeqs.iterator();
+            for (PDBChain mchain : maxChain)
+            {
+              String maxChainId = mchain.id;
+              StructureMapping nwMapping = getNWMappings(seq, pdbFile,
+                      maxChainId, mchain, pdb, as.next());
+              seqToStrucMapping.add(nwMapping);
+              mchain.transferRESNUMFeatures(seq, null,
+                      pdb.getId().toLowerCase(Locale.ROOT)); // FIXME: is this
+              // "IEA:Jalview" ?
+              mchain.transferResidueAnnotation(nwMapping, sqmpping);
+              ds.addPDBId(mchain.sequence.getAllPDBEntries().get(0));
+            }
           }
         }
       }
@@ -692,10 +708,15 @@ public class StructureSelectionManager
                           "status.obtaining_mapping_with_nw_alignment"),
                   progressSessionId);
         }
-        StructureMapping nwMapping = getNWMappings(seq, pdbFile, maxChainId,
-                maxChain, pdb, maxAlignseq);
-        seqToStrucMapping.add(nwMapping);
-        ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+        Iterator<AlignSeq> as = maxAlignSeqs.iterator();
+        for (PDBChain mchain : maxChain)
+        {
+          String maxChainId = mchain.id;
+          StructureMapping nwMapping = getNWMappings(seq, pdbFile,
+                  maxChainId, mchain, pdb, as.next());
+          seqToStrucMapping.add(nwMapping);
+          ds.addPDBId(mchain.sequence.getAllPDBEntries().get(0));
+        }
       }
       if (forStructureView)
       {