Merge branch 'develop' into feature/JAL-3187linkedFeatures
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 7 Jun 2019 15:22:03 +0000 (16:22 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 7 Jun 2019 15:22:03 +0000 (16:22 +0100)
1  2 
src/jalview/analysis/AlignmentUtils.java
src/jalview/gui/CrossRefAction.java
src/jalview/io/vcf/VCFLoader.java
src/jalview/project/Jalview2XML.java
test/jalview/project/Jalview2xmlTests.java

@@@ -1107,7 -1107,7 +1107,7 @@@ public class AlignmentUtil
          SequenceI prot = mapping.findAlignedSequence(dnaSeq, protein);
          if (prot != null)
          {
 -          Mapping seqMap = mapping.getMappingForSequence(dnaSeq);
 +          Mapping seqMap = mapping.getMappingForSequence(dnaSeq, false);
            addCodonPositions(dnaSeq, prot, protein.getGapCharacter(), seqMap,
                    alignedCodons);
            unmappedProtein.remove(prot);
        return;
      }
  
-     MapList newMap = targetToFrom.traverse(fromLoci.getMap());
+     MapList newMap = targetToFrom.traverse(fromLoci.getMapping());
  
      if (newMap != null)
      {
    static int computePeptideVariants(SequenceI peptide, int peptidePos,
            List<DnaVariant>[] codonVariants)
    {
 -    String residue = String.valueOf(peptide.getCharAt(peptidePos - 1));
 +    String residue = String
 +            .valueOf(peptide.getCharAt(peptidePos - peptide.getStart()));
      int count = 0;
      String base1 = codonVariants[0].get(0).base;
      String base2 = codonVariants[1].get(0).base;
@@@ -39,7 -39,6 +39,7 @@@ import jalview.util.DBRefUtils
  import jalview.util.MapList;
  import jalview.util.MappingUtils;
  import jalview.util.MessageManager;
 +import jalview.viewmodel.seqfeatures.FeatureRendererModel;
  import jalview.ws.SequenceFetcher;
  
  import java.util.ArrayList;
@@@ -171,17 -170,17 +171,17 @@@ public class CrossRefAction implements 
                .isShowSequenceFeatures();
        newFrame.setShowSeqFeatures(showSequenceFeatures);
        copyThis.setShowSeqFeatures(showSequenceFeatures);
 -      FeatureRenderer myFeatureStyling = alignFrame.alignPanel
 +      FeatureRendererModel myFeatureStyling = alignFrame.alignPanel
                .getSeqPanel().seqCanvas.getFeatureRenderer();
  
        /*
         * copy feature rendering settings to split frame
         */
 -      FeatureRenderer fr1 = newFrame.alignPanel.getSeqPanel().seqCanvas
 +      FeatureRendererModel fr1 = newFrame.alignPanel.getSeqPanel().seqCanvas
                .getFeatureRenderer();
        fr1.transferSettings(myFeatureStyling);
        fr1.findAllFeatures(true);
 -      FeatureRenderer fr2 = copyThis.alignPanel.getSeqPanel().seqCanvas
 +      FeatureRendererModel fr2 = copyThis.alignPanel.getSeqPanel().seqCanvas
                .getFeatureRenderer();
        fr2.transferSettings(myFeatureStyling);
        fr2.findAllFeatures(true);
              seq.getLength());
      if (geneLoci != null)
      {
-       MapList map = geneLoci.getMap();
+       MapList map = geneLoci.getMapping();
        int mappedFromLength = MappingUtils.getLength(map.getFromRanges());
        if (mappedFromLength == seq.getLength())
        {
          seq.setGeneLoci(geneLoci.getSpeciesId(), geneLoci.getAssemblyId(),
-                 geneLoci.getChromosomeId(), geneLoci.getMap());
+                 geneLoci.getChromosomeId(), map);
          retrievedLoci.put(dbref, geneLoci);
          return true;
        }
              seq.getLength());
      if (geneLoci != null)
      {
-       MapList map = geneLoci.getMap();
+       MapList map = geneLoci.getMapping();
        int mappedFromLength = MappingUtils.getLength(map.getFromRanges());
        if (mappedFromLength == seq.getLength())
        {
          seq.setGeneLoci(geneLoci.getSpeciesId(), geneLoci.getAssemblyId(),
-                 geneLoci.getChromosomeId(), geneLoci.getMap());
+                 geneLoci.getChromosomeId(), map);
          retrievedLoci.put(dbref, geneLoci);
          return true;
        }
@@@ -1,5 -1,6 +1,5 @@@
  package jalview.io.vcf;
  
 -import jalview.analysis.AlignmentUtils;
  import jalview.analysis.Dna;
  import jalview.api.AlignViewControllerGuiI;
  import jalview.bin.Cache;
@@@ -653,8 -654,7 +653,8 @@@ public class VCFLoade
          /*
           * dna-to-peptide product mapping
           */
 -        AlignmentUtils.computeProteinFeatures(seq, mapTo, map);
 +        // JAL-3187 render on the fly instead
 +        // AlignmentUtils.computeProteinFeatures(seq, mapTo, map);
        }
        else
        {
      String species = seqCoords.getSpeciesId();
      String chromosome = seqCoords.getChromosomeId();
      String seqRef = seqCoords.getAssemblyId();
-     MapList map = seqCoords.getMap();
+     MapList map = seqCoords.getMapping();
  
      // note this requires the configured species to match that
      // returned with the Ensembl sequence; todo: support aliases?
@@@ -38,6 -38,8 +38,8 @@@ import jalview.datamodel.AlignedCodonFr
  import jalview.datamodel.Alignment;
  import jalview.datamodel.AlignmentAnnotation;
  import jalview.datamodel.AlignmentI;
+ import jalview.datamodel.DBRefEntry;
+ import jalview.datamodel.GeneLocus;
  import jalview.datamodel.GraphLine;
  import jalview.datamodel.PDBEntry;
  import jalview.datamodel.Point;
@@@ -58,6 -60,7 +60,6 @@@ import jalview.gui.AlignmentPanel
  import jalview.gui.AppVarna;
  import jalview.gui.ChimeraViewFrame;
  import jalview.gui.Desktop;
 -import jalview.gui.FeatureRenderer;
  import jalview.gui.JvOptionPane;
  import jalview.gui.OOMWarning;
  import jalview.gui.PCAPanel;
@@@ -91,7 -94,6 +93,7 @@@ import jalview.util.matcher.Condition
  import jalview.viewmodel.AlignmentViewport;
  import jalview.viewmodel.PCAModel;
  import jalview.viewmodel.ViewportRanges;
 +import jalview.viewmodel.seqfeatures.FeatureRendererModel;
  import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
  import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
  import jalview.ws.jws2.Jws2Discoverer;
@@@ -1503,7 -1505,7 +1505,7 @@@ public class Jalview2XM
        {
          FeatureSettings fs = new FeatureSettings();
  
 -        FeatureRenderer fr = ap.getSeqPanel().seqCanvas
 +        FeatureRendererModel fr = ap.getSeqPanel().seqCanvas
                  .getFeatureRenderer();
          String[] renderOrder = fr.getRenderOrder().toArray(new String[0]);
  
          parentseq = jds;
        }
      }
