JAL-3949 - refactor logging from jalview.bin.Cache to jalview.bin.Console
[jalview.git] / src / jalview / util / MappingUtils.java
index c992243..8d34ea8 100644 (file)
@@ -29,13 +29,14 @@ import java.util.Map;
 
 import jalview.analysis.AlignmentSorter;
 import jalview.api.AlignViewportI;
-import jalview.bin.Cache;
+import jalview.bin.Console;
 import jalview.commands.CommandI;
 import jalview.commands.EditCommand;
 import jalview.commands.EditCommand.Action;
 import jalview.commands.EditCommand.Edit;
 import jalview.commands.OrderCommand;
 import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.AlignedCodonFrame.SequenceToSequenceMapping;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.ColumnSelection;
@@ -80,7 +81,7 @@ public final class MappingUtils
       action = action.getUndoAction();
     }
     // TODO write this
-    Cache.log.error("MappingUtils.mapCutOrPaste not yet implemented");
+    Console.error("MappingUtils.mapCutOrPaste not yet implemented");
   }
 
   /**
@@ -367,11 +368,13 @@ public final class MappingUtils
       {
         int mappedStartResidue = 0;
         int mappedEndResidue = 0;
-
         for (AlignedCodonFrame acf : codonFrames)
         {
-          Mapping map = acf.getMappingBetween(seq, selected);
-          if (map != null)
+          // rather than use acf.getCoveringMapping() we iterate through all
+          // mappings to make sure all CDS are selected for a protein
+          for (SequenceToSequenceMapping map: acf.getMappings())
+          {
+          if (map.covers(selected) && map.covers(seq))
           {
             /*
              * Found a sequence mapping. Locate the start/end mapped residues.
@@ -379,6 +382,7 @@ public final class MappingUtils
             List<AlignedCodonFrame> mapping = Arrays
                     .asList(new AlignedCodonFrame[]
                     { acf });
+            // locate start 
             SearchResultsI sr = buildSearchResults(selected,
                     startResiduePos, mapping);
             for (SearchResultMatchI m : sr.getResults())
@@ -386,6 +390,7 @@ public final class MappingUtils
               mappedStartResidue = m.getStart();
               mappedEndResidue = m.getEnd();
             }
+            // locate end - allowing for adjustment of start range
             sr = buildSearchResults(selected, endResiduePos, mapping);
             for (SearchResultMatchI m : sr.getResults())
             {
@@ -407,7 +412,7 @@ public final class MappingUtils
             mappedGroup.addSequence(seq, false);
             break;
           }
-        }
+        }}
       }
     }
     mappedGroup.setStartRes(minStartCol < 0 ? 0 : minStartCol);
@@ -446,20 +451,23 @@ public final class MappingUtils
     {
       for (AlignedCodonFrame acf : mappings)
       {
-        SequenceI mappedSeq = mappingToNucleotide ? acf.getDnaForAaSeq(seq)
-                : acf.getAaForDnaSeq(seq);
-        if (mappedSeq != null)
-        {
           for (SequenceI seq2 : mapTo.getSequences())
           {
-            if (seq2.getDatasetSequence() == mappedSeq)
+            /*
+             * the corresponding peptide / CDS is the one for which there is
+             * a complete ('covering') mapping to 'seq'
+             */
+            SequenceI peptide = mappingToNucleotide ? seq2 : seq;
+            SequenceI cds = mappingToNucleotide ? seq : seq2;
+            SequenceToSequenceMapping s2s = acf.getCoveringMapping(cds,
+                    peptide);
+            if (s2s != null)
             {
               mappedOrder.add(seq2);
               j++;
               break;
             }
           }
-        }
       }
     }
 
@@ -521,7 +529,7 @@ public final class MappingUtils
 
     if (colsel == null)
     {
-      return; // mappedColumns;
+      return; 
     }
 
     char fromGapChar = mapFrom.getAlignment().getGapCharacter();
@@ -545,7 +553,7 @@ public final class MappingUtils
       mapHiddenColumns(regions.next(), codonFrames, newHidden,
               fromSequences, toSequences, fromGapChar);
     }
-    return; // mappedColumns;
+    return; 
   }
 
   /**
@@ -663,7 +671,9 @@ public final class MappingUtils
          */
         for (SequenceI toSeq : toSequences)
         {
-          if (toSeq.getDatasetSequence() == mappedSeq)
+          if (toSeq.getDatasetSequence() == mappedSeq
+                  && mappedStartResidue >= toSeq.getStart()
+                  && mappedEndResidue <= toSeq.getEnd())
           {
             int mappedStartCol = toSeq.findIndex(mappedStartResidue);
             int mappedEndCol = toSeq.findIndex(mappedEndResidue);
@@ -832,7 +842,7 @@ public final class MappingUtils
     {
       if (range.length % 2 != 0)
       {
-        Cache.log.error(
+        Console.error(
                 "Error unbalance start/end ranges: " + ranges.toString());
         return 0;
       }
@@ -988,7 +998,7 @@ public final class MappingUtils
         /*
          * not coded for [start1, end1, start2, end2, ...]
          */
-        Cache.log.error(
+        Console.error(
                 "MappingUtils.removeEndPositions doesn't handle multiple  ranges");
         return;
       }
@@ -999,7 +1009,7 @@ public final class MappingUtils
         /*
          * not coded for a reverse strand range (end < start)
          */
-        Cache.log.error(
+        Console.error(
                 "MappingUtils.removeEndPositions doesn't handle reverse strand");
         return;
       }