From f44d37742cd990083a89eade54f05513907b1a58 Mon Sep 17 00:00:00 2001 From: Soumyadeep Basu <44787782+basusoumyadeep@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:35:03 +0200 Subject: [PATCH 1/2] change deletion [skip ci] --- src/SettingsAction.cpp | 85 +++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 18 deletions(-) diff --git a/src/SettingsAction.cpp b/src/SettingsAction.cpp index 6bae727..5a2a9d0 100644 --- a/src/SettingsAction.cpp +++ b/src/SettingsAction.cpp @@ -1589,10 +1589,10 @@ void SettingsAction::updateButtonTriggered() //_startComputationTriggerAction.setDisabled(false); return; } - if (_selectedPointsTSNEDataset.isValid()) + /*if (_selectedPointsTSNEDataset.isValid()) { _selectedPointsTSNEDataset->setSelectionIndices({}); - } + }*/ //stopCodeTimer("Part2"); //startCodeTimer("Part3"); _clusterNameToGeneNameToExpressionValue.clear(); @@ -1655,7 +1655,11 @@ void SettingsAction::updateButtonTriggered() }*/ - + _selectedPointsDataset = Dataset(); + _tsneDatasetExpressionColors = Dataset(); + _selectedPointsEmbeddingDataset = Dataset(); + _tsneDatasetSpeciesColors = Dataset(); + _tsneDatasetClusterColors = Dataset(); pointsDatasetRaw->setSelectionIndices(_selectedIndicesFromStorage); _selectedPointsDataset = pointsDatasetRaw->createSubsetFromSelection("SelectedPointsDataset"); _selectedPointsDataset->setGroupIndex(groupIDDeletion); @@ -3652,28 +3656,73 @@ void SettingsAction::removeDatasets(int groupId) { auto allDatasets = mv::data().getAllDatasets(); - Datasets datasetsFilteredAndSorted; + // id -> dataset pointer (NO COPYING) + QHash> idToDataset; + idToDataset.reserve(allDatasets.size()); - std::copy_if(allDatasets.begin(), allDatasets.end(), std::back_inserter(datasetsFilteredAndSorted), [groupId](Dataset dataset) { - return dataset->getGroupIndex() == groupId; - }); + for (const auto& ds : allDatasets) { + if (ds->getGroupIndex() == groupId) { + idToDataset.insert(ds->getId(), ds); + } + } - std::sort(datasetsFilteredAndSorted.begin(), datasetsFilteredAndSorted.end(), [](Dataset lhs, Dataset rhs) -> bool { - return rhs->getDataHierarchyItem().getDepth() < lhs->getDataHierarchyItem().getDepth(); - }); + // Cache depth (memoization) + QHash depthCache; + depthCache.reserve(idToDataset.size()); - //std::reverse(datasetsFilteredAndSorted.begin(), datasetsFilteredAndSorted.end()); + std::function depthOf = + [&](const QString& id) -> int + { + auto it = depthCache.find(id); + if (it != depthCache.end()) + return it.value(); - for (auto dataset : datasetsFilteredAndSorted) - { - //qDebug() << dataset->getGuiName() << dataset->getId() << dataset->getDataHierarchyItem().getDepth(); + int depth = 0; + + auto ds = idToDataset.value(id); + auto parent = ds->getParent(); + + if (parent.isValid()) { + QString parentId = parent->getId(); + + if (idToDataset.contains(parentId)) { + depth = 1 + depthOf(parentId); + } + } + + depthCache.insert(id, depth); + return depth; + }; + + // Build list of ids + QVector ids; + ids.reserve(idToDataset.size()); + + for (auto it = idToDataset.begin(); it != idToDataset.end(); ++it) { + ids.push_back(it.key()); + } - if (dataset.isValid()) - mv::data().removeDataset(dataset); + // Compute all depths (O(N)) + for (const auto& id : ids) { + depthOf(id); } - //mv::data().removeDataset(_selectedPointsDataset); - //mv::data().removeDataset(_selectedPointsEmbeddingDataset); + // Sort deepest first (critical step) + std::sort(ids.begin(), ids.end(), + [&](const QString& a, const QString& b) { + return depthCache[a] > depthCache[b]; + }); + + // Delete in correct order + for (const auto& id : ids) { + auto ds = idToDataset.value(id); + if (ds.isValid()) { + qDebug() << "Deleting:" << ds->getId() << "with name:" << ds->getGuiName() + << "depth:" << depthCache[id]; + + mv::data().removeDataset(ds); + } + } } QVariant SettingsAction::createModelFromData(const std::map>& map, const std::map>& geneCounter, const std::map>>& rankingMap, const int& n) { From c542ea6076465405a2f5c91c1c1fb796b40fd0d2 Mon Sep 17 00:00:00 2001 From: Soumyadeep Basu <44787782+basusoumyadeep@users.noreply.github.com> Date: Thu, 23 Apr 2026 17:03:10 +0200 Subject: [PATCH 2/2] fix updation error --- ...CrossSpeciesComparisonGeneDetectPlugin.cpp | 1 + src/SettingsAction.cpp | 23 +++++++++++++++---- src/SettingsAction.h | 3 ++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/CrossSpeciesComparisonGeneDetectPlugin.cpp b/src/CrossSpeciesComparisonGeneDetectPlugin.cpp index 9b4eb55..f2dc471 100644 --- a/src/CrossSpeciesComparisonGeneDetectPlugin.cpp +++ b/src/CrossSpeciesComparisonGeneDetectPlugin.cpp @@ -584,6 +584,7 @@ void CrossSpeciesComparisonGeneDetectPlugin::init() int groupIDDeletion = 10; int groupId1 = 10 * 2; int groupId2 = 10 * 3; + _settingsAction.clearTemporaryDatasetHandles(); _settingsAction.removeDatasets(groupIDDeletion); _settingsAction.removeDatasets(groupId1); _settingsAction.removeDatasets(groupId2); diff --git a/src/SettingsAction.cpp b/src/SettingsAction.cpp index 5a2a9d0..cfbb85b 100644 --- a/src/SettingsAction.cpp +++ b/src/SettingsAction.cpp @@ -1564,6 +1564,7 @@ void SettingsAction::updateButtonTriggered() int groupIDDeletion = 10; int groupID1 = 10 * 2; int groupID2 = 10 * 3; + clearTemporaryDatasetHandles(); removeDatasets(groupIDDeletion); auto pointsDataset = _mainPointsDataset.getCurrentDataset(); auto embeddingDataset = _embeddingDataset.getCurrentDataset(); @@ -1655,11 +1656,6 @@ void SettingsAction::updateButtonTriggered() }*/ - _selectedPointsDataset = Dataset(); - _tsneDatasetExpressionColors = Dataset(); - _selectedPointsEmbeddingDataset = Dataset(); - _tsneDatasetSpeciesColors = Dataset(); - _tsneDatasetClusterColors = Dataset(); pointsDatasetRaw->setSelectionIndices(_selectedIndicesFromStorage); _selectedPointsDataset = pointsDatasetRaw->createSubsetFromSelection("SelectedPointsDataset"); _selectedPointsDataset->setGroupIndex(groupIDDeletion); @@ -3652,6 +3648,23 @@ void SettingsAction::findTopNGenesPerCluster() { _selectedGene.setString(""); //return returnedmodel; } + +void SettingsAction::clearTemporaryDatasetHandles() +{ + _selectedPointsTSNEDataset = Dataset(); + _selectedPointsDataset = Dataset(); + _selectedPointsEmbeddingDataset = Dataset(); + _filteredUMAPDatasetPoints = Dataset(); + _filteredUMAPDatasetColors = Dataset(); + _filteredUMAPDatasetClusters = Dataset(); + _tsneDatasetExpressionColors = Dataset(); + _geneSimilarityPoints = Dataset(); + + _tsneDatasetSpeciesColors = Dataset(); + _tsneDatasetClusterColors = Dataset(); + _geneSimilarityClusterColoring = Dataset(); +} + void SettingsAction::removeDatasets(int groupId) { auto allDatasets = mv::data().getAllDatasets(); diff --git a/src/SettingsAction.h b/src/SettingsAction.h index b8bd606..e00298b 100644 --- a/src/SettingsAction.h +++ b/src/SettingsAction.h @@ -347,6 +347,7 @@ class SettingsAction : public WidgetAction void removeSelectionTableRows(QStringList* selectedLeaves); void enableDisableButtonsAutomatically(); void removeDatasets(int groupId); + void clearTemporaryDatasetHandles(); void updateClusterInfoStatusBar(); QVariant createModelFromData(const std::map>& map, const std::map>& geneCounter, const std::map>>& rankingMap,const int& n); void findTopNGenesPerCluster(); @@ -475,4 +476,4 @@ class SettingsAction : public WidgetAction QStringList _currentHierarchyItemsMiddleForTable; StringAction _topSelectedHierarchyStatus; bool _projectOpened=false; -}; \ No newline at end of file +};