void CQTSSAResultSubWidget::saveDataToFile() { C_INT32 Answer = QMessageBox::No; QString fileName; while (Answer == QMessageBox::No) { fileName = CopasiFileDialog::getSaveFileName(this, "Save File Dialog", "untitled.txt", "Text Files (*.txt)", "Save to"); if (fileName.isEmpty()) return; // Checks whether the file exists Answer = checkSelection(fileName); if (Answer == QMessageBox::Cancel) return; } std::ofstream file(CLocaleString::fromUtf8(TO_UTF8(fileName)).c_str()); if (file.fail()) return; assert(CCopasiRootContainer::getDatamodelList()->size() > 0); CCopasiTask* mpTask = dynamic_cast<CTSSATask *>((*(*CCopasiRootContainer::getDatamodelList())[0]->getTaskList())["Time Scale Separation Analysis"]); if (!mpTask) return; CCopasiProblem* mpProblem = mpTask->getProblem(); mpProblem->printResult(&file); return; }
/** * Creates the simulations for SEDML. */ std::string CSEDMLExporter::createTimeCourseTask(CCopasiDataModel& dataModel, const std::string & modelId) { mpTimecourse = this->mpSEDMLDocument->createUniformTimeCourse(); mpTimecourse->setId(SEDMLUtils::getNextId("sim", mpSEDMLDocument->getNumSimulations())); //presently SEDML only supports time course CCopasiTask* pTask = (*dataModel.getTaskList())["Time-Course"]; CTrajectoryProblem* tProblem = static_cast<CTrajectoryProblem*>(pTask->getProblem()); mpTimecourse->setInitialTime(0.0); mpTimecourse->setOutputStartTime(tProblem->getOutputStartTime()); mpTimecourse->setOutputEndTime(tProblem->getStepNumber()*tProblem->getStepSize()); mpTimecourse->setNumberOfPoints(tProblem->getStepNumber()); // set the correct KISAO Term SedAlgorithm* alg = mpTimecourse->createAlgorithm(); if (pTask->getMethod()->getObjectName().find("Stochastic") != std::string::npos) alg->setKisaoID("KISAO:0000241"); else alg->setKisaoID("KISAO:0000019"); mpTimecourseTask = this->mpSEDMLDocument->createTask(); std::string taskId = SEDMLUtils::getNextId("task", mpSEDMLDocument->getNumTasks()); mpTimecourseTask->setId(taskId); mpTimecourseTask->setSimulationReference(mpTimecourse->getId()); mpTimecourseTask->setModelReference(modelId); return taskId; }
/** * Creates the simulations for SEDML. */ std::string CSEDMLExporter::createSteadyStateTask(CCopasiDataModel& dataModel, const std::string & modelId) { SedSteadyState *steady = this->mpSEDMLDocument->createSteadyState(); steady->setId(SEDMLUtils::getNextId("steady", mpSEDMLDocument->getNumSimulations())); //presently SEDML only supports time course CCopasiTask* pTask = (*dataModel.getTaskList())["Steady-State"]; CTrajectoryProblem* tProblem = static_cast<CTrajectoryProblem*>(pTask->getProblem()); // set the correct KISAO Term SedAlgorithm* alg = steady->createAlgorithm(); alg->setKisaoID("KISAO:0000282"); SedTask *task = this->mpSEDMLDocument->createTask(); std::string taskId = SEDMLUtils::getNextId("task", mpSEDMLDocument->getNumTasks()); task->setId(taskId); task->setSimulationReference(steady->getId()); task->setModelReference(modelId); return taskId; }
/* * build the population tree */ void CCopasiSimpleSelectionTree::populateTree(const CModel * pModel, const ObjectClasses & classes) { if (!pModel) return; const CCopasiObject * pObject; Q3ListViewItem * pItem; // find all kinds of time pObject = pModel->getObject(CCopasiObjectName("Reference=Time")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpTimeSubtree, "Model Time"); treeItems[pItem] = pObject; } pObject = pModel->getObject(CCopasiObjectName("Reference=Initial Time")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpTimeSubtree, "Model Initial Time"); treeItems[pItem] = pObject; } pObject = pModel->getObjectDataModel()->getObject(CCopasiObjectName("Timer=CPU Time")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpTimeSubtree, "CPU time"); treeItems[pItem] = pObject; } pObject = pModel->getObjectDataModel()->getObject(CCopasiObjectName("Timer=Wall Clock Time")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpTimeSubtree, "real time"); treeItems[pItem] = pObject; } removeEmptySubTree(&mpTimeSubtree); // find all species (aka metabolites) and create items in the metabolite subtree const CCopasiVector<CMetab>& metabolites = pModel->getMetabolites(); unsigned int counter; unsigned int maxCount = metabolites.size(); for (counter = maxCount; counter != 0; --counter) { const CMetab* metab = metabolites[counter - 1]; std::string name = metab->getObjectName(); bool unique = isMetaboliteNameUnique(name, metabolites); if (!unique) { const CCompartment* comp = metab->getCompartment(); if (comp) { name = name + "(" + comp->getObjectName() + ")"; } } pObject = metab->getObject(CCopasiObjectName("Reference=InitialParticleNumber")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpMetaboliteInitialNumberSubtree, FROM_UTF8(name + "(t=0)")); treeItems[pItem] = pObject; } pObject = metab->getObject(CCopasiObjectName("Reference=ParticleNumber")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpMetaboliteTransientNumberSubtree, FROM_UTF8(name + "(t)")); treeItems[pItem] = pObject; } if (metab->getStatus() != CModelEntity::ASSIGNMENT) { pObject = metab->getObject(CCopasiObjectName("Reference=ParticleNumberRate")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpMetaboliteRateNumberSubtree, FROM_UTF8("d(" + name + ")/dt")); treeItems[pItem] = pObject; } } name = "[" + name + "]"; // Concentration pObject = metab->getObject(CCopasiObjectName("Reference=InitialConcentration")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpMetaboliteInitialConcentrationSubtree, FROM_UTF8(name + "(t=0)")); treeItems[pItem] = pObject; } pObject = metab->getObject(CCopasiObjectName("Reference=Concentration")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpMetaboliteTransientConcentrationSubtree, FROM_UTF8(name + "(t)")); treeItems[pItem] = pObject; } if (metab->getStatus() != CModelEntity::ASSIGNMENT) { pObject = metab->getObject(CCopasiObjectName("Reference=Rate")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpMetaboliteRateConcentrationSubtree, FROM_UTF8("d(" + name + ")/dt")); treeItems[pItem] = pObject; } } } removeEmptySubTree(&mpMetaboliteInitialNumberSubtree); removeEmptySubTree(&mpMetaboliteTransientNumberSubtree); removeEmptySubTree(&mpMetaboliteRateNumberSubtree); removeEmptySubTree(&mpMetaboliteInitialConcentrationSubtree); removeEmptySubTree(&mpMetaboliteTransientConcentrationSubtree); removeEmptySubTree(&mpMetaboliteRateConcentrationSubtree); removeEmptySubTree(&mpMetaboliteSubtree); // find all reactions and create items in the reaction subtree const CCopasiVectorNS<CReaction>& reactions = pModel->getReactions(); maxCount = reactions.size(); for (counter = maxCount; counter != 0; --counter) { const CReaction* react = reactions[counter - 1]; std::string name = "flux(" + react->getObjectName() + ")"; pObject = react->getObject(CCopasiObjectName("Reference=Flux")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpReactionFluxConcentrationSubtree, FROM_UTF8(name)); treeItems[pItem] = pObject; } pObject = react->getObject(CCopasiObjectName("Reference=ParticleFlux")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpReactionFluxNumberSubtree, FROM_UTF8("particle " + name)); treeItems[pItem] = pObject; } // create items for the reaction parameters pItem = new Q3ListViewItem(mpReactionParameterSubtree, FROM_UTF8(react->getObjectName())); const CCopasiParameterGroup & Parameters = react->getParameters(); unsigned int j; unsigned int numParameters = Parameters.size(); for (j = numParameters; j != 0; --j) { const CCopasiParameter * pParameter = Parameters.getParameter(j - 1); // We skip local parameters which ar covered by global parameters if (!react->isLocalParameter(pParameter->getObjectName())) continue; pObject = pParameter->getObject(CCopasiObjectName("Reference=Value")); if (filter(classes, pObject)) { Q3ListViewItem * pParameterItem = new Q3ListViewItem(pItem, FROM_UTF8(pParameter->getObjectName())); treeItems[pParameterItem] = pObject; } } removeEmptySubTree(&pItem); } removeEmptySubTree(&mpReactionFluxNumberSubtree); removeEmptySubTree(&mpReactionFluxConcentrationSubtree); removeEmptySubTree(&mpReactionParameterSubtree); removeEmptySubTree(&mpReactionSubtree); // find all global parameters (aka model values) variables const CCopasiVector<CModelValue>& objects = pModel->getModelValues(); maxCount = objects.size(); for (counter = maxCount; counter != 0; --counter) { const CModelEntity* object = objects[counter - 1]; std::string name = object->getObjectName(); pObject = object->getObject(CCopasiObjectName("Reference=InitialValue")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpModelQuantityInitialValueSubtree, FROM_UTF8(name + "(t=0)")); treeItems[pItem] = pObject; } pObject = object->getObject(CCopasiObjectName("Reference=Value")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpModelQuantityTransientValueSubtree, FROM_UTF8(name + "(t)")); treeItems[pItem] = pObject; } if (object->getStatus() != CModelEntity::ASSIGNMENT) { pObject = object->getObject(CCopasiObjectName("Reference=Rate")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpModelQuantityRateSubtree, FROM_UTF8("d(" + name + ")/dt")); treeItems[pItem] = pObject; } } } removeEmptySubTree(&mpModelQuantityRateSubtree); removeEmptySubTree(&mpModelQuantityInitialValueSubtree); removeEmptySubTree(&mpModelQuantityTransientValueSubtree); removeEmptySubTree(&mpModelQuantitySubtree); // find all compartments const CCopasiVector<CCompartment>& objects2 = pModel->getCompartments(); maxCount = objects2.size(); for (counter = maxCount; counter != 0; --counter) { const CModelEntity* object = objects2[counter - 1]; std::string name = object->getObjectName(); pObject = object->getObject(CCopasiObjectName("Reference=InitialVolume")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpCompartmentInitialVolumeSubtree, FROM_UTF8(name + "(t=0)")); treeItems[pItem] = pObject; } pObject = object->getObject(CCopasiObjectName("Reference=Volume")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpCompartmentTransientVolumeSubtree, FROM_UTF8(name + "(t)")); treeItems[pItem] = pObject; } if (object->getStatus() != CModelEntity::ASSIGNMENT) { pObject = object->getObject(CCopasiObjectName("Reference=Rate")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(mpCompartmentRateSubtree, FROM_UTF8("d(" + name + ")/dt")); treeItems[pItem] = pObject; } } } removeEmptySubTree(&mpCompartmentRateSubtree); removeEmptySubTree(&mpCompartmentInitialVolumeSubtree); removeEmptySubTree(&mpCompartmentTransientVolumeSubtree); removeEmptySubTree(&mpCompartmentSubtree); pObject = pModel->getObject(CCopasiObjectName("Reference=Avogadro Constant")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(this, "Avogadro Constant"); treeItems[pItem] = pObject; } pObject = pModel->getObject(CCopasiObjectName("Reference=Quantity Conversion Factor")); if (filter(classes, pObject)) { pItem = new Q3ListViewItem(this, "Quantity Conversion Factor"); treeItems[pItem] = pObject; } // find all model matrices const CMatrix<C_FLOAT64> &StoiMatrix = pModel->getStoi(); if (StoiMatrix.array()) { pObject = pModel->getObject(CCopasiObjectName("Array=Stoichiometry(ann)")); if (filter(classes, pObject)) { // pItem = new QListViewItem(matrixSubtree, "Stoichiometry(ann)"); pItem = new Q3ListViewItem(mpModelMatrixSubtree, FROM_UTF8(pObject->getObjectName())); treeItems[pItem] = pObject; } } const CMatrix<C_FLOAT64> &RedStoiMatrix = pModel->getRedStoi(); if (RedStoiMatrix.array()) { pObject = pModel->getObject(CCopasiObjectName("Array=Reduced stoichiometry(ann)")); if (filter(classes, pObject)) { // pItem = new QListViewItem(matrixSubtree, "Reduced stoichiometry(ann)"); pItem = new Q3ListViewItem(mpModelMatrixSubtree, FROM_UTF8(pObject->getObjectName())); treeItems[pItem] = pObject; } } const CMatrix<C_FLOAT64> &LinkMatrix = pModel->getL0(); if (LinkMatrix.array()) { pObject = pModel->getObject(CCopasiObjectName("Array=Link matrix(ann)")); if (filter(classes, pObject)) { // pItem = new QListViewItem(matrixSubtree, "Link matrix(ann)"); pItem = new Q3ListViewItem(mpModelMatrixSubtree, FROM_UTF8(pObject->getObjectName())); treeItems[pItem] = pObject; } } removeEmptySubTree(&mpModelMatrixSubtree); // find all result matrices // Metabolic Control Analysis CCopasiTask *task; assert(CCopasiRootContainer::getDatamodelList()->size() > 0); CCopasiDataModel* pDataModel = (*CCopasiRootContainer::getDatamodelList())[0]; assert(pDataModel != NULL); // MCA task = dynamic_cast<CCopasiTask*>((*pDataModel->getTaskList())["Metabolic Control Analysis"]); try { if (task && task->updateMatrices()) { //for mca the result is in the method CMCAMethod* pMethod = dynamic_cast<CMCAMethod *>(task->getMethod()); const CCopasiContainer::objectMap * pObjects = & pMethod->getObjects(); CCopasiContainer::objectMap::const_iterator its = pObjects->begin(); CArrayAnnotation *ann; for (; its != pObjects->end(); ++its) { ann = dynamic_cast<CArrayAnnotation*>(its->second); if (!ann) continue; if (!ann->isEmpty() && filter(classes, ann)) { pItem = new Q3ListViewItem(this->mpResultMCASubtree, FROM_UTF8(ann->getObjectName())); treeItems[pItem] = ann; } } } } catch (...) {} // Steady State task = dynamic_cast<CCopasiTask *>((*pDataModel->getTaskList())["Steady-State"]); try { if (task && task->updateMatrices()) { //for steady state the results are in the task const CCopasiContainer::objectMap * pObjects = & task->getObjects(); CCopasiContainer::objectMap::const_iterator its = pObjects->begin(); CArrayAnnotation *ann; for (; its != pObjects->end(); ++its) { ann = dynamic_cast<CArrayAnnotation*>(its->second); if (!ann) continue; if (!ann->isEmpty() && filter(classes, ann)) { pItem = new Q3ListViewItem(this->mpResultSteadyStateSubtree, FROM_UTF8(ann->getObjectName())); treeItems[pItem] = ann; } } } } catch (...) {} // Sensitivities task = dynamic_cast<CCopasiTask *>((*pDataModel->getTaskList())["Sensitivities"]); try { if (task && task->updateMatrices()) { //for sensitivities the result is in the problem CSensProblem *sens = dynamic_cast<CSensProblem *>(task->getProblem()); const CCopasiContainer::objectMap * pObjects = & sens->getObjects(); CCopasiContainer::objectMap::const_iterator its = pObjects->begin(); CArrayAnnotation *ann; for (; its != pObjects->end(); ++its) { ann = dynamic_cast<CArrayAnnotation*>(its->second); if (!ann) continue; if (!ann->isEmpty() && filter(classes, ann)) { pItem = new Q3ListViewItem(this->mpResultSensitivitySubtree, FROM_UTF8(ann->getObjectName())); treeItems[pItem] = (CCopasiObject *) ann; } } } } catch (...) {} removeEmptySubTree(&mpResultMCASubtree); removeEmptySubTree(&mpResultSensitivitySubtree); removeEmptySubTree(&mpResultSteadyStateSubtree); removeEmptySubTree(&mpResultMatrixSubtree); if (selectionMode() == Q3ListView::NoSelection) { // see if some objects are there, if yes set to single selection Q3ListViewItemIterator it = Q3ListViewItemIterator(this); while (it.current()) { if (treeItems.find(it.current()) != treeItems.end()) { setSelectionMode(Q3ListView::Single); setCurrentItem(it.current()); it.current()->setSelected(true); Q3ListViewItem* parent = it.current()->parent(); while (parent) { parent->setOpen(true); parent = parent->parent(); } break; } ++it; } } }