From: gmungoc Date: Fri, 12 Jul 2019 13:38:34 +0000 (+0100) Subject: Merge branch 'develop' into features/JAL-3010ontologyFeatureSettings X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=6a05eb3f55d97e685f0c723822384633d5636778;hp=-c;p=jalview.git Merge branch 'develop' into features/JAL-3010ontologyFeatureSettings Conflicts: test/jalview/gui/AlignFrameTest.java --- 6a05eb3f55d97e685f0c723822384633d5636778 diff --combined resources/lang/Messages.properties index 3daba03,d2d8e88..205da8e --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@@ -801,7 -801,6 +801,7 @@@ label.rest_client_submit = {0} using {1 label.fetch_retrieve_from =Retrieve from {0} label.fetch_retrieve_from_all_sources = Retrieve from all {0} sources in {1}
First is :{2} label.feature_settings_click_drag = Drag up or down to change render order.
Double click to select columns containing feature. +label.feature_settings_select_columns = Double click to select columns containing feature label.transparency_tip = Adjust transparency to 'see through' feature colours. label.opt_and_params_further_details = see further details by right-clicking label.opt_and_params_show_brief_desc_image_link = Click to show brief description
Right click for further information. @@@ -1227,9 -1226,6 +1227,6 @@@ label.structure_chooser_filter_time = S label.structure_chooser_no_of_structures = Structure Chooser - {0} Found ({1}) info.no_pdb_entry_found_for = No PDB entry found for {0} exception.unable_to_detect_internet_connection = Jalview is unable to detect an internet connection - exception.fts_rest_service_no_longer_available = {0} rest services no longer available! - exception.resource_not_be_found = The requested resource could not be found - exception.fts_server_error = There seems to be an error from the {0} server exception.fts_server_unreachable = Jalview is unable to reach the {0} server. \nPlease ensure that you are connected to the internet and try again. label.nw_mapping = Needleman & Wunsch Alignment label.sifts_mapping = SIFTs Mapping @@@ -1246,8 -1242,6 +1243,6 @@@ action.next_page= > action.prev_page= << label.next_page_tooltip=Next Page label.prev_page_tooltip=Previous Page - exception.bad_request=Bad request. There is a problem with your input. - exception.service_not_available=Service not available. The server is being updated, try again later. status.launching_3d_structure_viewer = Launching 3D Structure viewer... status.fetching_3d_structures_for_selected_entries = Fetching 3D Structures for selected entries... status.fetching_dbrefs_for_sequences_without_valid_refs = Fetching db refs for {0} sequence(s) without valid db ref required for SIFTS mapping @@@ -1340,10 -1334,6 +1335,10 @@@ label.most_bound_molecules = Most Boun label.most_polymer_residues = Most Polymer Residues label.cached_structures = Cached Structures label.free_text_search = Free Text Search +label.summary_view = Summary View +label.group_by_so = Group features by Sequence Ontology +label.apply_to_subtypes = Apply to features and sub-types of +label.apply_also_to = Apply also to: label.backupfiles_confirm_delete = Confirm delete label.backupfiles_confirm_delete_old_files = Delete the following older backup files? (see the Backups tab in Preferences for more options) label.backupfiles_confirm_save_file = Confirm save file diff --combined resources/lang/Messages_es.properties index 0ec2810,e9e18ce..b62a8c5 --- a/resources/lang/Messages_es.properties +++ b/resources/lang/Messages_es.properties @@@ -726,8 -726,7 +726,8 @@@ label.services_at = Servicios en {0 label.rest_client_submit = {0} utilizando {1} label.fetch_retrieve_from =Recuperar de {0} label.fetch_retrieve_from_all_sources = Recuperar de todas las fuentes {0} en {1}
La primera es :{2} -label.feature_settings_click_drag = Haga clic o arrastre los tipos de las características hacia arriba o hacia abajo para cambiar el orden de visualización.
Haga doble clic para seleccionar las columnas que contienen las características del alineamiento/selección actual.
+label.feature_settings_click_drag = Haga clic o arrastre los tipos de las características hacia arriba o hacia abajo para cambiar el orden de visualización.
Haga doble clic para seleccionar las columnas que contienen las características del alineamiento/selección actual. +label.feature_settings_select_columns =Haga doble clic para seleccionar las columnas que contienen las características del alineamiento/selección actual label.opt_and_params_further_details = ver los detalles adicionales haciendo clic en el botón derecho label.opt_and_params_show_brief_desc_image_link = Haga clic para ver una descripción breve
Haga clic en el botón derecho para obtener información adicional. label.opt_and_params_show_brief_desc = Haga clic para ver una descripción breve
@@@ -1201,7 -1200,6 +1201,6 @@@ tooltip.rnalifold_settings=Modificar l label.show_selected_annotations=Mostrar anotaciones seleccionadas status.colouring_chimera=Coloreando Chimera label.configure_displayed_columns=Configurar Columnas Mostradas - exception.resource_not_be_found=El recurso solicitado no se ha encontrado label.aacon_calculations=cálculos AACon label.pdb_web-service_error=Error de servicio web PDB exception.unable_to_detect_internet_connection=Jalview no puede detectar una conexión a Internet @@@ -1226,13 -1224,10 +1225,10 @@@ exception.fts_server_unreachable=Jalvie exception.outofmemory_loading_mmcif_file=Sin memoria al cargar el fichero mmCIF label.hide_columns_not_containing=Ocultar las columnas que no contengan label.pdb_sequence_fetcher=Recuperador de secuencias PDB - exception.fts_server_error=Parece que hay un error desde el servidor {0} - exception.service_not_available=Servicio no disponible. El servidor se está actualizando, vuelva a intentarlo más tarde. status.waiting_for_user_to_select_output_file=Esperando que el usuario seleccione el fichero {0} action.prev_page=<< status.cancelled_image_export_operation=Operación de exportación {0} cancelada label.couldnt_run_groovy_script=No se ha podido ejecutar el script Groovy - exception.bad_request=Solicitud incorrecta. Hay un problema con su entrada. label.run_groovy=Ejecutar script Groovy desde la consola action.next_page=>> label.uniprot_sequence_fetcher=Recuperador de secuencias UniProt @@@ -1248,7 -1243,6 +1244,6 @@@ label.next_page_tooltip=Página siguient label.sifts_mapping=Mapeado SIFTs label.mapping_method=Método de mapeo de secuencia \u27F7 estructura info.error_creating_file=Error al crear fichero {0} - exception.fts_rest_service_no_longer_available= Servicios Rest {0} ya no están disponibles! status.launching_3d_structure_viewer=Lanzando visualizador de estructura 3D... status.obtaining_mapping_with_sifts=Obteniendo mapeo por SIFTS status.fetching_3d_structures_for=Buscando la estructura 3D para {0} @@@ -1341,10 -1335,6 +1336,10 @@@ label.most_bound_molecules = Más Molécu label.most_polymer_residues = Más Residuos de Polímeros label.cached_structures = Estructuras en Caché label.free_text_search = Búsqueda de texto libre +label.summary_view = Vista Resumida +label.group_by_so = Agrupar por términos de la Sequence Ontology +label.apply_to_subtypes = Aplicar también a características y subtipos de +label.apply_also_to = Aplicar también a: label.backupfiles_confirm_delete = Confirmar borrar label.backupfiles_confirm_delete_old_files = ¿Borrar los siguientes archivos? (ver la pestaña 'Copias' de la ventana de Preferencias para más opciones) label.backupfiles_confirm_save_file = Confirmar guardar archivo diff --combined src/jalview/gui/AlignFrame.java index 7b02aad,fcb6572..1cdd3a6 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@@ -33,6 -33,7 +33,7 @@@ 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.SimilarityParamsI; @@@ -4935,6 -4936,13 +4936,13 @@@ public class AlignFrame extends GAlignF @Override public void finished() { + + for (FeatureSettingsModelI srcSettings : dbRefFetcher + .getFeatureSettingsModels()) + { + + alignPanel.av.mergeFeaturesStyle(srcSettings); + } AlignFrame.this.setMenusForViewport(); } }); @@@ -5020,6 -5028,10 +5028,10 @@@ @Override public void finished() { + FeatureSettingsModelI srcSettings = dassource[0] + .getFeatureColourScheme(); + alignPanel.av.mergeFeaturesStyle( + srcSettings); AlignFrame.this.setMenusForViewport(); } }); @@@ -5552,23 -5564,22 +5564,23 @@@ } /** - * Hides columns containing (or not containing) a specified feature, provided - * that would not leave all columns hidden + * Hides columns containing (or not containing) the specified feature(s), + * provided that would not leave all columns hidden * - * @param featureType * @param columnsContaining + * @param featureTypes + * * @return */ - public boolean hideFeatureColumns(String featureType, - boolean columnsContaining) + public boolean hideFeatureColumns(boolean columnsContaining, + String... featureTypes) { boolean notForHiding = avc.markColumnsContainingFeatures( - columnsContaining, false, false, featureType); + columnsContaining, false, false, featureTypes); if (notForHiding) { if (avc.markColumnsContainingFeatures(!columnsContaining, false, - false, featureType)) + false, featureTypes)) { getViewport().hideSelectedColumns(); return true; diff --combined src/jalview/gui/CrossRefAction.java index 7045481,9ad6596..16f2b5d --- a/src/jalview/gui/CrossRefAction.java +++ b/src/jalview/gui/CrossRefAction.java @@@ -111,6 -111,13 +111,13 @@@ public class CrossRefAction implements FeatureSettingsModelI featureColourScheme = new SequenceFetcher() .getFeatureColourScheme(source); + if (dna && AlignmentUtils.looksLikeEnsembl(alignment)) + { + // override default featureColourScheme so products have Ensembl variant colours + featureColourScheme = new SequenceFetcher() + .getFeatureColourScheme(DBRefSource.ENSEMBL); + } + AlignmentI xrefsAlignment = makeCrossReferencesAlignment(dataset, xrefs); if (!dna) @@@ -143,7 -150,7 +150,7 @@@ AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); if (Cache.getDefault("HIDE_INTRONS", true)) { - newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false); + newFrame.hideFeatureColumns(false, SequenceOntologyI.EXON); } String newtitle = String.format("%s %s %s", dna ? MessageManager.getString("label.proteins") @@@ -187,15 -194,24 +194,24 @@@ /* * apply 'database source' feature configuration - * if any was found + * if any - first to the new splitframe view about to be displayed */ - // 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); + /* + * and for JAL-3330 also to original alignFrame view(s) + * this currently trashes any original settings. + */ + for (AlignmentViewPanel origpanel: alignFrame.getAlignPanels()) { + origpanel.getAlignViewport() + .mergeFeaturesStyle(featureColourScheme); + } + SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame, dna ? newFrame : copyThis); + newFrame.setVisible(true); copyThis.setVisible(true); String linkedTitle = MessageManager @@@ -356,12 -372,12 +372,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; } @@@ -374,12 -390,12 +390,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/gff/SequenceOntologyLite.java index 5722159,7d354e0..2cbec36 --- a/src/jalview/io/gff/SequenceOntologyLite.java +++ b/src/jalview/io/gff/SequenceOntologyLite.java @@@ -20,8 -20,6 +20,8 @@@ */ package jalview.io.gff; +import jalview.datamodel.ontology.OntologyBase; + import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@@ -40,8 -38,7 +40,8 @@@ import java.util.Map * @author gmcarstairs * */ -public class SequenceOntologyLite implements SequenceOntologyI +public class SequenceOntologyLite extends OntologyBase + implements SequenceOntologyI { /* * initial selection of types of interest when processing Ensembl features @@@ -73,6 -70,7 +73,7 @@@ { "snRNA", "transcript" }, { "miRNA", "transcript" }, { "lincRNA", "transcript" }, + { "lnc_RNA", "transcript" }, { "rRNA", "transcript" }, { "mRNA", "transcript" }, // there are many more sub-types of ncRNA... @@@ -83,11 -81,8 +84,11 @@@ { "sequence_variant", "sequence_variant" }, { "structural_variant", "sequence_variant" }, { "feature_variant", "sequence_variant" }, + { "upstream_gene_variant", "sequence_variant" }, { "gene_variant", "sequence_variant" }, { "transcript_variant", "sequence_variant" }, + { "non_coding_transcript_variant", "sequence_variant" }, + { "non_coding_transcript_exon_variant", "sequence_variant" }, // NB Ensembl uses NMD_transcript_variant as if a 'transcript' // but we model it here correctly as per the SO { "NMD_transcript_variant", "sequence_variant" }, @@@ -253,70 -248,4 +254,70 @@@ return termsNotFound; } } + + @Override + public List getRootParents(final String term) + { + /* + * check in cache first + */ + if (rootParents.containsKey(term)) + { + return rootParents.get(term); + } + + List top = new ArrayList<>(); + List query = new ArrayList<>(); + query.add(term); + + while (!query.isEmpty()) + { + List nextQuery = new ArrayList<>(); + for (String q : query) + { + List theParents = parents.get(q); + if (theParents != null) + { + if (theParents.size() == 1 && theParents.get(0).equals(q)) + { + /* + * top-level term + */ + if (!top.contains(q)) + { + top.add(q); + } + } + else + { + for (String p : theParents) + { + if (!p.equals(q)) + { + nextQuery.add(p); + } + } + } + } + } + query = nextQuery; + } + + rootParents.put(term, top); + + return top.isEmpty() ? null : top; + } + + @Override + public List getParents(String term) + { + List result = parents.get(term); + return result == null ? new ArrayList<>() : result; + } + + @Override + public boolean isValidTerm(String term) + { + return parents.containsKey(term); + } } diff --combined test/jalview/gui/AlignFrameTest.java index 60a94c4,3e82547..3fe56b7 --- a/test/jalview/gui/AlignFrameTest.java +++ b/test/jalview/gui/AlignFrameTest.java @@@ -62,7 -62,53 +62,53 @@@ public class AlignFrameTes AlignFrame af; @BeforeClass(alwaysRun = true) - public void setUpJvOptionPane() + public static void setUpBeforeClass() throws Exception + { + setUpJvOptionPane(); + /* + * use read-only test properties file + */ + Cache.loadProperties("test/jalview/io/testProps.jvprops"); + Jalview.main(new String[] { "-nonews" }); + } + + @AfterMethod(alwaysRun = true) + public void tearDown() + { + Desktop.instance.closeAll_actionPerformed(null); + } + + /** + * configure (read-only) properties for test to ensure Consensus is computed for + * colour Above PID testing + */ + @BeforeMethod(alwaysRun = true) + public void setUp() + { + Cache.loadProperties("test/jalview/io/testProps.jvprops"); + Cache.applicationProperties.setProperty("SHOW_IDENTITY", + Boolean.TRUE.toString()); + af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa", + DataSourceType.FILE); + + /* + * wait for Consensus thread to complete + */ + synchronized (this) + { + while (af.getViewport().getConsensusSeq() == null) + { + try + { + wait(50); + } catch (InterruptedException e) + { + } + } + } + } + + public static void setUpJvOptionPane() { JvOptionPane.setInteractiveMode(false); JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); @@@ -71,18 -117,15 +117,18 @@@ @Test(groups = "Functional") public void testHideFeatureColumns() { - SequenceI seq1 = new Sequence("Seq1", "ABCDEFGHIJ"); - SequenceI seq2 = new Sequence("Seq2", "ABCDEFGHIJ"); - seq1.addSequenceFeature(new SequenceFeature("Metal", "", 1, 5, 0f, null)); - seq2.addSequenceFeature(new SequenceFeature("Metal", "", 6, 10, 10f, - null)); - seq1.addSequenceFeature(new SequenceFeature("Turn", "", 2, 4, - Float.NaN, null)); - seq2.addSequenceFeature(new SequenceFeature("Turn", "", 7, 9, - Float.NaN, null)); + SequenceI seq1 = new Sequence("Seq1/01-10", "A---BCDEFG-HIJ"); + SequenceI seq2 = new Sequence("Seq2/11-20", "-AB-CDEF--GHIJ"); + String METAL = "Metal"; + String TURN = "Turn"; + seq1.addSequenceFeature( + new SequenceFeature(METAL, "", 1, 5, 0f, null)); + seq2.addSequenceFeature( + new SequenceFeature(METAL, "", 16, 20, 10f, null)); + seq1.addSequenceFeature( + new SequenceFeature(TURN, "", 2, 4, Float.NaN, null)); + seq2.addSequenceFeature( + new SequenceFeature(TURN, "", 17, 19, Float.NaN, null)); AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 }); AlignFrame alignFrame = new AlignFrame(al, al.getWidth(), al.getHeight()); @@@ -95,141 -138,65 +141,94 @@@ /* * hiding a feature not present does nothing */ - assertFalse(alignFrame.hideFeatureColumns("exon", true)); + assertFalse(alignFrame.hideFeatureColumns(true, "exon")); assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty()); assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns() .getNumberOfRegions(), 0); - assertFalse(alignFrame.hideFeatureColumns("exon", false)); + assertFalse(alignFrame.hideFeatureColumns(false, "exon")); assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty()); - assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns() .getNumberOfRegions(), 0); /* * hiding a feature in all columns does nothing */ - assertFalse(alignFrame.hideFeatureColumns("Metal", true)); + assertFalse(alignFrame.hideFeatureColumns(true, METAL)); assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty()); - assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns() .getNumberOfRegions(), 0); /* * threshold Metal to hide features where score < 5 - * seq1 feature in columns 1-5 is hidden - * seq2 feature in columns 6-10 is shown + * seq1 feature in columns 1-8 is hidden + * seq2 feature in columns 8-14 is shown + * result: columns 8-14 are hidden + * note this includes gapped columns spanned by the feature */ FeatureColourI fc = new FeatureColour(null, Color.red, Color.blue, null, 0f, 10f); fc.setAboveThreshold(true); fc.setThreshold(5f); - alignFrame.getFeatureRenderer().setColour("Metal", fc); - assertTrue(alignFrame.hideFeatureColumns("Metal", true)); + alignFrame.getFeatureRenderer().setColour(METAL, fc); + assertTrue(alignFrame.hideFeatureColumns(true, METAL)); HiddenColumns hidden = alignFrame.getViewport().getAlignment().getHiddenColumns(); assertEquals(hidden.getNumberOfRegions(), 1); Iterator regions = hidden.iterator(); - int[] next = regions.next(); - assertEquals(next[0], 5); - assertEquals(next[1], 9); + assertEquals(regions.next(), new int[] { 7, 13 }); // base 0 + assertFalse(regions.hasNext()); /* * hide a feature present in some columns - * sequence positions [2-4], [7-9] are column positions - * [1-3], [6-8] base zero + * seq1 positions [2-4] are column positions [4-6] base zero + * seq2 positions [17-19] are column positions [10-12] base zero */ alignFrame.getViewport().showAllHiddenColumns(); - assertTrue(alignFrame.hideFeatureColumns("Turn", true)); + assertTrue(alignFrame.hideFeatureColumns(true, TURN)); regions = alignFrame.getViewport().getAlignment() .getHiddenColumns().iterator(); assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns() .getNumberOfRegions(), 2); - next = regions.next(); - assertEquals(next[0], 1); - assertEquals(next[1], 3); - next = regions.next(); - assertEquals(next[0], 6); - assertEquals(next[1], 8); + assertEquals(regions.next(), new int[] { 4, 6 }); + assertEquals(regions.next(), new int[] { 10, 12 }); + assertFalse(regions.hasNext()); + + /* + * hiding a contact feature should only hide start and end positions, + * not the intermediate columns + */ + String DISULFIDE = "Disulfide Bond"; + seq1.addSequenceFeature( + new SequenceFeature(DISULFIDE, "", 1, 5, 0f, null)); + alignFrame.getViewport().showAllHiddenColumns(); + assertTrue(alignFrame.hideFeatureColumns(true, DISULFIDE)); + regions = alignFrame.getViewport().getAlignment().getHiddenColumns() + .iterator(); + assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns() + .getNumberOfRegions(), 2); + assertEquals(regions.next(), new int[] { 0, 0 }); + assertEquals(regions.next(), new int[] { 7, 7 }); + assertFalse(regions.hasNext()); + + /* + * hide multiple feature types: + * TURN columns hides 4-6, 10-12 + * DISULFIDE columns hides 0, 7 + * combined is { 0-0, 4-7, 10-12 } + */ + alignFrame.getViewport().showAllHiddenColumns(); + assertTrue(alignFrame.hideFeatureColumns(true, TURN, DISULFIDE)); + regions = alignFrame.getViewport().getAlignment().getHiddenColumns() + .iterator(); + assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns() + .getNumberOfRegions(), 3); + assertEquals(regions.next(), new int[] { 0, 0 }); + assertEquals(regions.next(), new int[] { 4, 7 }); + assertEquals(regions.next(), new int[] { 10, 12 }); + assertFalse(regions.hasNext()); } - @BeforeClass(alwaysRun = true) - public static void setUpBeforeClass() throws Exception - { - /* - * use read-only test properties file - */ - Jalview.main( - new String[] - { "-nonews", "-props", "test/jalview/io/testProps.jvprops" }); - } - - @AfterMethod(alwaysRun = true) - public void tearDown() - { - Desktop.instance.closeAll_actionPerformed(null); - } - - /** - * configure (read-only) properties for test to ensure Consensus is computed - * for colour Above PID testing - */ - @BeforeMethod(alwaysRun = true) - public void setUp() - { - Cache.loadProperties("test/jalview/io/testProps.jvprops"); - Cache.applicationProperties.setProperty("SHOW_IDENTITY", - Boolean.TRUE.toString()); - af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa", - DataSourceType.FILE); - - /* - * wait for Consensus thread to complete - */ - synchronized (this) - { - while (af.getViewport().getConsensusSeq() == null) - { - try - { - wait(50); - } catch (InterruptedException e) - { - } - } - } - } - /** * Test that changing background (alignment) colour scheme *