use of org.sbml.jsbml.Event in project vcell by virtualcell.
the class SBMLExporter method addEvents.
/**
* Export events
*/
protected void addEvents() {
BioEvent[] vcBioevents = getSelectedSimContext().getBioEvents();
if (vcBioevents != null) {
for (BioEvent vcEvent : vcBioevents) {
Event sbmlEvent = sbmlModel.createEvent();
sbmlEvent.setId(vcEvent.getName());
sbmlEvent.setUseValuesFromTriggerTime(vcEvent.getUseValuesFromTriggerTime());
// create trigger
Trigger trigger = sbmlEvent.createTrigger();
trigger.setPersistent(true);
// NOTE: VCell solver behavior is to fire if trigger is true at timepoint 0
// solver does work correctly if there is a non-zero delay
// BUT - solver does not correctly simulate when the delay is 0 and when it also fires at 0
// ----> will need a fix in solver
// HOWEVER - the correct SBML translation requires to set the initial value to false
trigger.setInitialValue(false);
// get the math for the trigger in terms of variables and globals only
try {
Expression triggerExpr = vcEvent.generateTriggerExpression();
Expression flattenedTrigger = MathUtilities.substituteModelParameters(triggerExpr, vcSelectedSimContext);
// TODO - we will need to add event parameter info into VCell notes so we can recover the semantic of trigger type on roundtrip and transform back a flattened expression
ASTNode math = getFormulaFromExpression(flattenedTrigger, MathType.BOOLEAN);
trigger.setMath(math);
} catch (ExpressionException e) {
e.printStackTrace(System.out);
throw new RuntimeException("failed to generate trigger expression for event " + vcEvent.getName() + ": " + e.getMessage());
}
// create delay
LocalParameter delayParam = vcEvent.getParameter(BioEventParameterType.TriggerDelay);
if (delayParam != null && delayParam.getExpression() != null && !delayParam.getExpression().isZero()) {
Delay delay = sbmlEvent.createDelay();
Expression delayExpr = delayParam.getExpression();
ASTNode math = getFormulaFromExpression(delayExpr);
delay.setMath(math);
sbmlEvent.setUseValuesFromTriggerTime(vcEvent.getUseValuesFromTriggerTime());
}
// create eventAssignments
ArrayList<EventAssignment> vcEventAssgns = vcEvent.getEventAssignments();
for (int j = 0; j < vcEventAssgns.size(); j++) {
org.sbml.jsbml.EventAssignment sbmlEA = sbmlEvent.createEventAssignment();
SymbolTableEntry target = vcEventAssgns.get(j).getTarget();
sbmlEA.setVariable(target.getName());
Expression eventAssgnExpr = new Expression(vcEventAssgns.get(j).getAssignmentExpression());
ASTNode eaMath = getFormulaFromExpression(eventAssgnExpr);
sbmlEA.setMath(eaMath);
}
}
}
}
use of org.sbml.jsbml.Event in project vcell by virtualcell.
the class SBMLImporter method addEvents.
protected void addEvents() {
if (sbmlModel.getNumEvents() > 0) {
// VCell does not support events in spatial model
if (bSpatial) {
throw new SBMLImportException("Events are not supported in a spatial VCell model.");
}
ListOf<Event> listofEvents = sbmlModel.getListOfEvents();
Model vcModel = vcBioModel.getSimulationContext(0).getModel();
for (int i = 0; i < sbmlModel.getNumEvents(); i++) {
try {
Event event = listofEvents.get(i);
// trigger - adjust for species context and time conversion
// factors if necessary
Expression triggerExpr = null;
if (event.isSetTrigger()) {
triggerExpr = getExpressionFromFormula(event.getTrigger().getMath());
triggerExpr = adjustExpression(triggerExpr, vcModel);
}
// create bioevent
String eventName = event.getId();
if (eventName == null || eventName.length() == 0) {
eventName = TokenMangler.mangleToSName(event.getName());
// vcBioModel.getSimulationContext(0).
if (eventName == null || eventName.length() == 0) {
eventName = vcBioModel.getSimulationContext(0).getFreeEventName(null);
}
}
// delay
BioEvent vcEvent = new BioEvent(eventName, TriggerType.GeneralTrigger, true, vcBioModel.getSimulationContext(0));
if (event.isSetDelay()) {
Expression durationExpr = null;
durationExpr = getExpressionFromFormula(event.getDelay().getMath());
durationExpr = adjustExpression(durationExpr, vcModel);
boolean bUseValsFromTriggerTime = true;
if (event.isSetUseValuesFromTriggerTime()) {
bUseValsFromTriggerTime = event.isSetUseValuesFromTriggerTime();
} else {
if (durationExpr != null && !durationExpr.isZero()) {
bUseValsFromTriggerTime = false;
}
}
if (durationExpr != null && !durationExpr.isZero()) {
bUseValsFromTriggerTime = false;
}
vcEvent.setUseValuesFromTriggerTime(bUseValsFromTriggerTime);
vcEvent.getParameter(BioEventParameterType.TriggerDelay).setExpression(durationExpr);
}
// event assignments
ArrayList<EventAssignment> vcEvntAssgnList = new ArrayList<EventAssignment>();
for (int j = 0; j < event.getNumEventAssignments(); j++) {
org.sbml.jsbml.EventAssignment sbmlEvntAssgn = event.getEventAssignment(j);
String varName = sbmlEvntAssgn.getVariable();
SymbolTableEntry varSTE = vcBioModel.getSimulationContext(0).getEntry(varName);
if (varSTE != null) {
Expression evntAssgnExpr = getExpressionFromFormula(sbmlEvntAssgn.getMath());
evntAssgnExpr = adjustExpression(evntAssgnExpr, vcModel);
EventAssignment vcEvntAssgn = vcEvent.new EventAssignment(varSTE, evntAssgnExpr);
vcEvntAssgnList.add(vcEvntAssgn);
} else {
logger.sendMessage(VCLogger.Priority.HighPriority, VCLogger.ErrorType.UnsupportedConstruct, "No symbolTableEntry for '" + varName + "'; Cannot add event assignment.");
}
}
vcEvent.setEventAssignmentsList(vcEvntAssgnList);
vcEvent.bind();
vcBioModel.getSimulationContext(0).addBioEvent(vcEvent);
} catch (Exception e) {
e.printStackTrace(System.out);
throw new SBMLImportException(e.getMessage(), e);
}
// end - try/catch
}
// end - for(sbmlEvents)
}
// end - if numEvents > 0)
}
use of org.sbml.jsbml.Event in project vcell by virtualcell.
the class SBMLImporter method addEvents.
protected void addEvents(Map<String, String> sbmlToVcNameMap) {
if (sbmlModel.getNumEvents() > 0) {
// VCell does not support events in spatial model
if (bSpatial) {
throw new SBMLImportException("Events are not supported in a spatial VCell model.");
}
ListOf<Event> listofEvents = sbmlModel.getListOfEvents();
SimulationContext simContext = vcBioModel.getSimulationContext(0);
Model vcModel = simContext.getModel();
Map<String, SymbolTableEntry> entryMap = new HashMap<String, SymbolTableEntry>();
simContext.getEntries(entryMap);
for (int i = 0; i < sbmlModel.getNumEvents(); i++) {
try {
Event event = listofEvents.get(i);
// trigger - adjust for species context and time conversion factors if necessary
Expression triggerExpr = null;
if (event.isSetTrigger()) {
triggerExpr = getExpressionFromFormula(event.getTrigger().getMath());
triggerExpr = adjustExpression(triggerExpr, vcModel);
}
// convert reserved symbols, if any
if (!sbmlToVcNameMap.isEmpty() && triggerExpr != null && triggerExpr.getSymbols() != null && triggerExpr.getSymbols().length > 0) {
String[] symbols = triggerExpr.getSymbols();
for (String oldSymbol : symbols) {
String newSymbol = sbmlToVcNameMap.get(oldSymbol);
if (newSymbol != null) {
triggerExpr.substituteInPlace(new Expression(oldSymbol), new Expression(newSymbol));
}
}
}
// create bioevent
String eventName = event.getId();
if (eventName == null || eventName.length() == 0) {
eventName = TokenMangler.mangleToSName(event.getName());
// vcBioModel.getSimulationContext(0).
if (eventName == null || eventName.length() == 0) {
eventName = vcBioModel.getSimulationContext(0).getFreeEventName(null);
}
}
// delay
BioEvent vcEvent = new BioEvent(eventName, TriggerType.GeneralTrigger, true, vcBioModel.getSimulationContext(0));
if (event.isSetDelay()) {
Expression durationExpr = null;
durationExpr = getExpressionFromFormula(event.getDelay().getMath());
durationExpr = adjustExpression(durationExpr, vcModel);
// convert reserved symbols, if any
if (!sbmlToVcNameMap.isEmpty() && durationExpr != null && durationExpr.getSymbols() != null && durationExpr.getSymbols().length > 0) {
String[] symbols = durationExpr.getSymbols();
for (String oldSymbol : symbols) {
String newSymbol = sbmlToVcNameMap.get(oldSymbol);
if (newSymbol != null) {
durationExpr.substituteInPlace(new Expression(oldSymbol), new Expression(newSymbol));
}
}
}
boolean bUseValsFromTriggerTime = true;
if (event.isSetUseValuesFromTriggerTime()) {
bUseValsFromTriggerTime = event.isSetUseValuesFromTriggerTime();
} else {
if (durationExpr != null && !durationExpr.isZero()) {
bUseValsFromTriggerTime = false;
}
}
if (durationExpr != null && !durationExpr.isZero()) {
bUseValsFromTriggerTime = false;
}
vcEvent.setUseValuesFromTriggerTime(bUseValsFromTriggerTime);
vcEvent.getParameter(BioEventParameterType.TriggerDelay).setExpression(durationExpr);
}
cbit.vcell.mapping.ParameterContext.LocalParameter triggerParameter = vcEvent.getParameter(BioEventParameterType.GeneralTriggerFunction);
triggerParameter.setExpression(triggerExpr);
// event assignments
ArrayList<EventAssignment> vcEvntAssgnList = new ArrayList<EventAssignment>();
for (int j = 0; j < event.getNumEventAssignments(); j++) {
org.sbml.jsbml.EventAssignment sbmlEvntAssgn = event.getEventAssignment(j);
String sbmlVarName = sbmlEvntAssgn.getVariable();
String vcVarName = sbmlVarName;
if (sbmlToVcNameMap.get(sbmlVarName) != null) {
// convert reserved symbols, if any
vcVarName = sbmlToVcNameMap.get(sbmlVarName);
}
SymbolTableEntry ste = simContext.getEntry(vcVarName);
if (ste != null) {
Expression evntAssgnExpr;
ASTNode node = sbmlEvntAssgn.getMath();
if (node == null) {
evntAssgnExpr = new Expression("0.0");
String msg = "Event assignment expression is null for event '" + eventName + "'.";
localIssueList.add(new Issue(vcBioModel, issueContext, IssueCategory.SBMLImport_UnsupportedAttributeOrElement, msg, Issue.Severity.WARNING));
} else {
evntAssgnExpr = getExpressionFromFormula(node);
}
evntAssgnExpr = adjustExpression(evntAssgnExpr, vcModel);
// convert reserved symbols, if any
if (!sbmlToVcNameMap.isEmpty() && evntAssgnExpr != null && evntAssgnExpr.getSymbols() != null && evntAssgnExpr.getSymbols().length > 0) {
String[] symbols = evntAssgnExpr.getSymbols();
for (String oldSymbol : symbols) {
String newSymbol = sbmlToVcNameMap.get(oldSymbol);
if (newSymbol != null) {
evntAssgnExpr.substituteInPlace(new Expression(oldSymbol), new Expression(newSymbol));
}
}
}
EventAssignment vcEvntAssgn = vcEvent.new EventAssignment(ste, evntAssgnExpr);
vcEvntAssgnList.add(vcEvntAssgn);
} else {
logger.sendMessage(VCLogger.Priority.HighPriority, VCLogger.ErrorType.UnsupportedConstruct, "No symbolTableEntry for '" + vcVarName + "'; Cannot add event assignment.");
}
}
vcEvent.setEventAssignmentsList(vcEvntAssgnList);
vcEvent.bind();
vcBioModel.getSimulationContext(0).addBioEvent(vcEvent);
} catch (Exception e) {
e.printStackTrace(System.out);
throw new SBMLImportException(e.getMessage(), e);
}
// end - try/catch
}
// end - for(sbmlEvents)
}
// end - if numEvents > 0)
}
Aggregations