From c4baa6ec459f004be9c3b3d50cfbb29212b13312 Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Sat, 13 Aug 2016 17:06:25 +0100 Subject: [PATCH] JAL-2154 refactor CrossRef UI code to its own class JAL-2154 first pass of cross-ref + project save/restore test --- src/jalview/gui/AlignFrame.java | 232 +---------- src/jalview/gui/CrossRefAction.java | 305 +++++++++++++++ test/jalview/io/CrossRef2xmlTests.java | 659 ++++---------------------------- 3 files changed, 386 insertions(+), 810 deletions(-) create mode 100644 src/jalview/gui/CrossRefAction.java diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index b0debf8..84edb4e 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -32,7 +32,6 @@ import jalview.api.AlignViewControllerI; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.FeatureSettingsControllerI; -import jalview.api.FeatureSettingsModelI; import jalview.api.SplitContainerI; import jalview.api.ViewStyleI; import jalview.api.analysis.ScoreModelI; @@ -54,7 +53,6 @@ import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.AlignmentView; import jalview.datamodel.ColumnSelection; -import jalview.datamodel.DBRefSource; import jalview.datamodel.HiddenSequences; import jalview.datamodel.PDBEntry; import jalview.datamodel.SeqCigar; @@ -74,7 +72,6 @@ import jalview.io.JalviewFileView; import jalview.io.JnetAnnotationMaker; import jalview.io.NewickFile; import jalview.io.TCoffeeScoreFile; -import jalview.io.gff.SequenceOntologyI; import jalview.jbgui.GAlignFrame; import jalview.schemes.Blosum62ColourScheme; import jalview.schemes.BuriedColourScheme; @@ -94,12 +91,10 @@ import jalview.schemes.TaylorColourScheme; import jalview.schemes.TurnColourScheme; import jalview.schemes.UserColourScheme; import jalview.schemes.ZappoColourScheme; -import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; import jalview.ws.DBRefFetcher; import jalview.ws.DBRefFetcher.FetchFinishedListenerI; -import jalview.ws.SequenceFetcher; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; import jalview.ws.jws2.jabaws2.Jws2Instance; @@ -4703,231 +4698,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void showProductsFor(final SequenceI[] sel, final boolean _odna, final String source) { - Runnable foo = new Runnable() - { - - @Override - public void run() - { - final long sttime = System.currentTimeMillis(); - AlignFrame.this.setProgressBar(MessageManager.formatMessage( - "status.searching_for_sequences_from", - new Object[] { source }), sttime); - try - { - AlignmentI alignment = AlignFrame.this.getViewport() - .getAlignment(); - AlignmentI dataset = alignment.getDataset() == null ? alignment - : alignment.getDataset(); - boolean dna = alignment.isNucleotide(); - if (_odna != dna) - { - System.err - .println("Conflict: showProducts for alignment originally " - + "thought to be " - + (_odna ? "DNA" : "Protein") - + " now searching for " - + (dna ? "DNA" : "Protein") + " Context."); - } - AlignmentI xrefs = new CrossRef(sel, dataset).findXrefSequences( - source, dna); - if (xrefs == null) - { - return; - } - /* - * get display scheme (if any) to apply to features - */ - FeatureSettingsModelI featureColourScheme = new SequenceFetcher() - .getFeatureColourScheme(source); - - AlignmentI xrefsAlignment = makeCrossReferencesAlignment(dataset, - xrefs); - if (!dna) - { - xrefsAlignment = AlignmentUtils.makeCdsAlignment( - xrefsAlignment.getSequencesArray(), dataset, sel); - xrefsAlignment.alignAs(alignment); - } - - /* - * If we are opening a splitframe, make a copy of this alignment (sharing the same dataset - * sequences). If we are DNA, drop introns and update mappings - */ - AlignmentI copyAlignment = null; - - if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) - { - boolean copyAlignmentIsAligned = false; - if (dna) - { - copyAlignment = AlignmentUtils.makeCdsAlignment(sel, dataset, - xrefsAlignment.getSequencesArray()); - if (copyAlignment.getHeight() == 0) - { - System.err.println("Failed to make CDS alignment"); - } - - /* - * pending getting Embl transcripts to 'align', - * we are only doing this for Ensembl - */ - // TODO proper criteria for 'can align as cdna' - if (DBRefSource.ENSEMBL.equalsIgnoreCase(source) - || AlignmentUtils.looksLikeEnsembl(alignment)) - { - copyAlignment.alignAs(alignment); - copyAlignmentIsAligned = true; - } - } - else - { - copyAlignment = AlignmentUtils.makeCopyAlignment(sel, - xrefs.getSequencesArray(), dataset); - } - copyAlignment.setGapCharacter(AlignFrame.this.viewport - .getGapCharacter()); - - StructureSelectionManager ssm = StructureSelectionManager - .getStructureSelectionManager(Desktop.instance); - - /* - * register any new mappings for sequence mouseover etc - * (will not duplicate any previously registered mappings) - */ - ssm.registerMappings(dataset.getCodonFrames()); - - if (copyAlignment.getHeight() <= 0) - { - System.err.println("No Sequences generated for xRef type " - + source); - return; - } - /* - * align protein to dna - */ - if (dna && copyAlignmentIsAligned) - { - xrefsAlignment.alignAs(copyAlignment); - } - else - { - /* - * align cdna to protein - currently only if - * fetching and aligning Ensembl transcripts! - */ - // TODO: generalise for other sources of locus/transcript/cds data - if (dna && DBRefSource.ENSEMBL.equalsIgnoreCase(source)) - { - copyAlignment.alignAs(xrefsAlignment); - } - } - } - /* - * build AlignFrame(s) according to available alignment data - */ - AlignFrame newFrame = new AlignFrame(xrefsAlignment, - DEFAULT_WIDTH, DEFAULT_HEIGHT); - if (Cache.getDefault("HIDE_INTRONS", true)) - { - newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false); - } - String newtitle = String.format("%s %s %s", MessageManager - .getString(dna ? "label.proteins" : "label.nucleotides"), - MessageManager.getString("label.for"), getTitle()); - newFrame.setTitle(newtitle); - - if (copyAlignment == null) - { - /* - * split frame display is turned off in preferences file - */ - Desktop.addInternalFrame(newFrame, newtitle, DEFAULT_WIDTH, - DEFAULT_HEIGHT); - return; // via finally clause - } - AlignFrame copyThis = new AlignFrame(copyAlignment, - AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); - copyThis.setTitle(AlignFrame.this.getTitle()); - - boolean showSequenceFeatures = viewport.isShowSequenceFeatures(); - newFrame.setShowSeqFeatures(showSequenceFeatures); - copyThis.setShowSeqFeatures(showSequenceFeatures); - FeatureRenderer myFeatureStyling = alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer(); - - /* - * copy feature rendering settings to split frame - */ - newFrame.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() - .transferSettings(myFeatureStyling); - copyThis.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() - .transferSettings(myFeatureStyling); - - /* - * apply 'database source' feature configuration - * if any was found - */ - // TODO is this the feature colouring for the original - // alignment or the fetched xrefs? either could be Ensembl - newFrame.getViewport().applyFeaturesStyle(featureColourScheme); - copyThis.getViewport().applyFeaturesStyle(featureColourScheme); - - SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame, - dna ? newFrame : copyThis); - newFrame.setVisible(true); - copyThis.setVisible(true); - String linkedTitle = MessageManager - .getString("label.linked_view_title"); - Desktop.addInternalFrame(sf, linkedTitle, -1, -1); - sf.adjustDivider(); - } catch (OutOfMemoryError e) - { - new OOMWarning("whilst fetching crossreferences", e); - } catch (Throwable e) - { - Cache.log.error("Error when finding crossreferences", e); - } finally - { - AlignFrame.this.setProgressBar(MessageManager.formatMessage( - "status.finished_searching_for_sequences_from", - new Object[] { source }), sttime); - } - } - - /** - * Makes an alignment containing the given sequences, and adds them to the - * given dataset, which is also set as the dataset for the new alignment - * - * TODO: refactor to DatasetI method - * - * @param dataset - * @param seqs - * @return - */ - protected AlignmentI makeCrossReferencesAlignment(AlignmentI dataset, - AlignmentI seqs) - { - SequenceI[] sprods = new SequenceI[seqs.getHeight()]; - for (int s = 0; s < sprods.length; s++) - { - sprods[s] = (seqs.getSequenceAt(s)).deriveSequence(); - if (dataset.getSequences() == null - || !dataset.getSequences().contains( - sprods[s].getDatasetSequence())) - { - dataset.addSequence(sprods[s].getDatasetSequence()); - } - sprods[s].updatePDBIds(); - } - Alignment al = new Alignment(sprods); - al.setDataset(dataset); - return al; - } - - }; - Thread frunner = new Thread(foo); - frunner.start(); + new Thread(CrossRefAction.showProductsFor(sel, _odna, source, this)) + .start(); } /** diff --git a/src/jalview/gui/CrossRefAction.java b/src/jalview/gui/CrossRefAction.java new file mode 100644 index 0000000..cb315d6 --- /dev/null +++ b/src/jalview/gui/CrossRefAction.java @@ -0,0 +1,305 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.gui; + +import jalview.analysis.AlignmentUtils; +import jalview.analysis.CrossRef; +import jalview.api.AlignmentViewPanel; +import jalview.api.FeatureSettingsModelI; +import jalview.bin.Cache; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.DBRefSource; +import jalview.datamodel.SequenceI; +import jalview.io.gff.SequenceOntologyI; +import jalview.structure.StructureSelectionManager; +import jalview.util.MessageManager; +import jalview.ws.SequenceFetcher; + +import java.util.ArrayList; +import java.util.List; + +/** + * Factory constructor and runnable for discovering and displaying + * cross-references for a set of aligned sequences + * + * @author jprocter + * + */ +public class CrossRefAction implements Runnable +{ + private AlignFrame alignFrame; + + private SequenceI[] sel; + + private boolean _odna; + + private String source; + + List xrefViews = new ArrayList(); + + public List getXrefViews() + { + return xrefViews; + } + + @Override + public void run() + { + final long sttime = System.currentTimeMillis(); + alignFrame.setProgressBar( + MessageManager.formatMessage( + "status.searching_for_sequences_from", + new Object[] { source }), sttime); + try + { + AlignmentI alignment = alignFrame.getViewport().getAlignment(); + AlignmentI dataset = alignment.getDataset() == null ? alignment + : alignment.getDataset(); + boolean dna = alignment.isNucleotide(); + if (_odna != dna) + { + System.err + .println("Conflict: showProducts for alignment originally " + + "thought to be " + (_odna ? "DNA" : "Protein") + + " now searching for " + (dna ? "DNA" : "Protein") + + " Context."); + } + AlignmentI xrefs = new CrossRef(sel, dataset).findXrefSequences( + source, dna); + if (xrefs == null) + { + return; + } + /* + * get display scheme (if any) to apply to features + */ + FeatureSettingsModelI featureColourScheme = new SequenceFetcher() + .getFeatureColourScheme(source); + + AlignmentI xrefsAlignment = makeCrossReferencesAlignment(dataset, + xrefs); + if (!dna) + { + xrefsAlignment = AlignmentUtils.makeCdsAlignment( + xrefsAlignment.getSequencesArray(), dataset, sel); + xrefsAlignment.alignAs(alignment); + } + + /* + * If we are opening a splitframe, make a copy of this alignment (sharing the same dataset + * sequences). If we are DNA, drop introns and update mappings + */ + AlignmentI copyAlignment = null; + + if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) + { + boolean copyAlignmentIsAligned = false; + if (dna) + { + copyAlignment = AlignmentUtils.makeCdsAlignment(sel, dataset, + xrefsAlignment.getSequencesArray()); + if (copyAlignment.getHeight() == 0) + { + System.err.println("Failed to make CDS alignment"); + } + + /* + * pending getting Embl transcripts to 'align', + * we are only doing this for Ensembl + */ + // TODO proper criteria for 'can align as cdna' + if (DBRefSource.ENSEMBL.equalsIgnoreCase(source) + || AlignmentUtils.looksLikeEnsembl(alignment)) + { + copyAlignment.alignAs(alignment); + copyAlignmentIsAligned = true; + } + } + else + { + copyAlignment = AlignmentUtils.makeCopyAlignment(sel, + xrefs.getSequencesArray(), dataset); + } + copyAlignment + .setGapCharacter(alignFrame.viewport.getGapCharacter()); + + StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); + + /* + * register any new mappings for sequence mouseover etc + * (will not duplicate any previously registered mappings) + */ + ssm.registerMappings(dataset.getCodonFrames()); + + if (copyAlignment.getHeight() <= 0) + { + System.err.println("No Sequences generated for xRef type " + + source); + return; + } + /* + * align protein to dna + */ + if (dna && copyAlignmentIsAligned) + { + xrefsAlignment.alignAs(copyAlignment); + } + else + { + /* + * align cdna to protein - currently only if + * fetching and aligning Ensembl transcripts! + */ + // TODO: generalise for other sources of locus/transcript/cds data + if (dna && DBRefSource.ENSEMBL.equalsIgnoreCase(source)) + { + copyAlignment.alignAs(xrefsAlignment); + } + } + } + /* + * build AlignFrame(s) according to available alignment data + */ + AlignFrame newFrame = new AlignFrame(xrefsAlignment, + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + if (Cache.getDefault("HIDE_INTRONS", true)) + { + newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false); + } + String newtitle = String.format("%s %s %s", MessageManager + .getString(dna ? "label.proteins" : "label.nucleotides"), + MessageManager.getString("label.for"), alignFrame.getTitle()); + newFrame.setTitle(newtitle); + + if (copyAlignment == null) + { + /* + * split frame display is turned off in preferences file + */ + Desktop.addInternalFrame(newFrame, newtitle, + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + xrefViews.add(newFrame.alignPanel); + return; // via finally clause + } + AlignFrame copyThis = new AlignFrame(copyAlignment, + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + copyThis.setTitle(alignFrame.getTitle()); + + boolean showSequenceFeatures = alignFrame.getViewport() + .isShowSequenceFeatures(); + newFrame.setShowSeqFeatures(showSequenceFeatures); + copyThis.setShowSeqFeatures(showSequenceFeatures); + FeatureRenderer myFeatureStyling = alignFrame.alignPanel + .getSeqPanel().seqCanvas.getFeatureRenderer(); + + /* + * copy feature rendering settings to split frame + */ + newFrame.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() + .transferSettings(myFeatureStyling); + copyThis.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() + .transferSettings(myFeatureStyling); + + /* + * apply 'database source' feature configuration + * if any was found + */ + // TODO is this the feature colouring for the original + // alignment or the fetched xrefs? either could be Ensembl + newFrame.getViewport().applyFeaturesStyle(featureColourScheme); + copyThis.getViewport().applyFeaturesStyle(featureColourScheme); + + SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame, + dna ? newFrame : copyThis); + newFrame.setVisible(true); + copyThis.setVisible(true); + String linkedTitle = MessageManager + .getString("label.linked_view_title"); + Desktop.addInternalFrame(sf, linkedTitle, -1, -1); + sf.adjustDivider(); + + // finally add the top, then bottom frame to the view list + xrefViews.add(dna ? copyThis.alignPanel : newFrame.alignPanel); + xrefViews.add(!dna ? copyThis.alignPanel : newFrame.alignPanel); + + } catch (OutOfMemoryError e) + { + new OOMWarning("whilst fetching crossreferences", e); + } catch (Throwable e) + { + Cache.log.error("Error when finding crossreferences", e); + } finally + { + alignFrame.setProgressBar(MessageManager.formatMessage( + "status.finished_searching_for_sequences_from", + new Object[] { source }), sttime); + } + } + + /** + * Makes an alignment containing the given sequences, and adds them to the + * given dataset, which is also set as the dataset for the new alignment + * + * TODO: refactor to DatasetI method + * + * @param dataset + * @param seqs + * @return + */ + protected AlignmentI makeCrossReferencesAlignment(AlignmentI dataset, + AlignmentI seqs) + { + SequenceI[] sprods = new SequenceI[seqs.getHeight()]; + for (int s = 0; s < sprods.length; s++) + { + sprods[s] = (seqs.getSequenceAt(s)).deriveSequence(); + if (dataset.getSequences() == null + || !dataset.getSequences().contains( + sprods[s].getDatasetSequence())) + { + dataset.addSequence(sprods[s].getDatasetSequence()); + } + sprods[s].updatePDBIds(); + } + Alignment al = new Alignment(sprods); + al.setDataset(dataset); + return al; + } + + public CrossRefAction(AlignFrame alignFrame, SequenceI[] sel, + boolean _odna, String source) + { + this.alignFrame = alignFrame; + this.sel = sel; + this._odna = _odna; + this.source = source; + } + + public static CrossRefAction showProductsFor(final SequenceI[] sel, + final boolean _odna, final String source, + final AlignFrame alignFrame) + { + return new CrossRefAction(alignFrame, sel, _odna, source); + } + +} diff --git a/test/jalview/io/CrossRef2xmlTests.java b/test/jalview/io/CrossRef2xmlTests.java index 36ea69e..dd6aac6 100644 --- a/test/jalview/io/CrossRef2xmlTests.java +++ b/test/jalview/io/CrossRef2xmlTests.java @@ -20,615 +20,114 @@ */ package jalview.io; -import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertFalse; -import static org.testng.AssertJUnit.assertNotNull; -import static org.testng.AssertJUnit.assertSame; import static org.testng.AssertJUnit.assertTrue; -import jalview.api.AlignViewportI; +import jalview.analysis.CrossRef; import jalview.api.AlignmentViewPanel; -import jalview.api.ViewStyleI; -import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; -import jalview.datamodel.HiddenSequences; -import jalview.datamodel.SequenceCollectionI; -import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; +import jalview.gui.CrossRefAction; import jalview.gui.Desktop; -import jalview.gui.Jalview2XML; -import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.ColourSchemeI; -import jalview.structure.StructureImportSettings; -import jalview.viewmodel.AlignmentViewport; -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.List; -import java.util.Map; import org.testng.Assert; -import org.testng.AssertJUnit; import org.testng.annotations.Test; @Test(singleThreaded = true) public class CrossRef2xmlTests extends Jalview2xmlBase { - @Test(groups = { "Functional" }) - public void testRNAStructureRecovery() throws Exception - { - String inFile = "examples/RF00031_folded.stk"; - String tfile = File.createTempFile("JalviewTest", ".jvp") - .getAbsolutePath(); - AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - inFile, FormatAdapter.FILE); - assertTrue("Didn't read input file " + inFile, af != null); - int olddsann = countDsAnn(af.getViewport()); - assertTrue("Didn't find any dataset annotations", olddsann > 0); - af.rnahelicesColour_actionPerformed(null); - assertTrue( - "Couldn't apply RNA helices colourscheme", - af.getViewport().getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour); - assertTrue("Failed to store as a project.", - af.saveAlignment(tfile, "Jalview")); - af.closeMenuItem_actionPerformed(true); - af = null; - af = new jalview.io.FileLoader().LoadFileWaitTillLoaded(tfile, - FormatAdapter.FILE); - assertTrue("Failed to import new project", af != null); - int newdsann = countDsAnn(af.getViewport()); - assertTrue( - "Differing numbers of dataset sequence annotation\nOriginally " - + olddsann + " and now " + newdsann, - olddsann == newdsann); - System.out - .println("Read in same number of annotations as originally present (" - + olddsann + ")"); - assertTrue( - "RNA helices colourscheme was not applied on import.", - af.getViewport().getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour); - } - - @Test(groups = { "Functional" }) - public void testTCoffeeScores() throws Exception - { - String inFile = "examples/uniref50.fa", inAnnot = "examples/uniref50.score_ascii"; - String tfile = File.createTempFile("JalviewTest", ".jvp") - .getAbsolutePath(); - AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - inFile, FormatAdapter.FILE); - assertTrue("Didn't read input file " + inFile, af != null); - af.loadJalviewDataFile(inAnnot, FormatAdapter.FILE, null, null); - assertTrue( - "Didn't set T-coffee colourscheme", - af.getViewport().getGlobalColourScheme().getClass() - .equals(jalview.schemes.TCoffeeColourScheme.class)); - assertTrue( - "Recognise T-Coffee score from string", - jalview.schemes.ColourSchemeProperty.getColour(af.getViewport() - .getAlignment(), - jalview.schemes.ColourSchemeProperty.getColourName(af - .getViewport().getGlobalColourScheme())) != null); - - assertTrue("Failed to store as a project.", - af.saveAlignment(tfile, "Jalview")); - af.closeMenuItem_actionPerformed(true); - af = null; - af = new jalview.io.FileLoader().LoadFileWaitTillLoaded(tfile, - FormatAdapter.FILE); - assertTrue("Failed to import new project", af != null); - assertTrue( - "Didn't set T-coffee colourscheme for imported project.", - af.getViewport().getGlobalColourScheme().getClass() - .equals(jalview.schemes.TCoffeeColourScheme.class)); - System.out - .println("T-Coffee score shading successfully recovered from project."); - } - - @Test(groups = { "Functional" }) - public void testColourByAnnotScores() throws Exception - { - String inFile = "examples/uniref50.fa", inAnnot = "examples/testdata/uniref50_iupred.jva"; - String tfile = File.createTempFile("JalviewTest", ".jvp") - .getAbsolutePath(); - AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - inFile, FormatAdapter.FILE); - assertTrue("Didn't read input file " + inFile, af != null); - af.loadJalviewDataFile(inAnnot, FormatAdapter.FILE, null, null); - AlignmentAnnotation[] aa = af.getViewport().getAlignment() - .getSequenceAt(0).getAnnotation("IUPredWS (Short)"); - assertTrue( - "Didn't find any IUPred annotation to use to shade alignment.", - aa != null && aa.length > 0); - AnnotationColourGradient cs = new jalview.schemes.AnnotationColourGradient( - aa[0], null, AnnotationColourGradient.ABOVE_THRESHOLD); - AnnotationColourGradient gcs = new jalview.schemes.AnnotationColourGradient( - aa[0], null, AnnotationColourGradient.BELOW_THRESHOLD); - cs.setSeqAssociated(true); - gcs.setSeqAssociated(true); - af.changeColour(cs); - SequenceGroup sg = new SequenceGroup(); - sg.setStartRes(57); - sg.setEndRes(92); - sg.cs = gcs; - af.getViewport().getAlignment().addGroup(sg); - sg.addSequence(af.getViewport().getAlignment().getSequenceAt(1), false); - sg.addSequence(af.getViewport().getAlignment().getSequenceAt(2), true); - af.alignPanel.alignmentChanged(); - assertTrue("Failed to store as a project.", - af.saveAlignment(tfile, "Jalview")); - af.closeMenuItem_actionPerformed(true); - af = null; - af = new jalview.io.FileLoader().LoadFileWaitTillLoaded(tfile, - FormatAdapter.FILE); - assertTrue("Failed to import new project", af != null); - - // check for group and alignment colourschemes - - ColourSchemeI _rcs = af.getViewport().getGlobalColourScheme(); - ColourSchemeI _rgcs = af.getViewport().getAlignment().getGroups() - .get(0).cs; - assertTrue("Didn't recover global colourscheme", _rcs != null); - assertTrue("Didn't recover annotation colour global scheme", - _rcs instanceof AnnotationColourGradient); - AnnotationColourGradient __rcs = (AnnotationColourGradient) _rcs; - assertTrue("Annotation colourscheme wasn't sequence associated", - __rcs.isSeqAssociated()); - - boolean diffseqcols = false, diffgseqcols = false; - SequenceI[] sqs = af.getViewport().getAlignment().getSequencesArray(); - for (int p = 0, pSize = af.getViewport().getAlignment().getWidth(); p < pSize - && (!diffseqcols || !diffgseqcols); p++) - { - if (_rcs.findColour(sqs[0].getCharAt(p), p, sqs[0]) != _rcs - .findColour(sqs[5].getCharAt(p), p, sqs[5])) - { - diffseqcols = true; - } - } - assertTrue("Got Different sequence colours", diffseqcols); - System.out - .println("Per sequence colourscheme (Background) successfully applied and recovered."); - - assertTrue("Didn't recover group colourscheme", _rgcs != null); - assertTrue("Didn't recover annotation colour group colourscheme", - _rgcs instanceof AnnotationColourGradient); - __rcs = (AnnotationColourGradient) _rgcs; - assertTrue("Group Annotation colourscheme wasn't sequence associated", - __rcs.isSeqAssociated()); - - for (int p = 0, pSize = af.getViewport().getAlignment().getWidth(); p < pSize - && (!diffseqcols || !diffgseqcols); p++) - { - if (_rgcs.findColour(sqs[1].getCharAt(p), p, sqs[1]) != _rgcs - .findColour(sqs[2].getCharAt(p), p, sqs[2])) - { - diffgseqcols = true; - } - } - assertTrue("Got Different group sequence colours", diffgseqcols); - System.out - .println("Per sequence (Group) colourscheme successfully applied and recovered."); - } - - @Test(groups = { "Functional" }) - public void gatherViewsHere() throws Exception - { - int origCount = Desktop.getAlignFrames() == null ? 0 : Desktop - .getAlignFrames().length; - AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - "examples/exampleFile_2_7.jar", FormatAdapter.FILE); - assertTrue("Didn't read in the example file correctly.", af != null); - assertTrue("Didn't gather the views in the example file.", - Desktop.getAlignFrames().length == 1 + origCount); - - } - - @Test(groups = { "Functional" }) - public void viewRefPdbAnnotation() throws Exception - { - // TODO: Make this pass without setting StructureParser.JALVIEW_PARSER - // StructureImportSettings - // .setDefaultPDBFileParser(StructureParser.JALVIEW_PARSER); - StructureImportSettings.setProcessSecondaryStructure(true); - StructureImportSettings.setVisibleChainAnnotation(true); - AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - "examples/exampleFile_2_7.jar", FormatAdapter.FILE); - assertTrue("Didn't read in the example file correctly.", af != null); - AlignmentViewPanel sps = null; - for (AlignmentViewPanel ap : af.alignPanel.alignFrame.getAlignPanels()) - { - if ("Spinach Feredoxin Structure".equals(ap.getViewName())) - { - sps = ap; - break; - } - } - assertTrue("Couldn't find the structure view", sps != null); - SequenceI sq = sps.getAlignment().findName("1A70|"); - AlignmentAnnotation refan = null; - for (AlignmentAnnotation ra : sps.getAlignment() - .getAlignmentAnnotation()) - { - if (ra.graph != 0) - { - refan = ra; - break; - } - } - assertTrue("Annotation secondary structure not found.", refan != null); - assertTrue("Couldn't find 1a70 null chain", sq != null); - // compare the manually added temperature factor annotation - // to the track automatically transferred from the pdb structure on load - for (AlignmentAnnotation ala : sq.getDatasetSequence().getAnnotation()) - { - AlignmentAnnotation alaa; - sq.addAlignmentAnnotation(alaa = new AlignmentAnnotation(ala)); - alaa.adjustForAlignment(); - if (ala.graph == refan.graph) - { - for (int p = 0; p < ala.annotations.length; p++) - { - sq.findPosition(p); - try - { - assertTrue( - "Mismatch at alignment position " + p, - (alaa.annotations[p] == null && refan.annotations[p] == null) - || alaa.annotations[p].value == refan.annotations[p].value); - } catch (NullPointerException q) - { - Assert.fail("Mismatch of alignment annotations at position " - + p + " Ref seq ann: " + refan.annotations[p] - + " alignment " + alaa.annotations[p]); - } - } - } - } - - } - - @Test(groups = { "Functional" }) - public void testCopyViewSettings() throws Exception - { - AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - "examples/exampleFile_2_7.jar", FormatAdapter.FILE); - assertTrue("Didn't read in the example file correctly.", af != null); - AlignmentViewPanel sps = null, groups = null; - for (AlignmentViewPanel ap : af.alignPanel.alignFrame.getAlignPanels()) - { - if ("Spinach Feredoxin Structure".equals(ap.getViewName())) - { - sps = ap; - } - if (ap.getViewName().contains("MAFFT")) - { - groups = ap; - } - } - assertTrue("Couldn't find the structure view", sps != null); - assertTrue("Couldn't find the MAFFT view", groups != null); - - ViewStyleI structureStyle = sps.getAlignViewport().getViewStyle(); - ViewStyleI groupStyle = groups.getAlignViewport().getViewStyle(); - AssertJUnit.assertFalse(structureStyle.sameStyle(groupStyle)); - - groups.getAlignViewport().setViewStyle(structureStyle); - AssertJUnit.assertFalse(groupStyle.sameStyle(groups.getAlignViewport() - .getViewStyle())); - Assert.assertTrue(structureStyle.sameStyle(groups.getAlignViewport() - .getViewStyle())); - - } - /** * test store and recovery of expanded views * * @throws Exception */ - @Test(groups = { "Functional" }, enabled = true) - public void testStoreAndRecoverExpandedviews() throws Exception - { - Desktop.instance.closeAll_actionPerformed(null); - - AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - "examples/exampleFile_2_7.jar", FormatAdapter.FILE); - assertTrue("Didn't read in the example file correctly.", af != null); - Assert.assertEquals(Desktop.getAlignFrames().length, 1); - String afid = af.getViewport().getSequenceSetId(); - - // check FileLoader returned a reference to the one alignFrame that is - // actually on the Desktop - assertTrue( - "Jalview2XML.loadAlignFrame() didn't return correct AlignFrame reference for multiple view window", - af == Desktop.getAlignFrameFor(af.getViewport())); - - Desktop.explodeViews(af); - - int oldviews = Desktop.getAlignFrames().length; - Assert.assertEquals(Desktop.getAlignFrames().length, - Desktop.getAlignmentPanels(afid).length); - File tfile = File.createTempFile("testStoreAndRecoverExpanded", ".jvp"); - try - { - new Jalview2XML(false).saveState(tfile); - } catch (Error e) - { - Assert.fail("Didn't save the expanded view state", e); - } catch (Exception e) - { - Assert.fail("Didn't save the expanded view state", e); - } - Desktop.instance.closeAll_actionPerformed(null); - if (Desktop.getAlignFrames() != null) - { - Assert.assertEquals(Desktop.getAlignFrames().length, 0); - } - af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( - tfile.getAbsolutePath(), FormatAdapter.FILE); - Assert.assertNotNull(af); - Assert.assertEquals( - Desktop.getAlignFrames().length, - Desktop.getAlignmentPanels(af.getViewport().getSequenceSetId()).length); - Assert.assertEquals( - oldviews, - Desktop.getAlignmentPanels(af.getViewport().getSequenceSetId()).length); - } - - /** - * Test save and reload of a project with a different representative sequence - * in each view. - * - * @throws Exception - */ - @Test(groups = { "Functional" }) - public void testStoreAndRecoverReferenceSeqSettings() throws Exception - { - Desktop.instance.closeAll_actionPerformed(null); - AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( - "examples/exampleFile_2_7.jar", FormatAdapter.FILE); - assertTrue("Didn't read in the example file correctly.", af != null); - String afid = af.getViewport().getSequenceSetId(); - - // remember reference sequence for each panel - Map refseqs = new HashMap(); - - /* - * mark sequence 2, 3, 4.. in panels 1, 2, 3... - * as reference sequence for itself and the preceding sequence - */ - int n = 1; - for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) - { - AlignViewportI av = ap.getAlignViewport(); - AlignmentI alignment = ap.getAlignment(); - int repIndex = n % alignment.getHeight(); - SequenceI rep = alignment.getSequenceAt(repIndex); - refseqs.put(ap.getViewName(), rep); - - // code from mark/unmark sequence as reference in jalview.gui.PopupMenu - // todo refactor this to an alignment view controller - av.setDisplayReferenceSeq(true); - av.setColourByReferenceSeq(true); - av.getAlignment().setSeqrep(rep); - - n++; - } - File tfile = File.createTempFile("testStoreAndRecoverReferenceSeq", - ".jvp"); - try - { - new Jalview2XML(false).saveState(tfile); - } catch (Throwable e) - { - Assert.fail("Didn't save the expanded view state", e); - } - Desktop.instance.closeAll_actionPerformed(null); - if (Desktop.getAlignFrames() != null) - { - Assert.assertEquals(Desktop.getAlignFrames().length, 0); - } - - af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(), - FormatAdapter.FILE); - afid = af.getViewport().getSequenceSetId(); - - for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) - { - // check representative - AlignmentI alignment = ap.getAlignment(); - SequenceI rep = alignment.getSeqrep(); - Assert.assertNotNull(rep, - "Couldn't restore sequence representative from project"); - // can't use a strong equals here, because by definition, the sequence IDs - // will be different. - // could set vamsas session save/restore flag to preserve IDs across - // load/saves. - Assert.assertEquals(refseqs.get(ap.getViewName()).toString(), - rep.toString(), - "Representative wasn't the same when recovered."); - Assert.assertTrue(ap.getAlignViewport().isDisplayReferenceSeq(), - "Display reference sequence view setting not set."); - Assert.assertTrue(ap.getAlignViewport().isColourByReferenceSeq(), - "Colour By Reference Seq view setting not set."); - } - } - - @Test(groups = { "Functional" }) - public void testIsVersionStringLaterThan() - { - /* - * No version / development / test / autobuild is leniently assumed to be - * compatible - */ - assertTrue(Jalview2XML.isVersionStringLaterThan(null, null)); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", null)); - assertTrue(Jalview2XML.isVersionStringLaterThan(null, "2.8.3")); - assertTrue(Jalview2XML.isVersionStringLaterThan(null, - "Development Build")); - assertTrue(Jalview2XML.isVersionStringLaterThan(null, - "DEVELOPMENT BUILD")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", - "Development Build")); - assertTrue(Jalview2XML.isVersionStringLaterThan(null, "Test")); - assertTrue(Jalview2XML.isVersionStringLaterThan(null, "TEST")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "Test")); - assertTrue(Jalview2XML - .isVersionStringLaterThan(null, "Automated Build")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", - "Automated Build")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", - "AUTOMATED BUILD")); - - /* - * same version returns true i.e. compatible - */ - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8", "2.8")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8.3")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3b1", "2.8.3b1")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3B1", "2.8.3b1")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3b1", "2.8.3B1")); - - /* - * later version returns true - */ - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8.4")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.9")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.9.2")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8", "2.8.3")); - assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8.3b1")); - - /* - * earlier version returns false - */ - assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8")); - assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.4", "2.8.3")); - assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.3b1", "2.8.3")); - assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8.2b1")); - assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.0b2", "2.8.0b1")); - } - - /** - * Test save and reload of a project with a different sequence group (and - * representative sequence) in each view. - * - * @throws Exception - */ - @Test(groups = { "Functional" }) - public void testStoreAndRecoverGroupRepSeqs() throws Exception + @Test(groups = { "Operational" }, enabled = true) + public void testRetrieveAndShowCrossref() throws Exception { - Desktop.instance.closeAll_actionPerformed(null); - AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( - "examples/uniref50.fa", FormatAdapter.FILE); - assertTrue("Didn't read in the example file correctly.", af != null); - String afid = af.getViewport().getSequenceSetId(); - // make a second view of the alignment - af.newView_actionPerformed(null); - - /* - * remember representative and hidden sequences marked - * on each panel - */ - Map repSeqs = new HashMap(); - Map> hiddenSeqNames = new HashMap>(); - - /* - * mark sequence 2, 3, 4.. in panels 1, 2, 3... - * as reference sequence for itself and the preceding sequence - */ - int n = 1; - for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) - { - AlignViewportI av = ap.getAlignViewport(); - AlignmentI alignment = ap.getAlignment(); - int repIndex = n % alignment.getHeight(); - // ensure at least one preceding sequence i.e. index >= 1 - repIndex = Math.max(repIndex, 1); - SequenceI repSeq = alignment.getSequenceAt(repIndex); - repSeqs.put(ap.getViewName(), repSeq); - List hiddenNames = new ArrayList(); - hiddenSeqNames.put(ap.getViewName(), hiddenNames); - + // for every set of db queries + // retrieve db query + // verify presence of expected xrefs + // show xrefs - verify expected type of frame is shown for each xref + // show xrefs again + // - verify original -> xref -> xref(original) recovers frame containing at + // least the first retrieved sequence + // store + // 1. whole project + // 2. individual frames + // 3. load each one back and verify + // . aligned sequences (.toString() ) + // . xrefs (.toString() ) + // . codonframes + // + // + for (String[] did : new String[][] { { "UNIPROT", "P01731" } }) + { + AlignFrame af = jalview.gui.SequenceFetcher.fetchAndShow(did[0], + did[1]).get(0); + assertTrue("Didn't read in the example file correctly.", af != null); + boolean dna = af.getViewport().getAlignment().isNucleotide(); + AlignmentI retral = af.getViewport().getAlignment(); + AlignmentI dataset = retral.getDataset(); + SequenceI[] seqs = retral.getSequencesArray(); + List ptypes = (seqs == null || seqs.length == 0) ? null + : new CrossRef(seqs, dataset) + .findXrefSourcesForSequences(dna); /* - * have rep sequence represent itself and the one before it - * this hides the group (except for the rep seq) + * map between a view, and views generated after retrieving xrefs */ - SequenceGroup sg = new SequenceGroup(); - sg.addSequence(repSeq, false); - SequenceI precedingSeq = alignment.getSequenceAt(repIndex - 1); - sg.addSequence(precedingSeq, false); - sg.setSeqrep(repSeq); - assertTrue(sg.getSequences().contains(repSeq)); - assertTrue(sg.getSequences().contains(precedingSeq)); - av.setSelectionGroup(sg); - assertSame(repSeq, sg.getSeqrep()); - + IdentityHashMap> viewxrefview = new IdentityHashMap>(); /* - * represent group with sequence adds to a map of hidden rep sequences - * (it does not create a group on the alignment) + * map between a particular view and it's originating dbref path */ - ((AlignmentViewport) av).hideSequences(repSeq, true); - assertSame(repSeq, sg.getSeqrep()); - assertTrue(sg.getSequences().contains(repSeq)); - assertTrue(sg.getSequences().contains(precedingSeq)); - assertTrue("alignment has groups", alignment.getGroups().isEmpty()); - Map hiddenRepSeqsMap = av - .getHiddenRepSequences(); - assertNotNull(hiddenRepSeqsMap); - assertEquals(1, hiddenRepSeqsMap.size()); - assertSame(sg, hiddenRepSeqsMap.get(repSeq)); - assertTrue(alignment.getHiddenSequences().isHidden(precedingSeq)); - assertFalse(alignment.getHiddenSequences().isHidden(repSeq)); - hiddenNames.add(precedingSeq.getName()); - - n++; - } - File tfile = File - .createTempFile("testStoreAndRecoverGroupReps", ".jvp"); - try - { - new Jalview2XML(false).saveState(tfile); - } catch (Throwable e) - { - Assert.fail("Didn't save the expanded view state", e); - } - Desktop.instance.closeAll_actionPerformed(null); - if (Desktop.getAlignFrames() != null) - { - Assert.assertEquals(Desktop.getAlignFrames().length, 0); - } - - af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(), - FormatAdapter.FILE); - afid = af.getViewport().getSequenceSetId(); + IdentityHashMap viewsourcedb = new IdentityHashMap(); - for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) - { - String viewName = ap.getViewName(); - AlignViewportI av = ap.getAlignViewport(); - AlignmentI alignment = ap.getAlignment(); - List groups = alignment.getGroups(); - assertNotNull(groups); - assertTrue("Alignment has groups", groups.isEmpty()); - Map hiddenRepSeqsMap = av - .getHiddenRepSequences(); - assertNotNull("No hidden represented sequences", hiddenRepSeqsMap); - assertEquals(1, hiddenRepSeqsMap.size()); - assertEquals(repSeqs.get(viewName).getDisplayId(true), - hiddenRepSeqsMap.keySet().iterator().next() - .getDisplayId(true)); + String first = did[0] + " " + did[1]; + viewsourcedb.put(af.alignPanel, first); + for (String db : ptypes) + { + // retrieve and show cross-refs in this thread + CrossRefAction cra = new CrossRefAction(af, seqs, dna, db); + cra.run(); + Assert.assertTrue(cra.getXrefViews().size() > 0, + "No crossrefs retrieved for " + db); + viewxrefview.put(af.alignPanel, cra.getXrefViews()); + + for (AlignmentViewPanel avp : cra.getXrefViews()) + { - /* - * verify hidden sequences in restored panel - */ - List hidden = hiddenSeqNames.get(ap.getViewName()); - HiddenSequences hs = alignment.getHiddenSequences(); - assertEquals( - "wrong number of restored hidden sequences in " - + ap.getViewName(), hidden.size(), hs.getSize()); + SequenceI[] xrseqs = avp.getAlignment().getSequencesArray(); + String nextxref = first + " -> " + db; + viewsourcedb.put(avp, nextxref); + List xrptypes = (seqs == null || seqs.length == 0) ? null + : new CrossRef(xrseqs, dataset) + .findXrefSourcesForSequences(avp + .getAlignViewport().isNucleotide()); + for (String xrefdb : xrptypes) + { + AlignFrame nextaf = Desktop.getAlignFrameFor(avp + .getAlignViewport()); + cra = new CrossRefAction(nextaf, xrseqs, avp.getAlignViewport() + .isNucleotide(), xrefdb); + cra.run(); + Assert.assertTrue(cra.getXrefViews().size() > 0, + "No crossrefs found for '" + nextxref + "' to " + + xrefdb + " via '" + nextaf.getTitle() + "'"); + // save views for analysis + viewxrefview.put(avp, cra.getXrefViews()); + for (AlignmentViewPanel nextavp : cra.getXrefViews()) + { + + viewsourcedb.put(nextavp, nextxref + " -> " + xrefdb); + } + } + } + } } + Thread.sleep(50000); } + } -- 1.7.10.2