16 #include "itkMutexLockHolder.h" 36 emit beginResetModel();
37 UpdateByDataStorage();
44 emit beginResetModel();
45 UpdateByDataStorage();
52 int columns = m_StatisticNames.size() + 1;
59 if (parent.column() > 0)
62 if (!parent.isValid())
63 parentItem = m_RootItem;
75 if (role != Qt::DisplayRole)
80 return item->
data(index.column());
85 if (!hasIndex(row, column, parent))
90 if (!parent.isValid())
91 parentItem = m_RootItem;
97 return createIndex(row, column, childItem);
104 if (!child.isValid())
105 return QModelIndex();
110 if (parentItem == m_RootItem)
111 return QModelIndex();
113 return createIndex(parentItem->
row(), 0, parentItem);
118 if (!index.isValid())
121 return QAbstractItemModel::flags(index);
126 if ((Qt::DisplayRole == role) && (Qt::Horizontal == orientation))
130 return m_HeaderFirstColumn;
134 return QVariant(m_StatisticNames.at(section - 1).c_str());
142 std::vector<std::pair<mitk::DataNode::ConstPointer, unsigned int>> tempNodes;
143 for (
const auto &node : nodes)
145 auto data = node->GetData();
148 auto timeSteps =
data->GetTimeSteps();
149 for (
unsigned int i = 0; i < timeSteps; i++)
151 tempNodes.push_back(std::make_pair(node, i));
156 emit beginResetModel();
157 m_TimeStepResolvedImageNodes = std::move(tempNodes);
158 m_ImageNodes = nodes;
159 UpdateByDataStorage();
160 emit endResetModel();
166 std::vector<std::pair<mitk::DataNode::ConstPointer, unsigned int>> tempNodes;
167 for (
const auto &node : nodes)
169 auto data = node->GetData();
172 auto timeSteps =
data->GetTimeSteps();
174 if (timeSteps == 1 && m_TimeStepResolvedImageNodes.size() > 1)
176 timeSteps = m_TimeStepResolvedImageNodes.size();
178 for (
unsigned int i = 0; i < timeSteps; i++)
180 tempNodes.push_back(std::make_pair(node, i));
185 emit beginResetModel();
186 m_TimeStepResolvedMaskNodes = std::move(tempNodes);
188 UpdateByDataStorage();
189 emit endResetModel();
195 emit beginResetModel();
196 m_Statistics.clear();
197 m_ImageNodes.clear();
198 m_TimeStepResolvedImageNodes.clear();
200 m_StatisticNames.clear();
201 emit endResetModel();
205 void QmitkImageStatisticsTreeModel::UpdateByDataStorage()
207 StatisticsContainerVector newStatistics;
211 if (datamanager.IsNotNull())
213 for (
const auto &
image : m_ImageNodes)
215 if (m_MaskNodes.empty())
219 if (stats.IsNotNull())
221 newStatistics.emplace_back(stats);
226 for (
const auto &
mask : m_MaskNodes)
230 if (stats.IsNotNull())
232 newStatistics.emplace_back(stats);
237 if (!newStatistics.empty())
245 m_Statistics = newStatistics;
249 BuildHierarchicalModel();
252 void QmitkImageStatisticsTreeModel::BuildHierarchicalModel()
258 bool hasMask =
false;
259 bool hasMultipleTimesteps =
false;
261 std::map<mitk::DataNode::ConstPointer, QmitkImageStatisticsTreeItem *> dataNodeToTreeItem;
263 for (
auto statistic : m_Statistics)
267 auto imageOfStatisticsPredicate = imageRule->GetDestinationsDetector(statistic);
268 auto imageFinding = std::find_if(m_ImageNodes.begin(), m_ImageNodes.end(), [&imageOfStatisticsPredicate](
const mitk::DataNode::ConstPointer& testNode) {
return imageOfStatisticsPredicate->CheckNode(testNode); });
271 auto maskOfStatisticsPredicate = maskRule->GetDestinationsDetector(statistic);
272 auto maskFinding = std::find_if(m_MaskNodes.begin(), m_MaskNodes.end(), [&maskOfStatisticsPredicate](
const mitk::DataNode::ConstPointer& testNode) {
return maskOfStatisticsPredicate->CheckNode(testNode); });
274 if (imageFinding == m_ImageNodes.end())
276 mitkThrow() <<
"no image found connected to statistic" << statistic <<
" Aborting.";
279 auto&
image = *imageFinding;
283 auto search = dataNodeToTreeItem.find(
image);
285 if (search != dataNodeToTreeItem.end())
287 imageItem = search->second;
292 QString imageLabel = QString::fromStdString(
image->GetName());
293 if (statistic->GetTimeSteps() == 1 && maskFinding == m_MaskNodes.end())
295 auto statisticsObject = statistic->GetStatisticsForTimeStep(0);
303 dataNodeToTreeItem.emplace(
image, imageItem);
308 if (maskFinding != m_MaskNodes.end())
310 auto&
mask = *maskFinding;
311 QString maskLabel = QString::fromStdString(
mask->GetName());
314 if (statistic->GetTimeSteps() == 1)
316 auto statisticsObject = statistic->GetStatisticsForTimeStep(0);
325 lastParent = maskItem;
330 lastParent = imageItem;
333 if (statistic->GetTimeSteps() > 1)
335 for (
unsigned int i = 0; i < statistic->GetTimeSteps(); i++)
337 QString timeStepLabel =
"[" + QString::number(i) +
"] " +
338 QString::number(statistic->GetTimeGeometry()->TimeStepToTimePoint(i)) +
" ms";
339 if (statistic->TimeStepExists(i))
342 statistic->GetStatisticsForTimeStep(i), m_StatisticNames, timeStepLabel, lastParent);
346 hasMultipleTimesteps =
true;
349 QString headerString =
"Images";
352 headerString +=
"/Masks";
354 if (hasMultipleTimesteps)
356 headerString +=
"/Timesteps";
358 m_HeaderFirstColumn = headerString;
363 emit beginResetModel();
364 UpdateByDataStorage();
365 emit endResetModel();
371 emit beginResetModel();
372 UpdateByDataStorage();
373 emit endResetModel();
379 emit beginResetModel();
380 UpdateByDataStorage();
381 emit endResetModel();
itk::SmartPointer< T > Lock() const
int columnCount(const QModelIndex &parent=QModelIndex()) const override
void SetDataStorage(mitk::DataStorage *dataStorage)
QmitkImageStatisticsTreeModel(QObject *parent=nullptr)
QmitkImageStatisticsTreeItem * parentItem()
QmitkImageStatisticsTreeItem * child(int row)
void NodeRemoved(const mitk::DataNode *node) override
void SetMaskNodes(const std::vector< mitk::DataNode::ConstPointer > &nodes)
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QModelIndex parent(const QModelIndex &child) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
void appendChild(QmitkImageStatisticsTreeItem *child)
void SetImageNodes(const std::vector< mitk::DataNode::ConstPointer > &nodes)
QVariant data(int column) const
static mitk::ImageStatisticsContainer::ConstPointer GetImageStatistics(const mitk::DataStorage *dataStorage, const mitk::BaseData *image, const mitk::BaseData *mask=nullptr)
Returns the StatisticContainer for the given image and mask.
ImageStatisticsContainer::ImageStatisticsObject::StatisticNameVector GetAllStatisticNames(const ImageStatisticsContainer *container)
mitk::Image::Pointer image
void NodeChanged(const mitk::DataNode *node) override
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
void NodePredicateChanged() override
mitk::Image::Pointer mask
QVariant data(const QModelIndex &index, int role) const override
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
~QmitkImageStatisticsTreeModel() override
void DataStorageChanged() override
void NodeAdded(const mitk::DataNode *node) override
Class for nodes of the DataTree.
mitk::WeakPointer< mitk::DataStorage > m_DataStorage