From: gmungoc Date: Fri, 7 Jun 2019 15:22:03 +0000 (+0100) Subject: Merge branch 'develop' into feature/JAL-3187linkedFeatures X-Git-Tag: Release_2_11_1_0~52 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=b2eb64f196223039a95348a4026f0453693ee0e7;hp=-c;p=jalview.git Merge branch 'develop' into feature/JAL-3187linkedFeatures --- b2eb64f196223039a95348a4026f0453693ee0e7 diff --combined src/jalview/analysis/AlignmentUtils.java index 0440b24,0bc8180..4b4e2a7 --- a/src/jalview/analysis/AlignmentUtils.java +++ b/src/jalview/analysis/AlignmentUtils.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); @@@ -1870,7 -1870,7 +1870,7 @@@ return; } - MapList newMap = targetToFrom.traverse(fromLoci.getMap()); + MapList newMap = targetToFrom.traverse(fromLoci.getMapping()); if (newMap != null) { @@@ -2428,8 -2428,7 +2428,8 @@@ static int computePeptideVariants(SequenceI peptide, int peptidePos, List[] 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; diff --combined src/jalview/gui/CrossRefAction.java index 37f11df,51ac2ee..ac0e82a --- a/src/jalview/gui/CrossRefAction.java +++ b/src/jalview/gui/CrossRefAction.java @@@ -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); @@@ -357,12 -356,12 +357,12 @@@ 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; } @@@ -375,12 -374,12 +375,12 @@@ 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; } diff --combined src/jalview/io/vcf/VCFLoader.java index 93be43a,7bf7791..1ac9ad7 --- a/src/jalview/io/vcf/VCFLoader.java +++ b/src/jalview/io/vcf/VCFLoader.java @@@ -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 { @@@ -737,7 -737,7 +737,7 @@@ 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? diff --combined src/jalview/project/Jalview2XML.java index ef885c1,0e17779..9a303e2 --- a/src/jalview/project/Jalview2XML.java +++ b/src/jalview/project/Jalview2XML.java @@@ -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]); @@@ -2505,21 -2507,29 +2507,29 @@@ 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); } } @@@ -5013,7 -5023,7 +5023,7 @@@ // 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()); @@@ -5798,13 -5808,29 +5808,29 @@@ 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())); diff --combined test/jalview/project/Jalview2xmlTests.java index f5044bb,5f1256c..521ef81 --- a/test/jalview/project/Jalview2xmlTests.java +++ b/test/jalview/project/Jalview2xmlTests.java @@@ -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 @@@ -1179,4 -1183,83 +1183,83 @@@ .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); + } }