bool CFitProblem::elevateChildren() { // This call is necessary since CFitProblem is derived from COptProblem. if (!COptProblem::elevateChildren()) return false; // Due to a naming conflict the following parameters may have been overwritten during // the load of a CopasiML file we replace them with default values if that was the case. mpParmSteadyStateCN = assertParameter("Steady-State", CCopasiParameter::CN, CCopasiObjectName(""))->getValue().pCN; mpParmTimeCourseCN = assertParameter("Time-Course", CCopasiParameter::CN, CCopasiObjectName(""))->getValue().pCN; CCopasiVectorN< CCopasiTask > * pTasks = NULL; CCopasiDataModel* pDataModel = getObjectDataModel(); if (pDataModel) pTasks = pDataModel->getTaskList(); if (pTasks == NULL) pTasks = dynamic_cast<CCopasiVectorN< CCopasiTask > *>(getObjectAncestor("Vector")); if (pTasks) { unsigned C_INT32 i, imax = pTasks->size(); if (!mpParmSteadyStateCN->compare(0, 5 , "Task_") || *mpParmSteadyStateCN == "") for (i = 0; i < imax; i++) if ((*pTasks)[i]->getType() == CCopasiTask::steadyState) { *mpParmSteadyStateCN = (*pTasks)[i]->getCN(); break; } if (!mpParmTimeCourseCN->compare(0, 5 , "Task_") || *mpParmTimeCourseCN == "") for (i = 0; i < imax; i++) if ((*pTasks)[i]->getType() == CCopasiTask::timeCourse) { *mpParmTimeCourseCN = (*pTasks)[i]->getCN(); break; } } std::map<std::string, std::string> ExperimentMap; CCopasiParameterGroup * pGroup; CExperiment * pExperiment; std::vector<CCopasiParameter *> * pExperiments = getGroup("Experiment Set")->CCopasiParameter::getValue().pGROUP; std::vector<CCopasiParameter *>::iterator itExp; std::vector<CCopasiParameter *>::iterator endExp; for (itExp = pExperiments->begin(), endExp = pExperiments->end(); itExp != endExp; ++itExp) if ((pGroup = dynamic_cast< CCopasiParameterGroup * >(*itExp)) != NULL && pGroup->getParameter("Key") != NULL) ExperimentMap[*pGroup->getValue("Key").pKEY] = (*itExp)->getObjectName(); mpExperimentSet = elevate<CExperimentSet, CCopasiParameterGroup>(getGroup("Experiment Set")); if (!mpExperimentSet) return false; std::map<std::string, std::string>::iterator itMap; std::map<std::string, std::string>::iterator endMap; for (itMap = ExperimentMap.begin(), endMap = ExperimentMap.end(); itMap != endMap; ++itMap) { pExperiment = mpExperimentSet->getExperiment(itMap->second); itMap->second = pExperiment->CCopasiParameter::getKey(); pExperiment->setValue("Key", itMap->second); } std::vector<COptItem * >::iterator it = mpOptItems->begin(); std::vector<COptItem * >::iterator end = mpOptItems->end(); for (; it != end; ++it) { if (!((*it) = elevate<CFitItem, COptItem>(*it))) return false; pExperiments = (*it)->getParameter("Affected Experiments")->getValue().pGROUP; for (itExp = pExperiments->begin(), endExp = pExperiments->end(); itExp != endExp; ++itExp) (*itExp)->setValue(ExperimentMap[*(*itExp)->getValue().pKEY]); } it = mpConstraintItems->begin(); end = mpConstraintItems->end(); for (; it != end; ++it) { if (!((*it) = elevate<CFitConstraint, COptItem>(*it))) return false; pExperiments = (*it)->getParameter("Affected Experiments")->getValue().pGROUP; for (itExp = pExperiments->begin(), endExp = pExperiments->end(); itExp != endExp; ++itExp) (*itExp)->setValue(ExperimentMap[*(*itExp)->getValue().pKEY]); } return true; }
/** * Creates the simulations for SEDML. */ std::string CSEDMLExporter::createScanTask(CCopasiDataModel& dataModel, const std::string & modelId) { // need L1V2 to export repeated tasks if (mpSEDMLDocument->getVersion() != 2) return ""; CScanTask* pTask = dynamic_cast<CScanTask*>((*dataModel.getTaskList())["Scan"]); if (pTask == NULL) return ""; CScanProblem* pProblem = dynamic_cast<CScanProblem*>(pTask->getProblem()); size_t numItems = pProblem->getNumberOfScanItems(); if (numItems == 0) return ""; if (pProblem->getSubtask() != CCopasiTask::steadyState && pProblem->getSubtask() != CCopasiTask::timeCourse) { CCopasiMessage(CCopasiMessage::WARNING, "This version of COPASI only allows the export of time course or steady state scans."); return ""; } std::string subTaskId; if (pProblem->getSubtask() == CCopasiTask::steadyState) { subTaskId = createSteadyStateTask(dataModel, modelId); } else { subTaskId = mpTimecourseTask->getId(); } SedRepeatedTask* task = mpSEDMLDocument->createRepeatedTask(); std::string taskId = SEDMLUtils::getNextId("task", mpSEDMLDocument->getNumTasks()); task->setId(taskId); task->setResetModel(!pProblem->getContinueFromCurrentState()); // craete ranges / changes for (size_t i = 0; i < numItems; ++i) { CCopasiParameterGroup* current = pProblem->getScanItem(i); CScanProblem::Type type = (CScanProblem::Type)(*current->getParameter("Type")->getValue().pUINT); // ignore random items if (type == CScanProblem::SCAN_RANDOM) { CCopasiMessage(CCopasiMessage::WARNING, "This version of COPASI cannot export random scan items, they will be ignored."); continue; } int numSteps = (*current->getParameter("Number of steps")->getValue().pUINT); // handle repeats if (type == CScanProblem::SCAN_REPEAT) { SedUniformRange *range = task->createUniformRange(); range->setId(SEDMLUtils::getNextId("range", task->getNumRanges())); range->setStart(0); range->setEnd(numSteps); range->setNumberOfPoints(numSteps); range->setType("linear"); if (task->isSetRangeId()) task->setRangeId(range->getId()); continue; } // handle scans if (type == CScanProblem::SCAN_LINEAR) { double min = (*current->getParameter("Minimum")->getValue().pDOUBLE); double max = (*current->getParameter("Maximum")->getValue().pDOUBLE); bool log = (*current->getParameter("log")->getValue().pBOOL); SedUniformRange *range = task->createUniformRange(); range->setId(SEDMLUtils::getNextId("range", task->getNumRanges())); range->setStart(min); range->setEnd(max); range->setNumberOfPoints(numSteps); range->setType(log ? "log" : "linear"); const CRegisteredObjectName& cn = (*current->getParameter("Object")->getValue().pCN); std::string xpath = SEDMLUtils::getXPathForObject(*static_cast<const CCopasiObject*>(dataModel.getObject(cn))); if (xpath.empty()) { CCopasiMessage(CCopasiMessage::WARNING, "This version of COPASI cannot export the selected scan object, it will be ignored."); continue; } SedSetValue *change = task->createTaskChange(); change->setModelReference(modelId); if (xpath == SEDML_TIME_URN) { change->setSymbol(xpath); } else { change->setTarget(xpath); } change->setRange(range->getId()); change->setMath(SBML_parseFormula(range->getId().c_str())); continue; } } if (!task->isSetRangeId() && task->getNumRanges() > 0) task->setRangeId(task->getRange(0)->getId()); // create subtask SedSubTask* subTask = task->createSubTask(); subTask->setOrder(1); subTask->setTask(subTaskId); return taskId; }