Example #1
0
        /// <summary>
        /// Updates a species quantity.
        /// </summary>
        /// <param name="metab">Metab.</param>
        /// <param name="quantity">Quantity.</param>
        public void UpdateSpeciesQuantity(CMetab metab, double quantity)
        {
            metab.setInitialValue(quantity);             // use setInitialValue for Number (not Concentration) see Doc 1.5.2.3 metabolites
            CCopasiObject obj = metab.getInitialValueReference();

            changedObjects.Add(obj);
        }
Example #2
0
        /// <summary>
        /// Updates the compartment volume.
        /// </summary>
        /// <param name="volume">Volume in nl</param>
        public void UpdateCompartmentVolume(double volume)
        {
            compartment.setInitialValue(volume);
            CCopasiObject obj = compartment.getInitialValueReference();

            changedObjects.Add(obj);
        }
Example #3
0
    static void Main(string[] args)
    {
        Debug.Assert(CCopasiRootContainer.getRoot() != null);
        // create a new datamodel
        CCopasiDataModel dataModel = CCopasiRootContainer.addDatamodel();

        Debug.Assert(CCopasiRootContainer.getDatamodelList().size() == 1);
        // first we load a simple model
        try
        {
            // load the model
            dataModel.importSBMLFromString(MODEL_STRING);
        }
        catch
        {
            System.Console.Error.WriteLine("Error while importing the model.");
            System.Environment.Exit(1);
        }

        // now we need to run some time course simulation to get data to fit
        // against

        // get the trajectory task object
        CTrajectoryTask trajectoryTask = (CTrajectoryTask)dataModel.getTask("Time-Course");

        // run a deterministic time course
        trajectoryTask.setMethodType(CTaskEnum.deterministic);

        // pass a pointer of the model to the problem
        trajectoryTask.getProblem().setModel(dataModel.getModel());

        // activate the task so that it will be run when the model is saved
        // and passed to CopasiSE
        trajectoryTask.setScheduled(true);

        // get the problem for the task to set some parameters
        CTrajectoryProblem problem = (CTrajectoryProblem)trajectoryTask.getProblem();

        // simulate 4000 steps
        problem.setStepNumber(4000);
        // start at time 0
        dataModel.getModel().setInitialTime(0.0);
        // simulate a duration of 400 time units
        problem.setDuration(400);
        // tell the problem to actually generate time series data
        problem.setTimeSeriesRequested(true);

        // set some parameters for the LSODA method through the method
        // Currently we don't use the method to set anything
        //CTrajectoryMethod method = (CTrajectoryMethod)trajectoryTask.getMethod();

        bool result = true;

        try
        {
            // now we run the actual trajectory
            result = trajectoryTask.processWithOutputFlags(true, (int)CCopasiTask.ONLY_TIME_SERIES);
        }
        catch
        {
            System.Console.Error.WriteLine("Error. Running the time course simulation failed.");
            String lastErrors = trajectoryTask.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);
        }
        if (result == false)
        {
            System.Console.Error.WriteLine("An error occured while running the time course simulation.");
            String lastErrors = trajectoryTask.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);
        }

        // we write the data to a file and add some noise to it
        // This is necessary since COPASI can only read experimental data from
        // file.
        CTimeSeries timeSeries = trajectoryTask.getTimeSeries();

        // we simulated 100 steps, including the initial state, this should be
        // 101 step in the timeseries
        Debug.Assert(timeSeries.getRecordedSteps() == 4001);
        uint i;
        uint iMax = (uint)timeSeries.getNumVariables();

        // there should be four variables, the three metabolites and time
        Debug.Assert(iMax == 5);
        uint lastIndex = (uint)timeSeries.getRecordedSteps() - 1;
        // open the file
        // we need to remember in which order the variables are written to file
        // since we need to specify this later in the parameter fitting task
        List <uint>   indexSet    = new List <uint>();
        List <CMetab> metabVector = new List <CMetab>();

        // write the header
        // the first variable in a time series is a always time, for the rest
        // of the variables, we use the SBML id in the header
        double random = 0.0;

        System.Random rand_gen = new System.Random();
        try
        {
            System.IO.StreamWriter os = new System.IO.StreamWriter("fakedata_example6.txt");
            os.Write("# time ");
            CKeyFactory keyFactory = CCopasiRootContainer.getKeyFactory();
            Debug.Assert(keyFactory != null);
            for (i = 1; i < iMax; ++i)
            {
                string        key = timeSeries.getKey(i);
                CCopasiObject obj = keyFactory.get(key);
                Debug.Assert(obj != null);
                // only write header data or metabolites
                System.Type type = obj.GetType();
                if (type.FullName.Equals("org.COPASI.CMetab"))
                {
                    os.Write(", ");
                    os.Write(timeSeries.getSBMLId(i, dataModel));
                    CMetab m = (CMetab)obj;
                    indexSet.Add(i);
                    metabVector.Add(m);
                }
            }
            os.Write("\n");
            double data = 0.0;
            for (i = 0; i < lastIndex; ++i)
            {
                uint   j;
                string s = "";
                for (j = 0; j < iMax; ++j)
                {
                    // we only want to  write the data for metabolites
                    // the compartment does not interest us here
                    if (j == 0 || indexSet.Contains(j))
                    {
                        // write the data with some noise (+-5% max)
                        random = rand_gen.NextDouble();
                        data   = timeSeries.getConcentrationData(i, j);
                        // don't add noise to the time
                        if (j != 0)
                        {
                            data += data * (random * 0.1 - 0.05);
                        }
                        s = s + (System.Convert.ToString(data));
                        s = s + ", ";
                    }
                }
                // remove the last two characters again
                os.Write(s.Substring(0, s.Length - 2));
                os.Write("\n");
            }
            os.Close();
        }
        catch (System.ApplicationException e)
        {
            System.Console.Error.WriteLine("Error. Could not write time course data to file.");
            System.Console.WriteLine(e.Message);
            System.Environment.Exit(1);
        }

        // now we change the parameter values to see if the parameter fitting
        // can really find the original values
        random = rand_gen.NextDouble() * 10;
        CReaction reaction = dataModel.getModel().getReaction(0);

        // we know that it is an irreversible mass action, so there is one
        // parameter
        Debug.Assert(reaction.getParameters().size() == 1);
        Debug.Assert(reaction.isLocalParameter(0));
        // the parameter of a irreversible mass action is called k1
        reaction.setParameterValue("k1", random);

        reaction = dataModel.getModel().getReaction(1);
        // we know that it is an irreversible mass action, so there is one
        // parameter
        Debug.Assert(reaction.getParameters().size() == 1);
        Debug.Assert(reaction.isLocalParameter(0));
        reaction.setParameterValue("k1", random);

        CFitTask fitTask = (CFitTask)dataModel.addTask(CTaskEnum.parameterFitting);

        Debug.Assert(fitTask != null);
        // the method in a fit task is an instance of COptMethod or a subclass of
        // it.
        COptMethod fitMethod = (COptMethod)fitTask.getMethod();

        Debug.Assert(fitMethod != null);
        // the object must be an instance of COptMethod or a subclass thereof
        // (CFitMethod)
        CFitProblem fitProblem = (CFitProblem)fitTask.getProblem();

        Debug.Assert(fitProblem != null);

        CExperimentSet experimentSet = (CExperimentSet)fitProblem.getParameter("Experiment Set");

        Debug.Assert(experimentSet != null);

        // first experiment (we only have one here)
        CExperiment experiment = new CExperiment(dataModel);

        Debug.Assert(experiment != null);
        // tell COPASI where to find the data
        // reading data from string is not possible with the current C++ API
        experiment.setFileName("fakedata_example6.txt");
        // we have to tell COPASI that the data for the experiment is a komma
        // separated list (the default is TAB separated)
        experiment.setSeparator(",");
        // the data start in row 1 and goes to row 4001
        experiment.setFirstRow(1);
        Debug.Assert(experiment.getFirstRow() == 1);
        experiment.setLastRow(4001);
        Debug.Assert(experiment.getLastRow() == 4001);
        experiment.setHeaderRow(1);
        Debug.Assert(experiment.getHeaderRow() == 1);
        experiment.setExperimentType(CTaskEnum.timeCourse);
        Debug.Assert(experiment.getExperimentType() == CTaskEnum.timeCourse);
        experiment.setNumColumns(4);
        Debug.Assert(experiment.getNumColumns() == 4);
        CExperimentObjectMap objectMap = experiment.getObjectMap();

        Debug.Assert(objectMap != null);
        result = objectMap.setNumCols(4);
        Debug.Assert(result == true);
        result = objectMap.setRole(0, CExperiment.time);
        Debug.Assert(result == true);
        Debug.Assert(objectMap.getRole(0) == CExperiment.time);

        CModel model = dataModel.getModel();

        Debug.Assert(model != null);
        CCopasiObject timeReference = model.getValueReference();

        Debug.Assert(timeReference != null);
        objectMap.setObjectCN(0, timeReference.getCN().getString());

        // now we tell COPASI which column contain the concentrations of
        // metabolites and belong to dependent variables
        objectMap.setRole(1, CExperiment.dependent);
        CMetab metab = metabVector[0];

        Debug.Assert(metab != null);
        CCopasiObject particleReference = metab.getConcentrationReference();

        Debug.Assert(particleReference != null);
        objectMap.setObjectCN(1, particleReference.getCN().getString());

        objectMap.setRole(2, CExperiment.dependent);
        metab = metabVector[1];
        Debug.Assert(metab != null);
        particleReference = metab.getConcentrationReference();
        Debug.Assert(particleReference != null);
        objectMap.setObjectCN(2, particleReference.getCN().getString());

        objectMap.setRole(3, CExperiment.dependent);
        metab = metabVector[2];
        Debug.Assert(metab != null);
        particleReference = metab.getConcentrationReference();
        Debug.Assert(particleReference != null);
        objectMap.setObjectCN(3, particleReference.getCN().getString());

        experimentSet.addExperiment(experiment);
        Debug.Assert(experimentSet.getExperimentCount() == 1);
        // addExperiment makes a copy, so we need to get the added experiment
        // again
        experiment = experimentSet.getExperiment(0);
        Debug.Assert(experiment != null);

        // now we have to define the two fit items for the two local parameters
        // of the two reactions
        reaction = model.getReaction(0);
        Debug.Assert(reaction != null);
        Debug.Assert(reaction.isLocalParameter(0) == true);
        CCopasiParameter parameter = reaction.getParameters().getParameter(0);

        Debug.Assert(parameter != null);

        // define a CFitItem
        CCopasiObject parameterReference = parameter.getValueReference();

        Debug.Assert(parameterReference != null);
        CFitItem fitItem1 = new CFitItem(dataModel);

        Debug.Assert(fitItem1 != null);
        fitItem1.setObjectCN(parameterReference.getCN());
        fitItem1.setStartValue(4.0);
        fitItem1.setLowerBound(new CCopasiObjectName("0.00001"));
        fitItem1.setUpperBound(new CCopasiObjectName("10"));
        // add the fit item to the correct parameter group
        CCopasiParameterGroup optimizationItemGroup = (CCopasiParameterGroup)fitProblem.getParameter("OptimizationItemList");

        Debug.Assert(optimizationItemGroup != null);
        optimizationItemGroup.addParameter(fitItem1);

        reaction = model.getReaction(1);
        Debug.Assert(reaction != null);
        Debug.Assert(reaction.isLocalParameter(0) == true);
        parameter = reaction.getParameters().getParameter(0);
        Debug.Assert(parameter != null);

        // define a CFitItem
        parameterReference = parameter.getValueReference();
        Debug.Assert(parameterReference != null);
        CFitItem fitItem2 = new CFitItem(dataModel);

        Debug.Assert(fitItem2 != null);
        fitItem2.setObjectCN(parameterReference.getCN());
        fitItem2.setStartValue(4.0);
        fitItem2.setLowerBound(new CCopasiObjectName("0.00001"));
        fitItem2.setUpperBound(new CCopasiObjectName("10"));
        // add the fit item to the correct parameter group
        optimizationItemGroup.addParameter(fitItem2);

        result = true;
        try
        {
            // running the task for this example will probably take some time
            System.Console.WriteLine("This can take some time...");
            result = fitTask.processWithOutputFlags(true, (int)CCopasiTask.ONLY_TIME_SERIES);
        }
        catch
        {
            System.Console.Error.WriteLine("Error. Parameter fitting failed.");
            String lastErrors = fitTask.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);
        }

        Debug.Assert(result == true);
        // assert that there are two optimization items
        Debug.Assert(fitProblem.getOptItemList().Count == 2);
        // the order should be the order in whih we added the items above
        COptItem optItem1 = fitProblem.getOptItemList()[0];
        COptItem optItem2 = fitProblem.getOptItemList()[1];

        // the actual results are stored in the fit problem
        Debug.Assert(fitProblem.getSolutionVariables().size() == 2);
        System.Console.WriteLine("value for " + optItem1.getObject().getCN().getString() + ": " + fitProblem.getSolutionVariables().get(0));
        System.Console.WriteLine("value for " + optItem2.getObject().getCN().getString() + ": " + fitProblem.getSolutionVariables().get(1));
        // depending on the noise, the fit can be quite bad, so we are a litle
        // relaxed here (we should be within 3% of the original values)
        Debug.Assert((System.Math.Abs(fitProblem.getSolutionVariables().get(0) - 0.03) / 0.03) < 3e-2);
        Debug.Assert((System.Math.Abs(fitProblem.getSolutionVariables().get(1) - 0.004) / 0.004) < 3e-2);
    }
