Search in sources :

Example 1 with SBMLSupport

use of org.jlibsedml.modelsupport.SBMLSupport in project vcell by virtualcell.

the class SEDMLExporter method translateBioModelToSedML.

private void translateBioModelToSedML(String savePath) {
    sbmlFilePathStrAbsoluteList.clear();
    // models
    try {
        SimulationContext[] simContexts = vcBioModel.getSimulationContexts();
        cbit.vcell.model.Model vcModel = vcBioModel.getModel();
        // "urn:sedml:language:sbml";
        String sbmlLanguageURN = SUPPORTED_LANGUAGE.SBML_GENERIC.getURN();
        String bioModelName = TokenMangler.mangleToSName(vcBioModel.getName());
        // String usrHomeDirPath = ResourceUtil.getUserHomeDir().getAbsolutePath();
        // to get Xpath string for variables.
        SBMLSupport sbmlSupport = new SBMLSupport();
        // for model count, task subcount
        int simContextCnt = 0;
        // for dtaGenerator count.
        int varCount = 0;
        boolean bSpeciesAddedAsDataGens = false;
        String sedmlNotesStr = "";
        for (SimulationContext simContext : simContexts) {
            String simContextName = simContext.getName();
            // export all applications that are not spatial stochastic
            if (!(simContext.getGeometry().getDimension() > 0 && simContext.isStoch())) {
                // to compute and set the sizes of the remaining structures.
                if (!simContext.getGeometryContext().isAllSizeSpecifiedPositive()) {
                    Structure structure = simContext.getModel().getStructure(0);
                    double structureSize = 1.0;
                    StructureMapping structMapping = simContext.getGeometryContext().getStructureMapping(structure);
                    StructureSizeSolver.updateAbsoluteStructureSizes(simContext, structure, structureSize, structMapping.getSizeParameter().getUnitDefinition());
                }
                // Export the application itself to SBML, with default overrides
                String sbmlString = null;
                int level = 2;
                int version = 4;
                boolean isSpatial = simContext.getGeometry().getDimension() > 0 ? true : false;
                SimulationJob simJob = null;
                // if (simContext.getGeometry().getDimension() > 0) {
                // sbmlString = XmlHelper.exportSBML(vcBioModel, 2, 4, 0, true, simContext, null);
                // } else {
                // sbmlString = XmlHelper.exportSBML(vcBioModel, 2, 4, 0, false, simContext, null);
                // }
                // 
                // TODO: we need to salvage from the SBMLExporter info about the fate of local parameters
                // some of them may stay as locals, some others may become globals
                // Any of these, if used in a repeated task or change or whatever, needs to be used in a consistent way,
                // that is, if a param becomes a global in SBML, we need to refer at it in SEDML as the same global
                // 
                // We'll use:
                // Map<Pair <String reaction, String param>, String global>		- if local converted to global
                // Set<Pair <String reaction, String param>>	(if needed?)	- if local stays local
                // 
                // local to global translation map
                Map<Pair<String, String>, String> l2gMap = null;
                if (vcBioModel instanceof BioModel) {
                    try {
                        // check if model to be exported to SBML has units compatible with SBML default units (default units in SBML can be assumed only until SBML Level2)
                        ModelUnitSystem forcedModelUnitSystem = simContext.getModel().getUnitSystem();
                        if (level < 3 && !ModelUnitSystem.isCompatibleWithDefaultSBMLLevel2Units(forcedModelUnitSystem)) {
                            forcedModelUnitSystem = ModelUnitSystem.createDefaultSBMLLevel2Units();
                        }
                        // create new Biomodel with new (SBML compatible)  unit system
                        BioModel modifiedBiomodel = ModelUnitConverter.createBioModelWithNewUnitSystem(simContext.getBioModel(), forcedModelUnitSystem);
                        // extract the simContext from new Biomodel. Apply overrides to *this* modified simContext
                        SimulationContext simContextFromModifiedBioModel = modifiedBiomodel.getSimulationContext(simContext.getName());
                        SBMLExporter sbmlExporter = new SBMLExporter(modifiedBiomodel, level, version, isSpatial);
                        sbmlExporter.setSelectedSimContext(simContextFromModifiedBioModel);
                        // no sim job
                        sbmlExporter.setSelectedSimulationJob(null);
                        sbmlString = sbmlExporter.getSBMLFile();
                        l2gMap = sbmlExporter.getLocalToGlobalTranslationMap();
                    } catch (ExpressionException | SbmlException e) {
                        e.printStackTrace(System.out);
                        throw new XmlParseException(e);
                    }
                } else {
                    throw new RuntimeException("unsupported Document Type " + vcBioModel.getClass().getName() + " for SBML export");
                }
                String sbmlFilePathStrAbsolute = savePath + FileUtils.WINDOWS_SEPARATOR + bioModelName + "_" + simContextName + ".xml";
                String sbmlFilePathStrRelative = bioModelName + "_" + simContextName + ".xml";
                XmlUtil.writeXMLStringToFile(sbmlString, sbmlFilePathStrAbsolute, true);
                sbmlFilePathStrAbsoluteList.add(sbmlFilePathStrRelative);
                String simContextId = TokenMangler.mangleToSName(simContextName);
                sedmlModel.addModel(new Model(simContextId, simContextName, sbmlLanguageURN, sbmlFilePathStrRelative));
                // required for mathOverrides, if any
                MathMapping mathMapping = simContext.createNewMathMapping();
                MathSymbolMapping mathSymbolMapping = mathMapping.getMathSymbolMapping();
                // create sedml simulation objects and tasks (mapping each sim with current simContext)
                int simCount = 0;
                String taskRef = null;
                int overrideCount = 0;
                for (Simulation vcSimulation : simContext.getSimulations()) {
                    List<DataGenerator> dataGeneratorsOfSim = new ArrayList<DataGenerator>();
                    // if simContext is non-spatial stochastic, check if sim is histogram
                    SolverTaskDescription simTaskDesc = vcSimulation.getSolverTaskDescription();
                    if (simContext.getGeometry().getDimension() == 0 && simContext.isStoch()) {
                        long numOfTrials = simTaskDesc.getStochOpt().getNumOfTrials();
                        if (numOfTrials > 1) {
                            String msg = "\n\t" + simContextName + " ( " + vcSimulation.getName() + " ) : export of non-spatial stochastic simulation with histogram option to SEDML not supported at this time.";
                            sedmlNotesStr += msg;
                            continue;
                        }
                    }
                    // create Algorithm and sedmlSimulation (UniformtimeCourse)
                    SolverDescription vcSolverDesc = simTaskDesc.getSolverDescription();
                    // String kiSAOIdStr = getKiSAOIdFromSimulation(vcSolverDesc);	// old way of doing it, going directly to the web site
                    String kiSAOIdStr = vcSolverDesc.getKisao();
                    Algorithm sedmlAlgorithm = new Algorithm(kiSAOIdStr);
                    TimeBounds vcSimTimeBounds = simTaskDesc.getTimeBounds();
                    double startingTime = vcSimTimeBounds.getStartingTime();
                    String simName = vcSimulation.getName();
                    UniformTimeCourse utcSim = new UniformTimeCourse(TokenMangler.mangleToSName(simName), simName, startingTime, startingTime, vcSimTimeBounds.getEndingTime(), (int) simTaskDesc.getExpectedNumTimePoints(), sedmlAlgorithm);
                    // if solver is not CVODE, add a note to utcSim to indicate actual solver name
                    if (!vcSolverDesc.equals(SolverDescription.CVODE)) {
                        String simNotesStr = "Actual Solver Name : '" + vcSolverDesc.getDisplayLabel() + "'.";
                        utcSim.addNote(createNotesElement(simNotesStr));
                    }
                    sedmlModel.addSimulation(utcSim);
                    // add SEDML tasks (map simulation to model:simContext)
                    // repeated tasks
                    MathOverrides mathOverrides = vcSimulation.getMathOverrides();
                    if (mathOverrides != null && mathOverrides.hasOverrides()) {
                        String[] overridenConstantNames = mathOverrides.getOverridenConstantNames();
                        String[] scannedConstantsNames = mathOverrides.getScannedConstantNames();
                        HashMap<String, String> scannedParamHash = new HashMap<String, String>();
                        HashMap<String, String> unscannedParamHash = new HashMap<String, String>();
                        for (String name : scannedConstantsNames) {
                            scannedParamHash.put(name, name);
                        }
                        for (String name : overridenConstantNames) {
                            if (!scannedParamHash.containsKey(name)) {
                                unscannedParamHash.put(name, name);
                            }
                        }
                        if (!unscannedParamHash.isEmpty() && scannedParamHash.isEmpty()) {
                            // only parameters with simple overrides (numeric/expression) no scans
                            // create new model with change for each parameter that has override; add simple task
                            String overriddenSimContextId = simContextId + "_" + overrideCount;
                            String overriddenSimContextName = simContextName + " modified";
                            Model sedModel = new Model(overriddenSimContextId, overriddenSimContextName, sbmlLanguageURN, simContextId);
                            overrideCount++;
                            for (String unscannedParamName : unscannedParamHash.values()) {
                                SymbolTableEntry ste = getSymbolTableEntryForModelEntity(mathSymbolMapping, unscannedParamName);
                                Expression unscannedParamExpr = mathOverrides.getActualExpression(unscannedParamName, 0);
                                if (unscannedParamExpr.isNumeric()) {
                                    // if expression is numeric, add ChangeAttribute to model created above
                                    XPathTarget targetXpath = getTargetAttributeXPath(ste, l2gMap);
                                    ChangeAttribute changeAttribute = new ChangeAttribute(targetXpath, unscannedParamExpr.infix());
                                    sedModel.addChange(changeAttribute);
                                } else {
                                    // non-numeric expression : add 'computeChange' to modified model
                                    ASTNode math = Libsedml.parseFormulaString(unscannedParamExpr.infix());
                                    XPathTarget targetXpath = getTargetXPath(ste, l2gMap);
                                    ComputeChange computeChange = new ComputeChange(targetXpath, math);
                                    String[] exprSymbols = unscannedParamExpr.getSymbols();
                                    for (String symbol : exprSymbols) {
                                        String symbolName = TokenMangler.mangleToSName(symbol);
                                        SymbolTableEntry ste1 = vcModel.getEntry(symbol);
                                        if (ste != null) {
                                            if (ste1 instanceof SpeciesContext || ste1 instanceof Structure || ste1 instanceof ModelParameter) {
                                                XPathTarget ste1_XPath = getTargetXPath(ste1, l2gMap);
                                                org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(symbolName, symbolName, taskRef, ste1_XPath.getTargetAsString());
                                                computeChange.addVariable(sedmlVar);
                                            } else {
                                                double doubleValue = 0.0;
                                                if (ste1 instanceof ReservedSymbol) {
                                                    doubleValue = getReservedSymbolValue(ste1);
                                                }
                                                Parameter sedmlParameter = new Parameter(symbolName, symbolName, doubleValue);
                                                computeChange.addParameter(sedmlParameter);
                                            }
                                        } else {
                                            throw new RuntimeException("Symbol '" + symbol + "' used in expression for '" + unscannedParamName + "' not found in model.");
                                        }
                                    }
                                    sedModel.addChange(computeChange);
                                }
                            }
                            sedmlModel.addModel(sedModel);
                            String taskId = "tsk_" + simContextCnt + "_" + simCount;
                            Task sedmlTask = new Task(taskId, taskId, sedModel.getId(), utcSim.getId());
                            sedmlModel.addTask(sedmlTask);
                            // to be used later to add dataGenerators : one set of DGs per model (simContext).
                            taskRef = taskId;
                        } else if (!scannedParamHash.isEmpty() && unscannedParamHash.isEmpty()) {
                            // only parameters with scans : only add 1 Task and 1 RepeatedTask
                            String taskId = "tsk_" + simContextCnt + "_" + simCount;
                            Task sedmlTask = new Task(taskId, taskId, simContextId, utcSim.getId());
                            sedmlModel.addTask(sedmlTask);
                            String repeatedTaskId = "repTsk_" + simContextCnt + "_" + simCount;
                            // TODO: temporary solution - we use as range here the first range
                            String scn = scannedConstantsNames[0];
                            String rId = "range_" + simContextCnt + "_" + simCount + "_" + scn;
                            RepeatedTask rt = new RepeatedTask(repeatedTaskId, repeatedTaskId, true, rId);
                            // to be used later to add dataGenerators - in our case it has to be the repeated task
                            taskRef = repeatedTaskId;
                            SubTask subTask = new SubTask("0", taskId);
                            rt.addSubtask(subTask);
                            for (String scannedConstName : scannedConstantsNames) {
                                ConstantArraySpec constantArraySpec = mathOverrides.getConstantArraySpec(scannedConstName);
                                String rangeId = "range_" + simContextCnt + "_" + simCount + "_" + scannedConstName;
                                // list of Ranges, if sim is parameter scan.
                                if (constantArraySpec != null) {
                                    Range r = null;
                                    System.out.println("     " + constantArraySpec.toString());
                                    if (constantArraySpec.getType() == ConstantArraySpec.TYPE_INTERVAL) {
                                        // ------ Uniform Range
                                        r = new UniformRange(rangeId, constantArraySpec.getMinValue(), constantArraySpec.getMaxValue(), constantArraySpec.getNumValues());
                                        rt.addRange(r);
                                    } else {
                                        // ----- Vector Range
                                        cbit.vcell.math.Constant[] cs = constantArraySpec.getConstants();
                                        ArrayList<Double> values = new ArrayList<Double>();
                                        for (int i = 0; i < cs.length; i++) {
                                            String value = cs[i].getExpression().infix();
                                            values.add(Double.parseDouble(value));
                                        }
                                        r = new VectorRange(rangeId, values);
                                        rt.addRange(r);
                                    }
                                    // list of Changes
                                    SymbolTableEntry ste = getSymbolTableEntryForModelEntity(mathSymbolMapping, scannedConstName);
                                    XPathTarget target = getTargetXPath(ste, l2gMap);
                                    // ASTNode math1 = new ASTCi(r.getId());		// was scannedConstName
                                    ASTNode math1 = Libsedml.parseFormulaString(r.getId());
                                    SetValue setValue = new SetValue(target, r.getId(), simContextId);
                                    setValue.setMath(math1);
                                    rt.addChange(setValue);
                                } else {
                                    throw new RuntimeException("No scan ranges found for scanned parameter : '" + scannedConstName + "'.");
                                }
                            }
                            sedmlModel.addTask(rt);
                        } else {
                            // both scanned and simple parameters : create new model with change for each simple override; add RepeatedTask
                            // create new model with change for each unscanned parameter that has override
                            String overriddenSimContextId = simContextId + "_" + overrideCount;
                            String overriddenSimContextName = simContextName + " modified";
                            Model sedModel = new Model(overriddenSimContextId, overriddenSimContextName, sbmlLanguageURN, simContextId);
                            overrideCount++;
                            String taskId = "tsk_" + simContextCnt + "_" + simCount;
                            Task sedmlTask = new Task(taskId, taskId, overriddenSimContextId, utcSim.getId());
                            sedmlModel.addTask(sedmlTask);
                            // scanned parameters
                            String repeatedTaskId = "repTsk_" + simContextCnt + "_" + simCount;
                            // TODO: temporary solution - we use as range here the first range
                            String scn = scannedConstantsNames[0];
                            String rId = "range_" + simContextCnt + "_" + simCount + "_" + scn;
                            RepeatedTask rt = new RepeatedTask(repeatedTaskId, repeatedTaskId, true, rId);
                            // to be used later to add dataGenerators - in our case it has to be the repeated task
                            taskRef = repeatedTaskId;
                            SubTask subTask = new SubTask("0", taskId);
                            rt.addSubtask(subTask);
                            for (String scannedConstName : scannedConstantsNames) {
                                ConstantArraySpec constantArraySpec = mathOverrides.getConstantArraySpec(scannedConstName);
                                String rangeId = "range_" + simContextCnt + "_" + simCount + "_" + scannedConstName;
                                // list of Ranges, if sim is parameter scan.
                                if (constantArraySpec != null) {
                                    Range r = null;
                                    System.out.println("     " + constantArraySpec.toString());
                                    if (constantArraySpec.getType() == ConstantArraySpec.TYPE_INTERVAL) {
                                        // ------ Uniform Range
                                        r = new UniformRange(rangeId, constantArraySpec.getMinValue(), constantArraySpec.getMaxValue(), constantArraySpec.getNumValues());
                                        rt.addRange(r);
                                    } else {
                                        // ----- Vector Range
                                        cbit.vcell.math.Constant[] cs = constantArraySpec.getConstants();
                                        ArrayList<Double> values = new ArrayList<Double>();
                                        for (int i = 0; i < cs.length; i++) {
                                            String value = cs[i].getExpression().infix() + ", ";
                                            values.add(Double.parseDouble(value));
                                        }
                                        r = new VectorRange(rangeId, values);
                                        rt.addRange(r);
                                    }
                                    // use scannedParamHash to store rangeId for that param, since it might be needed if unscanned param has a scanned param in expr.
                                    if (scannedParamHash.get(scannedConstName).equals(scannedConstName)) {
                                        // the hash was originally populated as <scannedParamName, scannedParamName>. Replace 'value' with rangeId for scannedParam
                                        scannedParamHash.put(scannedConstName, r.getId());
                                    }
                                    // create setValue for scannedConstName
                                    SymbolTableEntry ste2 = getSymbolTableEntryForModelEntity(mathSymbolMapping, scannedConstName);
                                    XPathTarget target1 = getTargetXPath(ste2, l2gMap);
                                    ASTNode math1 = new ASTCi(scannedConstName);
                                    SetValue setValue1 = new SetValue(target1, r.getId(), sedModel.getId());
                                    setValue1.setMath(math1);
                                    rt.addChange(setValue1);
                                } else {
                                    throw new RuntimeException("No scan ranges found for scanned parameter : '" + scannedConstName + "'.");
                                }
                            }
                            // for unscanned parameter overrides
                            for (String unscannedParamName : unscannedParamHash.values()) {
                                SymbolTableEntry ste = getSymbolTableEntryForModelEntity(mathSymbolMapping, unscannedParamName);
                                Expression unscannedParamExpr = mathOverrides.getActualExpression(unscannedParamName, 0);
                                if (unscannedParamExpr.isNumeric()) {
                                    // if expression is numeric, add ChangeAttribute to model created above
                                    XPathTarget targetXpath = getTargetAttributeXPath(ste, l2gMap);
                                    ChangeAttribute changeAttribute = new ChangeAttribute(targetXpath, unscannedParamExpr.infix());
                                    sedModel.addChange(changeAttribute);
                                } else {
                                    // check for any scanned parameter in unscanned parameter expression
                                    ASTNode math = Libsedml.parseFormulaString(unscannedParamExpr.infix());
                                    String[] exprSymbols = unscannedParamExpr.getSymbols();
                                    boolean bHasScannedParameter = false;
                                    String scannedParamNameInUnscannedParamExp = null;
                                    for (String symbol : exprSymbols) {
                                        if (scannedParamHash.get(symbol) != null) {
                                            bHasScannedParameter = true;
                                            scannedParamNameInUnscannedParamExp = new String(symbol);
                                            // @TODO check for multiple scannedParameters in expression.
                                            break;
                                        }
                                    }
                                    // (scanned parameter in expr) ? (add setValue for unscanned param in repeatedTask) : (add computeChange to modifiedModel)
                                    if (bHasScannedParameter && scannedParamNameInUnscannedParamExp != null) {
                                        // create setValue for unscannedParamName (which contains a scanned param in its expression)
                                        SymbolTableEntry entry = getSymbolTableEntryForModelEntity(mathSymbolMapping, unscannedParamName);
                                        XPathTarget target = getTargetXPath(entry, l2gMap);
                                        String rangeId = scannedParamHash.get(scannedParamNameInUnscannedParamExp);
                                        // @TODO: we have no range??
                                        SetValue setValue = new SetValue(target, rangeId, sedModel.getId());
                                        setValue.setMath(math);
                                        rt.addChange(setValue);
                                    } else {
                                        // non-numeric expression : add 'computeChange' to modified model
                                        XPathTarget targetXpath = getTargetXPath(ste, l2gMap);
                                        ComputeChange computeChange = new ComputeChange(targetXpath, math);
                                        for (String symbol : exprSymbols) {
                                            String symbolName = TokenMangler.mangleToSName(symbol);
                                            SymbolTableEntry ste1 = vcModel.getEntry(symbol);
                                            // ste1 could be a math parameter, hence the above could return null
                                            if (ste1 == null) {
                                                ste1 = simContext.getMathDescription().getEntry(symbol);
                                            }
                                            if (ste1 != null) {
                                                if (ste1 instanceof SpeciesContext || ste1 instanceof Structure || ste1 instanceof ModelParameter) {
                                                    XPathTarget ste1_XPath = getTargetXPath(ste1, l2gMap);
                                                    org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(symbolName, symbolName, taskRef, ste1_XPath.getTargetAsString());
                                                    computeChange.addVariable(sedmlVar);
                                                } else {
                                                    double doubleValue = 0.0;
                                                    if (ste1 instanceof ReservedSymbol) {
                                                        doubleValue = getReservedSymbolValue(ste1);
                                                    } else if (ste instanceof Function) {
                                                        try {
                                                            doubleValue = ste.getExpression().evaluateConstant();
                                                        } catch (Exception e) {
                                                            e.printStackTrace(System.out);
                                                            throw new RuntimeException("Unable to evaluate function '" + ste.getName() + "' used in '" + unscannedParamName + "' expression : ", e);
                                                        }
                                                    } else {
                                                        doubleValue = ste.getConstantValue();
                                                    }
                                                    // TODO: shouldn't be s1_init_uM which is a math symbol, should be s0 (so use the ste-something from above)
                                                    // TODO: revert to Variable, not Parameter
                                                    Parameter sedmlParameter = new Parameter(symbolName, symbolName, doubleValue);
                                                    computeChange.addParameter(sedmlParameter);
                                                }
                                            } else {
                                                throw new RuntimeException("Symbol '" + symbol + "' used in expression for '" + unscannedParamName + "' not found in model.");
                                            }
                                        }
                                        sedModel.addChange(computeChange);
                                    }
                                }
                            }
                            sedmlModel.addModel(sedModel);
                            sedmlModel.addTask(rt);
                        }
                    } else {
                        // no math overrides, add basic task.
                        String taskId = "tsk_" + simContextCnt + "_" + simCount;
                        Task sedmlTask = new Task(taskId, taskId, simContextId, utcSim.getId());
                        sedmlModel.addTask(sedmlTask);
                        // to be used later to add dataGenerators : one set of DGs per model (simContext).
                        taskRef = taskId;
                    }
                    // add one dataGenerator for 'time' for entire SEDML model.
                    // (using the id of the first task in model for 'taskRef' field of var since
                    String timeDataGenPrefix = DATAGENERATOR_TIME_NAME + "_" + taskRef;
                    DataGenerator timeDataGen = sedmlModel.getDataGeneratorWithId(timeDataGenPrefix);
                    if (timeDataGen == null) {
                        // org.jlibsedml.Variable timeVar = new org.jlibsedml.Variable(DATAGENERATOR_TIME_SYMBOL, DATAGENERATOR_TIME_SYMBOL, sedmlModel.getTasks().get(0).getId(), VariableSymbol.TIME);
                        org.jlibsedml.Variable timeVar = new org.jlibsedml.Variable(DATAGENERATOR_TIME_SYMBOL, DATAGENERATOR_TIME_SYMBOL, taskRef, VariableSymbol.TIME);
                        ASTNode math = Libsedml.parseFormulaString(DATAGENERATOR_TIME_SYMBOL);
                        timeDataGen = new DataGenerator(timeDataGenPrefix, timeDataGenPrefix, math);
                        timeDataGen.addVariable(timeVar);
                        sedmlModel.addDataGenerator(timeDataGen);
                        dataGeneratorsOfSim.add(timeDataGen);
                    }
                    // add dataGenerators for species
                    // get species list from SBML model.
                    String dataGenIdPrefix = "dataGen_" + taskRef;
                    String[] varNamesList = SimSpec.fromSBML(sbmlString).getVarsList();
                    for (String varName : varNamesList) {
                        org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(varName, varName, taskRef, sbmlSupport.getXPathForSpecies(varName));
                        ASTNode varMath = Libsedml.parseFormulaString(varName);
                        // "dataGen_" + varCount; - old code
                        String dataGenId = dataGenIdPrefix + "_" + TokenMangler.mangleToSName(varName);
                        DataGenerator dataGen = new DataGenerator(dataGenId, dataGenId, varMath);
                        dataGen.addVariable(sedmlVar);
                        sedmlModel.addDataGenerator(dataGen);
                        dataGeneratorsOfSim.add(dataGen);
                        varCount++;
                    }
                    // add DataGenerators for output functions here
                    ArrayList<AnnotatedFunction> outputFunctions = simContext.getOutputFunctionContext().getOutputFunctionsList();
                    for (AnnotatedFunction annotatedFunction : outputFunctions) {
                        Expression functionExpr = annotatedFunction.getExpression();
                        ASTNode funcMath = Libsedml.parseFormulaString(functionExpr.infix());
                        // "dataGen_" + varCount; - old code
                        String dataGenId = dataGenIdPrefix + "_" + TokenMangler.mangleToSName(annotatedFunction.getName());
                        DataGenerator dataGen = new DataGenerator(dataGenId, dataGenId, funcMath);
                        String[] functionSymbols = functionExpr.getSymbols();
                        for (String symbol : functionSymbols) {
                            String symbolName = TokenMangler.mangleToSName(symbol);
                            // try to get symbol from model, if null, try simContext.mathDesc
                            SymbolTableEntry ste = vcModel.getEntry(symbol);
                            if (ste == null) {
                                ste = simContext.getMathDescription().getEntry(symbol);
                            }
                            if (ste instanceof SpeciesContext || ste instanceof Structure || ste instanceof ModelParameter) {
                                XPathTarget targetXPath = getTargetXPath(ste, l2gMap);
                                org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(symbolName, symbolName, taskRef, targetXPath.getTargetAsString());
                                dataGen.addVariable(sedmlVar);
                            } else {
                                double value = 0.0;
                                if (ste instanceof Function) {
                                    try {
                                        value = ste.getExpression().evaluateConstant();
                                    } catch (Exception e) {
                                        e.printStackTrace(System.out);
                                        throw new RuntimeException("Unable to evaluate function '" + ste.getName() + "' for output function '" + annotatedFunction.getName() + "'.", e);
                                    }
                                } else {
                                    value = ste.getConstantValue();
                                }
                                Parameter sedmlParameter = new Parameter(symbolName, symbolName, value);
                                dataGen.addParameter(sedmlParameter);
                            }
                        }
                        sedmlModel.addDataGenerator(dataGen);
                        dataGeneratorsOfSim.add(dataGen);
                        varCount++;
                    }
                    simCount++;
                    // ignoring output for spatial deterministic (spatial stochastic is not exported to SEDML) and non-spatial stochastic applications with histogram
                    if (!(simContext.getGeometry().getDimension() > 0)) {
                        // ignore Output (Plot2d)  for non-spatial stochastic simulation with histogram.
                        boolean bSimHasHistogram = false;
                        if (simContext.isStoch()) {
                            long numOfTrials = simTaskDesc.getStochOpt().getNumOfTrials();
                            if (numOfTrials > 1) {
                                // not histogram {
                                bSimHasHistogram = true;
                            }
                        }
                        if (!bSimHasHistogram) {
                            String plot2dId = "plot2d_" + TokenMangler.mangleToSName(vcSimulation.getName());
                            Plot2D sedmlPlot2d = new Plot2D(plot2dId, simContext.getName() + "plots");
                            sedmlPlot2d.addNote(createNotesElement("Plot of all variables and output functions from application '" + simContext.getName() + "' ; simulation '" + vcSimulation.getName() + "' in VCell model"));
                            List<DataGenerator> dataGenerators = sedmlModel.getDataGenerators();
                            String xDataRef = sedmlModel.getDataGeneratorWithId(DATAGENERATOR_TIME_NAME + "_" + taskRef).getId();
                            // add a curve for each dataGenerator in SEDML model
                            int curveCnt = 0;
                            for (DataGenerator dataGenerator : dataGeneratorsOfSim) {
                                // no curve for time, since time is xDateReference
                                if (dataGenerator.getId().equals(xDataRef)) {
                                    continue;
                                }
                                String curveId = "curve_" + curveCnt++;
                                Curve curve = new Curve(curveId, curveId, false, false, xDataRef, dataGenerator.getId());
                                sedmlPlot2d.addCurve(curve);
                            }
                            sedmlModel.addOutput(sedmlPlot2d);
                        }
                    }
                }
            // end - for 'sims'
            } else {
                // end if (!(simContext.getGeometry().getDimension() > 0 && simContext.isStoch()))
                String msg = "\n\t" + simContextName + " : export of spatial stochastic (Smoldyn solver) applications to SEDML not supported at this time.";
                sedmlNotesStr += msg;
            }
            // end : if-else simContext is not spatial stochastic
            simContextCnt++;
        }
        // if sedmlNotesStr is not null, there were some applications that could not be exported to SEDML (eg., spatial stochastic). Create a notes element and add it to sedml Model.
        if (sedmlNotesStr.length() > 0) {
            sedmlNotesStr = "\n\tThe following applications in the VCell model were not exported to VCell : " + sedmlNotesStr;
            sedmlModel.addNote(createNotesElement(sedmlNotesStr));
        }
        // error check : if there are no non-spatial deterministic applications (=> no models in SEDML document), complain.
        if (sedmlModel.getModels().isEmpty()) {
            throw new RuntimeException("No applications in biomodel to export to Sedml.");
        }
    } catch (Exception e) {
        e.printStackTrace(System.out);
        throw new RuntimeException("Error adding model to SEDML document : " + e.getMessage());
    }
}
Also used : Task(org.jlibsedml.Task) SubTask(org.jlibsedml.SubTask) RepeatedTask(org.jlibsedml.RepeatedTask) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) SpeciesContext(cbit.vcell.model.SpeciesContext) ConstantArraySpec(cbit.vcell.solver.ConstantArraySpec) ExpressionException(cbit.vcell.parser.ExpressionException) ChangeAttribute(org.jlibsedml.ChangeAttribute) ComputeChange(org.jlibsedml.ComputeChange) SolverTaskDescription(cbit.vcell.solver.SolverTaskDescription) SubTask(org.jlibsedml.SubTask) AnnotatedFunction(cbit.vcell.solver.AnnotatedFunction) Curve(org.jlibsedml.Curve) SBMLExporter(org.vcell.sbml.vcell.SBMLExporter) XmlParseException(cbit.vcell.xml.XmlParseException) VectorRange(org.jlibsedml.VectorRange) UniformRange(org.jlibsedml.UniformRange) Range(org.jlibsedml.Range) Algorithm(org.jlibsedml.Algorithm) MathOverrides(cbit.vcell.solver.MathOverrides) ModelParameter(cbit.vcell.model.Model.ModelParameter) DataGenerator(org.jlibsedml.DataGenerator) MathMapping(cbit.vcell.mapping.MathMapping) UniformTimeCourse(org.jlibsedml.UniformTimeCourse) Plot2D(org.jlibsedml.Plot2D) SbmlException(org.vcell.sbml.SbmlException) VectorRange(org.jlibsedml.VectorRange) SolverDescription(cbit.vcell.solver.SolverDescription) ReservedSymbol(cbit.vcell.model.Model.ReservedSymbol) StructureMapping(cbit.vcell.mapping.StructureMapping) TimeBounds(cbit.vcell.solver.TimeBounds) AnnotatedFunction(cbit.vcell.solver.AnnotatedFunction) Function(cbit.vcell.math.Function) SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) ASTCi(org.jmathml.ASTCi) RepeatedTask(org.jlibsedml.RepeatedTask) ASTNode(org.jmathml.ASTNode) Structure(cbit.vcell.model.Structure) SimulationJob(cbit.vcell.solver.SimulationJob) Pair(org.vcell.util.Pair) ModelUnitSystem(cbit.vcell.model.ModelUnitSystem) SimulationContext(cbit.vcell.mapping.SimulationContext) MathSymbolMapping(cbit.vcell.mapping.MathSymbolMapping) SbmlException(org.vcell.sbml.SbmlException) TransformerException(javax.xml.transform.TransformerException) XmlParseException(cbit.vcell.xml.XmlParseException) IOException(java.io.IOException) ExpressionException(cbit.vcell.parser.ExpressionException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) SBMLSupport(org.jlibsedml.modelsupport.SBMLSupport) Simulation(cbit.vcell.solver.Simulation) Expression(cbit.vcell.parser.Expression) BioModel(cbit.vcell.biomodel.BioModel) UniformRange(org.jlibsedml.UniformRange) BioModel(cbit.vcell.biomodel.BioModel) Model(org.jlibsedml.Model) StructureMappingParameter(cbit.vcell.mapping.StructureMapping.StructureMappingParameter) KineticsParameter(cbit.vcell.model.Kinetics.KineticsParameter) ModelParameter(cbit.vcell.model.Model.ModelParameter) SpeciesContextSpecParameter(cbit.vcell.mapping.SpeciesContextSpec.SpeciesContextSpecParameter) ProxyParameter(cbit.vcell.model.ProxyParameter) Parameter(org.jlibsedml.Parameter) XPathTarget(org.jlibsedml.XPathTarget) SetValue(org.jlibsedml.SetValue)

