Merge branch 'task/JAL-3763_newDatasetForCds' into merge/develop_task/JAL-3763_newDat...
authorJim Procter <j.procter@dundee.ac.uk>
Wed, 26 Jan 2022 19:36:23 +0000 (19:36 +0000)
committerJim Procter <j.procter@dundee.ac.uk>
Wed, 26 Jan 2022 19:36:23 +0000 (19:36 +0000)
 Conflicts:
src/jalview/analysis/AlignmentUtils.java
src/jalview/util/MapList.java
test/jalview/util/MapListTest.java
test/jalview/util/MappingUtilsTest.java

1  2 
src/jalview/analysis/AlignmentUtils.java
src/jalview/datamodel/SearchResults.java
src/jalview/gui/PopupMenu.java
src/jalview/util/MappingUtils.java
src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java
test/jalview/util/MapListTest.java
test/jalview/util/MappingUtilsTest.java

   */
  package jalview.analysis;
  
 +import java.util.Locale;
 +
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Collection;
+ import java.util.Collections;
+ import java.util.HashMap;
+ import java.util.HashSet;
+ import java.util.Iterator;
+ import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Map.Entry;
+ import java.util.NoSuchElementException;
+ import java.util.Set;
+ import java.util.SortedMap;
+ import java.util.TreeMap;
+ import jalview.bin.Cache;
  import jalview.commands.RemoveGapColCommand;
  import jalview.datamodel.AlignedCodon;
  import jalview.datamodel.AlignedCodonFrame;
Simple merge
   */
  package jalview.util;
  
 +import java.util.ArrayList;
 +import java.util.Arrays;
 +import java.util.HashMap;
 +import java.util.Iterator;
 +import java.util.List;
 +import java.util.Map;
 +
  import jalview.analysis.AlignmentSorter;
  import jalview.api.AlignViewportI;
+ import jalview.bin.Cache;
  import jalview.commands.CommandI;
  import jalview.commands.EditCommand;
  import jalview.commands.EditCommand.Action;
@@@ -831,7 -783,7 +831,8 @@@ public class MapListTes
      // 'subsumed' ranges are preserved
      ranges.clear();
      ranges.add(new int[] { 10, 30 });
-     ranges.add(new int[] { 15, 25 });
+     ranges.add(new int[] { 15, 25 }); 
++
      merged = MapList.coalesceRanges(ranges);
      assertEquals(2, merged.size());
      assertArrayEquals(new int[] { 10, 30 }, merged.get(0));
@@@ -24,18 -24,17 +24,28 @@@ import static org.testng.AssertJUnit.as
  import static org.testng.AssertJUnit.assertFalse;
  import static org.testng.AssertJUnit.assertSame;
  import static org.testng.AssertJUnit.assertTrue;
 +import static org.testng.AssertJUnit.fail;
 +
 +import java.awt.Color;
 +import java.io.IOException;
 +import java.util.ArrayList;
 +import java.util.Arrays;
 +import java.util.Iterator;
 +import java.util.List;
 +
 +import org.testng.annotations.BeforeClass;
 +import org.testng.annotations.Test;
  
+ import java.awt.Color;
+ import java.io.IOException;
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Iterator;
+ import java.util.List;
+ import org.testng.annotations.BeforeClass;
+ import org.testng.annotations.Test;
  import jalview.api.AlignViewportI;
  import jalview.bin.Cache;
  import jalview.commands.EditCommand;
@@@ -1328,32 -1329,104 +1339,133 @@@ public class MappingUtilsTes
      assertEquals(9, ranges.get(0)[1]);
    }
  
 +  @Test(groups = "Functional")
 +  public void testListToArray()
 +  {
 +    List<int[]> ranges = new ArrayList<>();
 +
 +    int[] result = MappingUtils.rangeListToArray(ranges);
 +    assertEquals(result.length, 0);
 +    ranges.add(new int[] { 24, 12 });
 +    result = MappingUtils.rangeListToArray(ranges);
 +    assertEquals(result.length, 2);
 +    assertEquals(result[0], 24);
 +    assertEquals(result[1], 12);
 +    ranges.add(new int[] { -7, 30 });
 +    result = MappingUtils.rangeListToArray(ranges);
 +    assertEquals(result.length, 4);
 +    assertEquals(result[0], 24);
 +    assertEquals(result[1], 12);
 +    assertEquals(result[2], -7);
 +    assertEquals(result[3], 30);
 +    try
 +    {
 +      MappingUtils.rangeListToArray(null);
 +      fail("Expected exception");
 +    } catch (NullPointerException e)
 +    {
 +      // expected
 +    }
 +  }