Example #4
0
    static void Main()
    {
        Debug.Assert(CCopasiRootContainer.getRoot() != null);
        // create a new datamodel
        CCopasiDataModel dataModel = CCopasiRootContainer.addDatamodel();

        Debug.Assert(CCopasiRootContainer.getDatamodelList().size() == 1);
        // get the model from the datamodel
        CModel model = dataModel.getModel();

        Debug.Assert(model != null);
        // set the units for the model
        // we want seconds as the time unit
        // microliter as the volume units
        // and nanomole as the substance units
        model.setTimeUnit(CUnit.s);
        model.setVolumeUnit(CUnit.microl);
        model.setQuantityUnit(CUnit.nMol);

        // we have to keep a set of all the initial values that are changed during
        // the model building process
        // They are needed after the model has been built to make sure all initial
        // values are set to the correct initial value
        ObjectStdVector changedObjects = new ObjectStdVector();

        // create a compartment with the name cell and an initial volume of 5.0
        // microliter
        CCompartment  compartment = model.createCompartment("cell", 5.0);
        CCopasiObject obj         = compartment.getInitialValueReference();

        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(compartment != null);
        Debug.Assert(model.getCompartments().size() == 1);
        // create a new metabolite with the name glucose and an inital
        // concentration of 10 nanomol
        // the metabolite belongs to the compartment we created and is is to be
        // fixed
        CMetab glucose = model.createMetabolite("glucose", compartment.getObjectName(), 10.0, CMetab.FIXED);

        obj = glucose.getInitialValueReference();
        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(glucose != null);
        Debug.Assert(model.getMetabolites().size() == 1);
        // create a second metabolite called glucose-6-phosphate with an initial
        // concentration of 0. This metabolite is to be changed by reactions
        CMetab g6p = model.createMetabolite("glucose-6-phosphate", compartment.getObjectName(), 0.0, CMetab.REACTIONS);

        Debug.Assert(g6p != null);
        obj = g6p.getInitialValueReference();
        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(model.getMetabolites().size() == 2);
        // another metabolite for ATP, also fixed
        CMetab atp = model.createMetabolite("ATP", compartment.getObjectName(), 10.0, CMetab.FIXED);

        Debug.Assert(atp != null);
        obj = atp.getInitialValueReference();
        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(model.getMetabolites().size() == 3);
        // and one for ADP
        CMetab adp = model.createMetabolite("ADP", compartment.getObjectName(), 0.0, CMetab.REACTIONS);

        Debug.Assert(adp != null);
        obj = adp.getInitialValueReference();
        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(model.getMetabolites().size() == 4);
        // now we create a reaction
        CReaction reaction = model.createReaction("hexokinase");

        Debug.Assert(reaction != null);
        Debug.Assert(model.getReactions().size() == 1);
        // hexokinase converts glucose and ATP to glucose-6-phosphate and ADP
        // we can set these on the chemical equation of the reaction
        CChemEq chemEq = reaction.getChemEq();

        // glucose is a substrate with stoichiometry 1
        chemEq.addMetabolite(glucose.getKey(), 1.0, CChemEq.SUBSTRATE);
        // ATP is a substrate with stoichiometry 1
        chemEq.addMetabolite(atp.getKey(), 1.0, CChemEq.SUBSTRATE);
        // glucose-6-phosphate is a product with stoichiometry 1
        chemEq.addMetabolite(g6p.getKey(), 1.0, CChemEq.PRODUCT);
        // ADP is a product with stoichiometry 1
        chemEq.addMetabolite(adp.getKey(), 1.0, CChemEq.PRODUCT);
        Debug.Assert(chemEq.getSubstrates().size() == 2);
        Debug.Assert(chemEq.getProducts().size() == 2);
        // this reaction is to be irreversible
        reaction.setReversible(false);
        Debug.Assert(reaction.isReversible() == false);
        // now we ned to set a kinetic law on the reaction
        // maybe constant flux would be OK
        // we need to get the function from the function database
        CFunctionDB funDB = CCopasiRootContainer.getFunctionList();

        Debug.Assert(funDB != null);
        // it should be in the list of suitable functions
        // lets get all suitable functions for an irreversible reaction with  2 substrates
        // and 2 products
        CFunctionStdVector suitableFunctions = funDB.suitableFunctions(2, 2, COPASI.TriFalse);

        Debug.Assert((suitableFunctions.Count > 0));
        int i, iMax = (int)suitableFunctions.Count;

        for (i = 0; i < iMax; ++i)
        {
            // we just assume that the only suitable function with Constant in
            // it's name is the one we want
            if (suitableFunctions[i].getObjectName().IndexOf("Constant") != -1)
            {
                break;
            }
        }
        if (i != iMax)
        {
            // we set the function
            // the method should be smart enough to associate the reaction entities
            // with the correct function parameters
            reaction.setFunction(suitableFunctions[i]);
            Debug.Assert(reaction.getFunction() != null);
            // constant flux has only one function parameter
            Debug.Assert(reaction.getFunctionParameters().size() == 1);
            // so there should be only one entry in the parameter mapping as well
            Debug.Assert(reaction.getParameterMappings().Count == 1);
            CCopasiParameterGroup parameterGroup = reaction.getParameters();
            Debug.Assert(parameterGroup.size() == 1);
            CCopasiParameter parameter = parameterGroup.getParameter(0);
            // make sure the parameter is a local parameter
            Debug.Assert(reaction.isLocalParameter(parameter.getObjectName()));
            // now we set the value of the parameter to 0.5
            Debug.Assert(parameter.getType() == CCopasiParameter.DOUBLE);
            parameter.setDblValue(0.5);
            obj = parameter.getValueReference();
            Debug.Assert(obj != null);
            changedObjects.Add(obj);
        }
        else
        {
            System.Console.Error.WriteLine("Error. Could not find a kinetic law that conatins the term \"Constant\".");
            System.Environment.Exit(1);
        }
        // now we also create a separate reaction for the backwards reaction and
        // set the kinetic law to irreversible mass action
        // now we create a reaction
        reaction = model.createReaction("hexokinase-backwards");
        Debug.Assert(reaction != null);
        Debug.Assert(model.getReactions().size() == 2);
        chemEq = reaction.getChemEq();
        // glucose is a product with stoichiometry 1
        chemEq.addMetabolite(glucose.getKey(), 1.0, CChemEq.PRODUCT);
        // ATP is a product with stoichiometry 1
        chemEq.addMetabolite(atp.getKey(), 1.0, CChemEq.PRODUCT);
        // glucose-6-phosphate is a substrate with stoichiometry 1
        chemEq.addMetabolite(g6p.getKey(), 1.0, CChemEq.SUBSTRATE);
        // ADP is a substrate with stoichiometry 1
        chemEq.addMetabolite(adp.getKey(), 1.0, CChemEq.SUBSTRATE);
        Debug.Assert(chemEq.getSubstrates().size() == 2);
        Debug.Assert(chemEq.getProducts().size() == 2);
        // this reaction is to be irreversible
        reaction.setReversible(false);
        Debug.Assert(reaction.isReversible() == false);
        // now we ned to set a kinetic law on the reaction
        CFunction massAction = (CFunction)funDB.findFunction("Mass action (irreversible)");

        Debug.Assert(massAction != null);
        // we set the function
        // the method should be smart enough to associate the reaction entities
        // with the correct function parameters
        reaction.setFunction(massAction);
        Debug.Assert(reaction.getFunction() != null);

        Debug.Assert(reaction.getFunctionParameters().size() == 2);
        // so there should be two entries in the parameter mapping as well
        Debug.Assert(reaction.getParameterMappings().Count == 2);
        // mass action is a special case since the parameter mappings for the
        // substrates (and products) are in a vector

        // Let us create a global parameter that is determined by an assignment
        // and that is used as the rate constant of the mass action kinetics
        // it gets the name rateConstant and an initial value of 1.56
        CModelValue modelValue = model.createModelValue("rateConstant", 1.56);

        Debug.Assert(modelValue != null);
        obj = modelValue.getInitialValueReference();
        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(model.getModelValues().size() == 1);
        // set the status to assignment
        modelValue.setStatus(CModelValue.ASSIGNMENT);
        // the assignment does not have to make sense
        modelValue.setExpression("1.0 / 4.0 + 2.0");

        // now we have to adjust the parameter mapping in the reaction so
        // that the kinetic law uses the global parameter we just created instead
        // of the local one that is created by default
        // The first parameter is the one for the rate constant, so we point it to
        // the key of out model value
        reaction.setParameterMapping(0, modelValue.getKey());
        // now we have to set the parameter mapping for the substrates
        reaction.addParameterMapping("substrate", g6p.getKey());
        reaction.addParameterMapping("substrate", adp.getKey());

        // finally compile the model
        // compile needs to be done before updating all initial values for
        // the model with the refresh sequence
        model.compileIfNecessary();

        // now that we are done building the model, we have to make sure all
        // initial values are updated according to their dependencies
        model.updateInitialValues(changedObjects);

        // save the model to a COPASI file
        // we save to a file named example1.cps
        // and we want to overwrite any existing file with the same name
        // Default tasks are automatically generated and will always appear in cps
        // file unless they are explicitley deleted before saving.
        dataModel.saveModel("example1.cps", true);

        // export the model to an SBML file
        // we save to a file named example1.xml, we want to overwrite any
        // existing file with the same name and we want SBML L2V3
        try
        {
            dataModel.exportSBML("example1.xml", true, 2, 3);
        }
        catch
        {
            System.Console.Error.WriteLine("Error. Exporting the model to SBML failed.");
        }
    }