Example 2 with SBMLSupport

use of org.jlibsedml.modelsupport.SBMLSupport in project vcell by virtualcell.

the class CLIUtils method generateReportsAsCSV.

public HashMap<String, File> generateReportsAsCSV(SedML sedml, HashMap<String, ODESolverResultSet> resultsHash, File outDirForCurrentSedml, String outDir, String sedmlLocation) throws DataAccessException, IOException {
    // finally, the real work
    HashMap<String, File> reportsHash = new HashMap<>();
    List<Output> ooo = sedml.getOutputs();
    for (Output oo : ooo) {
        if (!(oo instanceof Report)) {
            System.out.println("Ignoring unsupported output `" + oo.getId() + "` while CSV generation.");
        // BioModel bm = null;
        // 
        // VCDataIdentifier vcId = new VCDataIdentifier() {
        // public User getOwner() {	return new User("nouser", null);		}
        // public KeyValue getDataKey() { return null; }
        // public String getID()  {	return "mydata";					}
        // };
        // ExportFormat format = ExportFormat.HDF5;
        // 
        // Object[] variables = {"ala", "bala" };
        // String[] variableNames = new String[variables.length];
        // VariableSpecs variableSpecs = new VariableSpecs(variableNames, ExportConstants.VARIABLE_MULTI);
        // 
        // double[] timePoints = {0.0, 0.1, 0.2};
        // TimeSpecs timeSpecs = new TimeSpecs(0, 100, timePoints, ExportConstants.TIME_RANGE);
        // 
        // int geoMode = ExportConstants.GEOMETRY_FULL;
        // SpatialSelection[] selections = new SpatialSelection[0];
        // int axis = 3;
        // int sliceNumber = 0;
        // GeometrySpecs geometrySpecs = new GeometrySpecs(selections, axis, sliceNumber, geoMode);
        // 
        // ExportConstants.DataType dataType = ExportConstants.DataType.PDE_VARIABLE_DATA;
        // boolean switchRowsColumns = false;
        // ExportSpecs.SimNameSimDataID[] simNameSimDataIDs = { null, null };
        // int[] exportMultipleParamScans = { };
        // csvRoiLayout csvLayout = null;
        // boolean isHDF5 = true;
        // FormatSpecificSpecs formatSpecificSpecs = new ASCIISpecs(format, dataType, switchRowsColumns, simNameSimDataIDs, exportMultipleParamScans, csvLayout, isHDF5);
        // 
        // String simulationName = null;
        // String contextName = null;
        // ExportSpecs exportSpecs = new ExportSpecs(vcId, format, variableSpecs, timeSpecs, geometrySpecs, formatSpecificSpecs, simulationName, contextName);
        // 
        // SimulationContext sc = bm.getSimulationContext(0);
        // 
        // OutputFunctionContext ofc = sc.getOutputFunctionContext();
        // 
        // ArrayList<AnnotatedFunction> outputFunctionsList = ofc.getOutputFunctionsList();
        // 
        // AnnotatedFunction[] af = outputFunctionsList.toArray(new AnnotatedFunction[0]);
        // 
        // OutputContext outputContext = new OutputContext(af);
        // 
        // 
        // ExportServiceImpl exportServiceImpl = new ExportServiceImpl();
        // ASCIIExporter ae = new ASCIIExporter(exportServiceImpl);
        // 
        // 
        // DataSetControllerImpl dsControllerImpl = new DataSetControllerImpl(null, new File("C:\\TEMP\\eee"), null);
        // 
        // 
        // 
        // DataServerImpl dataServerImpl = new DataServerImpl(dsControllerImpl, exportServiceImpl);
        // 
        // 
        // FileDataContainerManager fileDataContainerManager = new FileDataContainerManager();
        // 
        // JobRequest jobRequest = JobRequest.createExportJobRequest(vcId.getOwner());
        // 
        // ae.makeASCIIData(outputContext, jobRequest, vcId.getOwner(), dataServerImpl, exportSpecs, fileDataContainerManager);
        // 
        // ClientServerManager csm = null;
        // ClientExportController cec = new ClientExportController(csm);
        // if(csm != null && cec != null) {
        // try {
        // cec.startExport(outputContext, exportSpecs);
        // } catch (RemoteProxyException e) {
        // e.printStackTrace();
        // }
        // }
        } else {
            System.out.println("Generating report `" + oo.getId() + "`.");
            try {
                StringBuilder sb = new StringBuilder();
                // we go through each entry (dataset) in the list of datasets
                // for each dataset, we use the data reference to obtain the data generator
                // ve get the list of variables associated with the data reference
                // each variable has an id (which is the data reference above, the task and the sbml symbol urn
                // for each variable we recover the task, from the task we get the sbml model
                // we search the sbml model to find the vcell variable name associated with the urn
                List<DataSet> datasets = ((Report) oo).getListOfDataSets();
                for (DataSet dataset : datasets) {
                    DataGenerator datagen = sedml.getDataGeneratorWithId(dataset.getDataReference());
                    ArrayList<String> varIDs = new ArrayList<>();
                    assert datagen != null;
                    ArrayList<Variable> vars = new ArrayList<>(datagen.getListOfVariables());
                    int mxlen = 0;
                    boolean supportedDataset = true;
                    // get target values
                    HashMap values = new HashMap<Variable, double[]>();
                    for (Variable var : vars) {
                        AbstractTask task = sedml.getTaskWithId(var.getReference());
                        Model model = sedml.getModelWithId(task.getModelReference());
                        Simulation sim = sedml.getSimulation(task.getSimulationReference());
                        IXPathToVariableIDResolver variable2IDResolver = new SBMLSupport();
                        // must get variable ID from SBML model
                        String sbmlVarId = "";
                        if (var.getSymbol() != null) {
                            // it is a predefined symbol
                            sbmlVarId = var.getSymbol().name();
                            // TIME is t, etc.
                            if ("TIME".equals(sbmlVarId)) {
                                // this is VCell reserved symbold for time
                                sbmlVarId = "t";
                            }
                        // TODO
                        // check spec for other symbols
                        } else {
                            // it is an XPATH target in model
                            String target = var.getTarget();
                            sbmlVarId = variable2IDResolver.getIdFromXPathIdentifer(target);
                        }
                        if (task instanceof RepeatedTask) {
                            supportedDataset = false;
                        } else {
                            varIDs.add(var.getId());
                            assert task != null;
                            if (sim instanceof UniformTimeCourse) {
                                // we want to keep the last outputNumberOfPoints only
                                int outputNumberOfPoints = ((UniformTimeCourse) sim).getNumberOfPoints();
                                double outputStartTime = ((UniformTimeCourse) sim).getOutputStartTime();
                                if (outputStartTime > 0) {
                                    ODESolverResultSet results = resultsHash.get(task.getId());
                                    int column = results.findColumn(sbmlVarId);
                                    double[] tmpData = results.extractColumn(column);
                                    double[] data = new double[outputNumberOfPoints + 1];
                                    for (int i = tmpData.length - outputNumberOfPoints - 1, j = 0; i < tmpData.length; i++, j++) {
                                        data[j] = tmpData[i];
                                    }
                                    mxlen = Integer.max(mxlen, data.length);
                                    values.put(var, data);
                                } else {
                                    ODESolverResultSet results = resultsHash.get(task.getId());
                                    int column = results.findColumn(sbmlVarId);
                                    double[] data = results.extractColumn(column);
                                    mxlen = Integer.max(mxlen, data.length);
                                    values.put(var, data);
                                }
                            } else {
                                System.err.println("only uniform time course simulations are supported");
                            }
                        }
                    }
                    updateDatasetStatusYml(sedmlLocation, oo.getId(), dataset.getId(), Status.SUCCEEDED, outDir);
                    if (!supportedDataset) {
                        System.err.println("Dataset " + dataset.getId() + " references unsupported RepeatedTask and is being skipped");
                        continue;
                    }
                    // get math
                    String mathMLStr = datagen.getMathAsString();
                    Expression expr = new Expression(mathMLStr);
                    SymbolTable st = new SimpleSymbolTable(varIDs.toArray(new String[vars.size()]));
                    expr.bindExpression(st);
                    // compute and write result, padding with NaN if unequal length or errors
                    double[] row = new double[vars.size()];
                    // Handling row labels that contains ","
                    if (dataset.getId().startsWith("__data_set__")) {
                        if (dataset.getLabel().contains(","))
                            sb.append("\"" + dataset.getLabel() + "\"").append(",");
                        else
                            sb.append(dataset.getLabel()).append(",");
                    } else {
                        if (dataset.getId().contains(","))
                            sb.append("\"" + dataset.getId() + "\"").append(",");
                        else
                            sb.append(dataset.getId()).append(",");
                    }
                    if (dataset.getLabel().contains(","))
                        sb.append("\"" + dataset.getLabel() + "\"").append(",");
                    else
                        sb.append(dataset.getLabel()).append(",");
                    DataGenerator dg = sedml.getDataGeneratorWithId(dataset.getDataReference());
                    if (dg != null && dg.getName() != null && !dg.getName().isEmpty()) {
                        // name may contain spaces or other things
                        sb.append("\"" + dg.getName() + "\"").append(",");
                    } else {
                        // dg may be null, name may be null
                        sb.append("").append(",");
                    }
                    for (int i = 0; i < mxlen; i++) {
                        for (int j = 0; j < vars.size(); j++) {
                            double[] varVals = ((double[]) values.get(vars.get(j)));
                            if (i < varVals.length) {
                                row[j] = varVals[i];
                            } else {
                                row[j] = Double.NaN;
                            }
                        }
                        double computed = Double.NaN;
                        try {
                            computed = expr.evaluateVector(row);
                        } catch (Exception e) {
                        // do nothing, we leave NaN and don't warn/log since it could flood
                        }
                        sb.append(computed).append(",");
                    }
                    sb.deleteCharAt(sb.lastIndexOf(","));
                    sb.append("\n");
                }
                File f = new File(outDirForCurrentSedml, oo.getId() + ".csv");
                PrintWriter out = new PrintWriter(f);
                out.print(sb.toString());
                out.flush();
                out.close();
                reportsHash.put(oo.getId(), f);
            } catch (Exception e) {
                e.printStackTrace(System.err);
                reportsHash.put(oo.getId(), null);
            }
        }
    }
    return reportsHash;
}
Also used : IXPathToVariableIDResolver(org.jlibsedml.execution.IXPathToVariableIDResolver) ExportOutput(cbit.vcell.export.server.ExportOutput) ODESolverResultSet(cbit.vcell.solver.ode.ODESolverResultSet) SymbolTable(cbit.vcell.parser.SymbolTable) SimpleSymbolTable(cbit.vcell.parser.SimpleSymbolTable) RemoteProxyException(cbit.vcell.message.server.bootstrap.client.RemoteProxyVCellConnectionFactory.RemoteProxyException) ExpressionException(cbit.vcell.parser.ExpressionException) DataAccessException(org.vcell.util.DataAccessException) SBMLSupport(org.jlibsedml.modelsupport.SBMLSupport) SimpleSymbolTable(cbit.vcell.parser.SimpleSymbolTable) Expression(cbit.vcell.parser.Expression) BioModel(cbit.vcell.biomodel.BioModel)

