void RecipeFilter::filter( const QString &s ) { //do this to only iterate over children of 'currentCategory' Q3ListViewItem * pEndItem = NULL; if ( currentCategory ) { Q3ListViewItem * pStartItem = currentCategory; do { if ( pStartItem->nextSibling() ) pEndItem = pStartItem->nextSibling(); else pStartItem = pStartItem->parent(); } while ( pStartItem && !pEndItem ); } //Re-show everything Q3ListViewItemIterator list_it; if ( currentCategory ) list_it = Q3ListViewItemIterator( currentCategory ); else list_it = Q3ListViewItemIterator( listview ); while ( list_it.current() != pEndItem ) { list_it.current() ->setVisible( true ); list_it++; } // Only filter if the filter text isn't empty if ( !s.isEmpty() ) { Q3ListViewItemIterator list_it( listview ); while ( Q3ListViewItem * it = list_it.current() ) { if ( it->rtti() == 1000 ) // Its a recipe { RecipeListItem * recipe_it = ( RecipeListItem* ) it; if ( recipe_it->title().contains( s, Qt::CaseInsensitive ) ) { if ( currentCategory ) { if ( isParentOf( currentCategory, recipe_it ) ) recipe_it->setVisible( true ); else recipe_it->setVisible( false ); } else recipe_it->setVisible( true ); } else recipe_it->setVisible( false ); } ++list_it; } hideIfEmpty(); } }
/* * 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; } } }