package uk.ac.ed.inf.biopepa.ui.wizards.timeseries;
import james.core.experiments.BaseExperiment;
import james.core.experiments.variables.ExperimentVariable;
import james.core.experiments.variables.ExperimentVariables;
import james.core.experiments.variables.NoNextVariableException;
import james.core.experiments.variables.modifier.IVariableModifier;
import james.core.experiments.variables.modifier.VariableModifier;
import java.util.LinkedList;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Button;
import uk.ac.ed.inf.biopepa.core.sba.ExperimentSet;
import uk.ac.ed.inf.biopepa.core.sba.LineStringBuilder;
import uk.ac.ed.inf.biopepa.core.sba.SBAReaction;
import uk.ac.ed.inf.biopepa.core.sba.ExperimentLine;
import uk.ac.ed.inf.biopepa.ui.interfaces.BioPEPAModel;
import uk.ac.ed.inf.biopepa.ui.interfaces.IResourceProvider;
import uk.ac.ed.inf.biopepa.ui.wizards.timeseries.AbstractExperimentPage.ArrayInput;
public class CreateExperimentationWizard extends Wizard implements
IResourceProvider {
private static final ExperimentVariable<Double> DoubleVectorElementModifier = null;
BioPEPAModel model;
private ExperimentSet experimentSet;
private BaseExperiment baseExperiment;
public CreateExperimentationWizard(BioPEPAModel model) {
if (model == null)
throw new NullPointerException("Error; model does not exist.");
this.model = model;
setHelpAvailable(false);
setWindowTitle("Create Experimentation .csv");
}
public ExperimentSet getExperimentSet (){
return this.experimentSet;
}
private ReactionKnockoutPage reactionKnockoutPage;
private InitPopsExperimentPage initPopsExperPage ;
private RateVariablesExperimentPage rateVarExperPage;
public void addPages() {
LineStringBuilder sb = new LineStringBuilder();
sb.appendLine("For each reaction which is selected a single experiment of two ");
sb.appendLine("lines will be performed. The first line in which the reaction is ");
sb.appendLine("enabled and the second line in which the reaction is disabled. ");
sb.appendLine("If you wish to range over only rate variables or initial component ");
sb.appendLine("populations then just leave this page blank.");
reactionKnockoutPage = new ReactionKnockoutPage(model) ;
reactionKnockoutPage.setHeaderHelp(sb.toString());
reactionKnockoutPage.setDefaultSelection(false);
addPage (reactionKnockoutPage) ;
initPopsExperPage = new InitPopsExperimentPage(model) ;
addPage (initPopsExperPage) ;
rateVarExperPage = new RateVariablesExperimentPage(model);
addPage (rateVarExperPage);
}
private class NumberArrayVariableModifier extends VariableModifier<Number> implements IVariableModifier<Number>{
/**
*
*/
private static final long serialVersionUID = 1L;
private Number[] numbers;
private int counter = 0;
public NumberArrayVariableModifier (Number[] numbers){
this.counter = 0;
this.numbers = numbers;
}
@Override
public Number next(ExperimentVariables variables)
throws NoNextVariableException {
int currentIndex = counter;
if (currentIndex == numbers.length)
throw new NoNextVariableException();
counter++;
return this.numbers[currentIndex];
}
@Override
public void reset() {
counter = 0;
}
}
private void computeBaseExperiment (){
LinkedList<ArrayInput> concentrationArrays = initPopsExperPage.getArrayInputs();
ExperimentVariables topLevel = null;
// First do the concentration arrays
for (ArrayInput arrayInput : concentrationArrays){
ExperimentVariables thisLevel = new ExperimentVariables();
// If this is the first level created then set the top level
// to this.
if (topLevel == null){ topLevel = thisLevel; }
NumberArrayVariableModifier arrayModifier = new NumberArrayVariableModifier(arrayInput.getDoubleValues());
ExperimentVariable<Number> variable =
new ExperimentVariable<Number>(arrayInput.getName(), 0, arrayModifier);
thisLevel.addVariable(variable);
}
// Create the base experiment and add in the experiment variables:
BaseExperiment baseExperiment = new BaseExperiment();
baseExperiment.setExperimentVariables(topLevel);
this.baseExperiment = baseExperiment;
}
public void computeExperimentSet(){
ExperimentSet experimentation = new ExperimentSet ();
/* The initial populations page*/
initPopsExperPage.addExperimentArrays(experimentation);
/* The reactions knockout page */
// reactionKnockoutPage.addKnockOutExperiments(experimentation);
LinkedList<SBAReaction> selectedReactions =
reactionKnockoutPage.getSelectedReactions();
for(SBAReaction reaction : selectedReactions){
String reactionName = reaction.getName();
// Add the off line
String lineName = reactionName + "-off";
ExperimentLine experLineOff = new ExperimentLine (lineName);
experLineOff.addReactionActivation(reactionName, false);
experimentation.addExperimentLine(experLineOff);
// Add the on line
lineName = reactionName + "-on";
ExperimentLine experLineOn = new ExperimentLine(lineName);
experLineOn.addReactionActivation(reactionName, true);
experimentation.addExperimentLine(experLineOn);
}
/* Finally the rate experimentation page */
rateVarExperPage.addExperimentArrays(experimentation);
// Do the same for the reactions page
// build a rates page and do the same for that
// allow turning an experimentset into a string
// build a saveas dialog and run that.
this.experimentSet = experimentation;
}
@Override
public boolean performFinish() {
computeExperimentSet();
computeBaseExperiment();
return true;
}
public IResource getUnderlyingResource() {
// TODO Auto-generated method stub
return null;
}
}