Example 3 with SBMLSupport

use of org.jlibsedml.modelsupport.SBMLSupport in project vcell by virtualcell.

the class SEDMLExporter method getTargetXPath.

private XPathTarget getTargetXPath(SymbolTableEntry ste, Map<Pair<String, String>, String> l2gMap) {
    // to get Xpath string for variables.
    SBMLSupport sbmlSupport = new SBMLSupport();
    XPathTarget targetXpath = null;
    if (ste instanceof SpeciesContext || ste instanceof SpeciesContextSpecParameter) {
        String name = ste.getName();
        if (ste instanceof SpeciesContextSpecParameter) {
            name = ((SpeciesContextSpecParameter) ste).getSpeciesContext().getName();
        }
        targetXpath = new XPathTarget(sbmlSupport.getXPathForSpecies(name));
    } else if (ste instanceof ModelParameter) {
        targetXpath = new XPathTarget(sbmlSupport.getXPathForGlobalParameter(ste.getName()));
    } else if (ste instanceof Structure || ste instanceof Structure.StructureSize || (ste instanceof StructureMappingParameter && ((StructureMappingParameter) ste).getRole() == StructureMapping.ROLE_Size)) {
        String compartmentId = ste.getName();
        // can change compartment size or spatial dimension, but in vcell, we cannot change compartment dimension.
        String compartmentAttr = "";
        if (ste instanceof Structure.StructureSize) {
            compartmentId = ((StructureSize) ste).getStructure().getName();
            compartmentAttr = ((StructureSize) ste).getName();
        }
        if (ste instanceof StructureMappingParameter) {
            StructureMappingParameter smp = (StructureMappingParameter) ste;
            compartmentId = smp.getStructure().getName();
            if (smp.getRole() == StructureMapping.ROLE_Size) {
                compartmentAttr = smp.getName();
            }
        }
        if (compartmentAttr.length() < 1) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForCompartment(compartmentId));
        } else if (compartmentAttr.equalsIgnoreCase("size")) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForCompartment(compartmentId, CompartmentAttribute.size));
        } else {
            throw new RuntimeException("Unknown compartment attribute '" + compartmentAttr + "'; cannot get xpath target for compartment '" + compartmentId + "'.");
        }
    } else if (ste instanceof KineticsParameter) {
        KineticsParameter kp = (KineticsParameter) ste;
        String reactionID = kp.getKinetics().getReactionStep().getName();
        String parameterID = kp.getName();
        Pair<String, String> key = new Pair(reactionID, parameterID);
        String value = l2gMap.get(key);
        if (value == null) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForKineticLawParameter(reactionID, parameterID));
        } else {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForGlobalParameter(value, ParameterAttribute.value));
        }
    } else {
        System.err.println("Entity should be SpeciesContext, Structure, ModelParameter : " + ste.getClass());
        throw new RuntimeException("Unknown entity in SBML model");
    }
    return targetXpath;
}
Also used : ModelParameter(cbit.vcell.model.Model.ModelParameter) KineticsParameter(cbit.vcell.model.Kinetics.KineticsParameter) SpeciesContext(cbit.vcell.model.SpeciesContext) StructureMappingParameter(cbit.vcell.mapping.StructureMapping.StructureMappingParameter) XPathTarget(org.jlibsedml.XPathTarget) Structure(cbit.vcell.model.Structure) StructureSize(cbit.vcell.model.Structure.StructureSize) SBMLSupport(org.jlibsedml.modelsupport.SBMLSupport) SpeciesContextSpecParameter(cbit.vcell.mapping.SpeciesContextSpec.SpeciesContextSpecParameter) Pair(org.vcell.util.Pair)

