/*******************************************************************************
* Copyright (c) 2009 University of Edinburgh.
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the BSD Licence, which accompanies this feature
* and can be downloaded from http://groups.inf.ed.ac.uk/pepa/update/licence.txt
******************************************************************************/
package uk.ac.ed.inf.biopepa.ui.wizards.timeseries;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.dialogs.SaveAsDialog;
import uk.ac.ed.inf.biopepa.core.interfaces.Result;
import uk.ac.ed.inf.biopepa.core.interfaces.Solver;
import uk.ac.ed.inf.biopepa.core.sba.ExperimentSet;
import uk.ac.ed.inf.biopepa.core.sba.Parameters;
import uk.ac.ed.inf.biopepa.core.sba.PhaseLine;
import uk.ac.ed.inf.biopepa.core.sba.Solvers;
import uk.ac.ed.inf.biopepa.core.sba.ExperimentLine;
import uk.ac.ed.inf.biopepa.core.sba.Parameters.Parameter;
import uk.ac.ed.inf.biopepa.ui.BioPEPAEvent;
import uk.ac.ed.inf.biopepa.ui.interfaces.BioPEPAModel;
import uk.ac.ed.inf.biopepa.ui.interfaces.IResourceProvider;
/**
*
* @author ajduguid
*
*/
public class TimeSeriesAnalysisWizard extends Wizard implements IResourceProvider {
BioPEPAModel model;
Solver solver;
Map<Parameter, Object> uParameters;
Parameters parameters;
private SpeciesSelectionWizardPage speciesSelectionPage;
private ImportCSVPage importCSVPage;
private ImportDataPage importDataPage;
private PhasesPage phasesPage;
public TimeSeriesAnalysisWizard(BioPEPAModel model) {
if (model == null)
throw new NullPointerException("Error; model does not exist.");
this.model = model;
setHelpAvailable(false);
setNeedsProgressMonitor(true);
setWindowTitle("Time-series analysis wizard");
uParameters = new HashMap<Parameter, Object>();
loadParameters();
}
public void addPages() {
speciesSelectionPage = new SpeciesSelectionWizardPage(model, uParameters);
addPage(speciesSelectionPage);
addPage(new AlgorithmWizardPage(model, uParameters));
importCSVPage = new ImportCSVPage(model);
addPage(importCSVPage);
phasesPage = new PhasesPage(model);
addPage(phasesPage);
importDataPage = new ImportDataPage("Import Experimental Data");
addPage(importDataPage);
}
/*
* We needn't write our own 'canFinish' because the default just checks if
* all pages are complete which is what we want.
*/
public IResource getUnderlyingResource() {
return model.getUnderlyingResource();
}
@Override
public boolean performFinish() {
/*
* String name = model.getUnderlyingResource().getName(); Export sbml =
* new SBMLExport(model.getSBAModel(), SBMLExport.flattenName(name));
* IPath path =
* model.getUnderlyingResource().getFullPath().removeFileExtension();
* path = path.addFileExtension("xml"); IFile file =
* ResourcesPlugin.getWorkspace().getRoot().getFile(path); InputStream
* source = new ByteArrayInputStream(sbml.toString().getBytes()); try {
* if(file.exists()) file.setContents(source, true, false, null); else
* file.create(source, true, null); } catch(Exception e) {}
*/
parameters.setValue(Parameter.Components, uParameters.get(Parameter.Components));
saveParameters();
// prepare simulation and creation of graphs
model.notify(new BioPEPAEvent(model, BioPEPAEvent.Event.MODIFIED, 1));
// Set up the experiment from the csv import page.
ExperimentSet experSet;
experSet = importCSVPage.getExperimentSet();
if (experSet == null) {
experSet = new ExperimentSet();
experSet.addExperimentLine(new ExperimentLine("results"));
}
experSet.setSeparateGraphs(importCSVPage.getSeparateGraphs());
Result externalResult = importDataPage.getPlottableResult();
if (externalResult != null){
ExperimentLine externalLine = new ExperimentLine("ext-data");
externalLine.setResult(externalResult);
experSet.addExperimentLine(externalLine);
}
// Set up the analysis job
AnalysisJob myJob = new AnalysisJob(model, parameters, experSet, solver);
// Now from the import csv page we must decide if we are
// only going to output directly to csv
boolean onlyCsv = importCSVPage.getJustBuildCsv();
myJob.setJustBuildCsv(onlyCsv);
// Now determine if any phases were set up
PhaseLine[] phaseLines = phasesPage.getPhaseLines();
if (phaseLines != null){
myJob.setPhaseLines(phaseLines);
}
// If we are only building straight to csv and not displaying
// the graph then we need to ask for a csv file this path will
// be modified in the case that there are multiple graphs.
if (onlyCsv) {
SaveAsDialog saveAsDialog = new SaveAsDialog(getShell());
IPath path = model.getUnderlyingResource().getFullPath();
path = path.removeFileExtension().addFileExtension("csv");
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
saveAsDialog.setOriginalFile(file);
saveAsDialog.open();
path = saveAsDialog.getResult();
myJob.setCsvPath(path);
}
myJob.schedule();
return true;
}
private void loadParameters() {
Class<?> c = (new String[] {}).getClass();
Parameter[] pArray = Parameter.values();
String s;
Object o;
solver = Solvers.getSolverInstance(model.getProperty("solver"));
outer: for (Parameter p : pArray) {
s = model.getProperty(p.getKey());
if (s == null)
continue outer;
o = p.parseString(s);
if (o != null)
uParameters.put(p, o);
else if (p.getType().equals(c)) {
// bencoded
StringBuilder sb = new StringBuilder((String) s);
ArrayList<String> al = new ArrayList<String>();
int index, length;
try {
while (sb.length() > 0) {
index = sb.indexOf(":");
if (index == -1)
continue outer;
length = Integer.parseInt(sb.substring(0, index));
sb.delete(0, index + 1);
al.add(sb.substring(0, length));
sb.delete(0, length);
}
} catch (NumberFormatException e) {
continue;
}
uParameters.put(p, al.toArray(new String[] {}));
}
}
}
private void saveParameters() {
Class<?> c = (new String[] {}).getClass();
if (solver != null)
model.setProperty("solver", solver.getShortName());
for (Map.Entry<Parameter, Object> me : uParameters.entrySet()) {
if (me.getKey().getType().equals(c) && me.getValue() != null) {
String[] sa = (String[]) me.getValue();
StringBuilder sb = new StringBuilder();
for (String s : sa)
sb.append(s.length()).append(":").append(s);
model.setProperty(me.getKey().getKey(), sb.toString());
} else if (me.getValue() != null)
model.setProperty(me.getKey().getKey(), me.getValue().toString());
}
}
}