++  
+   /**
+    * Test mapping a sequence group where sequences in and outside the group
+    * share a dataset sequence (e.g. alternative CDS for the same gene)
+    * <p>
+    * This scenario doesn't arise after JAL-3763 changes, but test left as still valid
+    * @throws IOException
+    */
+   @Test(groups = { "Functional" })
+   public void testMapSequenceGroup_sharedDataset() throws IOException
+   {
+     /*
+      * Set up dna and protein Seq1/2/3 with mappings (held on the protein
+      * viewport). CDS sequences share the same 'gene' dataset sequence.
+      */
+     SequenceI dna = new Sequence("dna", "aaatttgggcccaaatttgggccc");
+     SequenceI cds1 = new Sequence("cds1/1-6", "aaattt");
+     SequenceI cds2 = new Sequence("cds1/4-9", "tttggg");
+     SequenceI cds3 = new Sequence("cds1/19-24", "gggccc");
+     cds1.setDatasetSequence(dna);
+     cds2.setDatasetSequence(dna);
+     cds3.setDatasetSequence(dna);
+     SequenceI pep1 = new Sequence("pep1", "KF");
+     SequenceI pep2 = new Sequence("pep2", "FG");
+     SequenceI pep3 = new Sequence("pep3", "GP");
+     pep1.createDatasetSequence();
+     pep2.createDatasetSequence();
+     pep3.createDatasetSequence();
+     /*
+      * add mappings from coding positions of dna to respective peptides
+      */
+     AlignedCodonFrame acf = new AlignedCodonFrame();
+     acf.addMap(dna, pep1,
+             new MapList(new int[]
+             { 1, 6 }, new int[] { 1, 2 }, 3, 1));
+     acf.addMap(dna, pep2,
+             new MapList(new int[]
+             { 4, 9 }, new int[] { 1, 2 }, 3, 1));
+     acf.addMap(dna, pep3,
+             new MapList(new int[]
+             { 19, 24 }, new int[] { 1, 2 }, 3, 1));
+     List<AlignedCodonFrame> acfList = Arrays
+             .asList(new AlignedCodonFrame[]
+             { acf });
+     AlignmentI cdna = new Alignment(new SequenceI[] { cds1, cds2, cds3 });
+     AlignmentI protein = new Alignment(
+             new SequenceI[]
+             { pep1, pep2, pep3 });
+     AlignViewportI cdnaView = new AlignViewport(cdna);
+     AlignViewportI peptideView = new AlignViewport(protein);
+     protein.setCodonFrames(acfList);
+     /*
+      * Select pep1 and pep3 in the protein alignment
+      */
+     SequenceGroup sg = new SequenceGroup();
+     sg.setColourText(true);
+     sg.setIdColour(Color.GREEN);
+     sg.setOutlineColour(Color.LIGHT_GRAY);
+     sg.addSequence(pep1, false);
+     sg.addSequence(pep3, false);
+     sg.setEndRes(protein.getWidth() - 1);
+     /*
+      * Verify the mapped sequence group in dna is cds1 and cds3
+      */
+     SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg,
+             peptideView, cdnaView);
+     assertTrue(mappedGroup.getColourText());
+     assertSame(sg.getIdColour(), mappedGroup.getIdColour());
+     assertSame(sg.getOutlineColour(), mappedGroup.getOutlineColour());
+     assertEquals(2, mappedGroup.getSequences().size());
+     assertSame(cds1, mappedGroup.getSequences().get(0));
+     assertSame(cds3, mappedGroup.getSequences().get(1));
+     // columns 1-6 selected (0-5 base zero)
+     assertEquals(0, mappedGroup.getStartRes());
+     assertEquals(5, mappedGroup.getEndRes());
+     /*
+      * Select mapping sequence group from dna to protein
+      */
+     sg.clear();
+     sg.addSequence(cds2, false);
+     sg.addSequence(cds1, false);
+     sg.setStartRes(0);
+     sg.setEndRes(cdna.getWidth() - 1);
+     mappedGroup = MappingUtils.mapSequenceGroup(sg, cdnaView, peptideView);
+     assertTrue(mappedGroup.getColourText());
+     assertSame(sg.getIdColour(), mappedGroup.getIdColour());
+     assertSame(sg.getOutlineColour(), mappedGroup.getOutlineColour());
+     assertEquals(2, mappedGroup.getSequences().size());
+     assertSame(protein.getSequenceAt(1), mappedGroup.getSequences().get(0));
+     assertSame(protein.getSequenceAt(0), mappedGroup.getSequences().get(1));
+     assertEquals(0, mappedGroup.getStartRes());
+     assertEquals(1, mappedGroup.getEndRes()); // two columns
+   }
  }