Example 4 with SBMLSupport

use of org.jlibsedml.modelsupport.SBMLSupport in project vcell by virtualcell.

the class SEDMLExporter method translateBioModelToSedML.

private void translateBioModelToSedML(String savePath, String sBaseFileName, boolean bForceVCML, boolean bHasDataOnly, boolean bFromOmex) {
    // true if invoked for omex export, false if for sedml
    sbmlFilePathStrAbsoluteList.clear();
    // models
    try {
        SimulationContext[] simContexts = vcBioModel.getSimulationContexts();
        cbit.vcell.model.Model vcModel = vcBioModel.getModel();
        // "urn:sedml:language:sbml";
        String sbmlLanguageURN = SUPPORTED_LANGUAGE.SBML_GENERIC.getURN();
        // "urn:sedml:language:vcml";
        String vcmlLanguageURN = SUPPORTED_LANGUAGE.VCELL_GENERIC.getURN();
        String bioModelName = vcBioModel.getName();
        String bioModelID = TokenMangler.mangleToSName(bioModelName);
        // String usrHomeDirPath = ResourceUtil.getUserHomeDir().getAbsolutePath();
        // to get Xpath string for variables.
        SBMLSupport sbmlSupport = new SBMLSupport();
        // for model count, task subcount
        int simContextCnt = 0;
        boolean bSpeciesAddedAsDataGens = false;
        String sedmlNotesStr = "";
        for (SimulationContext simContext : simContexts) {
            // Export the application itself to SBML, with default overrides
            String sbmlString = null;
            int level = 3;
            int version = 1;
            boolean isSpatial = simContext.getGeometry().getDimension() > 0 ? true : false;
            // local to global translation map
            Map<Pair<String, String>, String> l2gMap = null;
            boolean sbmlExportFailed = false;
            if (!bForceVCML) {
                // we try to save to SBML
                try {
                    // to compute and set the sizes of the remaining structures.
                    if (!simContext.getGeometryContext().isAllSizeSpecifiedPositive()) {
                        Structure structure = simContext.getModel().getStructure(0);
                        double structureSize = 1.0;
                        StructureMapping structMapping = simContext.getGeometryContext().getStructureMapping(structure);
                        StructureSizeSolver.updateAbsoluteStructureSizes(simContext, structure, structureSize, structMapping.getSizeParameter().getUnitDefinition());
                    // StructureMapping structureMapping = simContext.getGeometryContext().getStructureMappings()[0];
                    // StructureSizeSolver.updateAbsoluteStructureSizes(simContext, structureMapping.getStructure(), 1.0, structureMapping.getSizeParameter().getUnitDefinition());
                    }
                    SBMLExporter sbmlExporter = new SBMLExporter(vcBioModel, level, version, isSpatial);
                    sbmlExporter.setSelectedSimContext(simContext);
                    // no sim job
                    sbmlExporter.setSelectedSimulationJob(null);
                    sbmlString = sbmlExporter.getSBMLString();
                    l2gMap = sbmlExporter.getLocalToGlobalTranslationMap();
                } catch (Exception e) {
                    sbmlExportFailed = true;
                }
            } else {
                // we want to force VCML, we act as if saving to SBML failed
                sbmlExportFailed = true;
            }
            // marked as failed, even if exporting to sbml didn't throw any exception
            if (simContext.getGeometry().getDimension() > 0 && simContext.getApplicationType() == Application.NETWORK_STOCHASTIC) {
                sbmlExportFailed = true;
            } else if (simContext.getApplicationType() == Application.RULE_BASED_STOCHASTIC) {
                sbmlExportFailed = true;
            }
            String simContextName = simContext.getName();
            String filePathStrAbsolute = null;
            String filePathStrRelative = null;
            String urn = null;
            String simContextId = null;
            if (sbmlExportFailed) {
                // filePathStrAbsolute = Paths.get(savePath, bioModelName + ".vcml").toString();
                filePathStrAbsolute = Paths.get(savePath, sBaseFileName + ".vcml").toString();
                // filePathStrRelative = bioModelName + ".vcml";
                filePathStrRelative = sBaseFileName + ".vcml";
                if (!bFromOmex) {
                    // the vcml file is managed elsewhere when called for omex
                    String vcmlString = XmlHelper.bioModelToXML(vcBioModel);
                    XmlUtil.writeXMLStringToFile(vcmlString, filePathStrAbsolute, true);
                    sbmlFilePathStrAbsoluteList.add(filePathStrRelative);
                }
                urn = vcmlLanguageURN;
                sedmlModel.addModel(new Model(bioModelID, bioModelName, urn, filePathStrRelative));
            } else {
                // filePathStrAbsolute = Paths.get(savePath, bioModelName + "_" + TokenMangler.mangleToSName(simContextName) + ".xml").toString();
                filePathStrAbsolute = Paths.get(savePath, sBaseFileName + "_" + TokenMangler.mangleToSName(simContextName) + ".xml").toString();
                // filePathStrRelative = bioModelName + "_" +  TokenMangler.mangleToSName(simContextName) + ".xml";
                filePathStrRelative = sBaseFileName + "_" + TokenMangler.mangleToSName(simContextName) + ".xml";
                XmlUtil.writeXMLStringToFile(sbmlString, filePathStrAbsolute, true);
                urn = sbmlLanguageURN;
                sbmlFilePathStrAbsoluteList.add(filePathStrRelative);
                simContextId = TokenMangler.mangleToSName(simContextName);
                sedmlModel.addModel(new Model(simContextId, simContextName, urn, filePathStrRelative));
            }
            MathMapping mathMapping = simContext.createNewMathMapping();
            MathSymbolMapping mathSymbolMapping = mathMapping.getMathSymbolMapping();
            // -------
            // create sedml objects (simulation, task, datagenerators, report, plot) for each simulation in simcontext
            // -------
            int simCount = 0;
            String taskRef = null;
            int overrideCount = 0;
            for (Simulation vcSimulation : simContext.getSimulations()) {
                if (bHasDataOnly) {
                    // skip simulations not present in hash
                    if (!simsToExport.contains(vcSimulation))
                        continue;
                }
                // 1 -------> check compatibility
                // if simContext is non-spatial stochastic, check if sim is histogram; if so, skip it, it can't be encoded in sedml 1.x
                SolverTaskDescription simTaskDesc = vcSimulation.getSolverTaskDescription();
                if (simContext.getGeometry().getDimension() == 0 && simContext.isStoch()) {
                    long numOfTrials = simTaskDesc.getStochOpt().getNumOfTrials();
                    if (numOfTrials > 1) {
                        String msg = "\n\t" + simContextName + " ( " + vcSimulation.getName() + " ) : export of non-spatial stochastic simulation with histogram option to SEDML not supported at this time.";
                        sedmlNotesStr += msg;
                        continue;
                    }
                }
                // 2 ------->
                // create Algorithm and sedmlSimulation (UniformtimeCourse)
                SolverDescription vcSolverDesc = simTaskDesc.getSolverDescription();
                String kiSAOIdStr = vcSolverDesc.getKisao();
                Algorithm sedmlAlgorithm = new Algorithm(kiSAOIdStr);
                TimeBounds vcSimTimeBounds = simTaskDesc.getTimeBounds();
                double startingTime = vcSimTimeBounds.getStartingTime();
                String simName = vcSimulation.getName();
                UniformTimeCourse utcSim = new UniformTimeCourse(TokenMangler.mangleToSName(simName), simName, startingTime, startingTime, vcSimTimeBounds.getEndingTime(), (int) simTaskDesc.getExpectedNumTimePoints(), sedmlAlgorithm);
                // --------- deal with error tolerance
                boolean enableAbsoluteErrorTolerance;
                boolean enableRelativeErrorTolerance;
                if (vcSolverDesc.isSemiImplicitPdeSolver() || vcSolverDesc.isChomboSolver()) {
                    enableAbsoluteErrorTolerance = false;
                    enableRelativeErrorTolerance = true;
                } else if (vcSolverDesc.hasErrorTolerance()) {
                    enableAbsoluteErrorTolerance = true;
                    enableRelativeErrorTolerance = true;
                } else {
                    enableAbsoluteErrorTolerance = false;
                    enableRelativeErrorTolerance = false;
                }
                if (enableAbsoluteErrorTolerance) {
                    ErrorTolerance et = simTaskDesc.getErrorTolerance();
                    String kisaoStr = ErrorTolerance.ErrorToleranceDescription.Absolute.getKisao();
                    AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, et.getAbsoluteErrorTolerance() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                }
                if (enableRelativeErrorTolerance) {
                    ErrorTolerance et = simTaskDesc.getErrorTolerance();
                    String kisaoStr = ErrorTolerance.ErrorToleranceDescription.Relative.getKisao();
                    AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, et.getRelativeErrorTolerance() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                }
                // ---------- deal with time step (code adapted from TimeSpecPanel.refresh()
                boolean enableDefaultTimeStep;
                boolean enableMinTimeStep;
                boolean enableMaxTimeStep;
                if (vcSolverDesc.compareEqual(SolverDescription.StochGibson)) {
                    // stochastic time
                    enableDefaultTimeStep = false;
                    enableMinTimeStep = false;
                    enableMaxTimeStep = false;
                } else if (vcSolverDesc.compareEqual(SolverDescription.NFSim)) {
                    enableDefaultTimeStep = false;
                    enableMinTimeStep = false;
                    enableMaxTimeStep = false;
                } else {
                    // fixed time step solvers and non spatial stochastic solvers only show default time step.
                    if (!vcSolverDesc.hasVariableTimestep() || vcSolverDesc.isNonSpatialStochasticSolver()) {
                        enableDefaultTimeStep = true;
                        enableMinTimeStep = false;
                        enableMaxTimeStep = false;
                    } else {
                        // variable time step solvers shows min and max, but sundials solvers don't show min
                        enableDefaultTimeStep = false;
                        enableMinTimeStep = true;
                        enableMaxTimeStep = true;
                        if (vcSolverDesc.hasSundialsTimeStepping()) {
                            enableMinTimeStep = false;
                        }
                    }
                }
                TimeStep ts = simTaskDesc.getTimeStep();
                if (enableDefaultTimeStep) {
                    String kisaoStr = TimeStep.TimeStepDescription.Default.getKisao();
                    AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, ts.getDefaultTimeStep() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                }
                if (enableMinTimeStep) {
                    String kisaoStr = TimeStep.TimeStepDescription.Minimum.getKisao();
                    AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, ts.getMinimumTimeStep() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                }
                if (enableMaxTimeStep) {
                    String kisaoStr = TimeStep.TimeStepDescription.Maximum.getKisao();
                    AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, ts.getMaximumTimeStep() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                }
                if (simTaskDesc.getSimulation().getMathDescription().isNonSpatialStoch()) {
                    // ------- deal with seed
                    NonspatialStochSimOptions nssso = simTaskDesc.getStochOpt();
                    if (nssso.isUseCustomSeed()) {
                        // 488
                        String kisaoStr = SolverDescription.AlgorithmParameterDescription.Seed.getKisao();
                        AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, nssso.getCustomSeed() + "");
                        sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                    }
                } else {
                    // (... isRuleBased(), isSpatial(), isMovingMembrane(), isSpatialHybrid() ...
                    ;
                }
                if (// -------- deal with hybrid solvers (non-spatial)
                vcSolverDesc == SolverDescription.HybridEuler || vcSolverDesc == SolverDescription.HybridMilAdaptive || vcSolverDesc == SolverDescription.HybridMilstein) {
                    NonspatialStochHybridOptions nssho = simTaskDesc.getStochHybridOpt();
                    String kisaoStr = SolverDescription.AlgorithmParameterDescription.Epsilon.getKisao();
                    AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, nssho.getEpsilon() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                    kisaoStr = SolverDescription.AlgorithmParameterDescription.Lambda.getKisao();
                    sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, nssho.getLambda() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                    kisaoStr = SolverDescription.AlgorithmParameterDescription.MSRTolerance.getKisao();
                    sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, nssho.getMSRTolerance() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                }
                if (vcSolverDesc == SolverDescription.HybridMilAdaptive) {
                    // --------- one more param for hybrid-adaptive
                    NonspatialStochHybridOptions nssho = simTaskDesc.getStochHybridOpt();
                    String kisaoStr = SolverDescription.AlgorithmParameterDescription.SDETolerance.getKisao();
                    AlgorithmParameter sedmlAlgorithmParameter = new AlgorithmParameter(kisaoStr, nssho.getSDETolerance() + "");
                    sedmlAlgorithm.addAlgorithmParameter(sedmlAlgorithmParameter);
                }
                // TODO: consider adding notes for the algorithm parameters, to provide human-readable description of kisao terms
                // sedmlAlgorithm.addNote(createNotesElement(algorithmNotesStr));
                // TODO: even better, AlgorithmParameter in sed-ml should also have a human readable "name" field
                // add a note to utcSim to indicate actual solver name
                String simNotesStr = "Actual Solver Name : '" + vcSolverDesc.getDisplayLabel() + "'.";
                utcSim.addNote(createNotesElement(simNotesStr));
                sedmlModel.addSimulation(utcSim);
                // 3 ------->
                // create Tasks
                MathOverrides mathOverrides = vcSimulation.getMathOverrides();
                if ((sbmlExportFailed == false) && mathOverrides != null && mathOverrides.hasOverrides()) {
                    String[] overridenConstantNames = mathOverrides.getOverridenConstantNames();
                    String[] scannedConstantsNames = mathOverrides.getScannedConstantNames();
                    HashMap<String, String> scannedParamHash = new HashMap<String, String>();
                    HashMap<String, String> unscannedParamHash = new HashMap<String, String>();
                    for (String name : scannedConstantsNames) {
                        scannedParamHash.put(name, name);
                    }
                    for (String name : overridenConstantNames) {
                        if (!scannedParamHash.containsKey(name)) {
                            unscannedParamHash.put(name, name);
                        }
                    }
                    if (!unscannedParamHash.isEmpty() && scannedParamHash.isEmpty()) {
                        // only parameters with simple overrides (numeric/expression) no scans
                        // create new model with change for each parameter that has override; add simple task
                        String overriddenSimContextId = simContextId + "_" + overrideCount;
                        String overriddenSimContextName = simContextName + " modified";
                        Model sedModel = new Model(overriddenSimContextId, overriddenSimContextName, sbmlLanguageURN, simContextId);
                        overrideCount++;
                        for (String unscannedParamName : unscannedParamHash.values()) {
                            SymbolTableEntry ste = getSymbolTableEntryForModelEntity(mathSymbolMapping, unscannedParamName);
                            Expression unscannedParamExpr = mathOverrides.getActualExpression(unscannedParamName, 0);
                            if (unscannedParamExpr.isNumeric()) {
                                // if expression is numeric, add ChangeAttribute to model created above
                                XPathTarget targetXpath = getTargetAttributeXPath(ste, l2gMap);
                                ChangeAttribute changeAttribute = new ChangeAttribute(targetXpath, unscannedParamExpr.infix());
                                sedModel.addChange(changeAttribute);
                            } else {
                                // non-numeric expression : add 'computeChange' to modified model
                                ASTNode math = Libsedml.parseFormulaString(unscannedParamExpr.infix());
                                XPathTarget targetXpath = getTargetXPath(ste, l2gMap);
                                ComputeChange computeChange = new ComputeChange(targetXpath, math);
                                String[] exprSymbols = unscannedParamExpr.getSymbols();
                                // }
                                for (String symbol : exprSymbols) {
                                    String symbolName = TokenMangler.mangleToSName(symbol);
                                    SymbolTableEntry ste1 = vcModel.getEntry(symbol);
                                    if (ste != null) {
                                        if (ste1 instanceof SpeciesContext || ste1 instanceof Structure || ste1 instanceof ModelParameter) {
                                            XPathTarget ste1_XPath = getTargetXPath(ste1, l2gMap);
                                            org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(symbolName, symbolName, taskRef, ste1_XPath.getTargetAsString());
                                            computeChange.addVariable(sedmlVar);
                                        } else {
                                            double doubleValue = 0.0;
                                            if (ste1 instanceof ReservedSymbol) {
                                                doubleValue = getReservedSymbolValue(ste1);
                                            }
                                            Parameter sedmlParameter = new Parameter(symbolName, symbolName, doubleValue);
                                            computeChange.addParameter(sedmlParameter);
                                        }
                                    } else {
                                        throw new RuntimeException("Symbol '" + symbol + "' used in expression for '" + unscannedParamName + "' not found in model.");
                                    }
                                }
                                sedModel.addChange(computeChange);
                            }
                        }
                        sedmlModel.addModel(sedModel);
                        String taskId = "tsk_" + simContextCnt + "_" + simCount;
                        Task sedmlTask = new Task(taskId, vcSimulation.getName(), sedModel.getId(), utcSim.getId());
                        sedmlModel.addTask(sedmlTask);
                        // to be used later to add dataGenerators : one set of DGs per model (simContext).
                        taskRef = taskId;
                    } else if (!scannedParamHash.isEmpty() && unscannedParamHash.isEmpty()) {
                        // only parameters with scans : only add 1 Task and 1 RepeatedTask
                        String taskId = "tsk_" + simContextCnt + "_" + simCount;
                        Task sedmlTask = new Task(taskId, vcSimulation.getName(), simContextId, utcSim.getId());
                        sedmlModel.addTask(sedmlTask);
                        String repeatedTaskId = "repTsk_" + simContextCnt + "_" + simCount;
                        // TODO: temporary solution - we use as range here the first range
                        String scn = scannedConstantsNames[0];
                        String rId = "range_" + simContextCnt + "_" + simCount + "_" + scn;
                        RepeatedTask rt = new RepeatedTask(repeatedTaskId, repeatedTaskId, true, rId);
                        // to be used later to add dataGenerators - in our case it has to be the repeated task
                        taskRef = repeatedTaskId;
                        SubTask subTask = new SubTask("0", taskId);
                        rt.addSubtask(subTask);
                        for (String scannedConstName : scannedConstantsNames) {
                            ConstantArraySpec constantArraySpec = mathOverrides.getConstantArraySpec(scannedConstName);
                            String rangeId = "range_" + simContextCnt + "_" + simCount + "_" + scannedConstName;
                            // list of Ranges, if sim is parameter scan.
                            if (constantArraySpec != null) {
                                Range r = null;
                                // System.out.println("     " + constantArraySpec.toString());
                                if (constantArraySpec.getType() == ConstantArraySpec.TYPE_INTERVAL) {
                                    // ------ Uniform Range
                                    r = new UniformRange(rangeId, constantArraySpec.getMinValue(), constantArraySpec.getMaxValue(), constantArraySpec.getNumValues());
                                    rt.addRange(r);
                                } else {
                                    // ----- Vector Range
                                    cbit.vcell.math.Constant[] cs = constantArraySpec.getConstants();
                                    ArrayList<Double> values = new ArrayList<Double>();
                                    for (int i = 0; i < cs.length; i++) {
                                        String value = cs[i].getExpression().infix();
                                        values.add(Double.parseDouble(value));
                                    }
                                    r = new VectorRange(rangeId, values);
                                    rt.addRange(r);
                                }
                                // list of Changes
                                SymbolTableEntry ste = getSymbolTableEntryForModelEntity(mathSymbolMapping, scannedConstName);
                                XPathTarget target = getTargetXPath(ste, l2gMap);
                                // ASTNode math1 = new ASTCi(r.getId());		// was scannedConstName
                                ASTNode math1 = Libsedml.parseFormulaString(r.getId());
                                SetValue setValue = new SetValue(target, r.getId(), simContextId);
                                setValue.setMath(math1);
                                rt.addChange(setValue);
                            } else {
                                throw new RuntimeException("No scan ranges found for scanned parameter : '" + scannedConstName + "'.");
                            }
                        }
                        sedmlModel.addTask(rt);
                    } else {
                        // both scanned and simple parameters : create new model with change for each simple override; add RepeatedTask
                        // create new model with change for each unscanned parameter that has override
                        String overriddenSimContextId = simContextId + "_" + overrideCount;
                        String overriddenSimContextName = simContextName + " modified";
                        Model sedModel = new Model(overriddenSimContextId, overriddenSimContextName, sbmlLanguageURN, simContextId);
                        overrideCount++;
                        String taskId = "tsk_" + simContextCnt + "_" + simCount;
                        Task sedmlTask = new Task(taskId, vcSimulation.getName(), overriddenSimContextId, utcSim.getId());
                        sedmlModel.addTask(sedmlTask);
                        // scanned parameters
                        String repeatedTaskId = "repTsk_" + simContextCnt + "_" + simCount;
                        // TODO: temporary solution - we use as range here the first range
                        String scn = scannedConstantsNames[0];
                        String rId = "range_" + simContextCnt + "_" + simCount + "_" + scn;
                        RepeatedTask rt = new RepeatedTask(repeatedTaskId, repeatedTaskId, true, rId);
                        // to be used later to add dataGenerators - in our case it has to be the repeated task
                        taskRef = repeatedTaskId;
                        SubTask subTask = new SubTask("0", taskId);
                        rt.addSubtask(subTask);
                        for (String scannedConstName : scannedConstantsNames) {
                            ConstantArraySpec constantArraySpec = mathOverrides.getConstantArraySpec(scannedConstName);
                            String rangeId = "range_" + simContextCnt + "_" + simCount + "_" + scannedConstName;
                            // list of Ranges, if sim is parameter scan.
                            if (constantArraySpec != null) {
                                Range r = null;
                                // System.out.println("     " + constantArraySpec.toString());
                                if (constantArraySpec.getType() == ConstantArraySpec.TYPE_INTERVAL) {
                                    // ------ Uniform Range
                                    r = new UniformRange(rangeId, constantArraySpec.getMinValue(), constantArraySpec.getMaxValue(), constantArraySpec.getNumValues());
                                    rt.addRange(r);
                                } else {
                                    // ----- Vector Range
                                    cbit.vcell.math.Constant[] cs = constantArraySpec.getConstants();
                                    ArrayList<Double> values = new ArrayList<Double>();
                                    for (int i = 0; i < cs.length; i++) {
                                        String value = cs[i].getExpression().infix() + ", ";
                                        values.add(Double.parseDouble(value));
                                    }
                                    r = new VectorRange(rangeId, values);
                                    rt.addRange(r);
                                }
                                // use scannedParamHash to store rangeId for that param, since it might be needed if unscanned param has a scanned param in expr.
                                if (scannedParamHash.get(scannedConstName).equals(scannedConstName)) {
                                    // the hash was originally populated as <scannedParamName, scannedParamName>. Replace 'value' with rangeId for scannedParam
                                    scannedParamHash.put(scannedConstName, r.getId());
                                }
                                // create setValue for scannedConstName
                                SymbolTableEntry ste2 = getSymbolTableEntryForModelEntity(mathSymbolMapping, scannedConstName);
                                XPathTarget target1 = getTargetXPath(ste2, l2gMap);
                                ASTNode math1 = new ASTCi(scannedConstName);
                                SetValue setValue1 = new SetValue(target1, r.getId(), sedModel.getId());
                                setValue1.setMath(math1);
                                rt.addChange(setValue1);
                            } else {
                                throw new RuntimeException("No scan ranges found for scanned parameter : '" + scannedConstName + "'.");
                            }
                        }
                        // for unscanned parameter overrides
                        for (String unscannedParamName : unscannedParamHash.values()) {
                            SymbolTableEntry ste = getSymbolTableEntryForModelEntity(mathSymbolMapping, unscannedParamName);
                            Expression unscannedParamExpr = mathOverrides.getActualExpression(unscannedParamName, 0);
                            if (unscannedParamExpr.isNumeric()) {
                                // if expression is numeric, add ChangeAttribute to model created above
                                XPathTarget targetXpath = getTargetAttributeXPath(ste, l2gMap);
                                ChangeAttribute changeAttribute = new ChangeAttribute(targetXpath, unscannedParamExpr.infix());
                                sedModel.addChange(changeAttribute);
                            } else {
                                // check for any scanned parameter in unscanned parameter expression
                                ASTNode math = Libsedml.parseFormulaString(unscannedParamExpr.infix());
                                String[] exprSymbols = unscannedParamExpr.getSymbols();
                                boolean bHasScannedParameter = false;
                                String scannedParamNameInUnscannedParamExp = null;
                                for (String symbol : exprSymbols) {
                                    if (scannedParamHash.get(symbol) != null) {
                                        bHasScannedParameter = true;
                                        scannedParamNameInUnscannedParamExp = new String(symbol);
                                        // @TODO check for multiple scannedParameters in expression.
                                        break;
                                    }
                                }
                                // (scanned parameter in expr) ? (add setValue for unscanned param in repeatedTask) : (add computeChange to modifiedModel)
                                if (bHasScannedParameter && scannedParamNameInUnscannedParamExp != null) {
                                    // create setValue for unscannedParamName (which contains a scanned param in its expression)
                                    SymbolTableEntry entry = getSymbolTableEntryForModelEntity(mathSymbolMapping, unscannedParamName);
                                    XPathTarget target = getTargetXPath(entry, l2gMap);
                                    String rangeId = scannedParamHash.get(scannedParamNameInUnscannedParamExp);
                                    // @TODO: we have no range??
                                    SetValue setValue = new SetValue(target, rangeId, sedModel.getId());
                                    setValue.setMath(math);
                                    rt.addChange(setValue);
                                } else {
                                    // non-numeric expression : add 'computeChange' to modified model
                                    XPathTarget targetXpath = getTargetXPath(ste, l2gMap);
                                    ComputeChange computeChange = new ComputeChange(targetXpath, math);
                                    for (String symbol : exprSymbols) {
                                        String symbolName = TokenMangler.mangleToSName(symbol);
                                        SymbolTableEntry ste1 = vcModel.getEntry(symbol);
                                        // ste1 could be a math parameter, hence the above could return null
                                        if (ste1 == null) {
                                            ste1 = simContext.getMathDescription().getEntry(symbol);
                                        }
                                        if (ste1 != null) {
                                            if (ste1 instanceof SpeciesContext || ste1 instanceof Structure || ste1 instanceof ModelParameter) {
                                                XPathTarget ste1_XPath = getTargetXPath(ste1, l2gMap);
                                                org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(symbolName, symbolName, taskRef, ste1_XPath.getTargetAsString());
                                                computeChange.addVariable(sedmlVar);
                                            } else {
                                                double doubleValue = 0.0;
                                                if (ste1 instanceof ReservedSymbol) {
                                                    doubleValue = getReservedSymbolValue(ste1);
                                                } else if (ste instanceof Function) {
                                                    try {
                                                        doubleValue = ste.getExpression().evaluateConstant();
                                                    } catch (Exception e) {
                                                        e.printStackTrace(System.out);
                                                        throw new RuntimeException("Unable to evaluate function '" + ste.getName() + "' used in '" + unscannedParamName + "' expression : ", e);
                                                    }
                                                } else {
                                                    doubleValue = ste.getConstantValue();
                                                }
                                                // TODO: shouldn't be s1_init_uM which is a math symbol, should be s0 (so use the ste-something from above)
                                                // TODO: revert to Variable, not Parameter
                                                Parameter sedmlParameter = new Parameter(symbolName, symbolName, doubleValue);
                                                computeChange.addParameter(sedmlParameter);
                                            }
                                        } else {
                                            throw new RuntimeException("Symbol '" + symbol + "' used in expression for '" + unscannedParamName + "' not found in model.");
                                        }
                                    }
                                    sedModel.addChange(computeChange);
                                }
                            }
                        }
                        sedmlModel.addModel(sedModel);
                        sedmlModel.addTask(rt);
                    }
                } else {
                    // no math overrides, add basic task.
                    String taskId = "tsk_" + simContextCnt + "_" + simCount;
                    // temporary workaround
                    // TODO better fix
                    simContextId = sbmlExportFailed ? bioModelID : simContextId;
                    Task sedmlTask = new Task(taskId, vcSimulation.getName(), simContextId, utcSim.getId());
                    sedmlModel.addTask(sedmlTask);
                    // to be used later to add dataGenerators : one set of DGs per model (simContext).
                    taskRef = taskId;
                }
                // 4 ------->
                // Create DataGenerators
                List<DataGenerator> dataGeneratorsOfSim = new ArrayList<DataGenerator>();
                // add one DataGenerator for 'time'
                String timeDataGenPrefix = DATAGENERATOR_TIME_NAME + "_" + taskRef;
                DataGenerator timeDataGen = sedmlModel.getDataGeneratorWithId(timeDataGenPrefix);
                org.jlibsedml.Variable timeVar = new org.jlibsedml.Variable(DATAGENERATOR_TIME_SYMBOL + "_" + taskRef, DATAGENERATOR_TIME_SYMBOL, taskRef, VariableSymbol.TIME);
                ASTNode math = Libsedml.parseFormulaString(DATAGENERATOR_TIME_SYMBOL + "_" + taskRef);
                timeDataGen = new DataGenerator(timeDataGenPrefix, timeDataGenPrefix, math);
                timeDataGen.addVariable(timeVar);
                sedmlModel.addDataGenerator(timeDataGen);
                dataGeneratorsOfSim.add(timeDataGen);
                // add dataGenerators for species
                // get species list from SBML model.
                // Map<String, String> name2IdMap = new LinkedHashMap<> ();
                String dataGenIdPrefix = "dataGen_" + taskRef;
                if (sbmlExportFailed) {
                    // we try vcml export
                    for (SpeciesContext sc : vcModel.getSpeciesContexts()) {
                        String varName = sc.getName();
                        String varId = varName + "_" + taskRef;
                        // name2IdMap.put(varName, varId);
                        ASTNode varMath = Libsedml.parseFormulaString(varId);
                        String dataGenId = dataGenIdPrefix + "_" + TokenMangler.mangleToSName(varName);
                        DataGenerator dataGen = new DataGenerator(dataGenId, dataGenId, varMath);
                        org.jlibsedml.Variable variable = new org.jlibsedml.Variable(varId, varName, taskRef, XmlHelper.getXPathForSpecies(varName));
                        dataGen.addVariable(variable);
                        sedmlModel.addDataGenerator(dataGen);
                        dataGeneratorsOfSim.add(dataGen);
                    }
                } else {
                    String[] varNamesList = SimSpec.fromSBML(sbmlString).getVarsList();
                    for (String varName : varNamesList) {
                        String varId = varName + "_" + taskRef;
                        // name2IdMap.put(varName, varId);
                        org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(varId, varName, taskRef, sbmlSupport.getXPathForSpecies(varName));
                        ASTNode varMath = Libsedml.parseFormulaString(varId);
                        // "dataGen_" + varCount; - old code
                        String dataGenId = dataGenIdPrefix + "_" + TokenMangler.mangleToSName(varName);
                        DataGenerator dataGen = new DataGenerator(dataGenId, dataGenId, varMath);
                        dataGen.addVariable(sedmlVar);
                        sedmlModel.addDataGenerator(dataGen);
                        dataGeneratorsOfSim.add(dataGen);
                    }
                }
                // add DataGenerators for output functions here
                ArrayList<AnnotatedFunction> outputFunctions = simContext.getOutputFunctionContext().getOutputFunctionsList();
                for (AnnotatedFunction annotatedFunction : outputFunctions) {
                    // Expression originalFunctionExpression = annotatedFunction.getExpression();
                    // Expression modifiedFunctionExpr = new Expression(annotatedFunction.getExpression());
                    // System.out.println("Before: " + originalFunctionExpression);
                    // String[] symbols = modifiedFunctionExpr.getSymbols();
                    // for(String symbol : symbols) {
                    // String id = name2IdMap.get(symbol);
                    // if(id == null) {
                    // System.err.println("Could not find id for " + symbol);
                    // } else {
                    // modifiedFunctionExpr.substituteInPlace(new Expression(symbol), new Expression(id));
                    // }
                    // }
                    // System.out.println("After:  " + modifiedFunctionExpr);
                    // ASTNode funcMath = Libsedml.parseFormulaString(modifiedFunctionExpr.infix());
                    // "dataGen_" + varCount; - old code
                    String dataGenId = dataGenIdPrefix + "_" + TokenMangler.mangleToSName(annotatedFunction.getName());
                    String varId = TokenMangler.mangleToSName(annotatedFunction.getName()) + taskRef;
                    if (sbmlExportFailed) {
                        // VCML
                        Expression exp = new Expression(varId);
                        ASTNode funcMath = Libsedml.parseFormulaString(exp.infix());
                        DataGenerator dataGen = new DataGenerator(dataGenId, dataGenId, funcMath);
                        org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(varId, annotatedFunction.getName(), taskRef, XmlHelper.getXPathForOutputFunction(simContextName, annotatedFunction.getName()));
                        dataGen.addVariable(sedmlVar);
                        sedmlModel.addDataGenerator(dataGen);
                        dataGeneratorsOfSim.add(dataGen);
                    } else {
                    // SBML
                    }
                // String[] functionSymbols = originalFunctionExpression.getSymbols();
                // for (String symbol : functionSymbols) {
                // String symbolName = TokenMangler.mangleToSName(symbol);
                // // try to get symbol from model, if null, try simContext.mathDesc
                // SymbolTableEntry ste = vcModel.getEntry(symbol);
                // if (ste == null) {
                // ste = simContext.getMathDescription().getEntry(symbol);
                // }
                // if (ste instanceof SpeciesContext || ste instanceof Structure || ste instanceof ModelParameter) {
                // XPathTarget targetXPath = getTargetXPath(ste, l2gMap);
                // if(sbmlExportFailed) {		// VCML
                // if(ste instanceof SpeciesContext) {
                // //											String varId = symbolName + "_" + taskRef;
                // //											org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(varId, symbolName, taskRef, XmlHelper.getXPathForSpecies(symbolName));
                // //											dataGen.addVariable(sedmlVar);
                // } else {
                // System.err.println("Not a species");
                // }
                // } else {					// SBML
                // //										String varId = symbolName + "_" + taskRef;
                // //										org.jlibsedml.Variable sedmlVar = new org.jlibsedml.Variable(varId, symbolName, taskRef, targetXPath.getTargetAsString());
                // //										dataGen.addVariable(sedmlVar);
                // }
                // } else {
                // double value = 0.0;
                // if (ste instanceof Function) {
                // try {
                // value = ste.getExpression().evaluateConstant();
                // } catch (Exception e) {
                // e.printStackTrace(System.out);
                // throw new RuntimeException("Unable to evaluate function '" + ste.getName() + "' for output function '" + annotatedFunction.getName() + "'.", e);
                // }
                // } else {
                // value = ste.getConstantValue();
                // }
                // Parameter sedmlParameter = new Parameter(symbolName, symbolName, value);
                // dataGen.addParameter(sedmlParameter);
                // }
                // }
                }
                // ignoring output for spatial deterministic (spatial stochastic is not exported to SEDML) and non-spatial stochastic applications with histogram
                if (!(simContext.getGeometry().getDimension() > 0)) {
                    String plot2dId = "plot2d_" + TokenMangler.mangleToSName(vcSimulation.getName());
                    String reportId = "report_" + TokenMangler.mangleToSName(vcSimulation.getName());
                    // String reportId = "__plot__" + plot2dId;
                    String plotName = simContextName + "_" + simName + "_plot";
                    Plot2D sedmlPlot2d = new Plot2D(plot2dId, plotName);
                    Report sedmlReport = new Report(reportId, plotName);
                    sedmlPlot2d.addNote(createNotesElement("Plot of all variables and output functions from application '" + simContext.getName() + "' ; simulation '" + vcSimulation.getName() + "' in VCell model"));
                    sedmlReport.addNote(createNotesElement("Report of all variables and output functions from application '" + simContext.getName() + "' ; simulation '" + vcSimulation.getName() + "' in VCell model"));
                    DataGenerator dgtime = sedmlModel.getDataGeneratorWithId(DATAGENERATOR_TIME_NAME + "_" + taskRef);
                    String xDataRef = dgtime.getId();
                    String xDatasetXId = "__data_set__" + plot2dId + dgtime.getId();
                    // id, name, label, data generator reference
                    DataSet dataSet = new DataSet(xDatasetXId, DATAGENERATOR_TIME_NAME, xDataRef, xDataRef);
                    sedmlReport.addDataSet(dataSet);
                    // add a curve for each dataGenerator in SEDML model
                    int curveCnt = 0;
                    // String id, String name, ASTNode math
                    for (DataGenerator dg : dataGeneratorsOfSim) {
                        // no curve for time, since time is xDateReference
                        if (dg.getId().equals(xDataRef)) {
                            continue;
                        }
                        String curveId = "curve_" + plot2dId + "_" + dg.getName();
                        String datasetYId = "__data_set__" + plot2dId + dg.getName();
                        Curve curve = new Curve(curveId, dg.getName(), false, false, xDataRef, dg.getId());
                        sedmlPlot2d.addCurve(curve);
                        // // id, name, label, dataRef
                        // // dataset id    <- unique id
                        // // dataset name  <- data generator name
                        // // dataset label <- dataset id
                        DataSet yDataSet = new DataSet(datasetYId, dg.getName(), dg.getId(), dg.getId());
                        sedmlReport.addDataSet(yDataSet);
                        curveCnt++;
                    }
                    sedmlModel.addOutput(sedmlPlot2d);
                    sedmlModel.addOutput(sedmlReport);
                } else {
                    // spatial deterministic
                    if (simContext.getApplicationType().equals(Application.NETWORK_DETERMINISTIC)) {
                        // we ignore spatial stochastic (Smoldyn)
                        if (bForceVCML) {
                            String reportId = "_report_" + TokenMangler.mangleToSName(vcSimulation.getName());
                            Report sedmlReport = new Report(reportId, simContext.getName() + "plots");
                            String xDataRef = sedmlModel.getDataGeneratorWithId(DATAGENERATOR_TIME_NAME + "_" + taskRef).getId();
                            String xDatasetXId = "datasetX_" + DATAGENERATOR_TIME_NAME + "_" + timeDataGen.getId();
                            DataSet dataSetTime = new DataSet(xDatasetXId, xDataRef, xDatasetXId, xDataRef);
                            sedmlReport.addDataSet(dataSetTime);
                            int surfaceCnt = 0;
                            for (DataGenerator dg : dataGeneratorsOfSim) {
                                if (dg.getId().equals(xDataRef)) {
                                    continue;
                                }
                                // String datasetYId = "datasetY_" + surfaceCnt;
                                String datasetYId = "__data_set__" + surfaceCnt + "_" + dg.getName();
                                DataSet yDataSet = new DataSet(datasetYId, dg.getName(), datasetYId, dg.getId());
                                sedmlReport.addDataSet(yDataSet);
                                surfaceCnt++;
                            }
                            sedmlModel.addOutput(sedmlReport);
                        } else {
                            // spatial deterministic SBML
                            // TODO: add surfaces to the plots
                            String plot3dId = "plot3d_" + TokenMangler.mangleToSName(vcSimulation.getName());
                            String reportId = "report_" + TokenMangler.mangleToSName(vcSimulation.getName());
                            String plotName = simContext.getName() + "plots";
                            Plot3D sedmlPlot3d = new Plot3D(plot3dId, plotName);
                            Report sedmlReport = new Report(reportId, plotName);
                            sedmlPlot3d.addNote(createNotesElement("Plot of all variables and output functions from application '" + simContext.getName() + "' ; simulation '" + vcSimulation.getName() + "' in VCell model"));
                            sedmlReport.addNote(createNotesElement("Report of all variables and output functions from application '" + simContext.getName() + "' ; simulation '" + vcSimulation.getName() + "' in VCell model"));
                            DataGenerator dgtime = sedmlModel.getDataGeneratorWithId(DATAGENERATOR_TIME_NAME + "_" + taskRef);
                            String xDataRef = dgtime.getId();
                            String xDatasetXId = "__data_set__" + plot3dId + dgtime.getId();
                            // id, name, label, data generator reference
                            DataSet dataSet = new DataSet(xDatasetXId, DATAGENERATOR_TIME_NAME, xDataRef, xDataRef);
                            sedmlReport.addDataSet(dataSet);
                            // add a curve for each dataGenerator in SEDML model
                            int curveCnt = 0;
                            // String id, String name, ASTNode math
                            for (DataGenerator dg : dataGeneratorsOfSim) {
                                // no curve for time, since time is xDateReference
                                if (dg.getId().equals(xDataRef)) {
                                    continue;
                                }
                                String curveId = "curve_" + plot3dId + "_" + dg.getName();
                                String datasetYId = "__data_set__" + plot3dId + dg.getName();
                                DataSet yDataSet = new DataSet(datasetYId, dg.getName(), dg.getId(), dg.getId());
                                sedmlReport.addDataSet(yDataSet);
                                curveCnt++;
                            }
                            sedmlModel.addOutput(sedmlReport);
                        }
                    }
                }
                simCount++;
            }
            // end - for 'sims'
            simContextCnt++;
        }
        // if sedmlNotesStr is not null, there were some applications that could not be exported to SEDML (eg., spatial stochastic). Create a notes element and add it to sedml Model.
        if (sedmlNotesStr.length() > 0) {
            sedmlNotesStr = "\n\tThe following applications in the VCell model were not exported to VCell : " + sedmlNotesStr;
            sedmlModel.addNote(createNotesElement(sedmlNotesStr));
        }
        if (sedmlModel.getModels() != null && sedmlModel.getModels().size() > 1) {
            System.out.println("Number of models in the sedml is " + sedmlModel.getModels().size());
        }
    } catch (Exception e) {
        e.printStackTrace(System.out);
        throw new RuntimeException("Error adding model to SEDML document : " + e.getMessage());
    }
}
Also used : Task(org.jlibsedml.Task) SubTask(org.jlibsedml.SubTask) RepeatedTask(org.jlibsedml.RepeatedTask) LinkedHashMap(java.util.LinkedHashMap) HashMap(java.util.HashMap) DataSet(org.jlibsedml.DataSet) NonspatialStochSimOptions(cbit.vcell.solver.NonspatialStochSimOptions) ArrayList(java.util.ArrayList) SpeciesContext(cbit.vcell.model.SpeciesContext) ConstantArraySpec(cbit.vcell.solver.ConstantArraySpec) ChangeAttribute(org.jlibsedml.ChangeAttribute) ComputeChange(org.jlibsedml.ComputeChange) ErrorTolerance(cbit.vcell.solver.ErrorTolerance) SolverTaskDescription(cbit.vcell.solver.SolverTaskDescription) Plot3D(org.jlibsedml.Plot3D) SubTask(org.jlibsedml.SubTask) AnnotatedFunction(cbit.vcell.solver.AnnotatedFunction) Curve(org.jlibsedml.Curve) SBMLExporter(org.vcell.sbml.vcell.SBMLExporter) VectorRange(org.jlibsedml.VectorRange) UniformRange(org.jlibsedml.UniformRange) Range(org.jlibsedml.Range) Algorithm(org.jlibsedml.Algorithm) MathOverrides(cbit.vcell.solver.MathOverrides) ModelParameter(cbit.vcell.model.Model.ModelParameter) DataGenerator(org.jlibsedml.DataGenerator) MathMapping(cbit.vcell.mapping.MathMapping) UniformTimeCourse(org.jlibsedml.UniformTimeCourse) Plot2D(org.jlibsedml.Plot2D) AlgorithmParameter(org.jlibsedml.AlgorithmParameter) VectorRange(org.jlibsedml.VectorRange) SolverDescription(cbit.vcell.solver.SolverDescription) ReservedSymbol(cbit.vcell.model.Model.ReservedSymbol) StructureMapping(cbit.vcell.mapping.StructureMapping) TimeBounds(cbit.vcell.solver.TimeBounds) TimeStep(cbit.vcell.solver.TimeStep) AnnotatedFunction(cbit.vcell.solver.AnnotatedFunction) Function(cbit.vcell.math.Function) SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) ASTCi(org.jmathml.ASTCi) RepeatedTask(org.jlibsedml.RepeatedTask) ASTNode(org.jmathml.ASTNode) Structure(cbit.vcell.model.Structure) Pair(org.vcell.util.Pair) Report(org.jlibsedml.Report) SimulationContext(cbit.vcell.mapping.SimulationContext) MathSymbolMapping(cbit.vcell.mapping.MathSymbolMapping) SbmlException(org.vcell.sbml.SbmlException) TransformerException(javax.xml.transform.TransformerException) XmlParseException(cbit.vcell.xml.XmlParseException) IOException(java.io.IOException) ExpressionException(cbit.vcell.parser.ExpressionException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) SBMLSupport(org.jlibsedml.modelsupport.SBMLSupport) Simulation(cbit.vcell.solver.Simulation) Expression(cbit.vcell.parser.Expression) UniformRange(org.jlibsedml.UniformRange) BioModel(cbit.vcell.biomodel.BioModel) Model(org.jlibsedml.Model) StructureMappingParameter(cbit.vcell.mapping.StructureMapping.StructureMappingParameter) KineticsParameter(cbit.vcell.model.Kinetics.KineticsParameter) ModelParameter(cbit.vcell.model.Model.ModelParameter) SpeciesContextSpecParameter(cbit.vcell.mapping.SpeciesContextSpec.SpeciesContextSpecParameter) ProxyParameter(cbit.vcell.model.ProxyParameter) AlgorithmParameter(org.jlibsedml.AlgorithmParameter) Parameter(org.jlibsedml.Parameter) NonspatialStochHybridOptions(cbit.vcell.solver.NonspatialStochHybridOptions) XPathTarget(org.jlibsedml.XPathTarget) SetValue(org.jlibsedml.SetValue)

