From b3d636f9671d460b9b8d4bf42bb3de46f50cd0b2 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 9 Jan 2017 16:29:22 +0100 Subject: [PATCH] Loading example data from the wizard --- ...ilis-germination (GSE6865) - used only.tsv | 8 ++ .../internal/tasks/LoadExampleDataTask.java | 72 ++++++++++++++++++ .../internal/tasks/StartWizardTask.java | 1 + .../internal/ui/wizard/GNWizardData.java | 3 + .../ui/wizard/SelectTimeSeriesStep.java | 38 +++++++++ .../internal/ui/wizard/WizardPanel.java | 4 +- .../cz/cas/mbu/genexpi/example1_ds.cys | Bin 0 -> 26713 bytes 7 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 cy-genexpi/sampleData/B.subtilis-germination (GSE6865) - used only.tsv create mode 100644 cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/LoadExampleDataTask.java create mode 100644 cy-genexpi/src/main/resources/cz/cas/mbu/genexpi/example1_ds.cys diff --git a/cy-genexpi/sampleData/B.subtilis-germination (GSE6865) - used only.tsv b/cy-genexpi/sampleData/B.subtilis-germination (GSE6865) - used only.tsv new file mode 100644 index 0000000..c39e220 --- /dev/null +++ b/cy-genexpi/sampleData/B.subtilis-germination (GSE6865) - used only.tsv @@ -0,0 +1,8 @@ +ID_REF 0 5 10 15 20 25 30 40 50 60 70 80 90 100 +sigA 65.02848915 126.4129103 4272.900479 5841.001338 3827.004813 4214.074196 3655.872395 3023.491903 2252.013874 771.2207189 1624.747711 1463.289999 2063.674901 1638.318343 +sigB 61.94860972 37.89669158 668.1369332 862.2724645 701.8407961 1585.805369 2365.615687 3475.488365 11206.12601 3856.295791 3227.049517 2245.778613 2055.110141 1884.544308 +dnaA 141.1416529 599.6596128 14776.3262 10631.07598 9554.734037 4408.279551 3439.540195 4630.653203 2886.288907 6463.05252 6051.176708 5845.051415 3942.786839 4463.624652 +glnR 102.1821935 982.2864582 4617.832088 5992.73972 5341.391812 6472.018427 6774.975434 2661.456 3676.201168 2281.868597 3877.739034 4261.069892 3850.953533 2900.327297 +tnrA 39.89123822 77.17170097 412.7144097 335.2282683 522.7582084 452.8847029 289.6165025 470.4833963 213.4863472 400.3172573 441.7235684 374.0273609 398.1035704 320.6820963 +bmrR 76.79816847 49.45347518 357.1781456 286.0255073 385.0761604 302.9634616 187.1433534 398.1035704 276.0909905 232.3249038 155.9565138 124.4998333 154.9866347 190.282622 +ctsR 77.54705027 382.9467541 2772.554299 1288.074211 827.1470363 933.8195615 922.8804737 1986.481992 2904.350793 2065.105828 1555.32461 1150.463901 1326.124031 1375.747508 \ No newline at end of file diff --git a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/LoadExampleDataTask.java b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/LoadExampleDataTask.java new file mode 100644 index 0000000..6e272fd --- /dev/null +++ b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/LoadExampleDataTask.java @@ -0,0 +1,72 @@ +package cz.cas.mbu.cygenexpi.internal.tasks; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.CopyOption; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +import org.cytoscape.event.CyEventHelper; +import org.cytoscape.io.read.CySessionReader; +import org.cytoscape.io.read.CySessionReaderManager; +import org.cytoscape.service.util.CyServiceRegistrar; +import org.cytoscape.session.CySession; +import org.cytoscape.session.CySessionManager; +import org.cytoscape.session.events.SessionAboutToBeLoadedEvent; +import org.cytoscape.session.events.SessionLoadCancelledEvent; +import org.cytoscape.work.AbstractTask; +import org.cytoscape.work.TaskMonitor; +import org.cytoscape.work.Tunable; + +public class LoadExampleDataTask extends AbstractTask { + @Tunable(description="Current session (all networks and tables) will be lost.
Do you want to continue?", + params="ForceSetDirectly=true;ForceSetTitle=Open Session") + public boolean approve; + + private final CyServiceRegistrar registrar; + + public LoadExampleDataTask(CyServiceRegistrar registrar) { + super(); + this.registrar = registrar; + } + + @Override + public void run(TaskMonitor taskMonitor) throws Exception { + if(approve) + { + CyEventHelper eventHelper = registrar.getService(CyEventHelper.class); + eventHelper.fireEvent(new SessionAboutToBeLoadedEvent(this)); + try { + InputStream is = getClass().getResourceAsStream("/cz/cas/mbu/genexpi/example1_ds.cys"); + File tempFile = File.createTempFile("cygenexpi_example", ".cys"); + tempFile.deleteOnExit(); + Files.copy(is, tempFile.toPath(),StandardCopyOption.REPLACE_EXISTING); + + CySessionReader reader = registrar.getService(CySessionReaderManager.class).getReader(tempFile.toURI(), tempFile.getName()); + + if (reader == null) + { + throw new NullPointerException("Failed to find appropriate reader for example data."); + } + reader.run(taskMonitor); + + final CySession newSession = reader.getSession(); + + if (newSession == null) + throw new NullPointerException("Example session could not be read."); + + CySessionManager sessionMgr = registrar.getService(CySessionManager.class); + sessionMgr.setCurrentSession(newSession, "CyGenexpi example"); + + } + catch(Exception ex) + { + eventHelper.fireEvent(new SessionLoadCancelledEvent(this)); + throw ex; + } + } + + } + + +} diff --git a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/StartWizardTask.java b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/StartWizardTask.java index bb86e93..a2cc70f 100644 --- a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/StartWizardTask.java +++ b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/tasks/StartWizardTask.java @@ -40,6 +40,7 @@ public void run(TaskMonitor taskMonitor) throws Exception { data.selectedNetwork = registrar.getService(CyApplicationManager.class).getCurrentNetwork(); WizardPanel panel = new WizardPanel<>(registrar, InferenceWizard.getSteps(), InferenceWizard.TITLE, data); + data.wizardPanel = panel; registrar.registerService(panel, CytoPanelComponent.class, new Properties()); UIUtils.ensurePanelVisible(registrar, panel); diff --git a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/GNWizardData.java b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/GNWizardData.java index 55e0eb4..0888398 100644 --- a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/GNWizardData.java +++ b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/GNWizardData.java @@ -14,6 +14,9 @@ public class GNWizardData { @RememberValue(type=Type.NEVER) public CyNetwork selectedNetwork; + @RememberValue(type=Type.NEVER) + public WizardPanel wizardPanel; + public String expressionMappingColumn = ""; @RememberValueRecursive diff --git a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/SelectTimeSeriesStep.java b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/SelectTimeSeriesStep.java index 057db5a..f855103 100644 --- a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/SelectTimeSeriesStep.java +++ b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/SelectTimeSeriesStep.java @@ -37,6 +37,7 @@ import cz.cas.mbu.cydataseries.TimeSeries; import cz.cas.mbu.cygenexpi.PredictionService; import cz.cas.mbu.cygenexpi.internal.tasks.CheckConfigurationTask; +import cz.cas.mbu.cygenexpi.internal.tasks.LoadExampleDataTask; import com.jgoodies.forms.layout.FormSpecs; import javax.swing.JLabel; @@ -103,6 +104,12 @@ public SelectTimeSeriesStep() { FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC, + FormSpecs.DEFAULT_ROWSPEC, + FormSpecs.RELATED_GAP_ROWSPEC, + FormSpecs.DEFAULT_ROWSPEC, + FormSpecs.RELATED_GAP_ROWSPEC, + FormSpecs.DEFAULT_ROWSPEC, + FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC,})); JLabel lblDescription = new JLabel("First we need a time series for the expression data. The time series needs to be mapped to nodes in the network.\r\n"); @@ -154,6 +161,16 @@ public SelectTimeSeriesStep() { btnSmoothTimeSeries = new JButton("Smooth a Time Series"); add(btnSmoothTimeSeries, "2, 28, 3, 1"); btnSmoothTimeSeries.addActionListener(evt -> smoothTimeSeries()); + + JSeparator separator_3 = new JSeparator(); + add(separator_3, "2, 30, 3, 1"); + + JLabel lblAlternativelyYouCan = new JLabel("Alternatively you can load example data directly:"); + add(lblAlternativelyYouCan, "2, 32, 3, 1"); + + JButton btnLoadExampleData = new JButton("Load example data"); + add(btnLoadExampleData, "2, 34, 3, 1"); + btnLoadExampleData.addActionListener(evt -> loadExampleData()); } @@ -293,6 +310,27 @@ private void smoothTimeSeries() registrar.getService(DialogTaskManager.class).execute(smoothTaskIterator); } + private void loadExampleData() + { + registrar.getService(DialogTaskManager.class).execute(new TaskIterator( + new LoadExampleDataTask(registrar) + , new AbstractTask(){ + + @Override + public void run(TaskMonitor taskMonitor) throws Exception { + SwingUtilities.invokeLater(() -> { + CyNetwork exampleNetwork = registrar.getService(CyNetworkManager.class).getNetworkSet().iterator().next(); + data.selectedNetwork = exampleNetwork; + data.expressionMappingColumn = "Expression_smooth"; + refreshUI(); + data.wizardPanel.nextStep(); + }); + } + + } + )); + + } @Override diff --git a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/WizardPanel.java b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/WizardPanel.java index d4f7a2c..fe120be 100644 --- a/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/WizardPanel.java +++ b/cy-genexpi/src/main/java/cz/cas/mbu/cygenexpi/internal/ui/wizard/WizardPanel.java @@ -195,7 +195,7 @@ public void run(TaskMonitor taskMonitor) throws Exception { } } - protected void previousStep() + public void previousStep() { if(shownStepIndex > 0) { @@ -203,7 +203,7 @@ protected void previousStep() } } - protected void nextStep() + public void nextStep() { registrar.getService(RememberValueService.class).saveProperties(data); diff --git a/cy-genexpi/src/main/resources/cz/cas/mbu/genexpi/example1_ds.cys b/cy-genexpi/src/main/resources/cz/cas/mbu/genexpi/example1_ds.cys new file mode 100644 index 0000000000000000000000000000000000000000..f67ac26f80c6b215be7b18d9dbb97a2376edda91 GIT binary patch literal 26713 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 Wb6-?ak;!7v>lJiZyn|fGWd8w!-Qpks literal 0 HcmV?d00001