static void Main() { Debug.Assert((CRootContainer.getRoot() != null)); // create a new datamodel CDataModel dataModel = CRootContainer.addDatamodel(); Debug.Assert((dataModel != null)); Debug.Assert((CRootContainer.getDatamodelList().size() == 1)); // next we import a simple SBML model from a string // clear the message queue so that we only have error messages from the import in the queue CCopasiMessage.clearDeque(); bool result = true; try { result = dataModel.importSBMLFromString(MODEL_STRING); } catch { System.Console.Error.WriteLine("Import of model failed miserably."); System.Environment.Exit(1); } // check if the import was successful int mostSevere = CCopasiMessage.getHighestSeverity(); // if it was a filtered error, we convert it to an unfiltered type // the filtered error messages have the same value as the unfiltered, but they // have the 7th bit set which basically adds 128 to the value mostSevere = mostSevere & 127; // we assume that the import succeeded if the return value is true and // the most severe error message is not an error or an exception if (result != true && mostSevere < CCopasiMessage.ERROR) { System.Console.Error.WriteLine("Sorry. Model could not be imported."); System.Environment.Exit(1); } // // now we tell the model object to calculate the jacobian // CModel model = dataModel.getModel(); Debug.Assert((model != null)); if (model != null) { // running a task, e.g. a trajectory will automatically make sure that // the initial values are transferred to the current state before the calculation begins. // If we use low level calculation methods like the one to calculate the jacobian, we // have to make sure the the initial values are applied to the state model.applyInitialValues(); // we need an array that stores the result // the size of the matrix does not really matter because // the calculateJacobian autoamtically resizes it to the correct // size FloatMatrix jacobian = new FloatMatrix(); // the first parameter to the calculation function is a reference to // the matrix where the result is to be stored // the second parameter is the derivationFactor for the calculation // it basically represents a relative delta value for the calculation of the derivatives // the third parameter is a boolean indicating whether the jacobian should // be calculated from the reduced (true) or full (false) system model.getMathContainer().calculateJacobian(jacobian, 1e-12, false); // now we print the result // the jacobian stores the values in the order they are // given in the user order in the state template so it is not really straight // forward to find out which column/row corresponds to which species CStateTemplate stateTemplate = model.getStateTemplate(); // and we need the user order SizeTVector userOrder = stateTemplate.getUserOrder(); // from those two, we can construct an new vector that contains // the names of the entities in the jacobian in the order in which they appear in // the jacobian System.Collections.Generic.List <string> nameVector = new System.Collections.Generic.List <string>(); CModelEntity entity = null; int status; for (uint i = 0; i < userOrder.size(); ++i) { entity = stateTemplate.getEntity(userOrder.get(i)); Debug.Assert((entity != null)); // now we need to check if the entity is actually // determined by an ODE or a reaction status = entity.getStatus(); if (status == CModelEntity.Status_ODE || (status == CModelEntity.Status_REACTIONS && entity.isUsed())) { nameVector.Add(entity.getObjectName()); } } Debug.Assert((nameVector.Count == jacobian.numRows())); // now we print the matrix, for this we assume that no // entity name is longer then 5 character which is a save bet since // we know the model System.Console.Out.NewLine = ""; System.Console.WriteLine(System.String.Format("Jacobian Matrix:{0}", System.Environment.NewLine)); System.Console.WriteLine(System.String.Format("size:{0}x{1}{2}", jacobian.numRows(), jacobian.numCols(), System.Environment.NewLine)); System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine)); System.Console.Out.WriteLine(System.String.Format("{0,7}", " ")); for (int i = 0; i < nameVector.Count; ++i) { System.Console.Out.WriteLine(System.String.Format("{0,7}", nameVector[i])); } System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine)); for (uint i = 0; i < nameVector.Count; ++i) { System.Console.Out.WriteLine(System.String.Format("{0,7}", nameVector[(int)i])); for (uint j = 0; j < nameVector.Count; ++j) { System.Console.Out.WriteLine(System.String.Format("{0,7:0.###}", jacobian.get(i, j))); } System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine)); } // we can also calculate the jacobian of the reduced system // in a similar way model.getMathContainer().calculateJacobian(jacobian, 1e-12, true); // this time generating the output is actually simpler because the rows // and columns are ordered in the same way as the independent variables of the state temple System.Console.WriteLine(System.String.Format("{0}{0}", System.Environment.NewLine)); System.Console.WriteLine(System.String.Format("Reduced Jacobian Matrix:{0}{0}", System.Environment.NewLine)); System.Console.Out.WriteLine(System.String.Format("{0:6}", " ")); uint iMax = stateTemplate.getNumIndependent(); for (uint i = 0; i < iMax; ++i) { System.Console.Out.WriteLine(System.String.Format("\t{0:7}", stateTemplate.getIndependent(i).getObjectName())); } System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine)); for (uint i = 0; i < iMax; ++i) { System.Console.Out.WriteLine(System.String.Format("{0:7}", stateTemplate.getIndependent(i).getObjectName())); for (uint j = 0; j < iMax; ++j) { System.Console.Out.WriteLine(System.String.Format("{0,7:0.###}", jacobian.get(i, j))); } System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine)); } } }
static void Main() { Debug.Assert(CRootContainer.getRoot() != null); // create a new datamodel CDataModel dataModel = CRootContainer.addDatamodel(); Debug.Assert(CRootContainer.getDatamodelList().size() == 1); // the only argument to the main routine should be the name of an SBML file try { // load the model dataModel.importSBMLFromString(MODEL_STRING); } catch { System.Console.Error.WriteLine("Error while importing the model from the given String."); System.Environment.Exit(1); } CModel model = dataModel.getModel(); Debug.Assert(model != null); // create a report with the correct filename and all the species against // time. CReportDefinitionVector reports = dataModel.getReportDefinitionList(); // create a new report definition object CReportDefinition report = reports.createReportDefinition("Report", "Output for timecourse"); // set the task type for the report definition to timecourse report.setTaskType(CTaskEnum.Task_timeCourse); // we don't want a table report.setIsTable(false); // the entries in the output should be seperated by a ", " report.setSeparator(new CCopasiReportSeparator(", ")); // we need a handle to the header and the body // the header will display the ids of the metabolites and "time" for // the first column // the body will contain the actual timecourse data ReportItemVector header = report.getHeaderAddr(); ReportItemVector body = report.getBodyAddr(); body.Add(new CRegisteredCommonName(new CCommonName(dataModel.getModel().getCN().getString() + ",Reference=Time").getString())); body.Add(new CRegisteredCommonName(report.getSeparator().getCN().getString())); header.Add(new CRegisteredCommonName(new CDataString("time").getCN().getString())); header.Add(new CRegisteredCommonName(report.getSeparator().getCN().getString())); uint i, iMax = (uint)model.getMetabolites().size(); for (i = 0; i < iMax; ++i) { CMetab metab = model.getMetabolite(i); Debug.Assert(metab != null); // we don't want output for FIXED metabolites right now if (metab.getStatus() != CModelEntity.Status_FIXED) { // we want the concentration oin the output // alternatively, we could use "Reference=Amount" to get the // particle number body.Add(new CRegisteredCommonName(metab.getObject(new CCommonName("Reference=Concentration")).getCN().getString())); // add the corresponding id to the header header.Add(new CRegisteredCommonName(new CDataString(metab.getSBMLId()).getCN().getString())); if (i != iMax - 1) { // after each entry, we need a seperator body.Add(new CRegisteredCommonName(report.getSeparator().getCN().getString())); // and a seperator header.Add(new CRegisteredCommonName(report.getSeparator().getCN().getString())); } } } // get the trajectory task object CTrajectoryTask trajectoryTask = (CTrajectoryTask)dataModel.getTask("Time-Course"); // run a stochastic time course trajectoryTask.setMethodType(CTaskEnum.Method_stochastic); // pass a pointer of the model to the problem trajectoryTask.getProblem().setModel(dataModel.getModel()); // we don't want the trajectory task to run by itself, but we want to // run it from a scan, so we deactivate the standalone trajectory task trajectoryTask.setScheduled(false); // get the problem for the task to set some parameters CTrajectoryProblem problem = (CTrajectoryProblem)trajectoryTask.getProblem(); // simulate 100 steps problem.setStepNumber(100); // start at time 0 dataModel.getModel().setInitialTime(0.0); // simulate a duration of 10 time units problem.setDuration(10); // tell the problem to actually generate time series data problem.setTimeSeriesRequested(true); // now we set up the scan CScanTask scanTask = (CScanTask)dataModel.getTask("Scan"); // get the problem CScanProblem scanProblem = (CScanProblem)scanTask.getProblem(); Debug.Assert(scanProblem != null); // set the model for the problem scanProblem.setModel(dataModel.getModel()); // activate the task so that is is run // if the model is saved and passed to CopasiSE scanTask.setScheduled(true); // set the report for the task scanTask.getReport().setReportDefinition(report); // set the output file for the report scanTask.getReport().setTarget("example4.txt"); // don't append to an existing file, but overwrite scanTask.getReport().setAppend(false); // tell the scan that we want to make a scan over a trajectory task scanProblem.setSubtask(CTaskEnum.Task_timeCourse); // we just want to run the timecourse task a number of times, so we // create a repeat item with 100 repeats scanProblem.addScanItem(CScanProblem.SCAN_REPEAT, 100); // we want the output from the trajectory task scanProblem.setOutputInSubtask(true); // we don't want to set the initial conditions of the model to the end // state of the last run scanProblem.setContinueFromCurrentState(false); try { // now we run the actual trajectory scanTask.processWithOutputFlags(true, (int)CCopasiTask.ONLY_TIME_SERIES); } catch { System.Console.Error.WriteLine("Error. Running the scan failed."); String lastErrors = scanTask.getProcessError(); // check if there are additional error messages if (!string.IsNullOrEmpty(lastErrors)) { // print the messages in chronological order System.Console.Error.WriteLine(lastErrors); } System.Environment.Exit(1); } }
static void Main() { // initialize the backend library // since we are not interested in the arguments // that are passed to main, we pass 0 and NULL to // init Debug.Assert(CRootContainer.getRoot() != null); // create a new datamodel CDataModel dataModel = CRootContainer.addDatamodel(); Debug.Assert((dataModel != null)); Debug.Assert((CRootContainer.getDatamodelList().size() == 1)); // next we import a simple SBML model from a string // clear the message queue so that we only have error messages from the import in the queue CCopasiMessage.clearDeque(); bool result = true; try { result = dataModel.importSBMLFromString(MODEL_STRING); } catch { System.Console.Error.WriteLine("An exception has occured during the import of the SBML model"); System.Environment.Exit(1); } // check if the import was successful int mostSevere = CCopasiMessage.getHighestSeverity(); // if it was a filtered error, we convert it to an unfiltered type // the filtered error messages have the same value as the unfiltered, but they // have the 7th bit set which basically adds 128 to the value mostSevere = mostSevere & 127; // we assume that the import succeeded if the return value is true and // the most severe error message is not an error or an exception if (result != true && mostSevere < CCopasiMessage.ERROR) { System.Console.Error.WriteLine("Sorry. Model could not be imported."); System.Environment.Exit(1); } // get the trajectory task object CSteadyStateTask task = (CSteadyStateTask)dataModel.getTask("Steady-State"); CCopasiMessage.clearDeque(); try { // now we run the actual trajectory task.processWithOutputFlags(true, (int)CCopasiTask.ONLY_TIME_SERIES); } catch { System.Console.Error.WriteLine("Error. Running the scan failed."); String lastErrors = task.getProcessError(); // check if there are additional error messages if (!string.IsNullOrEmpty(lastErrors)) { // print the messages in chronological order System.Console.Error.WriteLine(lastErrors); } System.Environment.Exit(1); } // now we can get the result of the steady state calculation, e.g. the jacobian // matrix of the model at the steady state // here we can either get the jacobian as we did in example 8 as a matrix with // getJacobian, or we can use getJacobianAnnotated to get an annotated matrix // Corresponding methods for the reduced jacobian are getJacobianX and getJacobianXAnnotated CDataArray aj = task.getJacobianAnnotated(); Debug.Assert((aj != null)); if (aj != null) { // we do the output, but as in contrast to the jacobian in example 8, // we now have all the information for the output in one place // first the array annotation can tell us how many dimensions it has. // Since the matrix is a 2D array, it should have 2 dimensions Debug.Assert((aj.dimensionality() == 2)); // since the matrix has a dimensionality of 2, the inde for the underlaying abstract array // object is a vector with two unsigned int elements // First element is the index for the outer dimension and the second element is the index // for the inner dimension SizeTStdVector index = new SizeTStdVector(); // The constructor does not seem to interpret an integer argument // as the size // I though that in C# we might be able to achieve this using the Capacity property // but that didn't work. Maybe I was using it incorrectly since I don't really know C# // So for now, we just add two elements to the vector which seems to do the trick. index.Add(0); index.Add(0); // since the rows and columns have the same annotation for the jacobian, it doesn't matter // for which dimension we get the annotations StringStdVector annotations = aj.getAnnotationsString(1); System.Console.Out.NewLine = ""; System.Console.WriteLine(System.String.Format("Jacobian Matrix:{0}{0}", System.Environment.NewLine)); System.Console.Out.WriteLine(System.String.Format("{0,7}", " ")); for (int i = 0; i < annotations.Count; ++i) { Console.Out.WriteLine(System.String.Format("{0,7}", annotations[i])); } Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine)); for (int i = 0; i < annotations.Count; ++i) { System.Console.Out.WriteLine(System.String.Format("{0,7} ", annotations[i])); index[0] = (uint)i; for (int j = 0; j < annotations.Count; ++j) { index[1] = (uint)j; System.Console.Out.WriteLine(System.String.Format("{0,7:G2} ", aj.array().get(index))); } System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine)); } } System.Environment.Exit(0); }