Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/CrossSpeciesComparisonGeneDetectPlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
98 changes: 80 additions & 18 deletions src/SettingsAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -1589,10 +1590,10 @@ void SettingsAction::updateButtonTriggered()
//_startComputationTriggerAction.setDisabled(false);
return;
}
if (_selectedPointsTSNEDataset.isValid())
/*if (_selectedPointsTSNEDataset.isValid())
{
_selectedPointsTSNEDataset->setSelectionIndices({});
}
}*/
//stopCodeTimer("Part2");
//startCodeTimer("Part3");
_clusterNameToGeneNameToExpressionValue.clear();
Expand Down Expand Up @@ -1655,7 +1656,6 @@ void SettingsAction::updateButtonTriggered()

}*/


pointsDatasetRaw->setSelectionIndices(_selectedIndicesFromStorage);
_selectedPointsDataset = pointsDatasetRaw->createSubsetFromSelection("SelectedPointsDataset");
_selectedPointsDataset->setGroupIndex(groupIDDeletion);
Expand Down Expand Up @@ -3648,32 +3648,94 @@ void SettingsAction::findTopNGenesPerCluster() {
_selectedGene.setString("");
//return returnedmodel;
}

void SettingsAction::clearTemporaryDatasetHandles()
{
_selectedPointsTSNEDataset = Dataset<Points>();
_selectedPointsDataset = Dataset<Points>();
_selectedPointsEmbeddingDataset = Dataset<Points>();
_filteredUMAPDatasetPoints = Dataset<Points>();
_filteredUMAPDatasetColors = Dataset<Points>();
_filteredUMAPDatasetClusters = Dataset<Points>();
_tsneDatasetExpressionColors = Dataset<Points>();
_geneSimilarityPoints = Dataset<Points>();

_tsneDatasetSpeciesColors = Dataset<Clusters>();
_tsneDatasetClusterColors = Dataset<Clusters>();
_geneSimilarityClusterColoring = Dataset<Clusters>();
}

void SettingsAction::removeDatasets(int groupId)
{
auto allDatasets = mv::data().getAllDatasets();

Datasets datasetsFilteredAndSorted;
// id -> dataset pointer (NO COPYING)
QHash<QString, Dataset<DatasetImpl>> idToDataset;
idToDataset.reserve(allDatasets.size());

std::copy_if(allDatasets.begin(), allDatasets.end(), std::back_inserter(datasetsFilteredAndSorted), [groupId](Dataset<DatasetImpl> 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<DatasetImpl> lhs, Dataset<DatasetImpl> rhs) -> bool {
return rhs->getDataHierarchyItem().getDepth() < lhs->getDataHierarchyItem().getDepth();
});
// Cache depth (memoization)
QHash<QString, int> depthCache;
depthCache.reserve(idToDataset.size());

//std::reverse(datasetsFilteredAndSorted.begin(), datasetsFilteredAndSorted.end());
std::function<int(const QString&)> 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 (dataset.isValid())
mv::data().removeDataset(dataset);
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<QString> ids;
ids.reserve(idToDataset.size());

for (auto it = idToDataset.begin(); it != idToDataset.end(); ++it) {
ids.push_back(it.key());
}

//mv::data().removeDataset(_selectedPointsDataset);
//mv::data().removeDataset(_selectedPointsEmbeddingDataset);
// Compute all depths (O(N))
for (const auto& id : ids) {
depthOf(id);
}

// 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<QString, std::map<QString, Stats>>& map, const std::map<QString, std::vector<QString>>& geneCounter, const std::map<QString, std::vector<std::pair<QString, int>>>& rankingMap, const int& n) {

Expand Down
3 changes: 2 additions & 1 deletion src/SettingsAction.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<QString, std::map<QString, Stats>>& map, const std::map<QString, std::vector<QString>>& geneCounter, const std::map<QString, std::vector<std::pair<QString, int>>>& rankingMap,const int& n);
void findTopNGenesPerCluster();
Expand Down Expand Up @@ -475,4 +476,4 @@ class SettingsAction : public WidgetAction
QStringList _currentHierarchyItemsMiddleForTable;
StringAction _topSelectedHierarchyStatus;
bool _projectOpened=false;
};
};
Loading