COPASI API  4.16.103
test000023.cpp
Go to the documentation of this file.
1 // Begin CVS Header
2 // $Source: /Volumes/Home/Users/shoops/cvs/copasi_dev/copasi/sbml/unittests/test000023.cpp,v $
3 // $Revision: 1.10 $
4 // $Name: $
5 // $Author: bergmann $
6 // $Date: 2012/04/20 09:23:41 $
7 // End CVS Header
8 
9 // Copyright (C) 2012 - 2010 by Pedro Mendes, Virginia Tech Intellectual
10 // Properties, Inc., University of Heidelberg, and The University
11 // of Manchester.
12 // All rights reserved.
13 
14 // Copyright (C) 2008 by Pedro Mendes, Virginia Tech Intellectual
15 // Properties, Inc., EML Research, gGmbH, University of Heidelberg,
16 // and The University of Manchester.
17 // All rights reserved.
18 
19 #include "test000023.h"
20 
21 #include <sstream>
22 #include "utilities.hpp"
24 #include "copasi/model/CModel.h"
25 #include "copasi/model/CMetab.h"
28 #include "copasi/model/CReaction.h"
31 
33 
34 CCopasiDataModel* test000023::pCOPASIDATAMODEL = NULL;
35 
37 {
38  // Create the root container.
39  CCopasiRootContainer::init(0, NULL, false);
40  // Create the global data model.
42 }
43 
45 {
47 }
48 
50 {
51  CCopasiDataModel* pDataModel = pCOPASIDATAMODEL;
52  CPPUNIT_ASSERT(pDataModel->importSBMLFromString(MODEL_STRING));
53  CModel* pModel = pDataModel->getModel();
54  CPPUNIT_ASSERT(pModel != NULL);
55  CPPUNIT_ASSERT(pModel->getQuantityUnitEnum() == CModel::mMol);
56  CPPUNIT_ASSERT(pModel->getVolumeUnitEnum() == CModel::ml);
57  CPPUNIT_ASSERT(pModel->getTimeUnitEnum() == CModel::s);
58  CPPUNIT_ASSERT(pModel->getCompartments().size() == 1);
59  const CCompartment* pCompartment = pModel->getCompartments()[0];
60  CPPUNIT_ASSERT(pCompartment != NULL);
61  CPPUNIT_ASSERT(pCompartment->getStatus() == CModelEntity::FIXED);
62  CPPUNIT_ASSERT(pModel->getMetabolites().size() == 2);
63  CMetab* pA = pModel->getMetabolites()[0];
64  CPPUNIT_ASSERT(pA != NULL);
65  CPPUNIT_ASSERT(pA->getStatus() == CModelEntity::REACTIONS);
66  const CMetab* pB = pModel->getMetabolites()[1];
67  CPPUNIT_ASSERT(pB != NULL);
68  CPPUNIT_ASSERT(pB->getStatus() == CModelEntity::REACTIONS);
69  CPPUNIT_ASSERT(pModel->getModelValues().size() == 2);
70  const CModelValue* pFactor = pModel->getModelValues()[1];
71  CPPUNIT_ASSERT(pFactor != NULL);
72  CPPUNIT_ASSERT(pFactor->getStatus() == CModelEntity::FIXED);
73  CPPUNIT_ASSERT(fabs((pFactor->getInitialValue() - pModel->getQuantity2NumberFactor()) / pModel->getQuantity2NumberFactor()) < 1e-3);
74  const CModelValue* pModelValue = pModel->getModelValues()[0];
75  CPPUNIT_ASSERT(pModelValue != NULL);
76  CPPUNIT_ASSERT(pModelValue->getStatus() == CModelEntity::ASSIGNMENT);
77  const CExpression* pExpr = pModelValue->getExpressionPtr();
78  // check the expression
79  const CEvaluationNode* pNode = pExpr->getRoot();
80  CPPUNIT_ASSERT(pNode != NULL);
81  const CEvaluationNodeOperator* pOperatorNode = dynamic_cast<const CEvaluationNodeOperator*>(pNode);
82  CPPUNIT_ASSERT(pOperatorNode != NULL);
84  const CEvaluationNodeObject* pObjectNode = dynamic_cast<const CEvaluationNodeObject*>(pOperatorNode->getChild());
85  CPPUNIT_ASSERT(pObjectNode != NULL);
86  CCopasiObjectName objectCN = pObjectNode->getObjectCN();
87  CPPUNIT_ASSERT(!objectCN.empty());
88  std::vector<CCopasiContainer*> listOfContainers;
89  listOfContainers.push_back(pModel);
90  const CCopasiObject* pObject = pCOPASIDATAMODEL->ObjectFromName(listOfContainers, objectCN);
91  CPPUNIT_ASSERT(pObject != NULL);
92  CPPUNIT_ASSERT(pObject->isReference() == true);
93  CPPUNIT_ASSERT(pObject->getObjectName() == std::string("ParticleNumber"));
94  CPPUNIT_ASSERT(pObject->getObjectParent() == pA);
95  pObjectNode = dynamic_cast<const CEvaluationNodeObject*>(pOperatorNode->getChild()->getSibling());
96  CPPUNIT_ASSERT(pObjectNode != NULL);
97  objectCN = pObjectNode->getObjectCN();
98  CPPUNIT_ASSERT(!objectCN.empty());
99  pObject = pCOPASIDATAMODEL->ObjectFromName(listOfContainers, objectCN);
100  CPPUNIT_ASSERT(pObject != NULL);
101  CPPUNIT_ASSERT(pObject->isReference() == true);
102  CPPUNIT_ASSERT(pObject->getObjectName() == std::string("Value"));
103  CPPUNIT_ASSERT(pObject->getObjectParent() == pFactor);
104  // check the reactions
105  CPPUNIT_ASSERT(pModel->getReactions().size() == 2);
106  const CReaction* pReaction1 = pModel->getReactions()[0];
107  CPPUNIT_ASSERT(pReaction1 != NULL);
108  CPPUNIT_ASSERT(pReaction1->isReversible() == false);
109  // check the kinetic law
110  const CFunction* pKineticFunction = pReaction1->getFunction();
111  CPPUNIT_ASSERT(pKineticFunction != NULL);
112  const CMassAction* pMassAction = dynamic_cast<const CMassAction*>(pKineticFunction);
113  //FTB: this no longer is recognized as mass action reaction because of the
114  // special case of a species with hOSU
115  CPPUNIT_ASSERT(pMassAction == NULL);
116  const CChemEq* pChemEq = &pReaction1->getChemEq();
117  CPPUNIT_ASSERT(pChemEq != NULL);
118  CPPUNIT_ASSERT(pChemEq->getCompartmentNumber() == 1);
119  CPPUNIT_ASSERT(pChemEq->getSubstrates().size() == 1);
120  const CChemEqElement* pElement = pChemEq->getSubstrates()[0];
121  CPPUNIT_ASSERT(pElement != NULL);
122  CPPUNIT_ASSERT(fabs(pElement->getMultiplicity() - 1.0) < 1e-3);
123  CPPUNIT_ASSERT(pElement->getMetabolite() == pA);
124  CPPUNIT_ASSERT(pChemEq->getProducts().size() == 0);
125  CPPUNIT_ASSERT(pChemEq->getModifiers().size() == 0);
126 
127  const CReaction* pReaction2 = pModel->getReactions()[1];
128  CPPUNIT_ASSERT(pReaction2 != NULL);
129  CPPUNIT_ASSERT(pReaction2->isReversible() == false);
130  // check the kinetic law
131  pKineticFunction = pReaction2->getFunction();
132  CPPUNIT_ASSERT(pKineticFunction != NULL);
133  CPPUNIT_ASSERT(pKineticFunction->getObjectName() == std::string("Henri-Michaelis-Menten (irreversible)"));
134  // check the function parameters one should be the reference to the substrate
135  pChemEq = &pReaction2->getChemEq();
136  CPPUNIT_ASSERT(pChemEq != NULL);
137  CPPUNIT_ASSERT(pChemEq->getCompartmentNumber() == 1);
138  CPPUNIT_ASSERT(pChemEq->getSubstrates().size() == 1);
139  pElement = pChemEq->getSubstrates()[0];
140  CPPUNIT_ASSERT(pElement != NULL);
141  CPPUNIT_ASSERT(fabs(pElement->getMultiplicity() - 1.0) < 1e-3);
142  CPPUNIT_ASSERT(pElement->getMetabolite() == pA);
143  CPPUNIT_ASSERT(pChemEq->getProducts().size() == 1);
144  pElement = pChemEq->getProducts()[0];
145  CPPUNIT_ASSERT(pElement != NULL);
146  CPPUNIT_ASSERT(fabs(pElement->getMultiplicity() - 1.0) < 1e-3);
147  CPPUNIT_ASSERT(pElement->getMetabolite() == pB);
148  CPPUNIT_ASSERT(pChemEq->getModifiers().size() == 0);
149  const std::vector<std::vector<std::string> > parameterMappings = pReaction2->getParameterMappings();
150  CPPUNIT_ASSERT(parameterMappings.size() == 3);
151  CPPUNIT_ASSERT(parameterMappings[0].size() == 1);
152  const std::string parameterKey = parameterMappings[0][0];
153  CPPUNIT_ASSERT(parameterKey == pA->getKey());
154 }
155 
156 const char* test000023::MODEL_STRING =
157  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
158  "<sbml xmlns=\"http://www.sbml.org/sbml/level2/version3\" level=\"2\" version=\"3\">\n"
159  " <model id=\"Model_1\" name=\"New Model\">\n"
160  " <notes>\n"
161  " <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
162  " <p>Model with fixed compartment volume, two species with hasOnlySubstanceUnits flag set to true. The units are set to ml and mMol. There is an assignment rule for the global parameter that contains a reference to species A.</p>\n"
163  " <p>The imported model should contain an assignment for the global parameter that consists of the reference to the particle number of species A divided by a constant (6.023e20). The species references in the reactions should be imported multiplied by the volume.</p>\n"
164  " </body>\n"
165  " </notes>\n"
166  " <listOfFunctionDefinitions>\n"
167  " <functionDefinition id=\"function_1\" name=\"Henri-Michaelis-Menten (irreversible)\">\n"
168  " <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n"
169  " <lambda>\n"
170  " <bvar>\n"
171  " <ci> substrate </ci>\n"
172  " </bvar>\n"
173  " <bvar>\n"
174  " <ci> Km </ci>\n"
175  " </bvar>\n"
176  " <bvar>\n"
177  " <ci> V </ci>\n"
178  " </bvar>\n"
179  " <apply>\n"
180  " <divide/>\n"
181  " <apply>\n"
182  " <times/>\n"
183  " <ci> V </ci>\n"
184  " <ci> substrate </ci>\n"
185  " </apply>\n"
186  " <apply>\n"
187  " <plus/>\n"
188  " <ci> Km </ci>\n"
189  " <ci> substrate </ci>\n"
190  " </apply>\n"
191  " </apply>\n"
192  " </lambda>\n"
193  " </math>\n"
194  " </functionDefinition>\n"
195  " </listOfFunctionDefinitions>\n"
196  " <listOfUnitDefinitions>\n"
197  " <unitDefinition id=\"volume\">\n"
198  " <listOfUnits>\n"
199  " <unit kind=\"litre\" scale=\"-3\"/>\n"
200  " </listOfUnits>\n"
201  " </unitDefinition>\n"
202  " <unitDefinition id=\"substance\">\n"
203  " <listOfUnits>\n"
204  " <unit kind=\"mole\" scale=\"-3\"/>\n"
205  " </listOfUnits>\n"
206  " </unitDefinition>\n"
207  " </listOfUnitDefinitions>\n"
208  " <listOfCompartments>\n"
209  " <compartment id=\"compartment_1\" name=\"compartment\" size=\"1\"/>\n"
210  " </listOfCompartments>\n"
211  " <listOfSpecies>\n"
212  " <species id=\"species_1\" name=\"A\" compartment=\"compartment_1\" initialAmount=\"1\" hasOnlySubstanceUnits=\"true\"/>\n"
213  " <species id=\"species_2\" name=\"B\" compartment=\"compartment_1\" initialAmount=\"1\" hasOnlySubstanceUnits=\"true\"/>\n"
214  " </listOfSpecies>\n"
215  " <listOfParameters>\n"
216  " <parameter id=\"parameter_1\" name=\"K\" value=\"0\" constant=\"false\"/>\n"
217  " </listOfParameters>\n"
218  " <listOfRules>\n"
219  " <assignmentRule variable=\"parameter_1\">\n"
220  " <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n"
221  " <ci> species_1 </ci>\n"
222  " </math>\n"
223  " </assignmentRule>\n"
224  " </listOfRules>\n"
225  " <listOfReactions>\n"
226  " <reaction id=\"reaction_1\" name=\"reaction_0\" reversible=\"false\">\n"
227  " <listOfReactants>\n"
228  " <speciesReference species=\"species_1\"/>\n"
229  " </listOfReactants>\n"
230  " <kineticLaw>\n"
231  " <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n"
232  " <apply>\n"
233  " <times/>\n"
234  " <ci> k1 </ci>\n"
235  " <ci> species_1 </ci>\n"
236  " </apply>\n"
237  " </math>\n"
238  " <listOfParameters>\n"
239  " <parameter id=\"k1\" value=\"0.1\"/>\n"
240  " </listOfParameters>\n"
241  " </kineticLaw>\n"
242  " </reaction>\n"
243  " <reaction id=\"reaction_2\" name=\"reaction_1\" reversible=\"false\">\n"
244  " <listOfReactants>\n"
245  " <speciesReference species=\"species_1\"/>\n"
246  " </listOfReactants>\n"
247  " <listOfProducts>\n"
248  " <speciesReference species=\"species_2\"/>\n"
249  " </listOfProducts>\n"
250  " <kineticLaw>\n"
251  " <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n"
252  " <apply>\n"
253  " <times/>\n"
254  " <ci> compartment_1 </ci>\n"
255  " <apply>\n"
256  " <ci> function_1 </ci>\n"
257  " <apply>\n"
258  " <divide/>\n"
259  " <ci> species_1 </ci>\n"
260  " <ci> compartment_1 </ci>\n"
261  " </apply> \n"
262  " <ci> Km </ci>\n"
263  " <ci> V </ci>\n"
264  " </apply>\n"
265  " </apply>\n"
266  " </math>\n"
267  " <listOfParameters>\n"
268  " <parameter id=\"Km\" value=\"0.1\"/>\n"
269  " <parameter id=\"V\" value=\"0.1\"/>\n"
270  " </listOfParameters>\n"
271  " </kineticLaw>\n"
272  " </reaction>\n"
273  " </listOfReactions>\n"
274  " </model>\n"
275  "</sbml>\n"
276  ;
const CExpression * getExpressionPtr() const
Header file of class CExpression.
size_t getCompartmentNumber() const
Definition: CChemEq.cpp:110
static const char * MODEL_STRING
Definition: test000023.h:31
Header file of class CModelEntity and CModelValue.
const std::string & getObjectName() const
virtual size_t size() const
const Type & getType() const
Definition: CMetab.h:178
void tearDown()
Definition: test000023.cpp:44
const CCopasiVector< CChemEqElement > & getProducts() const
Definition: CChemEq.cpp:63
bool isReference() const
void setUp()
Definition: test000023.cpp:36
const CCopasiVector< CChemEqElement > & getSubstrates() const
Definition: CChemEq.cpp:60
static CCopasiDataModel * addDatamodel()
static Type subType(const Type &type)
const CCopasiVector< CChemEqElement > & getModifiers() const
Definition: CChemEq.cpp:66
static CCopasiDataModel * pCOPASIDATAMODEL
Definition: test000023.h:32
bool importSBMLFromString(const std::string &sbmlDocumentText, CProcessReport *pImportHandler=NULL, const bool &deleteOldData=true)
The class for handling a chemical kinetic function.
Definition: CFunction.h:29
static void init(int argc, char *argv[], const bool &withGui=false)
Definition: CModel.h:50
const CModelEntity::Status & getStatus() const
void test_hasOnlySubstanceUnits()
Definition: test000023.cpp:49
CCopasiNode< Data > * getChild()
Definition: CCopasiNode.h:210
CCopasiObject * ObjectFromName(const std::vector< CCopasiContainer * > &listOfContainer, const CCopasiObjectName &CN) const
CCopasiContainer * getObjectParent() const