Example #5
0
        /// <summary>
        /// Updates a reaction.
        /// </summary>
        /// <param name="reaction">COPASI Reaction.</param>
        /// <param name="reagents">Reagents.</param>
        /// <param name="products">Products.</param>
        /// <param name="rate">Rate.</param>
        public void UpdateReaction(CReaction reaction, MoleculeSpecies[] reagents, MoleculeSpecies[] products, double rate)
        {
            // we can set these on the chemical equation of the reaction
            CChemEq chemEq = reaction.getChemEq();

            // remove all existing metabolites
            chemEq.getSubstrates().clear();
            chemEq.getProducts().clear();

            // add substrates
            CMetab[] substrates = GetMetabs(reagents);
            foreach (CMetab item in substrates)
            {
                // add substrate with stoichiometry 1
                chemEq.addMetabolite(item.getKey(), 1.0, CChemEq.SUBSTRATE);
            }

            // add products
            CMetab[] metabProducts = GetMetabs(products);
            foreach (CMetab item in metabProducts)
            {
                // add product with stoichiometry 1
                chemEq.addMetabolite(item.getKey(), 1.0, CChemEq.PRODUCT);
            }

            // this reaction is to be irreversible
            reaction.setReversible(false);


            // now we ned to set a kinetic law on the reaction
            // maybe constant flux would be OK
            // we need to get the function from the function database
            CFunctionDB funDB = CCopasiRootContainer.getFunctionList();

            // it should be in the list of suitable functions
            // lets get all suitable functions for an irreversible reaction with  x substrates
            // and y products
            CFunctionStdVector suitableFunctions = funDB.suitableFunctions((uint)substrates.Length, (uint)products.Length, COPASI.TriFalse);

            CFunction function = null;

            for (int i = 0; i < suitableFunctions.Count; i++)
            {
                // we just assume that the only suitable function with mass action in
                // it's name is the one we want
                if (suitableFunctions[i].getObjectName().ToLower().Contains("mass action"))
                {
                    function = suitableFunctions[i];
                    break;
                }
            }

            if (function != null)
            {
                reaction.setFunction(function);

                CCopasiParameterGroup parameterGroup = reaction.getParameters();
                CCopasiParameter      parameter      = parameterGroup.getParameter(0);
                // make sure the parameter is a local parameter
                System.Diagnostics.Debug.Assert(reaction.isLocalParameter(parameter.getObjectName()));
                // now we set the value of the parameter to 0.5
                System.Diagnostics.Debug.Assert(parameter.getType() == CCopasiParameter.DOUBLE);
                parameter.setDblValue(rate);
                CCopasiObject obj = parameter.getValueReference();
                changedObjects.Add(obj);

                //reaction.getParameterMappings().Clear();

                foreach (var substrate in substrates)
                {
                    reaction.addParameterMapping("substrate", substrate.getKey());
                }
            }
            else
            {
                throw new System.Exception("Error. Could not find a kinetic law that conatins the term \"mass action\".");
            }
        }
