JAL-2110 bug fix / test for searchDataset mappings created
[jalview.git] / src / jalview / analysis / CrossRef.java
index e73912d..2b5a0e2 100644 (file)
@@ -145,18 +145,18 @@ public class CrossRef
        * find sequence's direct (dna-to-dna, peptide-to-peptide) xrefs
        */
       DBRefEntry[] lrfs = DBRefUtils.selectDbRefs(fromDna, seq.getDBRefs());
-      List<SequenceI> rseqs = new ArrayList<SequenceI>();
+      List<SequenceI> foundSeqs = new ArrayList<SequenceI>();
 
       /*
        * find sequences in the alignment which xref one of these DBRefs
        * i.e. is xref-ed to a common sequence identifier
        */
-      searchDatasetXrefs(fromDna, seq, lrfs, rseqs, null);
+      searchDatasetXrefs(fromDna, seq, lrfs, foundSeqs, null);
 
       /*
        * add those sequences' (dna-to-peptide or peptide-to-dna) dbref sources
        */
-      for (SequenceI rs : rseqs)
+      for (SequenceI rs : foundSeqs)
       {
         DBRefEntry[] xrs = DBRefUtils
                 .selectDbRefs(!fromDna, rs.getDBRefs());
@@ -728,11 +728,11 @@ public class CrossRef
    *          context was searching from Protein sequences
    * @param sequenceI
    * @param lrfs
-   * @param rseqs
+   * @param foundSeqs
    * @return true if matches were found.
    */
   private boolean searchDatasetXrefs(boolean fromDna, SequenceI sequenceI,
-          DBRefEntry[] lrfs, List<SequenceI> rseqs, AlignedCodonFrame cf)
+          DBRefEntry[] lrfs, List<SequenceI> foundSeqs, AlignedCodonFrame cf)
   {
     boolean found = false;
     if (lrfs == null)
@@ -745,7 +745,7 @@ public class CrossRef
       // add in wildcards
       xref.setVersion(null);
       xref.setMap(null);
-      found |= searchDataset(fromDna, sequenceI, xref, rseqs, cf, false);
+      found |= searchDataset(fromDna, sequenceI, xref, foundSeqs, cf, false);
     }
     return found;
   }
@@ -757,13 +757,13 @@ public class CrossRef
    * @param fromDna
    *          true if context was searching for refs *from* dna sequence, false
    *          if context was searching for refs *from* protein sequence
-   * @param sequenceI
+   * @param fromSeq
    *          a sequence to ignore (start point of search)
    * @param xrf
    *          a cross-reference to try to match
-   * @param rseqs
+   * @param foundSeqs
    *          result list to add to
-   * @param cf
+   * @param mappings
    *          a set of sequence mappings to add to
    * @param direct
    *          - indicates the type of relationship between returned sequences,
@@ -778,8 +778,8 @@ public class CrossRef
    *          </ul>
    * @return true if relationship found and sequence added.
    */
-  boolean searchDataset(boolean fromDna, SequenceI sequenceI,
-          DBRefEntry xrf, List<SequenceI> rseqs, AlignedCodonFrame cf,
+  boolean searchDataset(boolean fromDna, SequenceI fromSeq,
+          DBRefEntry xrf, List<SequenceI> foundSeqs, AlignedCodonFrame mappings,
           boolean direct)
   {
     boolean found = false;
@@ -808,7 +808,7 @@ public class CrossRef
                             + nxt.getDatasetSequence().getDisplayId(true)
                             + ")");
           }
-          if (nxt == sequenceI || nxt == sequenceI.getDatasetSequence())
+          if (nxt == fromSeq || nxt == fromSeq.getDatasetSequence())
           {
             continue;
           }
@@ -840,13 +840,17 @@ public class CrossRef
           // }
           if (!cands.isEmpty())
           {
-            if (!rseqs.contains(nxt))
+            if (!foundSeqs.contains(nxt))
             {
               found = true;
-              rseqs.add(nxt);
-              if (cf != null)
+              foundSeqs.add(nxt);
+              if (mappings != null && !direct)
               {
-                // don't search if we aren't given a codon map object
+                /*
+                 * if the matched sequence has mapped dbrefs to
+                 * protein product / cdna, add equivalent mappings to
+                 * our source sequence
+                 */
                 for (DBRefEntry candidate : cands)
                 {
                   Mapping mapping = candidate.getMap();
@@ -856,23 +860,21 @@ public class CrossRef
                     if (mapping.getTo() != null
                             && map.getFromRatio() != map.getToRatio())
                     {
-                      // get sense of map correct for adding to product
-                      // alignment.
-                      if (fromDna)
+                      /*
+                       * add a mapping, as from dna to peptide sequence
+                       */
+                      if (map.getFromRatio() == 3)
                       {
-                        // map is from dna seq to a protein product
-                        cf.addMap(sequenceI, nxt, map);
+                        mappings.addMap(nxt, fromSeq, map);
                       }
                       else
                       {
-                        // map should be from protein seq to its coding dna
-                        cf.addMap(nxt, sequenceI, map.getInverse());
+                        mappings.addMap(nxt, fromSeq, map.getInverse());
                       }
                     }
                   }
                 }
               }
-              // TODO: add mapping between sequences if necessary
             }
           }
         }