Example 5 with SBMLSupport

use of org.jlibsedml.modelsupport.SBMLSupport in project vcell by virtualcell.

the class SEDMLExporter method getTargetAttributeXPath.

private XPathTarget getTargetAttributeXPath(SymbolTableEntry ste, Map<Pair<String, String>, String> l2gMap) {
    // to get Xpath string for variables.
    SBMLSupport sbmlSupport = new SBMLSupport();
    XPathTarget targetXpath = null;
    if (ste instanceof SpeciesContext || ste instanceof SpeciesContextSpecParameter) {
        String speciesId = ste.getName();
        // can change species initial concentration or amount
        String speciesAttr = "";
        if (ste instanceof SpeciesContextSpecParameter) {
            SpeciesContextSpecParameter scsp = (SpeciesContextSpecParameter) ste;
            speciesId = (scsp).getSpeciesContext().getName();
            if (scsp.getRole() == SpeciesContextSpec.ROLE_InitialConcentration) {
                speciesAttr = scsp.getName();
            }
            if (scsp.getRole() == SpeciesContextSpec.ROLE_InitialCount) {
                speciesAttr = scsp.getName();
            }
        }
        if (speciesAttr.length() < 1) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForCompartment(speciesId));
        } else if (speciesAttr.equalsIgnoreCase("initialConcentration") || speciesAttr.equalsIgnoreCase("initConc")) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForSpecies(speciesId, SpeciesAttribute.initialConcentration));
        } else if (speciesAttr.equalsIgnoreCase("initialCount")) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForSpecies(speciesId, SpeciesAttribute.initialAmount));
        } else {
            throw new RuntimeException("Unknown species attribute '" + speciesAttr + "'; cannot get xpath target for species '" + speciesId + "'.");
        }
        targetXpath = new XPathTarget(sbmlSupport.getXPathForSpecies(speciesId));
    } else if (ste instanceof ModelParameter) {
        // can only change parameter value.
        targetXpath = new XPathTarget(sbmlSupport.getXPathForGlobalParameter(ste.getName(), ParameterAttribute.value));
    } else if (ste instanceof Structure || ste instanceof Structure.StructureSize || (ste instanceof StructureMappingParameter && ((StructureMappingParameter) ste).getRole() == StructureMapping.ROLE_Size)) {
        String compartmentId = ste.getName();
        // can change compartment size or spatial dimension, but in vcell, we cannot change compartment dimension.
        String compartmentAttr = "";
        if (ste instanceof Structure.StructureSize) {
            compartmentId = ((StructureSize) ste).getStructure().getName();
            compartmentAttr = ((StructureSize) ste).getName();
        }
        if (ste instanceof StructureMappingParameter) {
            StructureMappingParameter smp = (StructureMappingParameter) ste;
            compartmentId = smp.getStructure().getName();
            if (smp.getRole() == StructureMapping.ROLE_Size) {
                compartmentAttr = smp.getName();
            }
        }
        if (compartmentAttr.length() < 1) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForCompartment(compartmentId));
        } else if (compartmentAttr.equalsIgnoreCase("size")) {
            targetXpath = new XPathTarget(sbmlSupport.getXPathForCompartment(compartmentId, CompartmentAttribute.size));
        } else {
            throw new RuntimeException("Unknown compartment attribute '" + compartmentAttr + "'; cannot get xpath target for compartment '" + compartmentId + "'.");
        }
    } else if (ste instanceof KineticsParameter) {
        KineticsParameter kp = (KineticsParameter) ste;
        String reactionID = kp.getKinetics().getReactionStep().getName();
        String parameterID = kp.getName();
        Pair<String, String> key = new Pair(reactionID, parameterID);
        String value = l2gMap.get(key);
        if (value == null) {
            // stays as local parameter
            targetXpath = new XPathTarget(sbmlSupport.getXPathForKineticLawParameter(reactionID, parameterID, ParameterAttribute.value));
        } else {
            // became a global in SBML, we need to refer to that global
            targetXpath = new XPathTarget(sbmlSupport.getXPathForGlobalParameter(value, ParameterAttribute.value));
        }
    } else {
        System.err.println("Entity should be SpeciesContext, Structure, ModelParameter : " + ste.getClass());
        throw new RuntimeException("Unknown entity in SBML model");
    }
    return targetXpath;
}
Also used : ModelParameter(cbit.vcell.model.Model.ModelParameter) KineticsParameter(cbit.vcell.model.Kinetics.KineticsParameter) SpeciesContext(cbit.vcell.model.SpeciesContext) StructureMappingParameter(cbit.vcell.mapping.StructureMapping.StructureMappingParameter) XPathTarget(org.jlibsedml.XPathTarget) Structure(cbit.vcell.model.Structure) StructureSize(cbit.vcell.model.Structure.StructureSize) SBMLSupport(org.jlibsedml.modelsupport.SBMLSupport) SpeciesContextSpecParameter(cbit.vcell.mapping.SpeciesContextSpec.SpeciesContextSpecParameter) Pair(org.vcell.util.Pair)

