void test000061::test_bug_1044() { CCopasiDataModel* pDataModel = pCOPASIDATAMODEL; std::istringstream iss(test000061::MODEL_STRING1); CPPUNIT_ASSERT(load_cps_model_from_stream(iss, *pDataModel) == true); CModel* pModel = pDataModel->getModel(); CPPUNIT_ASSERT(pModel != NULL); // check if the model has been loaded correctly CPPUNIT_ASSERT(pModel->getModelValues().size() == 1); const CModelValue* pModelValue = pModel->getModelValues()[0]; CPPUNIT_ASSERT(pModelValue != NULL); CPPUNIT_ASSERT(pModelValue->getObjectName() == "A"); CPPUNIT_ASSERT(pModelValue->getStatus() == CModelEntity::ASSIGNMENT); CPPUNIT_ASSERT(pModelValue->getExpressionPtr() != NULL); const CEvaluationNode* pRoot = pModelValue->getExpressionPtr()->getRoot(); CPPUNIT_ASSERT(pRoot != NULL); CPPUNIT_ASSERT(CEvaluationNode::type(pRoot->getType()) == CEvaluationNode::INVALID); const SBMLDocument* pDocument = pDataModel->getCurrentSBMLDocument(); CPPUNIT_ASSERT(pDocument == NULL); // export the model to SBML bool exception = false; try { CPPUNIT_ASSERT(pDataModel->exportSBMLToString(NULL, 2, 1).empty() == true); } catch (...) { exception = true; } CPPUNIT_ASSERT(exception == true); CPPUNIT_ASSERT(pDataModel->getCurrentSBMLDocument() == NULL); // check if the correct error message has been created. const CCopasiMessage& message = CCopasiMessage::getLastMessage(); CPPUNIT_ASSERT(message.getNumber() == MCSBML + 70); CPPUNIT_ASSERT(message.getType() == CCopasiMessage::EXCEPTION); CPPUNIT_ASSERT(CCopasiMessage::size() == 0); }
/** * This method tries to import CellDesigner annotations. */ void DataModelGUI::importCellDesigner() { // add code to check for CellDesigner annotations // ask the user if the annotations should be imported CCopasiDataModel* pDataModel = (*CCopasiRootContainer::getDatamodelList())[0]; assert(pDataModel != NULL); if (pDataModel != NULL) { SBMLDocument* pSBMLDocument = pDataModel->getCurrentSBMLDocument(); if (pSBMLDocument != NULL && pSBMLDocument->getModel() != NULL && pSBMLDocument->getModel()->getAnnotation() != NULL) { // check for the CellDesigner namespace std::pair<bool, std::string> foundNamespace = CCellDesignerImporter::findCellDesignerNamespace(pSBMLDocument); if (foundNamespace.first == true) { const XMLNode* pAnno = CCellDesignerImporter::findCellDesignerAnnotation(pSBMLDocument, pSBMLDocument->getModel()->getAnnotation()); // first we check if there are supported cell designer annotations if (pAnno != NULL) { // check if the file contains the correct version double version = CCellDesignerImporter::determineVersion(pAnno); if (version < 4.0) { CCopasiMessage(CCopasiMessage::RAW, "CellDesigner annotation was found in the file, but the version is not supported.\nPlease open the file in the latest version of CellDesigner and save it again."); } else { bool importCD = false; #if LIBSBML_VERSION >= 50400 // if we don't have a layout import it! LayoutModelPlugin* mplugin = (LayoutModelPlugin*)pSBMLDocument->getModel()->getPlugin("layout"); if (mplugin == NULL || (mplugin != NULL && mplugin->getNumLayouts() == 0)) importCD = true; #endif // ask the user if the CellDesigner annotation should be imported if (importCD || CQMessageBox::question(NULL, "CellDesigner import", "A CellDesigner diagram was found in this file.\nDo you want to import the diagram?" , QMessageBox::Yes | QMessageBox::No , QMessageBox::No) == QMessageBox::Yes) { // do the import CCellDesignerImporter cd_importer(pSBMLDocument); if (cd_importer.getLayout() == NULL) { CCopasiMessage(CCopasiMessage::WARNING, "Sorry, CellDesigner annotations could not be importet."); } else { // now we have to import the created layout // create the model map std::string s1, s2; std::map<std::string, std::string> modelmap; std::map<CCopasiObject*, SBase*>::const_iterator it; std::map<CCopasiObject*, SBase*>::const_iterator itEnd = pDataModel->getCopasi2SBMLMap().end(); for (it = pDataModel->getCopasi2SBMLMap().begin(); it != itEnd; ++it) { s1 = SBMLUtils::getIdFromSBase(it->second); if (it->first) { s2 = it->first->getKey(); } else { s2 = ""; } if ((s1 != "") && (s2 != "")) { modelmap[s1] = s2; } } // the layout map and the id to key map can be empty std::map<std::string, std::string> layoutmap; std::map<std::string, std::string> idToKeyMap; #ifdef USE_CRENDER_EXTENSION CLayout* pLayout = SBMLDocumentLoader::createLayout(*cd_importer.getLayout(), modelmap, layoutmap, idToKeyMap); #else CLayout* pLayout = SBMLDocumentLoader::createLayout(*cd_importer.getLayout(), modelmap, layoutmap); #endif /* USE_CRENDER_EXTENSION */ // add the layout to the DataModel if (pLayout != NULL && pDataModel->getListOfLayouts() != NULL) { // the addLayout methods expects a map as the second argument which currently is // ignored, so we just pass an empty one // TODO maybe the methods actually expects one of the maps above (layoutmap or idToKeyMap), but // TODO this is not documented in CListOfLayouts std::map<std::string, std::string> tmp; pDataModel->getListOfLayouts()->addLayout(pLayout, tmp); } else { CCopasiMessage(CCopasiMessage::WARNING, "Sorry, Layout from CellDesigner annotations could not be created."); } } } } } else { CCopasiMessage(CCopasiMessage::RAW, "CellDesigner annotation was found in the file, but the version is not supported.\nPlease open the file in the latest version of CellDesigner and save it again."); } } } } }
void test000009::test_references_to_species() { // load the CPS file // export to SBML // check the resulting SBML model CCopasiDataModel* pDataModel = pCOPASIDATAMODEL; std::istringstream iss(test000009::MODEL_STRING); CPPUNIT_ASSERT(load_cps_model_from_stream(iss, *pDataModel) == true); CPPUNIT_ASSERT(pDataModel->getModel() != NULL); CPPUNIT_ASSERT(pDataModel->exportSBMLToString(NULL, 2, 3).empty() == false); SBMLDocument* pDocument = pDataModel->getCurrentSBMLDocument(); CPPUNIT_ASSERT(pDocument != NULL); Model* pModel = pDocument->getModel(); CPPUNIT_ASSERT(pModel != NULL); // assert that there is only one compartment and // assert the compartment is constant CPPUNIT_ASSERT(pModel->getNumCompartments() == 1); Compartment* pCompartment = pModel->getCompartment(0); CPPUNIT_ASSERT(pCompartment->getConstant() == false); CPPUNIT_ASSERT(pModel->getNumSpecies() == 2); Species* pSpecies = pModel->getSpecies(1); CPPUNIT_ASSERT(pSpecies->getHasOnlySubstanceUnits() == true); pSpecies = pModel->getSpecies(0); std::string idSpeciesA = pSpecies->getId(); CPPUNIT_ASSERT(pSpecies->getHasOnlySubstanceUnits() == true); CPPUNIT_ASSERT(pModel->getNumRules() == 2); // there are two rules, one is the rule for the compartment AssignmentRule* pRule = dynamic_cast<AssignmentRule*>(pModel->getRule(0)); CPPUNIT_ASSERT(pRule != NULL); CPPUNIT_ASSERT(pModel->getNumParameters() == 1); Parameter* pParameter = pModel->getParameter(0); CPPUNIT_ASSERT(pParameter != NULL); if (pRule->getVariable() != pParameter->getId()) { pRule = dynamic_cast<AssignmentRule*>(pModel->getRule(1)); } CPPUNIT_ASSERT(pRule->getVariable() == pParameter->getId()); const ASTNode* pMath = pRule->getMath(); CPPUNIT_ASSERT(pMath != NULL); // the expression should be the species divided by the volume CPPUNIT_ASSERT(pMath->getType() == AST_DIVIDE); CPPUNIT_ASSERT(pMath->getChild(0) != NULL); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == pSpecies->getId()); CPPUNIT_ASSERT(pMath->getChild(1) != NULL); CPPUNIT_ASSERT(pMath->getChild(1)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(1)->getName() == pCompartment->getId()); CPPUNIT_ASSERT(pModel->getNumReactions() == 2); Reaction* pReaction = pModel->getReaction(0); // make sure this is reaction A -> CPPUNIT_ASSERT(pReaction != NULL); CPPUNIT_ASSERT(pReaction->getNumReactants() == 1); CPPUNIT_ASSERT(pReaction->getNumProducts() == 0); // check if all references in the kinetic law are unmodified // math element must be a multiplication of the mass action term by // the compartment volume // the mass action term is a multiplication of the parameter node by // the species node // the code that multiplies the reaction by the compartments volume // recognizes the division of the species by the compartment and cancels // those two CPPUNIT_ASSERT(pReaction->isSetKineticLaw() == true); KineticLaw* pLaw = pReaction->getKineticLaw(); CPPUNIT_ASSERT(pLaw != NULL); CPPUNIT_ASSERT(pLaw->isSetMath() == true); pMath = pLaw->getMath(); CPPUNIT_ASSERT(pMath->getType() == AST_TIMES); CPPUNIT_ASSERT(pMath->getNumChildren() == 2); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == std::string("k1")); CPPUNIT_ASSERT(pMath->getChild(1) != NULL); CPPUNIT_ASSERT(pMath->getChild(1)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(1)->getName() == idSpeciesA); pReaction = pModel->getReaction(1); // make sure this is reaction A -> S CPPUNIT_ASSERT(pReaction != NULL); CPPUNIT_ASSERT(pReaction->getNumReactants() == 1); CPPUNIT_ASSERT(pReaction->getNumProducts() == 1); // check if all references in the kinetic law are unmodified // math element must be a multiplication of the compartments volume with // a function call with three arguments // the first argument is the reference to the species CPPUNIT_ASSERT(pReaction->isSetKineticLaw() == true); pLaw = pReaction->getKineticLaw(); CPPUNIT_ASSERT(pLaw != NULL); CPPUNIT_ASSERT(pLaw->isSetMath() == true); pMath = pLaw->getMath(); CPPUNIT_ASSERT(pMath->getType() == AST_TIMES); CPPUNIT_ASSERT(pMath->getNumChildren() == 2); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == pCompartment->getId()); pMath = pMath->getChild(1); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_FUNCTION); CPPUNIT_ASSERT(pMath->getNumChildren() == 3); pMath = pMath->getChild(0); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_DIVIDE); CPPUNIT_ASSERT(pMath->getNumChildren() == 2); CPPUNIT_ASSERT(pMath->getChild(0) != NULL); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == idSpeciesA); CPPUNIT_ASSERT(pMath->getChild(1) != NULL); CPPUNIT_ASSERT(pMath->getChild(1)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(1)->getName() == pCompartment->getId()); }
void test000054::test_bug1002() { // load the CPS file // export to SBML // check the resulting SBML model CCopasiDataModel* pDataModel = pCOPASIDATAMODEL; std::istringstream iss(test000054::MODEL_STRING); CPPUNIT_ASSERT(load_cps_model_from_stream(iss, *pDataModel) == true); CPPUNIT_ASSERT(pDataModel->getModel() != NULL); CPPUNIT_ASSERT(pDataModel->exportSBMLToString(NULL, 2, 3).empty() == false); SBMLDocument* pDocument = pDataModel->getCurrentSBMLDocument(); CPPUNIT_ASSERT(pDocument != NULL); Model* pSBMLModel = pDocument->getModel(); CPPUNIT_ASSERT(pSBMLModel != NULL); CPPUNIT_ASSERT(pSBMLModel->getNumCompartments() == 0); CPPUNIT_ASSERT(pSBMLModel->getNumSpecies() == 0); CPPUNIT_ASSERT(pSBMLModel->getNumReactions() == 0); CPPUNIT_ASSERT(pSBMLModel->getNumInitialAssignments() == 0); CPPUNIT_ASSERT(pSBMLModel->getNumParameters() == 5); const Parameter* pParameter1 = pSBMLModel->getParameter(0); CPPUNIT_ASSERT(pParameter1 != NULL); CPPUNIT_ASSERT(pParameter1->getConstant() == false); const Parameter* pParameter2 = pSBMLModel->getParameter(1); CPPUNIT_ASSERT(pParameter2 != NULL); CPPUNIT_ASSERT(pParameter2->getConstant() == false); const Parameter* pParameter3 = pSBMLModel->getParameter(2); CPPUNIT_ASSERT(pParameter3 != NULL); CPPUNIT_ASSERT(pParameter3->getConstant() == false); const Parameter* pParameter4 = pSBMLModel->getParameter(3); CPPUNIT_ASSERT(pParameter4 != NULL); CPPUNIT_ASSERT(pParameter4->getConstant() == false); const Parameter* pParameter5 = pSBMLModel->getParameter(4); CPPUNIT_ASSERT(pParameter5 != NULL); CPPUNIT_ASSERT(pParameter5->getConstant() == false); CPPUNIT_ASSERT(pSBMLModel->getNumRules() == 5); const Rule* pRule = pSBMLModel->getRule(0); CPPUNIT_ASSERT(pRule != NULL); CPPUNIT_ASSERT(pRule->getTypeCode() == SBML_ASSIGNMENT_RULE); const AssignmentRule* pARule = dynamic_cast<const AssignmentRule*>(pRule); CPPUNIT_ASSERT(pARule != NULL); CPPUNIT_ASSERT(pARule->getVariable() == pParameter4->getId()); CPPUNIT_ASSERT(pARule->isSetMath() == true); const ASTNode* pMath = pARule->getMath(); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_PLUS); CPPUNIT_ASSERT(pMath->getNumChildren() == 2); const ASTNode* pChild1 = pMath->getChild(0); CPPUNIT_ASSERT(pChild1 != NULL); CPPUNIT_ASSERT(pChild1->getType() == AST_REAL); CPPUNIT_ASSERT(fabs((pChild1->getReal() - 2.0) / 2.0) < 1e-15); const ASTNode* pChild2 = pMath->getChild(1); CPPUNIT_ASSERT(pChild2 != NULL); CPPUNIT_ASSERT(pChild2->getType() == AST_REAL); CPPUNIT_ASSERT(fabs((pChild2->getReal() - 4.0) / 4.0) < 1e-15); pRule = pSBMLModel->getRule(1); CPPUNIT_ASSERT(pRule != NULL); CPPUNIT_ASSERT(pRule->getTypeCode() == SBML_ASSIGNMENT_RULE); pARule = dynamic_cast<const AssignmentRule*>(pRule); CPPUNIT_ASSERT(pARule != NULL); CPPUNIT_ASSERT(pARule->getVariable() == pParameter1->getId()); CPPUNIT_ASSERT(pARule->isSetMath() == true); pMath = pARule->getMath(); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getName() == pParameter4->getId()); CPPUNIT_ASSERT(pMath->getNumChildren() == 0); pRule = pSBMLModel->getRule(2); CPPUNIT_ASSERT(pRule != NULL); CPPUNIT_ASSERT(pRule->getTypeCode() == SBML_ASSIGNMENT_RULE); pARule = dynamic_cast<const AssignmentRule*>(pRule); CPPUNIT_ASSERT(pARule != NULL); CPPUNIT_ASSERT(pARule->getVariable() == pParameter3->getId()); CPPUNIT_ASSERT(pARule->isSetMath() == true); pMath = pARule->getMath(); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getName() == pParameter1->getId()); CPPUNIT_ASSERT(pMath->getNumChildren() == 0); pRule = pSBMLModel->getRule(3); CPPUNIT_ASSERT(pRule != NULL); CPPUNIT_ASSERT(pRule->getTypeCode() == SBML_ASSIGNMENT_RULE); pARule = dynamic_cast<const AssignmentRule*>(pRule); CPPUNIT_ASSERT(pARule != NULL); CPPUNIT_ASSERT(pARule->getVariable() == pParameter5->getId()); CPPUNIT_ASSERT(pARule->isSetMath() == true); pMath = pARule->getMath(); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getName() == pParameter3->getId()); CPPUNIT_ASSERT(pMath->getNumChildren() == 0); pRule = pSBMLModel->getRule(4); CPPUNIT_ASSERT(pRule != NULL); CPPUNIT_ASSERT(pRule->getTypeCode() == SBML_ASSIGNMENT_RULE); pARule = dynamic_cast<const AssignmentRule*>(pRule); CPPUNIT_ASSERT(pARule != NULL); CPPUNIT_ASSERT(pARule->getVariable() == pParameter2->getId()); CPPUNIT_ASSERT(pARule->isSetMath() == true); pMath = pARule->getMath(); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getName() == pParameter5->getId()); CPPUNIT_ASSERT(pMath->getNumChildren() == 0); }