Merge branch 'merge/develop_JAL-3725' into develop
authorJim Procter <j.procter@dundee.ac.uk>
Fri, 28 Jan 2022 17:08:35 +0000 (17:08 +0000)
committerJim Procter <j.procter@dundee.ac.uk>
Fri, 28 Jan 2022 17:08:35 +0000 (17:08 +0000)
 Conflicts:
src/jalview/gui/PopupMenu.java

1  2 
src/jalview/gui/PopupMenu.java
src/jalview/util/MappingUtils.java
test/jalview/util/MapListTest.java
test/jalview/util/MappingUtilsTest.java

@@@ -839,15 -839,13 +839,14 @@@ public class PopupMenu extends JPopupMe
        /*
         * show local rather than linked feature coordinates
         */
-       int[] beginRange = mf.getMappedPositions(start, start);
-       int[] endRange = mf.getMappedPositions(end, end);
-       if (beginRange == null || endRange == null)
+       int[] localRange = mf.getMappedPositions(start, end);
+       if (localRange == null)
        {
 +        // e.g. variant extending to stop codon so not mappable
          return;
        }
-       start = beginRange[0];
-       end = endRange[endRange.length - 1];
+       start = localRange[0];
+       end = localRange[localRange.length - 1];
      }
      StringBuilder desc = new StringBuilder();
      desc.append(sf.getType()).append(" ").append(String.valueOf(start));
Simple merge
Simple merge
@@@ -1340,132 -1330,20 +1341,121 @@@ public class MappingUtilsTes
    }
  
    @Test(groups = "Functional")
-   public void testListToArray()
+   public void testFindOverlap()
    {
      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
-     }
+     ranges.add(new int[] { 4, 8 });
+     ranges.add(new int[] { 10, 12 });
+     ranges.add(new int[] { 16, 19 });
+     int[] overlap = MappingUtils.findOverlap(ranges, 5, 13);
+     assertArrayEquals(overlap, new int[] { 5, 12 });
+     overlap = MappingUtils.findOverlap(ranges, -100, 100);
+     assertArrayEquals(overlap, new int[] { 4, 19 });
+     overlap = MappingUtils.findOverlap(ranges, 7, 17);
+     assertArrayEquals(overlap, new int[] { 7, 17 });
+     overlap = MappingUtils.findOverlap(ranges, 13, 15);
+     assertNull(overlap);
    }
 +  
 +  /**
 +   * 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
 +  }
  }