package uk.ac.ed.inf.biopepa.ui.wizards.export;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.widgets.Display;
import uk.ac.ed.inf.biopepa.core.interfaces.Result;
import uk.ac.ed.inf.biopepa.core.sba.SBAModel;
import uk.ac.ed.inf.biopepa.core.sba.export.SBRMLResultExport;
import uk.ac.ed.inf.biopepa.core.sba.export.SimulationTracer;
import uk.ac.ed.inf.biopepa.core.sba.export.SimulationTracer.SimulationTraceLog;
import uk.ac.ed.inf.biopepa.ui.BioPEPAPlugin;
import uk.ac.ed.inf.common.ui.plotting.IChart;
import uk.ac.ed.inf.common.ui.plotting.ISemanticElement;
import uk.ac.ed.inf.common.ui.plotting.Plotting;
import uk.ac.ed.inf.common.ui.plotting.data.InfoWithAxes;
import uk.ac.ed.inf.common.ui.plotting.data.Series;
import uk.ac.ed.inf.common.ui.plotview.PlotViewPlugin;
public class SimulationTraceJob extends Job {
private String jobName;
public SimulationTraceJob (String name){
super(name);
this.jobName = name;
this.outputFiles = new LinkedList<IFile> ();
}
private SimulationTracer simulationTracer;
public void setSimulationTracer (SimulationTracer st){
this.simulationTracer = st;
}
private LinkedList<SimulationTraceLog> traceLoggers;
public void setSimulationTraceLoggers(LinkedList<SimulationTraceLog> slts){
this.traceLoggers = slts;
}
private boolean doGraph = false;
public void setDoGraph (boolean dg){
this.doGraph = dg;
}
private LinkedList<IFile> outputFiles;
public void addOutputFile (IFile file){
this.outputFiles.add(file);
}
private IFile sbrmlFile;
public void setSbrmlFile (IFile file){
this.sbrmlFile = file;
}
private IPath sbrmlPath;
public void setSbrmlPath (IPath path){
this.sbrmlPath = path;
}
private SBAModel sbaModel;
public void setSbaModel (SBAModel model){
this.sbaModel = model;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
this.simulationTracer.generateLotsOfTraces(traceLoggers);
if (this.doGraph) {
Result result = this.simulationTracer.getSimulationResults();
// Collect the y information for the graph.
InfoWithAxes info = new InfoWithAxes();
// info.setXSeries(Series.create(results[0].getTimePoints(),
// "Time"));
List<Series> list = info.getYSeries();
info.setXSeries(Series.create(result.getTimePoints(), "Time"));
String[] names = result.getComponentNames();
for (int i = 0; i < names.length; i++) {
list.add(Series.create(result.getTimeSeries(i), names[i]));
}
info.setShowLegend(true);
info.setYLabel("Process Count / Variable Value");
/*
* Set the graph title to essentially the name of the biopepa
* file, if the graph title given is not empty then we appent
* that onto the end of the biopepa file name.
*
* if (graphTitle.equals("")) {
* info.setGraphTitle(path.lastSegment()); } else {
* info.setGraphTitle(path.lastSegment() + " - " + graphTitle);
* }
*/
final IChart chart = Plotting.getPlottingTools().createTimeSeriesChart(info);
class Semantic implements ISemanticElement {
public String getDescription(String format) {
return "Trace Generation Simulation";
}
public Object getAdapter(Class arg0) {
// TODO Auto-generated method stub
return null;
}
}
// ResultsAdapter ra = new ResultsAdapter(resultsArray);
chart.setSemanticElement(new Semantic());
Runnable runnable = new Runnable() {
public void run() {
PlotViewPlugin.getDefault().reveal(chart);
}
};
Display.getDefault().syncExec(runnable);
}
if (this.sbrmlFile != null && this.sbaModel != null){
Result results = this.simulationTracer.getSimulationResults();
String filePath = this.sbrmlFile.getLocation().toOSString();
SBRMLResultExport sbrmlExport = new SBRMLResultExport(this.sbaModel);
String modelName = this.jobName;
sbrmlExport.setModelName(modelName);
sbrmlExport.exportResults(filePath, results);
this.sbrmlFile.refreshLocal(0, null);
}
} catch (Exception e) {
e.printStackTrace();
return new Status(IStatus.ERROR, BioPEPAPlugin.PLUGIN_ID, e.getMessage());
}
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
} else {
try {
for (IFile outputFile : this.outputFiles){
if (outputFile != null) {
outputFile.refreshLocal(0, null);
}
}
return Status.OK_STATUS;
} catch (CoreException e) {
e.printStackTrace();
return new Status(IStatus.ERROR, BioPEPAPlugin.PLUGIN_ID, e.getMessage());
}
}
}
}