Example #6
0
    static void Main()
    {
        Debug.Assert(CCopasiRootContainer.getRoot() != null);
        // create a new datamodel
        CCopasiDataModel dataModel = CCopasiRootContainer.addDatamodel();

        Debug.Assert(CCopasiRootContainer.getDatamodelList().size() == 1);
        // get the model from the datamodel
        CModel model = dataModel.getModel();

        Debug.Assert(model != null);
        // set the units for the model
        // we want seconds as the time unit
        // microliter as the volume units
        // and nanomole as the substance units
        model.setTimeUnit(CUnit.s);
        model.setVolumeUnit(CUnit.microl);
        model.setQuantityUnit(CUnit.nMol);

        // we have to keep a set of all the initial values that are changed during
        // the model building process
        // They are needed after the model has been built to make sure all initial
        // values are set to the correct initial value
        ObjectStdVector changedObjects = new ObjectStdVector();

        // create a compartment with the name cell and an initial volume of 5.0
        // microliter
        CCompartment  compartment = model.createCompartment("cell", 5.0);
        CCopasiObject obj         = compartment.getValueReference();

        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(compartment != null);
        Debug.Assert(model.getCompartments().size() == 1);
        // create a new metabolite with the name S and an inital
        // concentration of 10 nanomol
        // the metabolite belongs to the compartment we created and is is to be
        // fixed
        CMetab S = model.createMetabolite("S", compartment.getObjectName(), 10.0, CMetab.FIXED);

        obj = S.getInitialConcentrationReference();
        Debug.Assert((obj != null));
        changedObjects.Add(obj);
        Debug.Assert((compartment != null));
        Debug.Assert(S != null);
        Debug.Assert(model.getMetabolites().size() == 1);
        // create a second metabolite called P with an initial
        // concentration of 0. This metabolite is to be changed by reactions
        CMetab P = model.createMetabolite("P", compartment.getObjectName(), 0.0, CMetab.REACTIONS);

        Debug.Assert(P != null);
        obj = P.getInitialConcentrationReference();
        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(model.getMetabolites().size() == 2);

        // now we create a reaction
        CReaction reaction = model.createReaction("reaction");

        Debug.Assert(reaction != null);
        Debug.Assert(model.getReactions().size() == 1);
        // reaction converts S to P
        // we can set these on the chemical equation of the reaction
        CChemEq chemEq = reaction.getChemEq();

        // S is a substrate with stoichiometry 1
        chemEq.addMetabolite(S.getKey(), 1.0, CChemEq.SUBSTRATE);
        // P is a product with stoichiometry 1
        chemEq.addMetabolite(P.getKey(), 1.0, CChemEq.PRODUCT);
        Debug.Assert(chemEq.getSubstrates().size() == 1);
        Debug.Assert(chemEq.getProducts().size() == 1);
        // this reaction is to be irreversible
        reaction.setReversible(false);
        Debug.Assert(reaction.isReversible() == false);

        CModelValue MV = model.createModelValue("K", 42.0);

        // set the status to FIXED
        MV.setStatus(CModelValue.FIXED);
        Debug.Assert(MV != null);
        obj = MV.getInitialValueReference();
        Debug.Assert(obj != null);
        changedObjects.Add(obj);
        Debug.Assert(model.getModelValues().size() == 1);

        // now we ned to set a kinetic law on the reaction
        // for this we create a user defined function
        CFunctionDB funDB = CCopasiRootContainer.getFunctionList();

        Debug.Assert(funDB != null);

        CFunction function = (CFunction)funDB.createFunction("My Rate Law", CEvaluationTree.UserDefined);

        CFunction rateLaw = (CFunction)funDB.findFunction("My Rate Law");

        Debug.Assert(rateLaw != null);

        // now we create the formula for the function and set it on the function
        string formula = "(1-0.4/(EXPONENTIALE^(temp-37)))*0.00001448471257*1.4^(temp-37)*substrate";

        bool result = function.setInfix(formula);

        Debug.Assert(result == true);
        // make the function irreversible
        function.setReversible(COPASI.TriFalse);
        // the formula string should have been parsed now
        // and COPASI should have determined that the formula string contained 2 parameters (temp and substrate)
        CFunctionParameters variables = function.getVariables();
        // per default the usage of those parameters will be set to VARIABLE
        uint index = function.getVariableIndex("temp");
        CFunctionParameter param = variables.getParameter(index);

        Debug.Assert(param.getUsage() == CFunctionParameter.VARIABLE);
        // This is correct for temp, but substrate should get the usage SUBSTRATE in order
        // for us to use the function with the reaction created above
        // So we need to set the usage for "substrate" manually
        index = function.getVariableIndex("substrate");
        param = variables.getParameter(index);
        param.setUsage(CFunctionParameter.SUBSTRATE);

        // set the rate law for the reaction
        reaction.setFunction(function);
        Debug.Assert(reaction.getFunction() != null);

        // COPASI also needs to know what object it has to assocuiate with the individual function parameters
        // In our case we need to tell COPASI that substrate is to be replaced by the substrate of the reaction
        // and temp is to be replaced by the global parameter K
        reaction.setParameterMapping("substrate", S.getKey());
        reaction.setParameterMapping("temp", MV.getKey());

        // finally compile the model
        // compile needs to be done before updating all initial values for
        // the model with the refresh sequence
        model.compileIfNecessary();

        // now that we are done building the model, we have to make sure all
        // initial values are updated according to their dependencies
        model.updateInitialValues(changedObjects);

        // save the model to a COPASI file
        // we save to a file named example1.cps
        // and we want to overwrite any existing file with the same name
        // Default tasks are automatically generated and will always appear in cps
        // file unless they are explicitley deleted before saving.
        dataModel.saveModel("example7.cps", true);

        // export the model to an SBML file
        // we save to a file named example1.xml, we want to overwrite any
        // existing file with the same name and we want SBML L2V3
        try
        {
            dataModel.exportSBML("example7.xml", true, 2, 3);
        }
        catch
        {
            System.Console.Error.WriteLine("Error. Exporting the model to SBML failed.");
        }
    }