JAL-2738 use complement base for a VCF variant on reverse strand gene
[jalview.git] / test / jalview / io / vcf / VCFLoaderTest.java
index 7319123..db72941 100644 (file)
@@ -55,23 +55,35 @@ public class VCFLoaderTest
     /*
      * verify variant feature(s) added to gene
      */
-    List<SequenceFeature> geneFeatures = al.getSequenceAt(0).findFeatures(
-            2, 2);
-    assertEquals(geneFeatures.size(), 1);
+    List<SequenceFeature> geneFeatures = al.getSequenceAt(0)
+            .getSequenceFeatures();
+    assertEquals(geneFeatures.size(), 2);
     SequenceFeature sf = geneFeatures.get(0);
     assertEquals(sf.getFeatureGroup(), "VCF");
+    assertEquals(sf.getBegin(), 2);
+    assertEquals(sf.getEnd(), 2);
     assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
     assertEquals(sf.getScore(), 5.08130e-03, 0.000001f);
     assertEquals("A,T", sf.getValue(Gff3Helper.ALLELES));
 
+    sf = geneFeatures.get(1);
+    assertEquals(sf.getFeatureGroup(), "VCF");
+    assertEquals(sf.getBegin(), 4);
+    assertEquals(sf.getEnd(), 4);
+    assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
+    assertEquals(sf.getScore(), 3.08130e-03, 0.000001f);
+    assertEquals("G,C", sf.getValue(Gff3Helper.ALLELES));
+
     /*
      * verify variant feature(s) added to transcript
      */
     List<SequenceFeature> transcriptFeatures = al.getSequenceAt(1)
-            .findFeatures(4, 4);
+            .getSequenceFeatures();
     assertEquals(transcriptFeatures.size(), 1);
     sf = transcriptFeatures.get(0);
     assertEquals(sf.getFeatureGroup(), "VCF");
+    assertEquals(sf.getBegin(), 2);
+    assertEquals(sf.getEnd(), 2);
     assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
     assertEquals(sf.getScore(), 3.08130e-03, 0.000001f);
     assertEquals("G,C", sf.getValue(Gff3Helper.ALLELES));
@@ -82,12 +94,12 @@ public class VCFLoaderTest
      */
     SequenceI peptide = al.getSequenceAt(1)
             .getDBRefs()[0].getMap().getTo();
-    List<SequenceFeature> proteinFeatures = peptide.findFeatures(1, 6);
+    List<SequenceFeature> proteinFeatures = peptide.getSequenceFeatures();
     assertEquals(proteinFeatures.size(), 1);
     sf = proteinFeatures.get(0);
     assertEquals(sf.getFeatureGroup(), "VCF");
-    assertEquals(sf.getBegin(), 2);
-    assertEquals(sf.getEnd(), 2);
+    assertEquals(sf.getBegin(), 1);
+    assertEquals(sf.getEnd(), 1);
     assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
     assertEquals(sf.getDescription(), "p.Ser1Thr");
   }
@@ -155,10 +167,89 @@ public class VCFLoaderTest
     return alignment;
   }
 
+  /**
+   * Test with 'gene' and 'transcript' mapped to the reverse strand of the
+   * chromosome. The VCF variant positions (in forward coordinates) should get
+   * correctly located on sequence positions.
+   * 
+   * @throws IOException
+   */
   @Test(groups = "Functional")
   public void testLoadVCF_reverseStrand() throws IOException
   {
-    // TODO a test with reverse strand mapping of
-    // gene and transcript to chromosome
+    AlignmentI al = buildAlignment();
+
+    /*
+     * invert forward to reverse strand mappings
+     */
+    List<int[]> to = al.getSequenceAt(0).getGeneLoci().mapping
+            .getToRanges();
+    int temp = to.get(0)[0];
+    to.get(0)[0] = to.get(0)[1];
+    to.get(0)[1] = temp;
+    to = al.getSequenceAt(1).getGeneLoci().mapping.getToRanges();
+    to.get(0)[0] = to.get(0)[1];
+    to.get(0)[1] = temp;
+    to.get(1)[0] = to.get(1)[1];
+    to.get(1)[1] = temp;
+    int[] tmp2 = to.get(0);
+    to.set(0, to.get(1));
+    to.set(1, tmp2);
+
+    VCFLoader loader = new VCFLoader(al);
+
+    File f = makeVcf();
+
+    loader.loadVCF(f.getPath(), null);
+
+    /*
+     * verify variant feature(s) added to gene
+     */
+    List<SequenceFeature> geneFeatures = al.getSequenceAt(0)
+            .getSequenceFeatures();
+    assertEquals(geneFeatures.size(), 2);
+    SequenceFeature sf = geneFeatures.get(0);
+    assertEquals(sf.getFeatureGroup(), "VCF");
+    assertEquals(sf.getBegin(), 2);
+    assertEquals(sf.getEnd(), 2);
+    assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
+    assertEquals(sf.getScore(), 5.08130e-03, 0.000001f);
+    assertEquals("A,T", sf.getValue(Gff3Helper.ALLELES));
+
+    sf = geneFeatures.get(1);
+    assertEquals(sf.getFeatureGroup(), "VCF");
+    assertEquals(sf.getBegin(), 4);
+    assertEquals(sf.getEnd(), 4);
+    assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
+    assertEquals(sf.getScore(), 3.08130e-03, 0.000001f);
+    assertEquals("G,C", sf.getValue(Gff3Helper.ALLELES));
+
+    /*
+     * verify variant feature(s) added to transcript
+     */
+    List<SequenceFeature> transcriptFeatures = al.getSequenceAt(1)
+            .getSequenceFeatures();
+    assertEquals(transcriptFeatures.size(), 1);
+    sf = transcriptFeatures.get(0);
+    assertEquals(sf.getFeatureGroup(), "VCF");
+    assertEquals(sf.getBegin(), 2);
+    assertEquals(sf.getEnd(), 2);
+    assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
+    assertEquals(sf.getScore(), 3.08130e-03, 0.000001f);
+    assertEquals("G,C", sf.getValue(Gff3Helper.ALLELES));
+
+    /*
+     * verify variant feature(s) computed and added to protein
+     * first codon AGC varies to ACC giving S/T
+     */
+    SequenceI peptide = al.getSequenceAt(1).getDBRefs()[0].getMap().getTo();
+    List<SequenceFeature> proteinFeatures = peptide.getSequenceFeatures();
+    assertEquals(proteinFeatures.size(), 1);
+    sf = proteinFeatures.get(0);
+    assertEquals(sf.getFeatureGroup(), "VCF");
+    assertEquals(sf.getBegin(), 1);
+    assertEquals(sf.getEnd(), 1);
+    assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT);
+    assertEquals(sf.getDescription(), "p.Ser1Thr");
   }
 }