+     /*
+      * save any dbrefs; special subclass GeneLocus is flagged as 'locus'
+      */
      if (dbrefs != null)
      {
        for (int d = 0; d < dbrefs.length; d++)
        {
          DBRef dbref = new DBRef();
-         dbref.setSource(dbrefs[d].getSource());
-         dbref.setVersion(dbrefs[d].getVersion());
-         dbref.setAccessionId(dbrefs[d].getAccessionId());
-         if (dbrefs[d].hasMap())
+         DBRefEntry dbRefEntry = dbrefs[d];
+         dbref.setSource(dbRefEntry.getSource());
+         dbref.setVersion(dbRefEntry.getVersion());
+         dbref.setAccessionId(dbRefEntry.getAccessionId());
+         if (dbRefEntry instanceof GeneLocus)
          {
-           Mapping mp = createVamsasMapping(dbrefs[d].getMap(), parentseq,
+           dbref.setLocus(true);
+         }
+         if (dbRefEntry.hasMap())
+         {
+           Mapping mp = createVamsasMapping(dbRefEntry.getMap(), parentseq,
                    jds, recurse);
            dbref.setMapping(mp);
          }
-         // vamsasSeq.addDBRef(dbref);
          vamsasSeq.getDBRef().add(dbref);
        }
      }
      // recover feature settings
      if (jm.getFeatureSettings() != null)
      {
 -      FeatureRenderer fr = af.alignPanel.getSeqPanel().seqCanvas
 +      FeatureRendererModel fr = af.alignPanel.getSeqPanel().seqCanvas
                .getFeatureRenderer();
        FeaturesDisplayed fdi;
        viewport.setFeaturesDisplayed(fdi = new FeaturesDisplayed());
      return datasetId;
    }
  
+   /**
+    * Add any saved DBRefEntry's to the sequence. An entry flagged as 'locus' is
+    * constructed as a special subclass GeneLocus.
+    * 
+    * @param datasetSequence
+    * @param sequence
+    */
    private void addDBRefs(SequenceI datasetSequence, Sequence sequence)
    {
      for (int d = 0; d < sequence.getDBRef().size(); d++)
      {
        DBRef dr = sequence.getDBRef().get(d);
-       jalview.datamodel.DBRefEntry entry = new jalview.datamodel.DBRefEntry(
-               dr.getSource(), dr.getVersion(), dr.getAccessionId());
+       DBRefEntry entry;
+       if (dr.isLocus())
+       {
+         entry = new GeneLocus(dr.getSource(), dr.getVersion(),
+                 dr.getAccessionId());
+       }
+       else
+       {
+         entry = new DBRefEntry(dr.getSource(), dr.getVersion(),
+                 dr.getAccessionId());
+       }
        if (dr.getMapping() != null)
        {
          entry.setMap(addMapping(dr.getMapping()));
@@@ -34,7 -34,10 +34,10 @@@ import jalview.api.FeatureColourI
  import jalview.api.ViewStyleI;
  import jalview.datamodel.AlignmentAnnotation;
  import jalview.datamodel.AlignmentI;
+ import jalview.datamodel.DBRefEntry;
+ import jalview.datamodel.GeneLocus;
  import jalview.datamodel.HiddenSequences;
+ import jalview.datamodel.Mapping;
  import jalview.datamodel.PDBEntry;
  import jalview.datamodel.PDBEntry.Type;
  import jalview.datamodel.SequenceCollectionI;
@@@ -48,6 -51,7 +51,6 @@@ import jalview.gui.AlignFrame
  import jalview.gui.AlignViewport;
  import jalview.gui.AlignmentPanel;
  import jalview.gui.Desktop;
 -import jalview.gui.FeatureRenderer;
  import jalview.gui.JvOptionPane;
  import jalview.gui.PCAPanel;
  import jalview.gui.PopupMenu;
@@@ -67,9 -71,9 +70,10 @@@ import jalview.schemes.RNAHelicesColour
  import jalview.schemes.StrandColourScheme;
  import jalview.schemes.TCoffeeColourScheme;
  import jalview.structure.StructureImportSettings;
+ import jalview.util.MapList;
  import jalview.util.matcher.Condition;
  import jalview.viewmodel.AlignmentViewport;
 +import jalview.viewmodel.seqfeatures.FeatureRendererModel;
  
  import java.awt.Color;
  import java.io.File;
@@@ -920,7 -924,7 +924,7 @@@ public class Jalview2xmlTests extends J
      /*
       * set colour schemes for features
       */
 -    FeatureRenderer fr = af.getFeatureRenderer();
 +    FeatureRendererModel fr = af.getFeatureRenderer();
      fr.findAllFeatures(true);
  
      // type1: red
                      .getAlignViewport(),
              "Didn't restore correct view association for the PCA view");
    }
+   /**
+    * Test save and reload of DBRefEntry including GeneLocus in project
+    * 
+    * @throws Exception
+    */
+   @Test(groups = { "Functional" })
+   public void testStoreAndRecoverGeneLocus() throws Exception
+   {
+     Desktop.instance.closeAll_actionPerformed(null);
+     String seqData = ">P30419\nACDE\n>X1235\nGCCTGTGACGAA";
+     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(seqData,
+             DataSourceType.PASTE);
+     assertNotNull(af, "Didn't read in the example file correctly.");
+   
+     AlignmentViewPanel ap = Desktop.getAlignmentPanels(null)[0];
+     SequenceI pep = ap.getAlignment().getSequenceAt(0);
+     SequenceI cds = ap.getAlignment().getSequenceAt(1);
+     /*
+      * give 'protein' a dbref to self, a dbref with map to CDS,
+      * and a dbref with map to gene 'locus'
+      */
+     DBRefEntry dbref1 = new DBRefEntry("Uniprot", "1", "P30419", null);
+     pep.addDBRef(dbref1);
+     Mapping cdsmap = new Mapping(cds,
+             new MapList(new int[]
+             { 1, 4 }, new int[] { 1, 12 }, 1, 3));
+     DBRefEntry dbref2 = new DBRefEntry("EMBLCDS", "2", "X1235", cdsmap);
+     pep.addDBRef(dbref2);
+     Mapping locusmap = new Mapping(null,
+             new MapList(new int[]
+             { 1, 4 }, new int[] { 2674123, 2674135 }, 1, 3));
+     DBRefEntry dbref3 = new GeneLocus("human", "GRCh38", "5", locusmap);
+     pep.addDBRef(dbref3);
+     File tfile = File.createTempFile("testStoreAndRecoverGeneLocus",
+             ".jvp");
+     try
+     {
+       new Jalview2XML(false).saveState(tfile);
+     } catch (Throwable e)
+     {
+       Assert.fail("Didn't save the state", e);
+     }
+     Desktop.instance.closeAll_actionPerformed(null);
+   
+     new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
+             DataSourceType.FILE);
+     AlignmentViewPanel rap = Desktop.getAlignmentPanels(null)[0];
+     SequenceI rpep = rap.getAlignment().getSequenceAt(0);
+     assertEquals(rpep.getName(), "P30419");
+     DBRefEntry[] dbrefs = rpep.getDBRefs();
+     assertEquals(dbrefs.length, 3);
+     DBRefEntry dbRef = dbrefs[0];
+     assertFalse(dbRef instanceof GeneLocus);
+     assertNull(dbRef.getMap());
+     assertEquals(dbRef, dbref1);
+     /*
+      * restored dbrefs with mapping have a different 'map to'
+      * sequence but otherwise match the original dbrefs
+      */
+     dbRef = dbrefs[1];
+     assertFalse(dbRef instanceof GeneLocus);
+     assertTrue(dbRef.equalRef(dbref2));
+     assertNotNull(dbRef.getMap());
+     SequenceI rcds = rap.getAlignment().getSequenceAt(1);
+     assertSame(dbRef.getMap().getTo(), rcds);
+     // compare MapList but not map.to
+     assertEquals(dbRef.getMap().getMap(), dbref2.getMap().getMap());
+     /*
+      * GeneLocus map.to is null so can compare Mapping objects
+      */
+     dbRef = dbrefs[2];
+     assertTrue(dbRef instanceof GeneLocus);
+     assertEquals(dbRef, dbref3);
+   }
  }