Search in sources :

Example 1 with Event

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);
            }
        }
    }
}
Also used : EventAssignment(cbit.vcell.mapping.BioEvent.EventAssignment) ExpressionException(cbit.vcell.parser.ExpressionException) Delay(org.sbml.jsbml.Delay) InteriorPoint(org.sbml.jsbml.ext.spatial.InteriorPoint) LocalParameter(cbit.vcell.mapping.ParameterContext.LocalParameter) SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) Trigger(org.sbml.jsbml.Trigger) Expression(cbit.vcell.parser.Expression) ASTNode(org.sbml.jsbml.ASTNode) Event(org.sbml.jsbml.Event) BioEvent(cbit.vcell.mapping.BioEvent) BioEvent(cbit.vcell.mapping.BioEvent)

Example 2 with Event

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)
}
Also used : EventAssignment(cbit.vcell.mapping.BioEvent.EventAssignment) ArrayList(java.util.ArrayList) InteriorPoint(org.sbml.jsbml.ext.spatial.InteriorPoint) XMLStreamException(javax.xml.stream.XMLStreamException) SbmlException(org.vcell.sbml.SbmlException) IOException(java.io.IOException) PropertyVetoException(java.beans.PropertyVetoException) SBMLException(org.sbml.jsbml.SBMLException) ModelPropertyVetoException(cbit.vcell.model.ModelPropertyVetoException) ExpressionException(cbit.vcell.parser.ExpressionException) SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) Expression(cbit.vcell.parser.Expression) Model(cbit.vcell.model.Model) BioModel(cbit.vcell.biomodel.BioModel) Event(org.sbml.jsbml.Event) BioEvent(cbit.vcell.mapping.BioEvent) BioEvent(cbit.vcell.mapping.BioEvent)

Example 3 with Event

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)
}
Also used : Issue(org.vcell.util.Issue) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) ASTNode(org.sbml.jsbml.ASTNode) EventAssignment(cbit.vcell.mapping.BioEvent.EventAssignment) SimulationContext(cbit.vcell.mapping.SimulationContext) InteriorPoint(org.sbml.jsbml.ext.spatial.InteriorPoint) XMLStreamException(javax.xml.stream.XMLStreamException) SbmlException(org.vcell.sbml.SbmlException) XmlParseException(cbit.vcell.xml.XmlParseException) IOException(java.io.IOException) PropertyVetoException(java.beans.PropertyVetoException) DivideByZeroException(cbit.vcell.parser.DivideByZeroException) SBMLException(org.sbml.jsbml.SBMLException) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) ModelPropertyVetoException(cbit.vcell.model.ModelPropertyVetoException) ExpressionException(cbit.vcell.parser.ExpressionException) Expression(cbit.vcell.parser.Expression) Model(cbit.vcell.model.Model) BioModel(cbit.vcell.biomodel.BioModel) Event(org.sbml.jsbml.Event) BioEvent(cbit.vcell.mapping.BioEvent) BioEvent(cbit.vcell.mapping.BioEvent)

Aggregations

BioEvent (cbit.vcell.mapping.BioEvent)3 EventAssignment (cbit.vcell.mapping.BioEvent.EventAssignment)3 Expression (cbit.vcell.parser.Expression)3 ExpressionException (cbit.vcell.parser.ExpressionException)3 SymbolTableEntry (cbit.vcell.parser.SymbolTableEntry)3 Event (org.sbml.jsbml.Event)3 InteriorPoint (org.sbml.jsbml.ext.spatial.InteriorPoint)3 BioModel (cbit.vcell.biomodel.BioModel)2 Model (cbit.vcell.model.Model)2 ModelPropertyVetoException (cbit.vcell.model.ModelPropertyVetoException)2 PropertyVetoException (java.beans.PropertyVetoException)2 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 XMLStreamException (javax.xml.stream.XMLStreamException)2 ASTNode (org.sbml.jsbml.ASTNode)2 SBMLException (org.sbml.jsbml.SBMLException)2 SbmlException (org.vcell.sbml.SbmlException)2 LocalParameter (cbit.vcell.mapping.ParameterContext.LocalParameter)1 SimulationContext (cbit.vcell.mapping.SimulationContext)1 DivideByZeroException (cbit.vcell.parser.DivideByZeroException)1