Aggregations

SBMLSupport (org.jlibsedml.modelsupport.SBMLSupport)5 SpeciesContextSpecParameter (cbit.vcell.mapping.SpeciesContextSpec.SpeciesContextSpecParameter)4 StructureMappingParameter (cbit.vcell.mapping.StructureMapping.StructureMappingParameter)4 KineticsParameter (cbit.vcell.model.Kinetics.KineticsParameter)4 ModelParameter (cbit.vcell.model.Model.ModelParameter)4 SpeciesContext (cbit.vcell.model.SpeciesContext)4 Structure (cbit.vcell.model.Structure)4 XPathTarget (org.jlibsedml.XPathTarget)4 Pair (org.vcell.util.Pair)4 BioModel (cbit.vcell.biomodel.BioModel)3 Expression (cbit.vcell.parser.Expression)3 ExpressionException (cbit.vcell.parser.ExpressionException)3 MathMapping (cbit.vcell.mapping.MathMapping)2 MathSymbolMapping (cbit.vcell.mapping.MathSymbolMapping)2 SimulationContext (cbit.vcell.mapping.SimulationContext)2 StructureMapping (cbit.vcell.mapping.StructureMapping)2 Function (cbit.vcell.math.Function)2 ReservedSymbol (cbit.vcell.model.Model.ReservedSymbol)2 ProxyParameter (cbit.vcell.model.ProxyParameter)2 StructureSize (cbit.vcell.model.Structure.StructureSize)2