use of cbit.vcell.math.Event in project vcell by virtualcell.
the class XmlReader method getEvent.
private Event getEvent(MathDescription mathdesc, Element eventElement) throws XmlParseException {
String name = unMangle(eventElement.getAttributeValue(XMLTags.NameAttrTag));
Element element = eventElement.getChild(XMLTags.TriggerTag, vcNamespace);
Expression triggerExp = unMangleExpression(element.getText());
element = eventElement.getChild(XMLTags.DelayTag, vcNamespace);
Delay delay = null;
if (element != null) {
boolean useValuesFromTriggerTime = Boolean.valueOf(element.getAttributeValue(XMLTags.UseValuesFromTriggerTimeAttrTag)).booleanValue();
Expression durationExp = unMangleExpression(element.getText());
delay = new Delay(useValuesFromTriggerTime, durationExp);
}
ArrayList<EventAssignment> eventAssignmentList = new ArrayList<EventAssignment>();
Iterator<Element> iter = eventElement.getChildren(XMLTags.EventAssignmentTag, vcNamespace).iterator();
while (iter.hasNext()) {
element = iter.next();
String varname = element.getAttributeValue(XMLTags.EventAssignmentVariableAttrTag);
Expression assignExp = unMangleExpression(element.getText());
Variable var = mathdesc.getVariable(varname);
EventAssignment eventAssignment = new EventAssignment(var, assignExp);
eventAssignmentList.add(eventAssignment);
}
Event event = new Event(name, triggerExp, delay, eventAssignmentList);
transcribeComments(eventElement, event);
return event;
}
use of cbit.vcell.math.Event in project vcell by virtualcell.
the class OdeFileWriter method writeEvents.
private String writeEvents(HashMap<Discontinuity, String> discontinuityNameMap) throws ExpressionException {
Simulation simulation = simTask.getSimulation();
StringBuffer sb = new StringBuffer();
MathDescription mathDescription = simulation.getMathDescription();
Iterator<Event> iter = mathDescription.getEvents();
sb.append("EVENTS " + mathDescription.getNumEvents() + "\n");
while (iter.hasNext()) {
Event event = iter.next();
sb.append("EVENT " + event.getName() + "\n");
Expression triggerExpression = event.getTriggerExpression();
triggerExpression = MathUtilities.substituteFunctions(triggerExpression, varsSymbolTable).flatten();
Vector<Discontinuity> v = triggerExpression.getDiscontinuities();
for (Discontinuity od : v) {
od = getSubsitutedAndFlattened(od, varsSymbolTable);
String dname = discontinuityNameMap.get(od);
if (dname == null) {
dname = ROOT_VARIABLE_PREFIX + discontinuityNameMap.size();
discontinuityNameMap.put(od, dname);
}
triggerExpression.substituteInPlace(od.getDiscontinuityExp(), new Expression("(" + dname + "==1)"));
}
sb.append("TRIGGER " + triggerExpression.infix() + ";\n");
Delay delay = event.getDelay();
if (delay != null) {
Expression durationExpression = delay.getDurationExpression();
durationExpression = MathUtilities.substituteFunctions(durationExpression, varsSymbolTable).flatten();
sb.append("DELAY " + delay.useValuesFromTriggerTime() + " " + durationExpression.infix() + ";\n");
}
sb.append("EVENTASSIGNMENTS " + event.getNumEventAssignments() + "\n");
Iterator<EventAssignment> iter2 = event.getEventAssignments();
while (iter2.hasNext()) {
EventAssignment eventAssignment = iter2.next();
Expression assignmentExpression = eventAssignment.getAssignmentExpression();
assignmentExpression = MathUtilities.substituteFunctions(assignmentExpression, varsSymbolTable).flatten();
Variable assignmentTarget = eventAssignment.getVariable();
for (int i = 0; i < fieldStateVariables.size(); i++) {
if (assignmentTarget.getName().equals(fieldStateVariables.get(i).getVariable().getName())) {
sb.append(i + " " + assignmentExpression.infix() + ";\n");
break;
}
}
}
}
return sb.toString();
}
use of cbit.vcell.math.Event in project vcell by virtualcell.
the class MathModel_SBMLExporter method addSbmlEvent.
protected static void addSbmlEvent(Model sbmlModel, Event vcellMathEvent) {
org.sbml.jsbml.Event sbmlEvent = sbmlModel.createEvent();
sbmlEvent.setId(vcellMathEvent.getName());
// create trigger
Trigger trigger = sbmlEvent.createTrigger();
Expression triggerExpr = vcellMathEvent.getTriggerExpression();
//
// if trigger expression is not already in "boolean" form, then new expression is (exp != 0.0) ...nonzero is true.
//
ASTNode triggerMath = getFormulaFromExpression(triggerExpr, MathType.BOOLEAN);
trigger.setMath(triggerMath);
// create delay
cbit.vcell.math.Event.Delay vcellMathDelay = vcellMathEvent.getDelay();
if (vcellMathDelay != null && vcellMathDelay.getDurationExpression() != null && !vcellMathDelay.getDurationExpression().isZero()) {
Delay delay = sbmlEvent.createDelay();
Expression delayExpr = vcellMathDelay.getDurationExpression();
ASTNode delayMath = getFormulaFromExpression(delayExpr, MathType.REAL);
delay.setMath(delayMath);
sbmlEvent.setUseValuesFromTriggerTime(vcellMathDelay.useValuesFromTriggerTime());
}
// create eventAssignments
Iterator<EventAssignment> vcEventAssignments = vcellMathEvent.getEventAssignments();
while (vcEventAssignments.hasNext()) {
EventAssignment vcEventAssignment = vcEventAssignments.next();
org.sbml.jsbml.EventAssignment sbmlEA = sbmlEvent.createEventAssignment();
Variable target = vcEventAssignment.getVariable();
sbmlEA.setVariable(target.getName());
Expression eventAssgnExpr = new Expression(vcEventAssignment.getAssignmentExpression());
ASTNode eaMath = getFormulaFromExpression(eventAssgnExpr, MathType.REAL);
sbmlEA.setMath(eaMath);
}
}
Aggregations