diff --git a/Modules/ModelFitUI/CMakeLists.txt b/Modules/ModelFitUI/CMakeLists.txt index 9eb1272a99..0e03ef28e4 100644 --- a/Modules/ModelFitUI/CMakeLists.txt +++ b/Modules/ModelFitUI/CMakeLists.txt @@ -1,6 +1,5 @@ MITK_CREATE_MODULE(ModelFitUI INCLUDE_DIRS Common Qmitk DEPENDS MitkModelFit MitkQtWidgets MitkQtWidgetsExt PACKAGE_DEPENDS Qt5|Core CTK|CTKWidgets Boost -WARNINGS_NO_ERRORS ) diff --git a/Modules/ModelFitUI/Qmitk/QmitkFitParameterModel.cpp b/Modules/ModelFitUI/Qmitk/QmitkFitParameterModel.cpp index f911741038..f5b7bc212d 100644 --- a/Modules/ModelFitUI/Qmitk/QmitkFitParameterModel.cpp +++ b/Modules/ModelFitUI/Qmitk/QmitkFitParameterModel.cpp @@ -1,342 +1,341 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkExceptionMacro.h" #include "mitkModelFitParameterValueExtraction.h" #include "QmitkFitParameterModel.h" QmitkFitParameterModel:: QmitkFitParameterModel(QObject* parent) : QAbstractTableModel(parent) { m_CurrentPos.Fill(0.0); } const QmitkFitParameterModel::FitVectorType& QmitkFitParameterModel:: getFits() const { return m_Fits; }; mitk::Point3D QmitkFitParameterModel:: getCurrentPosition() const { return m_CurrentPos; }; const mitk::PointSet* QmitkFitParameterModel:: getPositionBookmarks() const { return m_Bookmarks; }; void QmitkFitParameterModel:: setFits(const FitVectorType& fits) { emit beginResetModel(); m_Fits = fits; emit endResetModel(); }; void QmitkFitParameterModel:: setCurrentPosition(const mitk::Point3D& currentPos) { emit beginResetModel(); m_CurrentPos = currentPos; emit endResetModel(); }; void QmitkFitParameterModel:: setPositionBookmarks(const mitk::PointSet* bookmarks) { emit beginResetModel(); m_Bookmarks = bookmarks; emit endResetModel(); }; bool QmitkFitParameterModel:: hasSingleFit() const { return this->m_Fits.size() == 1; }; int QmitkFitParameterModel:: rowCount(const QModelIndex& parent) const { if (this->hasSingleFit()) { if (parent.isValid()) { return 0; } else { return this->m_Fits.front()->GetParameters().size() + this->m_Fits.front()->staticParamMap.Size(); } } else { if (parent.isValid()) { assert(parent.row() < this->m_Fits.size()); return this->m_Fits[parent.row()]->GetParameters().size() + this->m_Fits[parent.row()]->staticParamMap.Size(); } else { return this->m_Fits.size(); } } } std::size_t QmitkFitParameterModel:: getBookmarksCount() const { if (m_Bookmarks.IsNotNull()) { return m_Bookmarks->GetSize(); } return 0; } int QmitkFitParameterModel:: -columnCount(const QModelIndex& parent) const +columnCount(const QModelIndex&) const { return 3 + this->getBookmarksCount(); } /** Helper function returns the name of the static parameter indicates by the index. If the index does not indicate a static parameter an empty string will be returned.*/ std::string GetStaticParameterName(const mitk::modelFit::ModelFitInfo* currentFit, const QModelIndex& index) { - const auto paramSize = currentFit->GetParameters().size(); - const auto staticParamSize = currentFit->staticParamMap.Size(); + const auto paramSize = static_cast(currentFit->GetParameters().size()); std::string staticParamName; if (index.row() >= paramSize) { int pos = paramSize; for (const auto& iter : currentFit->staticParamMap) { if (pos == index.row()) { staticParamName = iter.first; break; } ++pos; } } return staticParamName; } QVariant QmitkFitParameterModel:: data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } QVariant result; if (!index.parent().isValid() && !this->hasSingleFit()) { //we need the fit names - if (index.row() < m_Fits.size() && index.column() == 0) + if (index.row() < static_cast(m_Fits.size()) && index.column() == 0) { if (role == Qt::DisplayRole || role == Qt::EditRole) { result = QVariant(QString::fromStdString(m_Fits[index.row()]->fitName)+QString("(") + QString::fromStdString(m_Fits[index.row()]->uid) + QString(")")); } else if (role == Qt::ToolTipRole) { result = QVariant("Name (UID) of the fit."); } } } else { // realy want to get the values of the current fit const mitk::modelFit::ModelFitInfo* currentFit = nullptr; if (this->hasSingleFit() && !index.parent().isValid()) { currentFit = m_Fits.front(); } - else if (index.parent().isValid() && index.parent().row() < m_Fits.size()) + else if (index.parent().isValid() && index.parent().row() < static_cast(m_Fits.size())) { currentFit = m_Fits[index.parent().row()]; } if (currentFit) { - const auto paramSize = currentFit->GetParameters().size(); - const auto staticParamSize = currentFit->staticParamMap.Size(); + const auto paramSize = static_cast(currentFit->GetParameters().size()); + const auto staticParamSize = static_cast(currentFit->staticParamMap.Size()); if (index.row() < paramSize + staticParamSize) { std::string staticParamName = GetStaticParameterName(currentFit, index); switch (index.column()) { case 0: if (role == Qt::DisplayRole || role == Qt::EditRole) { if (index.row() < paramSize) { const auto& param = currentFit->GetParameters()[index.row()]; result = QVariant(QString::fromStdString(param->name)); } else { result = QVariant(QString::fromStdString(staticParamName)); } } else if (role == Qt::ToolTipRole) { result = QVariant("Name of the parameter."); } break; case 1: if (role == Qt::DisplayRole || role == Qt::EditRole) { if (index.row() < paramSize) { const auto& param = currentFit->GetParameters()[index.row()]; std::string paramType = mitk::ModelFitConstants::PARAMETER_TYPE_VALUE_PARAMETER(); if (param->type == mitk::modelFit::Parameter::DerivedType) { paramType = mitk::ModelFitConstants::PARAMETER_TYPE_VALUE_DERIVED_PARAMETER(); } else if (param->type == mitk::modelFit::Parameter::CriterionType) { paramType = mitk::ModelFitConstants::PARAMETER_TYPE_VALUE_CRITERION(); } else if (param->type == mitk::modelFit::Parameter::EvaluationType) { paramType = mitk::ModelFitConstants::PARAMETER_TYPE_VALUE_EVALUATION_PARAMETER(); } result = QVariant(QString::fromStdString(paramType)); } else { result = QVariant("static"); } } else if (role == Qt::ToolTipRole) { result = QVariant("Type of the parameter."); } break; default: - if (index.column() - 2 < this->getBookmarksCount()+1) + if (index.column() - 2 < static_cast(this->getBookmarksCount()+1)) { mitk::Point3D pos = m_CurrentPos; if (index.column() > 2) { pos = m_Bookmarks->GetPoint(index.column() - 3); } if (role == Qt::DisplayRole || role == Qt::EditRole) { if (index.row() < paramSize) { auto value = mitk::ReadVoxel(currentFit->GetParameters()[index.row()]->image, pos); result = QVariant(QString::number(value)); } else { auto value = currentFit->staticParamMap.Get(staticParamName).front(); result = QVariant(QString::number(value)); } } else if (role == Qt::ToolTipRole) { result = QVariant("Value of a (static) fit parameter"); } } break; } } } } return result; } Qt::ItemFlags QmitkFitParameterModel:: flags(const QModelIndex& index) const { Qt::ItemFlags flags = QAbstractItemModel::flags(index); return flags; } QVariant QmitkFitParameterModel:: headerData(int section, Qt::Orientation orientation, int role) const { if ((Qt::DisplayRole == role) && (Qt::Horizontal == orientation)) { if (section == 0) { return QVariant("Name"); } else if (section == 1) { return QVariant("Type"); } else if (section == 2) { return QVariant("Value"); } - else if (section - 3 < this->getBookmarksCount()) + else if (section - 3 < static_cast(this->getBookmarksCount())) { const auto & pos = m_Bookmarks->GetPoint(section - 3); std::ostringstream strm; strm.imbue(std::locale("C")); strm << std::setprecision(3) << "Value @ Pos " << section -3 << " (" << pos[0] << "|" << pos[1] << "|" << pos[2] << ")"; return QVariant(QString::fromStdString(strm.str())); } } return QVariant(); } bool QmitkFitParameterModel:: -setData(const QModelIndex& index, const QVariant& value, int role) +setData(const QModelIndex&, const QVariant&, int) { return false; }; diff --git a/Modules/ModelFitUI/Qmitk/QmitkFitPlotDataModel.cpp b/Modules/ModelFitUI/Qmitk/QmitkFitPlotDataModel.cpp index cc0fa6bc2a..7c40875811 100644 --- a/Modules/ModelFitUI/Qmitk/QmitkFitPlotDataModel.cpp +++ b/Modules/ModelFitUI/Qmitk/QmitkFitPlotDataModel.cpp @@ -1,284 +1,284 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkExceptionMacro.h" #include "QmitkFitPlotDataModel.h" QmitkFitPlotDataModel:: QmitkFitPlotDataModel(QObject* parent) : QAbstractTableModel(parent) { } const mitk::ModelFitPlotData* QmitkFitPlotDataModel:: GetPlotData() const { return &m_PlotData; }; void QmitkFitPlotDataModel:: SetPlotData(const mitk::ModelFitPlotData* data) { emit beginResetModel(); m_PlotData = *data; emit endResetModel(); }; const std::string& QmitkFitPlotDataModel:: GetXName() const { return m_XName; }; void QmitkFitPlotDataModel:: SetXName(const std::string& xName) { emit beginResetModel(); m_XName = xName; emit endResetModel(); }; int QmitkFitPlotDataModel:: -rowCount(const QModelIndex& parent) const +rowCount(const QModelIndex&) const { //we assume that all plots have the same nr of values (except the interpolated signal which will be ignored). //Thus we have only to check one plot. Reason: One fit is always derived from one input data and therefore //all derived data should have the same size. auto plot = GetCurveByColumn(0); if (plot.second) { return plot.second->GetValues().size(); } return 0; } std::pair QmitkFitPlotDataModel::GetPositionalCurvePoint(const mitk::PlotDataCurve* curve) const { for (auto collection : this->m_PlotData.positionalPlots) { for (auto aCurve : collection.second.second->CastToSTLContainer()) { if (curve == aCurve.second.GetPointer()) { return std::make_pair(true, collection); } } } return std::make_pair(false, mitk::ModelFitPlotData::PositionalCollectionMap::value_type()); } int QmitkFitPlotDataModel:: columnCount(const QModelIndex& parent) const { if (parent.isValid()) { return 0; } else { auto size = this->m_PlotData.currentPositionPlots->size() + this->m_PlotData.staticPlots->size(); if (mitk::ModelFitPlotData::GetInterpolatedSignalPlot(this->m_PlotData.currentPositionPlots)) { //don't take the interpolated signal into account size -= 1; } if (mitk::ModelFitPlotData::GetInterpolatedSignalPlot(this->m_PlotData.staticPlots)) { //don't take the interpolated signal into account size -= 1; } for (const auto& coll : this->m_PlotData.positionalPlots) { size += coll.second.second->size(); if (mitk::ModelFitPlotData::GetInterpolatedSignalPlot(coll.second.second)) { //don't take the interpolated signal into account size -= 1; } } return size+2; } } bool GetCurveFromCollection(const mitk::PlotDataCurveCollection* collection, std::size_t index, std::pair& finding, std::size_t& actualCount) { actualCount = 0; for (const auto& iter : *(collection)) { if (iter.first != mitk::MODEL_FIT_PLOT_INTERPOLATED_SIGNAL_NAME()) { if (actualCount == index) { finding = std::make_pair(iter.first, iter.second.GetPointer()); return true; } ++actualCount; } } return false; } std::pair QmitkFitPlotDataModel:: GetCurveByColumn(int col) const { if (col == 1) { /*the x axis is needed so just get the first signal.*/ col = 0; } else if (col > 1) { /*a normal signal is requested, correct the column index to ignore the timestep and timepoint column*/ col -= 2; } std::pair finding; std::size_t actualCount; if (GetCurveFromCollection(this->m_PlotData.currentPositionPlots.GetPointer(), col, finding, actualCount)) { return finding; } col -= actualCount; for (auto collection : this->m_PlotData.positionalPlots) { if (GetCurveFromCollection(collection.second.second.GetPointer(), col, finding, actualCount)) { return finding; } col -= actualCount; } GetCurveFromCollection(this->m_PlotData.staticPlots.GetPointer(), col, finding, actualCount); return finding; }; QVariant QmitkFitPlotDataModel:: data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } QVariant result; if (index.column() == 0) { if (role == Qt::DisplayRole || role == Qt::EditRole) { result = QVariant(QString::number(index.row())); } else if (role == Qt::ToolTipRole) { result = QVariant("Index in plot."); } } else if (index.column() == 1) { auto finding = GetCurveByColumn(index.column()); if (role == Qt::DisplayRole || role == Qt::EditRole) { - if (finding.second && index.row() < finding.second->GetValues().size()) + if (finding.second && index.row() < static_cast(finding.second->GetValues().size())) { result = QVariant(QString::number(finding.second->GetValues()[index.row()].first)); } } else if (role == Qt::ToolTipRole) { result = QVariant("x value in plot."); } } else { auto finding = GetCurveByColumn(index.column()); if (role == Qt::DisplayRole || role == Qt::EditRole) { - if (finding.second && index.row() < finding.second->GetValues().size()) + if (finding.second && index.row() < static_cast(finding.second->GetValues().size())) { result = QVariant(QString::number(finding.second->GetValues()[index.row()].second)); } } else if (role == Qt::ToolTipRole) { result = QVariant("This is a value of the respective curve."); } } return result; } Qt::ItemFlags QmitkFitPlotDataModel:: flags(const QModelIndex& index) const { Qt::ItemFlags flags = QAbstractItemModel::flags(index); return flags; } QVariant QmitkFitPlotDataModel:: headerData(int section, Qt::Orientation orientation, int role) const { if ((Qt::DisplayRole == role) && (Qt::Horizontal == orientation)) { if (section == 0) { return QVariant("#"); } else if (section == 1) { return QVariant(QString::fromStdString(m_XName)); } else { auto finding = GetCurveByColumn(section); auto pointFinding = GetPositionalCurvePoint(finding.second); std::ostringstream nameStrm; nameStrm.imbue(std::locale("C")); nameStrm << finding.first; if (pointFinding.first) { nameStrm << " @ " << mitk::ModelFitPlotData::GetPositionalCollectionName(pointFinding.second); } return QVariant(QString::fromStdString(nameStrm.str())); } } return QVariant(); } bool QmitkFitPlotDataModel:: -setData(const QModelIndex& index, const QVariant& value, int role) +setData(const QModelIndex&, const QVariant&, int) { return false; }; diff --git a/Modules/ModelFitUI/Qmitk/QmitkInitialValuesModel.cpp b/Modules/ModelFitUI/Qmitk/QmitkInitialValuesModel.cpp index 816e41b2b8..a94f2a5f76 100644 --- a/Modules/ModelFitUI/Qmitk/QmitkInitialValuesModel.cpp +++ b/Modules/ModelFitUI/Qmitk/QmitkInitialValuesModel.cpp @@ -1,352 +1,352 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include #include "mitkExceptionMacro.h" #include "mitkImage.h" #include "mitkImageBasedParameterizationDelegate.h" #include "QmitkInitialValuesModel.h" QmitkInitialValuesModel:: QmitkInitialValuesModel(QObject* parent) : QAbstractTableModel(parent), m_modified(false) { } void QmitkInitialValuesModel:: setInitialValues(const mitk::ModelTraitsInterface::ParameterNamesType& names, const mitk::ModelTraitsInterface::ParametersType values) { if (names.size() != values.size()) { mitkThrow() << "Error. Cannot set initial value model. Passed parameter names vector and default values vector have different size."; } emit beginResetModel(); this->m_ParameterNames = names; this->m_Values = values; this->m_modified = false; emit endResetModel(); }; void QmitkInitialValuesModel:: setInitialValues(const mitk::ModelTraitsInterface::ParameterNamesType& names) { mitk::ModelTraitsInterface::ParametersType values; values.set_size(names.size()); values.fill(0.0); setInitialValues(names, values); }; void QmitkInitialValuesModel:: addInitialParameterImage(const mitk::DataNode* node, mitk::ModelTraitsInterface::ParametersType::size_type paramIndex) { if (!node) mitkThrow() << "Try to set a null ptr as initial value source image."; if (!dynamic_cast(node->GetData())) mitkThrow() << "Error. Passed node does not contain an image."; emit beginResetModel(); this->m_ParameterImageMap[paramIndex] = node; emit endResetModel(); }; void QmitkInitialValuesModel::resetInitialParameterImage() { emit beginResetModel(); this->m_ParameterImageMap.clear(); emit endResetModel(); }; mitk::ModelTraitsInterface::ParametersType QmitkInitialValuesModel:: getInitialValues() const { return this->m_Values; }; mitk::InitialParameterizationDelegateBase::Pointer QmitkInitialValuesModel:: getInitialParametrizationDelegate() const { mitk::ImageBasedParameterizationDelegate::Pointer initDelegate = mitk::ImageBasedParameterizationDelegate::New(); initDelegate->SetInitialParameterization(m_Values); for (const auto& pos : this->m_ParameterImageMap) { initDelegate->AddInitialParameterImage(dynamic_cast(pos.second->GetData()), pos.first); } return initDelegate.GetPointer(); }; bool QmitkInitialValuesModel:: hasValidInitialValues() const { for (const auto& pos : this->m_ParameterImageMap) { if (pos.second.IsNull()) return false; } return true; }; int QmitkInitialValuesModel:: rowCount(const QModelIndex& parent) const { if (parent.isValid()) { return 0; } return m_Values.size(); } int QmitkInitialValuesModel:: columnCount(const QModelIndex& parent) const { if (parent.isValid()) { return 0; } return 3; } int QmitkInitialValuesModel:: valueType(const QModelIndex& index) const { if (m_ParameterImageMap.find(index.row()) != m_ParameterImageMap.end()) { //image type return 1; } else { //simple scalar return 0; } } QVariant QmitkInitialValuesModel:: data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } QVariant result; - if (index.row() < m_Values.size()) + if (index.row() < static_cast(m_Values.size())) { switch (index.column()) { case 0: if (role == Qt::DisplayRole || role == Qt::EditRole) { result = QVariant(QString::fromStdString(m_ParameterNames[index.row()])); } else if (role == Qt::ToolTipRole) { result = QVariant("Name of the parameter."); } break; case 1: if (role == Qt::DisplayRole) { if (valueType(index) == 1) { //image type result = QVariant("image"); } else { //simple scalar result = QVariant("scalar"); } } else if (role == Qt::EditRole) { result = QVariant(valueType(index)); } else if (role == Qt::ToolTipRole) { result = QVariant("type of the inital value."); } break; case 2: if (role == Qt::DisplayRole || role == Qt::EditRole) { const auto& finding = m_ParameterImageMap.find(index.row()); if (finding != m_ParameterImageMap.end()) { //image type -> return the name if (finding->second.IsNotNull()) { result = QVariant(finding->second->GetName().c_str()); } else { result = QVariant("Invalid. Select image."); } } else { //simple scalar result = QVariant(m_Values(index.row())); } } else if (role == Qt::UserRole) { result = QVariant(valueType(index)); } else if (role == Qt::ToolTipRole) { result = QVariant("Initial values for the parameter."); } break; } } return result; } Qt::ItemFlags QmitkInitialValuesModel:: flags(const QModelIndex& index) const { Qt::ItemFlags flags = QAbstractItemModel::flags(index); - if (index.row() < m_Values.size()) + if (index.row() < static_cast(m_Values.size())) { if (index.column() > 0) { flags |= Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; } else { flags |= Qt::ItemIsEnabled | Qt::ItemIsSelectable; } } return flags; } QVariant QmitkInitialValuesModel:: headerData(int section, Qt::Orientation orientation, int role) const { if ((Qt::DisplayRole == role) && (Qt::Horizontal == orientation)) { if (section == 0) { return QVariant("Parameters"); } else if (section == 1) { return QVariant("Type"); } else if (section == 2) { return QVariant("Value"); } } return QVariant(); } bool QmitkInitialValuesModel:: setData(const QModelIndex& index, const QVariant& value, int role) { - if (!index.isValid() || index.row() >= m_Values.size() || (index.column() == 0)) + if (!index.isValid() || index.row() >= static_cast(m_Values.size()) || (index.column() == 0)) { return false; } if (Qt::EditRole == role) { emit dataChanged(index, index); emit beginResetModel(); bool result = false; if (index.column() == 1) { if (value.toInt() == 0) { this->m_ParameterImageMap.erase(index.row()); m_modified = true; result = true; } else { this->m_ParameterImageMap[index.row()] = nullptr; m_modified = true; result = true; } } else { if (valueType(index) == 0) { m_Values[index.row()] = value.toDouble(); m_modified = true; result = true; } else { mitk::DataNode *node = static_cast(value.value()); if (node && dynamic_cast(node->GetData())) { this->m_ParameterImageMap[index.row()] = node; m_modified = true; result = true; } } } emit endResetModel(); return result; } return false; }; bool QmitkInitialValuesModel::isModified() { return m_modified; } diff --git a/Modules/ModelFitUI/Qmitk/QmitkInitialValuesTypeDelegate.cpp b/Modules/ModelFitUI/Qmitk/QmitkInitialValuesTypeDelegate.cpp index c1592e67fc..d9a51d90f3 100644 --- a/Modules/ModelFitUI/Qmitk/QmitkInitialValuesTypeDelegate.cpp +++ b/Modules/ModelFitUI/Qmitk/QmitkInitialValuesTypeDelegate.cpp @@ -1,90 +1,90 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkInitialValuesTypeDelegate.h" #include #include #include #include QmitkInitialValuesTypeDelegate::QmitkInitialValuesTypeDelegate(QObject* /*parent*/) { } QWidget* QmitkInitialValuesTypeDelegate::createEditor(QWidget* parent, - const QStyleOptionViewItem& option + const QStyleOptionViewItem& , const QModelIndex& index) const { QVariant displayData = index.data(Qt::DisplayRole); QVariant data = index.data(Qt::EditRole); if (data.isValid()) { QComboBox* cmbBox = new QComboBox(parent); cmbBox->addItem(QString("scalar")); cmbBox->addItem(QString("image")); cmbBox->setCurrentIndex(0); cmbBox->installEventFilter(const_cast(this)); return cmbBox; } else { return new QLabel(displayData.toString(), parent); } } void QmitkInitialValuesTypeDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { QVariant data = index.data(Qt::EditRole); if (data.isValid()) { QComboBox* cmbBox = qobject_cast(editor); if (cmbBox) { cmbBox->setCurrentIndex(data.toInt()); } else { QStyledItemDelegate::setEditorData(editor, index); } } } void QmitkInitialValuesTypeDelegate::setModelData(QWidget* editor, QAbstractItemModel* model , const QModelIndex& index) const { QVariant data = index.data(Qt::EditRole); if (data.isValid()) { QComboBox* cmbBox = qobject_cast(editor); int selection = cmbBox->currentIndex(); QVariant selectionVariant(selection); model->setData(index, selectionVariant); } else { QStyledItemDelegate::setModelData(editor, model, index); } } diff --git a/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierManagerWidget.cpp b/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierManagerWidget.cpp index 66d0192ea2..6833080e96 100644 --- a/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierManagerWidget.cpp +++ b/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierManagerWidget.cpp @@ -1,105 +1,105 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include "QmitkSimpleBarrierManagerWidget.h" #include "QmitkSimpleBarrierModel.h" #include "QmitkSimpleBarrierParametersDelegate.h" #include "QmitkSimpleBarrierTypeDelegate.h" QmitkSimpleBarrierManagerWidget::QmitkSimpleBarrierManagerWidget(QWidget*): m_InternalUpdate(false) { this->m_Controls.setupUi(this); m_InternalModel = new QmitkSimpleBarrierModel(this); m_TypeDelegate = new QmitkSimpleBarrierTypeDelegate(this); m_ParametersDelegate = new QmitkSimpleBarrierParametersDelegate(this); this->m_Controls.constraintsView->setModel(m_InternalModel); this->m_Controls.constraintsView->setItemDelegateForColumn(0, m_ParametersDelegate); this->m_Controls.constraintsView->setItemDelegateForColumn(1, m_TypeDelegate); this->m_Controls.constraintsView->setContextMenuPolicy(Qt::CustomContextMenu); connect(this->m_Controls.btnAdd, SIGNAL(clicked(bool)), this, SLOT(OnAddConstraint(bool))); connect(this->m_Controls.btnDel, SIGNAL(clicked(bool)), this, SLOT(OnDelConstraint(bool))); connect(m_Controls.constraintsView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OnShowContextMenuIsoSet(const QPoint&))); this->update(); } QmitkSimpleBarrierManagerWidget::~QmitkSimpleBarrierManagerWidget() { delete m_InternalModel; delete m_TypeDelegate; delete m_ParametersDelegate; } void QmitkSimpleBarrierManagerWidget::setChecker(mitk::SimpleBarrierConstraintChecker* pChecker, const mitk::ModelTraitsInterface::ParameterNamesType& names) { this->m_Checker = pChecker; this->m_ParameterNames = names; this->m_InternalModel->setChecker(m_Checker, names); update(); } void QmitkSimpleBarrierManagerWidget::OnShowContextMenuIsoSet(const QPoint& pos) { QPoint globalPos = m_Controls.constraintsView->viewport()->mapToGlobal(pos); QModelIndex selectedIndex = m_Controls.constraintsView->currentIndex(); QMenu viewMenu; QAction* addLevelAct = viewMenu.addAction("Add new constraint"); QAction* delLevelAct = viewMenu.addAction("Delete selected constraint"); delLevelAct->setEnabled(selectedIndex.isValid()); QAction* selectedItem = viewMenu.exec(globalPos); if (selectedItem == addLevelAct) { this->m_InternalModel->addConstraint(); } else if (selectedItem == delLevelAct) { this->m_InternalModel->deleteConstraint(selectedIndex); } } -void QmitkSimpleBarrierManagerWidget::OnAddConstraint(bool checked) +void QmitkSimpleBarrierManagerWidget::OnAddConstraint(bool) { this->m_InternalModel->addConstraint(); } -void QmitkSimpleBarrierManagerWidget::OnDelConstraint(bool checked) +void QmitkSimpleBarrierManagerWidget::OnDelConstraint(bool) { QModelIndex selectedIndex = m_Controls.constraintsView->currentIndex(); if (!selectedIndex.isValid()) { selectedIndex = m_Controls.constraintsView->indexAt(QPoint(1, 1)); } this->m_InternalModel->deleteConstraint(selectedIndex); } void QmitkSimpleBarrierManagerWidget:: update() { }; diff --git a/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierParametersDelegate.cpp b/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierParametersDelegate.cpp index 187fa34b47..9ea37f4c7b 100644 --- a/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierParametersDelegate.cpp +++ b/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierParametersDelegate.cpp @@ -1,152 +1,152 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkSimpleBarrierParametersDelegate.h" #include #include #include #include #include QmitkSimpleBarrierParametersDelegate::QmitkSimpleBarrierParametersDelegate(QObject* /*parent*/) { } void QmitkSimpleBarrierParametersDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QVariant data = index.data(Qt::DisplayRole); - QStyleOptionViewItemV4 opt = option; + QStyleOptionViewItem opt = option; initStyleOption(&opt, index); QStyle* style = QApplication::style(); QString text = "Invalid data"; if (data.isValid()) { QStringList names = data.toStringList(); text.clear(); for (QStringList::const_iterator pos = names.begin(); pos != names.end(); ++pos) { if (pos != names.begin()) { text.append(", "); } text.append(*pos); } } style->drawItemText(painter, opt.rect.adjusted(0, 0, -5, 0), Qt::AlignRight | Qt::AlignVCenter, opt.palette, true, text); } QWidget* QmitkSimpleBarrierParametersDelegate::createEditor(QWidget* parent, - const QStyleOptionViewItem& option + const QStyleOptionViewItem& , const QModelIndex& index) const { QVariant data = index.data(Qt::EditRole); QVariant displayData = index.data(Qt::DisplayRole); if (data.isValid()) { QListWidget* list = new QListWidget(parent); list->setFixedSize(100, 100); list->installEventFilter(const_cast(this)); return list; } else { return new QLabel(displayData.toString(), parent); } } void QmitkSimpleBarrierParametersDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { QVariant data = index.data(Qt::EditRole); QVariant displayData = index.data(Qt::DisplayRole); if (data.isValid() && displayData.isValid()) { QListWidget* list = qobject_cast(editor); if (list) { list->clear(); QStringList names = data.toStringList(); QStringList checkedNames = displayData.toStringList(); for (QStringList::const_iterator pos = names.begin(); pos != names.end(); ++pos) { QListWidgetItem* item = new QListWidgetItem(*pos, list); item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); if (checkedNames.contains(*pos)) { item->setCheckState(Qt::Checked); } else { item->setCheckState(Qt::Unchecked); } } } else { QStyledItemDelegate::setEditorData(editor, index); } } } void QmitkSimpleBarrierParametersDelegate::setModelData(QWidget* editor, QAbstractItemModel* model , const QModelIndex& index) const { QVariant data = index.data(Qt::EditRole); if (data.isValid()) { QListWidget* list = qobject_cast(editor); QStringList selectedItems; if (list) { for (int row = 0; row < list->count(); ++row) { QListWidgetItem* item = list->item(row); if (item->checkState() == Qt::Checked) { selectedItems.append(item->text()); } } } QVariant selectedVariant(selectedItems); model->setData(index, selectedVariant); } else { QStyledItemDelegate::setModelData(editor, model, index); } -} \ No newline at end of file +} diff --git a/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierTypeDelegate.cpp b/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierTypeDelegate.cpp index 065c6c4674..a581a2bc75 100644 --- a/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierTypeDelegate.cpp +++ b/Modules/ModelFitUI/Qmitk/QmitkSimpleBarrierTypeDelegate.cpp @@ -1,90 +1,90 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkSimpleBarrierTypeDelegate.h" #include #include #include #include QmitkSimpleBarrierTypeDelegate::QmitkSimpleBarrierTypeDelegate(QObject* /*parent*/) { } QWidget* QmitkSimpleBarrierTypeDelegate::createEditor(QWidget* parent, - const QStyleOptionViewItem& option + const QStyleOptionViewItem& , const QModelIndex& index) const { QVariant displayData = index.data(Qt::DisplayRole); QVariant data = index.data(Qt::EditRole); if (data.isValid()) { QComboBox* cmbBox = new QComboBox(parent); cmbBox->addItem(QString("lower")); cmbBox->addItem(QString("upper")); cmbBox->setCurrentIndex(0); cmbBox->installEventFilter(const_cast(this)); return cmbBox; } else { return new QLabel(displayData.toString(), parent); } } void QmitkSimpleBarrierTypeDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { QVariant data = index.data(Qt::EditRole); if (data.isValid()) { QComboBox* cmbBox = qobject_cast(editor); if (cmbBox) { cmbBox->setCurrentIndex(data.toInt()); } else { QStyledItemDelegate::setEditorData(editor, index); } } } void QmitkSimpleBarrierTypeDelegate::setModelData(QWidget* editor, QAbstractItemModel* model , const QModelIndex& index) const { QVariant data = index.data(Qt::EditRole); if (data.isValid()) { QComboBox* cmbBox = qobject_cast(editor); int selection = cmbBox->currentIndex(); QVariant selectionVariant(selection); model->setData(index, selectionVariant); } else { QStyledItemDelegate::setModelData(editor, model, index); } } diff --git a/Modules/Pharmacokinetics/CMakeLists.txt b/Modules/Pharmacokinetics/CMakeLists.txt index 9c725c7550..ee417b64e2 100644 --- a/Modules/Pharmacokinetics/CMakeLists.txt +++ b/Modules/Pharmacokinetics/CMakeLists.txt @@ -1,19 +1,18 @@ MITK_CREATE_MODULE(Pharmacokinetics INCLUDE_DIRS PUBLIC ${MITK_BINARY_DIR} PRIVATE src/Common src/Functors src/Models src/DescriptionParameters src/SimulationFramework DEPENDS PUBLIC MitkCore MitkModelFit PRIVATE MitkMultilabel PACKAGE_DEPENDS PUBLIC ITK|ITKOptimizers PRIVATE Boost - WARNINGS_NO_ERRORS ) if(BUILD_TESTING) ADD_SUBDIRECTORY(test) endif(BUILD_TESTING) ADD_SUBDIRECTORY(autoload/Models) ADD_SUBDIRECTORY(cmdapps) \ No newline at end of file diff --git a/Modules/Pharmacokinetics/include/mitkConvolutionHelper.h b/Modules/Pharmacokinetics/include/mitkConvolutionHelper.h index 8c32455899..5d48327f17 100644 --- a/Modules/Pharmacokinetics/include/mitkConvolutionHelper.h +++ b/Modules/Pharmacokinetics/include/mitkConvolutionHelper.h @@ -1,157 +1,157 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef mitkConvolutionHelper_h #define mitkConvolutionHelper_h #include "itkArray.h" #include "mitkAIFBasedModelBase.h" #include #include "MitkPharmacokineticsExports.h" namespace mitk { /** @namespace convolution * @brief Helper for itk implementation of vnl fourier transformation * This namespace provides functions for the preperation of vnl_fft_1d, including a wrapper * for wrapping the convolution kernel (turning it inside out) and a function for zeropadding * to avoid convolution artefacts. */ namespace convolution { /** Some typedefs concerning data structures needed for vnl_fft_1d, which has vnl_vector< vcl_complex< double > > * as output typ of the forward transformation fwd_transform. Input is of type vnl_vector< vcl_complex< T > > * but since itk::Array is derived from vnl_vector, this works as well*/ /** @brief Function that wraps the kernel */ inline itk::Array wrap1d(itk::Array kernel) { int dim = kernel.GetNumberOfElements(); itk::Array wrappedKernel(dim); wrappedKernel.fill(0.); for(int i=0; i< dim; ++i) { wrappedKernel.SetElement(i, kernel.GetElement((i+(dim/2))%dim)); } return wrappedKernel; } /** @brief Fuction for zeropadding (adding zeros) of an Array/vnl_vector, so that is has size paddedDimensions * @param paddedDimensions Dimensions that the Array should have after padding (convolution dimensions) * \remark dim = Dimensions of padded image --> PaddedDimension * \remark m dimensions of larger image * \remark n dimensions of image to be padded --> InitialDimension*/ inline itk::Array zeropadding1d(itk::Array unpaddedSpectrum, int paddedDimension) { int initialDimension = unpaddedSpectrum.GetNumberOfElements(); itk::Array paddedSpectrum(paddedDimension); paddedSpectrum.fill(0.); if(paddedDimension > initialDimension) { unsigned int padding = paddedDimension - initialDimension; for(int i=0; i unpadAndScale(itk::Array convolutionResult, int initialDimension) { int transformationDimension = convolutionResult.size(); unsigned int padding = transformationDimension - initialDimension; itk::Array scaledResult(initialDimension); scaledResult.fill(0.0); for(int i = 0; i >, ready to * be entered in fwd_transform*/ inline void prepareConvolution(const itk::Array& kernel, const itk::Array& spectrum, itk::Array& preparedKernel, itk::Array& preparedSpectrum ){ int convolutionDimensions = kernel.GetSize() + spectrum.GetSize(); // itk::Array paddedKernel = zeropadding1d(kernel,convolutionDimensions); preparedKernel=zeropadding1d(kernel,convolutionDimensions); preparedSpectrum = zeropadding1d(spectrum,convolutionDimensions); // preparedKernel = wrap1d(paddedKernel); } } inline itk::Array convoluteAIFWithExponential(mitk::ModelBase::TimeGridType timeGrid, mitk::AIFBasedModelBase::AterialInputFunctionType aif, double lambda) { /** @brief Iterative Formula to Convolve aif(t) with an exponential Residuefunction R(t) = exp(lambda*t) **/ typedef itk::Array ConvolutionResultType; ConvolutionResultType convolution(timeGrid.GetSize()); convolution.fill(0.0); convolution(0) = 0; - for(int i = 0; i< (timeGrid.GetSize()-1); ++i) + for(unsigned int i = 0; i< (timeGrid.GetSize()-1); ++i) { double dt = timeGrid(i+1) - timeGrid(i); double m = (aif(i+1) - aif(i))/dt; double edt = exp(-lambda *dt); convolution(i+1) =edt * convolution(i) + (aif(i) - m*timeGrid(i))/lambda * (1 - edt ) + m/(lambda * lambda) * ((lambda * timeGrid(i+1) - 1) - edt*(lambda*timeGrid(i) -1)); } return convolution; } inline itk::Array convoluteAIFWithConstant(mitk::ModelBase::TimeGridType timeGrid, mitk::AIFBasedModelBase::AterialInputFunctionType aif, double constant) { /** @brief Iterative Formula to Convolve aif(t) with a constant value by linear interpolation of the Aif between sampling points **/ typedef itk::Array ConvolutionResultType; ConvolutionResultType convolution(timeGrid.GetSize()); convolution.fill(0.0); convolution(0) = 0; - for(int i = 0; i< (timeGrid.GetSize()-1); ++i) + for(unsigned int i = 0; i< (timeGrid.GetSize()-1); ++i) { double dt = timeGrid(i+1) - timeGrid(i); double m = (aif(i+1) - aif(i))/dt; convolution(i+1) = convolution(i) + constant * (aif(i)*dt + m*timeGrid(i)*dt + m/2*(timeGrid(i+1)*timeGrid(i+1) - timeGrid(i)*timeGrid(i))); } return convolution; } } #endif // mitkConvolutionHelper_h diff --git a/Modules/Pharmacokinetics/src/Common/mitkConcentrationCurveGenerator.cpp b/Modules/Pharmacokinetics/src/Common/mitkConcentrationCurveGenerator.cpp index d17529ef06..cc3676fbd7 100644 --- a/Modules/Pharmacokinetics/src/Common/mitkConcentrationCurveGenerator.cpp +++ b/Modules/Pharmacokinetics/src/Common/mitkConcentrationCurveGenerator.cpp @@ -1,265 +1,265 @@ #include "mitkConcentrationCurveGenerator.h" #include "mitkConvertToConcentrationTurboFlashFunctor.h" #include "mitkConvertT2ConcentrationFunctor.h" #include "mitkConvertToConcentrationViaT1Functor.h" #include "mitkImageTimeSelector.h" #include "mitkImageCast.h" #include "mitkITKImageImport.h" #include "mitkModelBase.h" #include "mitkExtractTimeGrid.h" #include "mitkArbitraryTimeGeometry.h" #include "itkImageIOBase.h" #include "itkBinaryFunctorImageFilter.h" #include "itkTernaryFunctorImageFilter.h" -mitk::ConcentrationCurveGenerator::ConcentrationCurveGenerator() : m_isT2weightedImage(false), m_UsingT1Map(false), m_isTurboFlashSequence(false), - m_AbsoluteSignalEnhancement(false), m_RelativeSignalEnhancement(0.0), m_Factor(0.0), m_RecoveryTime(0.0), m_RelaxationTime(0.0), - m_Relaxivity(0.0), m_T2Factor(0.0), m_T2EchoTime(0.0), m_FlipAngle(0.0) +mitk::ConcentrationCurveGenerator::ConcentrationCurveGenerator() : m_isT2weightedImage(false), m_isTurboFlashSequence(false), + m_AbsoluteSignalEnhancement(false), m_RelativeSignalEnhancement(0.0), m_UsingT1Map(false), m_Factor(0.0), m_RecoveryTime(0.0), m_RelaxationTime(0.0), + m_Relaxivity(0.0), m_FlipAngle(0.0), m_T2Factor(0.0), m_T2EchoTime(0.0) { } mitk::ConcentrationCurveGenerator::~ConcentrationCurveGenerator() { } mitk::Image::Pointer mitk::ConcentrationCurveGenerator::GetConvertedImage() { if(this->m_DynamicImage.IsNull()) { itkExceptionMacro( << "Dynamic Image not set!"); } else { Convert(); } return m_ConvertedImage; } void mitk::ConcentrationCurveGenerator::Convert() { mitk::Image::Pointer tempImage = mitk::Image::New(); mitk::PixelType pixeltype = mitk::MakeScalarPixelType(); tempImage->Initialize(pixeltype,*this->m_DynamicImage->GetTimeGeometry()); mitk::TimeGeometry::Pointer timeGeometry = (this->m_DynamicImage->GetTimeGeometry())->Clone(); tempImage->SetTimeGeometry(timeGeometry); PrepareBaselineImage(); mitk::ImageTimeSelector::Pointer imageTimeSelector = mitk::ImageTimeSelector::New(); imageTimeSelector->SetInput(this->m_DynamicImage); for(unsigned int i = 0; i< this->m_DynamicImage->GetTimeSteps(); ++i) { imageTimeSelector->SetTimeNr(i); imageTimeSelector->UpdateLargestPossibleRegion(); mitk::Image::Pointer mitkInputImage = imageTimeSelector->GetOutput(); mitk::Image::Pointer outputImage = mitk::Image::New(); outputImage = ConvertSignalToConcentrationCurve(mitkInputImage,this->m_BaselineImage); mitk::ImageReadAccessor accessor(outputImage); tempImage->SetVolume(accessor.GetData(), i); } this->m_ConvertedImage = tempImage; } void mitk::ConcentrationCurveGenerator::PrepareBaselineImage() { mitk::ImageTimeSelector::Pointer imageTimeSelector = mitk::ImageTimeSelector::New(); imageTimeSelector->SetInput(this->m_DynamicImage); imageTimeSelector->SetTimeNr(0); imageTimeSelector->UpdateLargestPossibleRegion(); this->m_BaselineImage = imageTimeSelector->GetOutput(); } mitk::Image::Pointer mitk::ConcentrationCurveGenerator::ConvertSignalToConcentrationCurve(mitk::Image::Pointer inputImage,mitk::Image::Pointer baselineImage) { mitk::PixelType m_PixelType = inputImage->GetPixelType(); mitk::Image::Pointer outputImage; if(inputImage->GetPixelType().GetComponentType() != baselineImage->GetPixelType().GetComponentType()) { mitkThrow() << "Input Image and Baseline Image have different Pixel Types. Data not supported"; } if(m_PixelType.GetComponentType() == itk::ImageIOBase::USHORT) { outputImage = convertToConcentration(inputImage, baselineImage); } else if(m_PixelType.GetComponentType() == itk::ImageIOBase::UINT) { outputImage = convertToConcentration(inputImage, baselineImage); } else if(m_PixelType.GetComponentType() == itk::ImageIOBase::INT) { outputImage = convertToConcentration(inputImage, baselineImage); } else if(m_PixelType.GetComponentType() == itk::ImageIOBase::SHORT) { outputImage = convertToConcentration(inputImage, baselineImage); } /*else if(m_PixelType.GetComponentType() == itk::ImageIOBase::ULONG) { outputImage = convertToConcentration(inputImage, baselineImage); } else if(m_PixelType.GetComponentType() == itk::ImageIOBase::LONG) { outputImage = convertToConcentration(inputImage, baselineImage); }*/ else if(m_PixelType.GetComponentType() == itk::ImageIOBase::DOUBLE) { outputImage = convertToConcentration(inputImage, baselineImage); } else if(m_PixelType.GetComponentType() == itk::ImageIOBase::FLOAT) { outputImage = convertToConcentration(inputImage, baselineImage); } else { mitkThrow() << "PixelType is "< mitk::Image::Pointer mitk::ConcentrationCurveGenerator::convertToConcentration(mitk::Image::Pointer inputImage,mitk::Image::Pointer baselineImage) { typedef itk::Image InputImageType; typename InputImageType::Pointer itkInputImage = InputImageType::New(); typename InputImageType::Pointer itkBaselineImage = InputImageType::New(); mitk::CastToItkImage(inputImage, itkInputImage ); mitk::CastToItkImage(baselineImage, itkBaselineImage ); mitk::Image::Pointer outputImage; if(this->m_isT2weightedImage) { typedef mitk::ConvertT2ConcentrationFunctor ConversionFunctorT2Type; typedef itk::BinaryFunctorImageFilter FilterT2Type; ConversionFunctorT2Type ConversionT2Functor; ConversionT2Functor.initialize(this->m_T2Factor, this->m_T2EchoTime); typename FilterT2Type::Pointer ConversionT2Filter = FilterT2Type::New(); ConversionT2Filter->SetFunctor(ConversionT2Functor); ConversionT2Filter->SetInput1(itkInputImage); ConversionT2Filter->SetInput2(itkBaselineImage); ConversionT2Filter->Update(); outputImage = mitk::ImportItkImage(ConversionT2Filter->GetOutput())->Clone(); } else { if(this->m_isTurboFlashSequence) { typedef mitk::ConvertToConcentrationTurboFlashFunctor ConversionFunctorTurboFlashType; typedef itk::BinaryFunctorImageFilter FilterTurboFlashType; ConversionFunctorTurboFlashType ConversionTurboFlashFunctor; ConversionTurboFlashFunctor.initialize(this->m_RelaxationTime, this->m_Relaxivity, this->m_RecoveryTime); typename FilterTurboFlashType::Pointer ConversionTurboFlashFilter = FilterTurboFlashType::New(); ConversionTurboFlashFilter->SetFunctor(ConversionTurboFlashFunctor); ConversionTurboFlashFilter->SetInput1(itkInputImage); ConversionTurboFlashFilter->SetInput2(itkBaselineImage); ConversionTurboFlashFilter->Update(); outputImage = mitk::ImportItkImage(ConversionTurboFlashFilter->GetOutput())->Clone(); } else if(this->m_UsingT1Map) { typename InputImageType::Pointer itkT10Image = InputImageType::New(); mitk::CastToItkImage(m_T10Image, itkT10Image); typedef mitk::ConvertToConcentrationViaT1CalcFunctor ConvertToConcentrationViaT1CalcFunctorType; typedef itk::TernaryFunctorImageFilter FilterT1MapType; ConvertToConcentrationViaT1CalcFunctorType ConversionT1MapFunctor; ConversionT1MapFunctor.initialize(this->m_Relaxivity, this->m_RecoveryTime, this->m_FlipAngle); typename FilterT1MapType::Pointer ConversionT1MapFilter = FilterT1MapType::New(); ConversionT1MapFilter->SetFunctor(ConversionT1MapFunctor); ConversionT1MapFilter->SetInput1(itkInputImage); ConversionT1MapFilter->SetInput2(itkBaselineImage); ConversionT1MapFilter->SetInput3(itkT10Image); ConversionT1MapFilter->Update(); outputImage = mitk::ImportItkImage(ConversionT1MapFilter->GetOutput())->Clone(); } else if(this->m_AbsoluteSignalEnhancement) { typedef mitk::ConvertToConcentrationAbsoluteFunctor ConversionFunctorAbsoluteType; typedef itk::BinaryFunctorImageFilter FilterAbsoluteType; ConversionFunctorAbsoluteType ConversionAbsoluteFunctor; ConversionAbsoluteFunctor.initialize(this->m_Factor); typename FilterAbsoluteType::Pointer ConversionAbsoluteFilter = FilterAbsoluteType::New(); ConversionAbsoluteFilter->SetFunctor(ConversionAbsoluteFunctor); ConversionAbsoluteFilter->SetInput1(itkInputImage); ConversionAbsoluteFilter->SetInput2(itkBaselineImage); ConversionAbsoluteFilter->Update(); outputImage = mitk::ImportItkImage(ConversionAbsoluteFilter->GetOutput())->Clone(); } else if(this->m_RelativeSignalEnhancement) { typedef mitk::ConvertToConcentrationRelativeFunctor ConversionFunctorRelativeType; typedef itk::BinaryFunctorImageFilter FilterRelativeType; ConversionFunctorRelativeType ConversionRelativeFunctor; ConversionRelativeFunctor.initialize(this->m_Factor); typename FilterRelativeType::Pointer ConversionRelativeFilter = FilterRelativeType::New(); ConversionRelativeFilter->SetFunctor(ConversionRelativeFunctor); ConversionRelativeFilter->SetInput1(itkInputImage); ConversionRelativeFilter->SetInput2(itkBaselineImage); ConversionRelativeFilter->Update(); outputImage = mitk::ImportItkImage(ConversionRelativeFilter->GetOutput())->Clone(); } } return outputImage; } diff --git a/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderFirstMomentDescriptionParameter.cpp b/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderFirstMomentDescriptionParameter.cpp index f72b4173f3..36bda034e8 100644 --- a/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderFirstMomentDescriptionParameter.cpp +++ b/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderFirstMomentDescriptionParameter.cpp @@ -1,38 +1,38 @@ #include "mitkAreaUnderFirstMomentDescriptionParameter.h" const std::string mitk::AreaUnderFirstMomentDescriptionParameter::PARAMETER_NAME = "AreaUnderFirstMoment"; mitk::AreaUnderFirstMomentDescriptionParameter::AreaUnderFirstMomentDescriptionParameter() { } mitk::AreaUnderFirstMomentDescriptionParameter::~AreaUnderFirstMomentDescriptionParameter() { } mitk::CurveDescriptionParameterBase::DescriptionParameterNamesType mitk::AreaUnderFirstMomentDescriptionParameter::GetDescriptionParameterName() const { DescriptionParameterNamesType result = { PARAMETER_NAME }; return result; } mitk::CurveDescriptionParameterBase::DescriptionParameterResultsType mitk::AreaUnderFirstMomentDescriptionParameter::ComputeCurveDescriptionParameter(const CurveType &curve, const CurveGridType &grid) const { DescriptionParameterResultsType results; CurveDescriptionParameterResultType aumc = 0; - int steps = grid.GetSize(); + auto steps = grid.GetSize(); for (CurveGridType::size_type i = 0; i < steps - 1; ++i) { double deltaX = grid(i + 1) - grid(i); double deltaY = curve(i + 1)*grid(i + 1) - curve(i)*grid(i); double Yi = curve(i)*grid(i); double intI = 1 / 2 * deltaX * deltaY + Yi * deltaX; aumc += std::abs(intI); } results.push_back(aumc); return results; } diff --git a/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderTheCurveDescriptionParameter.cpp b/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderTheCurveDescriptionParameter.cpp index 2c558707fd..916f0f59a0 100644 --- a/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderTheCurveDescriptionParameter.cpp +++ b/Modules/Pharmacokinetics/src/DescriptionParameters/mitkAreaUnderTheCurveDescriptionParameter.cpp @@ -1,55 +1,55 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkAreaUnderTheCurveDescriptionParameter.h" const std::string mitk::AreaUnderTheCurveDescriptionParameter::PARAMETER_NAME = "AreaUnderCurve"; mitk::AreaUnderTheCurveDescriptionParameter::AreaUnderTheCurveDescriptionParameter() { } mitk::AreaUnderTheCurveDescriptionParameter::~AreaUnderTheCurveDescriptionParameter() { } mitk::CurveDescriptionParameterBase::DescriptionParameterNamesType mitk::AreaUnderTheCurveDescriptionParameter::GetDescriptionParameterName() const { DescriptionParameterNamesType result = { PARAMETER_NAME }; return result; } mitk::CurveDescriptionParameterBase::DescriptionParameterResultsType mitk::AreaUnderTheCurveDescriptionParameter::ComputeCurveDescriptionParameter(const CurveType &curve, const CurveGridType &grid) const { DescriptionParameterResultsType results; CurveDescriptionParameterResultType auc = 0; - int steps = grid.GetSize(); + auto steps = grid.GetSize(); for (CurveGridType::size_type i = 0; i < steps - 1; ++i) { double deltaX = grid(i + 1) - grid(i); double deltaY = curve(i + 1) - curve(i); double Yi = curve(i); double intI = 1 / 2 * deltaX * deltaY + Yi * deltaX; auc += std::abs(intI); } results.push_back(auc); return results; } diff --git a/Modules/Pharmacokinetics/src/DescriptionParameters/mitkMeanResidenceTimeDescriptionParameter.cpp b/Modules/Pharmacokinetics/src/DescriptionParameters/mitkMeanResidenceTimeDescriptionParameter.cpp index 26d74b549f..e6ea3fa38a 100644 --- a/Modules/Pharmacokinetics/src/DescriptionParameters/mitkMeanResidenceTimeDescriptionParameter.cpp +++ b/Modules/Pharmacokinetics/src/DescriptionParameters/mitkMeanResidenceTimeDescriptionParameter.cpp @@ -1,51 +1,51 @@ #include "mitkMeanResidenceTimeDescriptionParameter.h" const std::string mitk::MeanResidenceTimeDescriptionParameter::PARAMETER_NAME = "MeanResidenceTime"; mitk::MeanResidenceTimeDescriptionParameter::MeanResidenceTimeDescriptionParameter() { } mitk::MeanResidenceTimeDescriptionParameter::~MeanResidenceTimeDescriptionParameter() { } mitk::CurveDescriptionParameterBase::DescriptionParameterNamesType mitk::MeanResidenceTimeDescriptionParameter::GetDescriptionParameterName() const { DescriptionParameterNamesType result = { PARAMETER_NAME }; return result; } mitk::CurveDescriptionParameterBase::DescriptionParameterResultsType mitk::MeanResidenceTimeDescriptionParameter::ComputeCurveDescriptionParameter(const CurveType &curve, const CurveGridType &grid) const { DescriptionParameterResultsType results; CurveDescriptionParameterResultType aumc = 0; CurveDescriptionParameterResultType auc = 0; CurveDescriptionParameterResultType mrt = 0; - int steps = grid.GetSize(); + auto steps = grid.GetSize(); for (CurveGridType::size_type i = 0; i < steps - 1; ++i) { double deltaX = grid(i + 1) - grid(i); double deltaY1 = curve(i + 1)*grid(i + 1) - curve(i)*grid(i); double Y1 = curve(i)*grid(i); double intI1 = 1 / 2 * deltaX * deltaY1 + Y1 * deltaX; aumc += std::abs(intI1); double deltaY2 = curve(i + 1) - curve(i); double Y2 = curve(i); double intI2 = 1 / 2 * deltaX * deltaY2 + Y2 * deltaX; auc += std::abs(intI2); } if(auc != 0) { mrt = aumc/auc; } results.push_back(mrt); return results; } diff --git a/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModel.cpp index c6b2d6c32a..388f47d1f6 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModel.cpp @@ -1,262 +1,261 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkDescriptivePharmacokineticBrixModel.h" const std::string mitk::DescriptivePharmacokineticBrixModel::MODEL_DISPLAY_NAME = "Descriptive Pharmacokinetic Brix Model"; const std::string mitk::DescriptivePharmacokineticBrixModel::NAME_PARAMETER_A = "A"; const std::string mitk::DescriptivePharmacokineticBrixModel::NAME_PARAMETER_kep = "kep"; const std::string mitk::DescriptivePharmacokineticBrixModel::NAME_PARAMETER_kel = "kel"; //tlag in minutes const std::string mitk::DescriptivePharmacokineticBrixModel::NAME_PARAMETER_tlag = "tlag"; const std::string mitk::DescriptivePharmacokineticBrixModel::UNIT_PARAMETER_A = "a.u."; const std::string mitk::DescriptivePharmacokineticBrixModel::UNIT_PARAMETER_kep = "1/min"; const std::string mitk::DescriptivePharmacokineticBrixModel::UNIT_PARAMETER_kel = "1/min"; //tlag in minutes const std::string mitk::DescriptivePharmacokineticBrixModel::UNIT_PARAMETER_tlag = "min"; const std::string mitk::DescriptivePharmacokineticBrixModel::NAME_STATIC_PARAMETER_Tau = "Tau"; const std::string mitk::DescriptivePharmacokineticBrixModel::NAME_STATIC_PARAMETER_S0 = "S0"; const std::string mitk::DescriptivePharmacokineticBrixModel::UNIT_STATIC_PARAMETER_Tau = "min"; const std::string mitk::DescriptivePharmacokineticBrixModel::UNIT_STATIC_PARAMETER_S0 = "I"; const unsigned int mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_A = 0; const unsigned int mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_kep = 1; const unsigned int mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_kel = 2; const unsigned int mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_tlag = 3; const unsigned int mitk::DescriptivePharmacokineticBrixModel::NUMBER_OF_PARAMETERS = 4; std::string mitk::DescriptivePharmacokineticBrixModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::DescriptivePharmacokineticBrixModel::GetModelType() const { return "Perfusion.MR"; }; std::string mitk::DescriptivePharmacokineticBrixModel::GetXAxisName() const { return "Time"; }; std::string mitk::DescriptivePharmacokineticBrixModel::GetXAxisUnit() const { return "s"; } std::string mitk::DescriptivePharmacokineticBrixModel::GetYAxisName() const { return ""; }; std::string mitk::DescriptivePharmacokineticBrixModel::GetYAxisUnit() const { return ""; } mitk::DescriptivePharmacokineticBrixModel::DescriptivePharmacokineticBrixModel(): m_Tau(0), m_S0(1) { } mitk::DescriptivePharmacokineticBrixModel::~DescriptivePharmacokineticBrixModel() { } mitk::DescriptivePharmacokineticBrixModel::ParameterNamesType mitk::DescriptivePharmacokineticBrixModel::GetParameterNames() const { ParameterNamesType result; result.push_back(NAME_PARAMETER_A); result.push_back(NAME_PARAMETER_kep); result.push_back(NAME_PARAMETER_kel); result.push_back(NAME_PARAMETER_tlag); return result; } mitk::DescriptivePharmacokineticBrixModel::ParametersSizeType mitk::DescriptivePharmacokineticBrixModel::GetNumberOfParameters() const { return NUMBER_OF_PARAMETERS; } mitk::DescriptivePharmacokineticBrixModel::ParamterUnitMapType mitk::DescriptivePharmacokineticBrixModel::GetParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_PARAMETER_A, UNIT_PARAMETER_A)); result.insert(std::make_pair(NAME_PARAMETER_kep, UNIT_PARAMETER_kep)); result.insert(std::make_pair(NAME_PARAMETER_kel, UNIT_PARAMETER_kel)); result.insert(std::make_pair(NAME_PARAMETER_tlag, UNIT_PARAMETER_tlag)); return result; }; mitk::DescriptivePharmacokineticBrixModel::ParameterNamesType mitk::DescriptivePharmacokineticBrixModel::GetStaticParameterNames() const { ParameterNamesType result; result.push_back(NAME_STATIC_PARAMETER_Tau); result.push_back(NAME_STATIC_PARAMETER_S0); return result; } mitk::DescriptivePharmacokineticBrixModel::ParamterUnitMapType mitk::DescriptivePharmacokineticBrixModel::GetStaticParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_STATIC_PARAMETER_Tau, UNIT_STATIC_PARAMETER_Tau)); result.insert(std::make_pair(NAME_STATIC_PARAMETER_S0, UNIT_STATIC_PARAMETER_S0)); return result; }; mitk::DescriptivePharmacokineticBrixModel::ParametersSizeType mitk::DescriptivePharmacokineticBrixModel::GetNumberOfStaticParameters() const { return 1; } mitk::DescriptivePharmacokineticBrixModel::ModelResultType mitk::DescriptivePharmacokineticBrixModel::ComputeModelfunction(const ParametersType& parameters) const { if (m_TimeGrid.GetSize() == 0) { itkExceptionMacro("No Time Grid Set! Cannot Calculate Signal"); } if (m_Tau == 0) { itkExceptionMacro("Injection time is 0! Cannot Calculate Signal"); } - unsigned int timeSteps = m_TimeGrid.GetSize(); ModelResultType signal(m_TimeGrid.GetSize()); double tx = 0; double amplitude = parameters[POSITION_PARAMETER_A]; double kel = parameters[POSITION_PARAMETER_kel]; double kep = parameters[POSITION_PARAMETER_kep]; double tlag = parameters[POSITION_PARAMETER_tlag]; TimeGridType::const_iterator timeGridEnd = m_TimeGrid.end(); ModelResultType::iterator signalPos = signal.begin(); for (TimeGridType::const_iterator gridPos = m_TimeGrid.begin(); gridPos != timeGridEnd; ++gridPos, ++signalPos) { double t = (*gridPos) / 60.0; //convert from [sec] to [min] if (t <= tlag) { tx = 0; } else if ((t > tlag) && (t < (m_Tau + tlag))) { tx = t - tlag; } else if (t >= (m_Tau + tlag)) { tx = m_Tau; } double kDiff = kep - kel; double tDiff = t - tlag; double expkel = (kep * exp(-kel * tDiff)); double expkeltx = exp(kel * tx); double expkep = exp(-kep * tDiff); double expkeptx = exp(kep * tx); double value = 1 + (amplitude / m_Tau) * (((expkel / (kel * kDiff)) * (expkeltx - 1)) - (( expkep / kDiff) * (expkeptx - 1))); *signalPos = value * m_S0; } return signal; } void mitk::DescriptivePharmacokineticBrixModel::SetStaticParameter(const ParameterNameType& name, const StaticParameterValuesType& values) { if (name == NAME_STATIC_PARAMETER_Tau) { SetTau(values[0]); } if (name == NAME_STATIC_PARAMETER_S0) { SetS0(values[0]); } }; mitk::DescriptivePharmacokineticBrixModel::StaticParameterValuesType mitk::DescriptivePharmacokineticBrixModel::GetStaticParameterValue(const ParameterNameType& name) const { StaticParameterValuesType result; if (name == NAME_STATIC_PARAMETER_Tau) { result.push_back(GetTau()); } if (name == NAME_STATIC_PARAMETER_S0) { result.push_back(GetS0()); } return result; }; itk::LightObject::Pointer mitk::DescriptivePharmacokineticBrixModel::InternalClone() const { DescriptivePharmacokineticBrixModel::Pointer newClone = DescriptivePharmacokineticBrixModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); newClone->SetTau(this->m_Tau); newClone->SetS0(this->m_S0); return newClone.GetPointer(); }; void mitk::DescriptivePharmacokineticBrixModel::PrintSelf(std::ostream& os, ::itk::Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Tau (injection time): " << m_Tau; os << indent << "S0 (base value): " << m_S0; }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModelValueBasedParameterizer.cpp b/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModelValueBasedParameterizer.cpp index 82a7bc23b9..29966f3942 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModelValueBasedParameterizer.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkDescriptivePharmacokineticBrixModelValueBasedParameterizer.cpp @@ -1,65 +1,65 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include "mitkDescriptivePharmacokineticBrixModel.h" #include "mitkDescriptivePharmacokineticBrixModelValueBasedParameterizer.h" mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::StaticParameterMapType mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::GetGlobalStaticParameters() const { StaticParameterMapType result; StaticParameterValuesType values; values.push_back(m_Tau); result.insert(std::make_pair(ModelType::NAME_STATIC_PARAMETER_Tau, values)); return result; }; mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::StaticParameterMapType mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::GetLocalStaticParameters( - const IndexType& currentPosition) const + const IndexType&) const { StaticParameterMapType result; StaticParameterValuesType values; values.push_back(m_BaseValue); result.insert(std::make_pair(ModelType::NAME_STATIC_PARAMETER_S0, values)); return result; }; mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::ParametersType mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::GetDefaultInitialParameterization() const { ParametersType initialParameters; initialParameters.SetSize(4); initialParameters[mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_A] = 1.0; initialParameters[mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_kep] = 4.0; initialParameters[mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_kel] = 0.2; initialParameters[mitk::DescriptivePharmacokineticBrixModel::POSITION_PARAMETER_tlag] = 1.0; return initialParameters; } mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::DescriptivePharmacokineticBrixModelValueBasedParameterizer() { }; mitk::DescriptivePharmacokineticBrixModelValueBasedParameterizer::~DescriptivePharmacokineticBrixModelValueBasedParameterizer() { }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkExtendedOneTissueCompartmentModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkExtendedOneTissueCompartmentModel.cpp index fcfd70e6e1..12398b6880 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkExtendedOneTissueCompartmentModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkExtendedOneTissueCompartmentModel.cpp @@ -1,151 +1,148 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkExtendedOneTissueCompartmentModel.h" #include "mitkConvolutionHelper.h" #include #include const std::string mitk::ExtendedOneTissueCompartmentModel::MODEL_DISPLAY_NAME = "Extended One Tissue Compartment Model (with blood volume)"; const std::string mitk::ExtendedOneTissueCompartmentModel::NAME_PARAMETER_k1 = "K1"; const std::string mitk::ExtendedOneTissueCompartmentModel::NAME_PARAMETER_k2 = "k2"; const std::string mitk::ExtendedOneTissueCompartmentModel::NAME_PARAMETER_VB = "VB"; const std::string mitk::ExtendedOneTissueCompartmentModel::UNIT_PARAMETER_k1 = "1/min"; const std::string mitk::ExtendedOneTissueCompartmentModel::UNIT_PARAMETER_k2 = "1/min"; const std::string mitk::ExtendedOneTissueCompartmentModel::UNIT_PARAMETER_VB = "ml/ml"; const unsigned int mitk::ExtendedOneTissueCompartmentModel::POSITION_PARAMETER_k1 = 0; const unsigned int mitk::ExtendedOneTissueCompartmentModel::POSITION_PARAMETER_k2 = 1; const unsigned int mitk::ExtendedOneTissueCompartmentModel::POSITION_PARAMETER_VB = 2; const unsigned int mitk::ExtendedOneTissueCompartmentModel::NUMBER_OF_PARAMETERS = 3; std::string mitk::ExtendedOneTissueCompartmentModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::ExtendedOneTissueCompartmentModel::GetModelType() const { return "Dynamic.PET"; }; mitk::ExtendedOneTissueCompartmentModel::ExtendedOneTissueCompartmentModel() { } mitk::ExtendedOneTissueCompartmentModel::~ExtendedOneTissueCompartmentModel() { } mitk::ExtendedOneTissueCompartmentModel::ParameterNamesType mitk::ExtendedOneTissueCompartmentModel::GetParameterNames() const { ParameterNamesType result; result.push_back(NAME_PARAMETER_k1); result.push_back(NAME_PARAMETER_k2); result.push_back(NAME_PARAMETER_VB); return result; } mitk::ExtendedOneTissueCompartmentModel::ParametersSizeType mitk::ExtendedOneTissueCompartmentModel::GetNumberOfParameters() const { return NUMBER_OF_PARAMETERS; } mitk::ExtendedOneTissueCompartmentModel::ParamterUnitMapType mitk::ExtendedOneTissueCompartmentModel::GetParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_PARAMETER_k1, UNIT_PARAMETER_k1)); result.insert(std::make_pair(NAME_PARAMETER_k2, UNIT_PARAMETER_k2)); result.insert(std::make_pair(NAME_PARAMETER_VB, UNIT_PARAMETER_VB)); return result; }; mitk::ExtendedOneTissueCompartmentModel::ModelResultType mitk::ExtendedOneTissueCompartmentModel::ComputeModelfunction( const ParametersType& parameters) const { - typedef itk::Array ResidueFunctionType; - - if (this->m_TimeGrid.GetSize() == 0) { itkExceptionMacro("No Time Grid Set! Cannot Calculate Signal"); } AterialInputFunctionType aterialInputFunction; aterialInputFunction = GetAterialInputFunction(this->m_TimeGrid); unsigned int timeSteps = this->m_TimeGrid.GetSize(); //Model Parameters double K1 = (double) parameters[POSITION_PARAMETER_k1] / 60.0; double k2 = (double) parameters[POSITION_PARAMETER_k2] / 60.0; double VB = parameters[POSITION_PARAMETER_VB]; mitk::ModelBase::ModelResultType convolution = mitk::convoluteAIFWithExponential(this->m_TimeGrid, aterialInputFunction, k2); //Signal that will be returned by ComputeModelFunction mitk::ModelBase::ModelResultType signal(timeSteps); signal.fill(0.0); mitk::ModelBase::ModelResultType::iterator signalPos = signal.begin(); AterialInputFunctionType::const_iterator aifPos = aterialInputFunction.begin(); for (mitk::ModelBase::ModelResultType::const_iterator res = convolution.begin(); res != convolution.end(); ++res, ++signalPos, ++aifPos) { *signalPos = VB * (*aifPos) + (1 - VB) * K1 * (*res); } return signal; } itk::LightObject::Pointer mitk::ExtendedOneTissueCompartmentModel::InternalClone() const { ExtendedOneTissueCompartmentModel::Pointer newClone = ExtendedOneTissueCompartmentModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); }; void mitk::ExtendedOneTissueCompartmentModel::PrintSelf(std::ostream& os, ::itk::Indent indent) const { Superclass::PrintSelf(os, indent); }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkExtendedToftsModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkExtendedToftsModel.cpp index 0f8a483fd9..cf70582884 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkExtendedToftsModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkExtendedToftsModel.cpp @@ -1,184 +1,181 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkExtendedToftsModel.h" #include "mitkConvolutionHelper.h" #include #include const std::string mitk::ExtendedToftsModel::MODEL_DISPLAY_NAME = "Tofts Model"; const std::string mitk::ExtendedToftsModel::NAME_PARAMETER_Ktrans = "KTrans"; const std::string mitk::ExtendedToftsModel::NAME_PARAMETER_ve = "ve"; const std::string mitk::ExtendedToftsModel::NAME_PARAMETER_vp = "vp"; const std::string mitk::ExtendedToftsModel::UNIT_PARAMETER_Ktrans = "ml/min/100ml"; const std::string mitk::ExtendedToftsModel::UNIT_PARAMETER_ve = "ml/ml"; const std::string mitk::ExtendedToftsModel::UNIT_PARAMETER_vp = "ml/ml"; const unsigned int mitk::ExtendedToftsModel::POSITION_PARAMETER_Ktrans = 0; const unsigned int mitk::ExtendedToftsModel::POSITION_PARAMETER_ve = 1; const unsigned int mitk::ExtendedToftsModel::POSITION_PARAMETER_vp = 2; const unsigned int mitk::ExtendedToftsModel::NUMBER_OF_PARAMETERS = 3; std::string mitk::ExtendedToftsModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::ExtendedToftsModel::GetModelType() const { return "Perfusion.MR"; }; mitk::ExtendedToftsModel::ExtendedToftsModel() { } mitk::ExtendedToftsModel::~ExtendedToftsModel() { } mitk::ExtendedToftsModel::ParameterNamesType mitk::ExtendedToftsModel::GetParameterNames() const { ParameterNamesType result; result.push_back(NAME_PARAMETER_Ktrans); result.push_back(NAME_PARAMETER_ve); result.push_back(NAME_PARAMETER_vp); return result; } mitk::ExtendedToftsModel::ParametersSizeType mitk::ExtendedToftsModel::GetNumberOfParameters() const { return NUMBER_OF_PARAMETERS; } mitk::ExtendedToftsModel::ParamterUnitMapType mitk::ExtendedToftsModel::GetParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_PARAMETER_Ktrans, UNIT_PARAMETER_Ktrans)); result.insert(std::make_pair(NAME_PARAMETER_vp, UNIT_PARAMETER_vp)); result.insert(std::make_pair(NAME_PARAMETER_ve, UNIT_PARAMETER_ve)); return result; }; mitk::ExtendedToftsModel::ParameterNamesType mitk::ExtendedToftsModel::GetDerivedParameterNames() const { ParameterNamesType result; result.push_back("kep"); return result; }; mitk::ExtendedToftsModel::ParametersSizeType mitk::ExtendedToftsModel::GetNumberOfDerivedParameters() const { return 1; }; mitk::ExtendedToftsModel::ParamterUnitMapType mitk::ExtendedToftsModel::GetDerivedParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair("kep", "1/min")); return result; }; mitk::ExtendedToftsModel::ModelResultType mitk::ExtendedToftsModel::ComputeModelfunction( const ParametersType& parameters) const { - typedef itk::Array ResidueFunctionType; - - if (this->m_TimeGrid.GetSize() == 0) { itkExceptionMacro("No Time Grid Set! Cannot Calculate Signal"); } AterialInputFunctionType aterialInputFunction; aterialInputFunction = GetAterialInputFunction(this->m_TimeGrid); unsigned int timeSteps = this->m_TimeGrid.GetSize(); //Model Parameters double ktrans = parameters[POSITION_PARAMETER_Ktrans] / 6000.0; double ve = parameters[POSITION_PARAMETER_ve]; double vp = parameters[POSITION_PARAMETER_vp]; double lambda = ktrans / ve; mitk::ModelBase::ModelResultType convolution = mitk::convoluteAIFWithExponential(this->m_TimeGrid, aterialInputFunction, lambda); //Signal that will be returned by ComputeModelFunction mitk::ModelBase::ModelResultType signal(timeSteps); signal.fill(0.0); mitk::ModelBase::ModelResultType::iterator signalPos = signal.begin(); mitk::ModelBase::ModelResultType::const_iterator res = convolution.begin(); for (AterialInputFunctionType::iterator Cp = aterialInputFunction.begin(); Cp != aterialInputFunction.end(); ++res, ++signalPos, ++Cp) { *signalPos = (*Cp) * vp + ktrans * (*res); } return signal; } mitk::ModelBase::DerivedParameterMapType mitk::ExtendedToftsModel::ComputeDerivedParameters( const mitk::ModelBase::ParametersType& parameters) const { DerivedParameterMapType result; double kep = parameters[POSITION_PARAMETER_Ktrans] / parameters[POSITION_PARAMETER_ve]; result.insert(std::make_pair("kep", kep)); return result; }; itk::LightObject::Pointer mitk::ExtendedToftsModel::InternalClone() const { ExtendedToftsModel::Pointer newClone = ExtendedToftsModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); }; void mitk::ExtendedToftsModel::PrintSelf(std::ostream& os, ::itk::Indent indent) const { Superclass::PrintSelf(os, indent); }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkOneTissueCompartmentModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkOneTissueCompartmentModel.cpp index 3514eeaef2..cc9b6ae026 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkOneTissueCompartmentModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkOneTissueCompartmentModel.cpp @@ -1,145 +1,142 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkOneTissueCompartmentModel.h" #include "mitkConvolutionHelper.h" #include #include const std::string mitk::OneTissueCompartmentModel::MODEL_DISPLAY_NAME = "One Tissue Compartment Model"; const std::string mitk::OneTissueCompartmentModel::NAME_PARAMETER_k1 = "K1"; const std::string mitk::OneTissueCompartmentModel::NAME_PARAMETER_k2 = "k2"; const std::string mitk::OneTissueCompartmentModel::UNIT_PARAMETER_k1 = "1/min"; const std::string mitk::OneTissueCompartmentModel::UNIT_PARAMETER_k2 = "1/min"; const unsigned int mitk::OneTissueCompartmentModel::POSITION_PARAMETER_k1 = 0; const unsigned int mitk::OneTissueCompartmentModel::POSITION_PARAMETER_k2 = 1; const unsigned int mitk::OneTissueCompartmentModel::NUMBER_OF_PARAMETERS = 2; std::string mitk::OneTissueCompartmentModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::OneTissueCompartmentModel::GetModelType() const { return "Dynamic.PET"; }; mitk::OneTissueCompartmentModel::OneTissueCompartmentModel() { } mitk::OneTissueCompartmentModel::~OneTissueCompartmentModel() { } mitk::OneTissueCompartmentModel::ParameterNamesType mitk::OneTissueCompartmentModel::GetParameterNames() const { ParameterNamesType result; result.push_back(NAME_PARAMETER_k1); result.push_back(NAME_PARAMETER_k2); return result; } mitk::OneTissueCompartmentModel::ParametersSizeType mitk::OneTissueCompartmentModel::GetNumberOfParameters() const { return NUMBER_OF_PARAMETERS; } mitk::OneTissueCompartmentModel::ParamterUnitMapType mitk::OneTissueCompartmentModel::GetParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_PARAMETER_k1, UNIT_PARAMETER_k1)); result.insert(std::make_pair(NAME_PARAMETER_k2, UNIT_PARAMETER_k2)); return result; }; mitk::OneTissueCompartmentModel::ModelResultType mitk::OneTissueCompartmentModel::ComputeModelfunction( const ParametersType& parameters) const { - typedef itk::Array ResidueFunctionType; - - if (this->m_TimeGrid.GetSize() == 0) { itkExceptionMacro("No Time Grid Set! Cannot Calculate Signal"); } AterialInputFunctionType aterialInputFunction; aterialInputFunction = GetAterialInputFunction(this->m_TimeGrid); unsigned int timeSteps = this->m_TimeGrid.GetSize(); //Model Parameters double K1 = (double) parameters[POSITION_PARAMETER_k1] / 60.0; double k2 = (double) parameters[POSITION_PARAMETER_k2] / 60.0; mitk::ModelBase::ModelResultType convolution = mitk::convoluteAIFWithExponential(this->m_TimeGrid, aterialInputFunction, k2); //Signal that will be returned by ComputeModelFunction mitk::ModelBase::ModelResultType signal(timeSteps); signal.fill(0.0); mitk::ModelBase::ModelResultType::iterator signalPos = signal.begin(); for (mitk::ModelBase::ModelResultType::const_iterator res = convolution.begin(); res != convolution.end(); ++res, ++signalPos) { *signalPos = K1 * (*res); } return signal; } itk::LightObject::Pointer mitk::OneTissueCompartmentModel::InternalClone() const { OneTissueCompartmentModel::Pointer newClone = OneTissueCompartmentModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); }; void mitk::OneTissueCompartmentModel::PrintSelf(std::ostream& os, ::itk::Indent indent) const { Superclass::PrintSelf(os, indent); }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp index b9df013da2..c8447f88a0 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp @@ -1,175 +1,172 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkStandardToftsModel.h" #include "mitkConvolutionHelper.h" #include #include const std::string mitk::StandardToftsModel::MODEL_DISPLAY_NAME = "Standard Tofts Model"; const std::string mitk::StandardToftsModel::NAME_PARAMETER_Ktrans = "KTrans"; const std::string mitk::StandardToftsModel::NAME_PARAMETER_ve = "ve"; const std::string mitk::StandardToftsModel::UNIT_PARAMETER_Ktrans = "ml/min/100ml"; const std::string mitk::StandardToftsModel::UNIT_PARAMETER_ve = "ml/ml"; const unsigned int mitk::StandardToftsModel::POSITION_PARAMETER_Ktrans = 0; const unsigned int mitk::StandardToftsModel::POSITION_PARAMETER_ve = 1; const unsigned int mitk::StandardToftsModel::NUMBER_OF_PARAMETERS = 2; std::string mitk::StandardToftsModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::StandardToftsModel::GetModelType() const { return "Perfusion.MR"; }; mitk::StandardToftsModel::StandardToftsModel() { } mitk::StandardToftsModel::~StandardToftsModel() { } mitk::StandardToftsModel::ParameterNamesType mitk::StandardToftsModel::GetParameterNames() const { ParameterNamesType result; result.push_back(NAME_PARAMETER_Ktrans); result.push_back(NAME_PARAMETER_ve); return result; } mitk::StandardToftsModel::ParametersSizeType mitk::StandardToftsModel::GetNumberOfParameters() const { return NUMBER_OF_PARAMETERS; } mitk::StandardToftsModel::ParamterUnitMapType mitk::StandardToftsModel::GetParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_PARAMETER_Ktrans, UNIT_PARAMETER_Ktrans)); result.insert(std::make_pair(NAME_PARAMETER_ve, UNIT_PARAMETER_ve)); return result; }; mitk::StandardToftsModel::ParameterNamesType mitk::StandardToftsModel::GetDerivedParameterNames() const { ParameterNamesType result; result.push_back("kep"); return result; }; mitk::StandardToftsModel::ParametersSizeType mitk::StandardToftsModel::GetNumberOfDerivedParameters() const { return 1; }; mitk::StandardToftsModel::ParamterUnitMapType mitk::StandardToftsModel::GetDerivedParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair("kep", "1/min")); return result; }; mitk::StandardToftsModel::ModelResultType mitk::StandardToftsModel::ComputeModelfunction( const ParametersType& parameters) const { - typedef itk::Array ResidueFunctionType; - - if (this->m_TimeGrid.GetSize() == 0) { itkExceptionMacro("No Time Grid Set! Cannot Calculate Signal"); } AterialInputFunctionType aterialInputFunction; aterialInputFunction = GetAterialInputFunction(this->m_TimeGrid); unsigned int timeSteps = this->m_TimeGrid.GetSize(); //Model Parameters double ktrans = parameters[POSITION_PARAMETER_Ktrans] / 6000.0; double ve = parameters[POSITION_PARAMETER_ve]; double lambda = ktrans / ve; mitk::ModelBase::ModelResultType convolution = mitk::convoluteAIFWithExponential(this->m_TimeGrid, aterialInputFunction, lambda); //Signal that will be returned by ComputeModelFunction mitk::ModelBase::ModelResultType signal(timeSteps); signal.fill(0.0); mitk::ModelBase::ModelResultType::iterator signalPos = signal.begin(); mitk::ModelBase::ModelResultType::const_iterator res = convolution.begin(); for (AterialInputFunctionType::iterator Cp = aterialInputFunction.begin(); Cp != aterialInputFunction.end(); ++res, ++signalPos, ++Cp) { *signalPos = ktrans * (*res); } return signal; } mitk::ModelBase::DerivedParameterMapType mitk::StandardToftsModel::ComputeDerivedParameters( const mitk::ModelBase::ParametersType& parameters) const { DerivedParameterMapType result; double kep = parameters[POSITION_PARAMETER_Ktrans] / parameters[POSITION_PARAMETER_ve]; result.insert(std::make_pair("kep", kep)); return result; }; itk::LightObject::Pointer mitk::StandardToftsModel::InternalClone() const { StandardToftsModel::Pointer newClone = StandardToftsModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); }; void mitk::StandardToftsModel::PrintSelf(std::ostream& os, ::itk::Indent indent) const { Superclass::PrintSelf(os, indent); }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModel.cpp index ff7d3af9f0..2aa4519e11 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModel.cpp @@ -1,227 +1,225 @@ #include "mitkThreeStepLinearModel.h" const std::string mitk::ThreeStepLinearModel::MODEL_DISPLAY_NAME = "Three Step Linear Model"; const std::string mitk::ThreeStepLinearModel::NAME_PARAMETER_S0 = "Baseline"; const std::string mitk::ThreeStepLinearModel::NAME_PARAMETER_t1 = "Time_point_1"; const std::string mitk::ThreeStepLinearModel::NAME_PARAMETER_t2 = "Time_point_2"; const std::string mitk::ThreeStepLinearModel::NAME_PARAMETER_a1 = "Slope_1"; const std::string mitk::ThreeStepLinearModel::NAME_PARAMETER_a2 = "Slope_2"; // Assuming that Model is calculated on Signal intensities I const std::string mitk::ThreeStepLinearModel::UNIT_PARAMETER_S0 = "I"; const std::string mitk::ThreeStepLinearModel::UNIT_PARAMETER_t1 = "s"; const std::string mitk::ThreeStepLinearModel::UNIT_PARAMETER_t2 = "s"; const std::string mitk::ThreeStepLinearModel::UNIT_PARAMETER_a1 = "I/s"; const std::string mitk::ThreeStepLinearModel::UNIT_PARAMETER_a2 = "I/s"; const unsigned int mitk::ThreeStepLinearModel::POSITION_PARAMETER_S0 = 0; const unsigned int mitk::ThreeStepLinearModel::POSITION_PARAMETER_t1 = 1; const unsigned int mitk::ThreeStepLinearModel::POSITION_PARAMETER_t2 = 2; const unsigned int mitk::ThreeStepLinearModel::POSITION_PARAMETER_a1 = 3; const unsigned int mitk::ThreeStepLinearModel::POSITION_PARAMETER_a2 = 4; const unsigned int mitk::ThreeStepLinearModel::NUMBER_OF_PARAMETERS = 5; std::string mitk::ThreeStepLinearModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::ThreeStepLinearModel::GetModelType() const { return "Generic"; }; mitk::ThreeStepLinearModel::FunctionStringType mitk::ThreeStepLinearModel::GetFunctionString() const { return "Baseline if t= t1 && (*gridPos) <= t2) { *signalPos = a1*(*gridPos)+b1; } else { *signalPos = a2*(*gridPos)+b2; } } return signal; }; mitk::ThreeStepLinearModel::ParameterNamesType mitk::ThreeStepLinearModel::GetStaticParameterNames() const { ParameterNamesType result; return result; } mitk::ThreeStepLinearModel::ParametersSizeType mitk::ThreeStepLinearModel::GetNumberOfStaticParameters() const { return 0; } -void mitk::ThreeStepLinearModel::SetStaticParameter(const ParameterNameType& name, - const StaticParameterValuesType& values) +void mitk::ThreeStepLinearModel::SetStaticParameter(const ParameterNameType&, + const StaticParameterValuesType&) { //do nothing }; mitk::ThreeStepLinearModel::StaticParameterValuesType mitk::ThreeStepLinearModel::GetStaticParameterValue( - const ParameterNameType& name) const + const ParameterNameType&) const { StaticParameterValuesType result; //do nothing return result; }; mitk::ModelBase::DerivedParameterMapType mitk::ThreeStepLinearModel::ComputeDerivedParameters( const mitk::ModelBase::ParametersType& parameters) const { double S0 = (double) parameters[POSITION_PARAMETER_S0]; double tau = (double) parameters[POSITION_PARAMETER_t1] ; double tmax = (double) parameters[POSITION_PARAMETER_t2] ; double s1 = (double) parameters[POSITION_PARAMETER_a1] ; double s2 = (double) parameters[POSITION_PARAMETER_a2] ; unsigned int timeSteps = m_TimeGrid.GetSize(); double Taq = 0; Taq = m_TimeGrid.GetElement(timeSteps-1); double b1 = S0-s1*tau; double Smax = s1*tmax+b1; double b2 = Smax-s2*tmax; double AUC = s1/2*(tmax*tmax-tau*tau) +(b1-S0)*(tmax-tau) +s2/2*(Taq*Taq-tmax*tmax) +(b2-S0)*(Taq-tmax); double Sfin = s2*Taq+b2; DerivedParameterMapType result; result.insert(std::make_pair("AUC", AUC)); result.insert(std::make_pair("FinalTimePoint", Taq)); result.insert(std::make_pair("FinalUptake", Sfin)); result.insert(std::make_pair("Smax", Smax)); result.insert(std::make_pair("y-intercept1", b1)); result.insert(std::make_pair("y-intercept2", b2)); return result; }; itk::LightObject::Pointer mitk::ThreeStepLinearModel::InternalClone() const { ThreeStepLinearModel::Pointer newClone = ThreeStepLinearModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModelFactory.cpp b/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModelFactory.cpp index e1b7bfdbc4..108fc5bb5e 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModelFactory.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkThreeStepLinearModelFactory.cpp @@ -1,38 +1,38 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkThreeStepLinearModelFactory.h" #include "mitkConcreteModelParameterizerBase.h" mitk::ThreeStepLinearModelFactory::ThreeStepLinearModelFactory() { }; mitk::ThreeStepLinearModelFactory::~ThreeStepLinearModelFactory() { }; mitk::ModelParameterizerBase::ParametersType mitk::ThreeStepLinearModelFactory::GetDefaultInitialParameterization() const { return ThreeStepLinearModelParameterizer::New()->GetDefaultInitialParameterization(); }; mitk::ModelParameterizerBase::Pointer mitk::ThreeStepLinearModelFactory::DoCreateParameterizer( - const modelFit::ModelFitInfo* fit) const + const modelFit::ModelFitInfo*) const { return ConcreteModelParameterizerBase::New().GetPointer(); }; diff --git a/Modules/Pharmacokinetics/src/Models/mitkTwoCompartmentExchangeModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkTwoCompartmentExchangeModel.cpp index eb56b6252d..32dd5d7c3f 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkTwoCompartmentExchangeModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkTwoCompartmentExchangeModel.cpp @@ -1,185 +1,184 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkTwoCompartmentExchangeModel.h" #include "mitkConvolutionHelper.h" #include const std::string mitk::TwoCompartmentExchangeModel::MODEL_DISPLAY_NAME = "Two Compartment Exchange Model"; const std::string mitk::TwoCompartmentExchangeModel::NAME_PARAMETER_F = "F"; const std::string mitk::TwoCompartmentExchangeModel::NAME_PARAMETER_PS = "PS"; const std::string mitk::TwoCompartmentExchangeModel::NAME_PARAMETER_ve = "ve"; const std::string mitk::TwoCompartmentExchangeModel::NAME_PARAMETER_vp = "vp"; const std::string mitk::TwoCompartmentExchangeModel::UNIT_PARAMETER_F = "ml/min/100ml"; const std::string mitk::TwoCompartmentExchangeModel::UNIT_PARAMETER_PS = "ml/min/100ml"; const std::string mitk::TwoCompartmentExchangeModel::UNIT_PARAMETER_ve = "ml/ml"; const std::string mitk::TwoCompartmentExchangeModel::UNIT_PARAMETER_vp = "ml/ml"; const unsigned int mitk::TwoCompartmentExchangeModel::POSITION_PARAMETER_F = 0; const unsigned int mitk::TwoCompartmentExchangeModel::POSITION_PARAMETER_PS = 1; const unsigned int mitk::TwoCompartmentExchangeModel::POSITION_PARAMETER_ve = 2; const unsigned int mitk::TwoCompartmentExchangeModel::POSITION_PARAMETER_vp = 3; const unsigned int mitk::TwoCompartmentExchangeModel::NUMBER_OF_PARAMETERS = 4; inline double square(double a) { return a * a; } std::string mitk::TwoCompartmentExchangeModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::TwoCompartmentExchangeModel::GetModelType() const { return "Perfusion.MR"; }; mitk::TwoCompartmentExchangeModel::TwoCompartmentExchangeModel() { } mitk::TwoCompartmentExchangeModel::~TwoCompartmentExchangeModel() { } mitk::TwoCompartmentExchangeModel::ParameterNamesType mitk::TwoCompartmentExchangeModel::GetParameterNames() const { ParameterNamesType result; result.push_back(NAME_PARAMETER_F); result.push_back(NAME_PARAMETER_PS); result.push_back(NAME_PARAMETER_ve); result.push_back(NAME_PARAMETER_vp); return result; } mitk::TwoCompartmentExchangeModel::ParametersSizeType mitk::TwoCompartmentExchangeModel::GetNumberOfParameters() const { return NUMBER_OF_PARAMETERS; } mitk::TwoCompartmentExchangeModel::ParamterUnitMapType mitk::TwoCompartmentExchangeModel::GetParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_PARAMETER_F, UNIT_PARAMETER_F)); result.insert(std::make_pair(NAME_PARAMETER_PS, UNIT_PARAMETER_PS)); result.insert(std::make_pair(NAME_PARAMETER_vp, UNIT_PARAMETER_vp)); result.insert(std::make_pair(NAME_PARAMETER_ve, UNIT_PARAMETER_ve)); return result; }; mitk::TwoCompartmentExchangeModel::ModelResultType mitk::TwoCompartmentExchangeModel::ComputeModelfunction(const ParametersType& parameters) const { - typedef itk::Array ResidueFunctionType; typedef mitk::ModelBase::ModelResultType ConvolutionResultType; if (this->m_TimeGrid.GetSize() == 0) { itkExceptionMacro("No Time Grid Set! Cannot Calculate Signal"); } AterialInputFunctionType aterialInputFunction; aterialInputFunction = GetAterialInputFunction(this->m_TimeGrid); unsigned int timeSteps = this->m_TimeGrid.GetSize(); mitk::ModelBase::ModelResultType signal(timeSteps); signal.fill(0.0); //Model Parameters double F = parameters[POSITION_PARAMETER_F] / 6000.0; double PS = parameters[POSITION_PARAMETER_PS] / 6000.0; double ve = parameters[POSITION_PARAMETER_ve]; double vp = parameters[POSITION_PARAMETER_vp]; if(PS != 0) { double Tp = vp/(PS + F); double Te = ve/PS; double Tb = vp/F; double Kp = 0.5 *( 1/Tp + 1/Te + sqrt(( 1/Tp + 1/Te )*( 1/Tp + 1/Te ) - 4 * 1/Te*1/Tb) ); double Km = 0.5 *( 1/Tp + 1/Te - sqrt(( 1/Tp + 1/Te )*( 1/Tp + 1/Te ) - 4 * 1/Te*1/Tb) ); double E = ( Kp - 1/Tb )/( Kp - Km ); ConvolutionResultType expp = mitk::convoluteAIFWithExponential(this->m_TimeGrid, aterialInputFunction,Kp); ConvolutionResultType expm = mitk::convoluteAIFWithExponential(this->m_TimeGrid, aterialInputFunction,Km); //Signal that will be returned by ComputeModelFunction mitk::ModelBase::ModelResultType::const_iterator exppPos = expp.begin(); mitk::ModelBase::ModelResultType::const_iterator expmPos = expm.begin(); for( mitk::ModelBase::ModelResultType::iterator signalPos = signal.begin(); signalPos!=signal.end(); ++exppPos,++expmPos, ++signalPos) { *signalPos = F * ( *exppPos + E*(*expmPos - *exppPos) ); } } else { double Kp = F/vp; ConvolutionResultType exp = mitk::convoluteAIFWithExponential(this->m_TimeGrid, aterialInputFunction,Kp); mitk::ModelBase::ModelResultType::const_iterator expPos = exp.begin(); for( mitk::ModelBase::ModelResultType::iterator signalPos = signal.begin(); signalPos!=signal.end(); ++expPos, ++signalPos) { *signalPos = F * ( *expPos ); } } return signal; } itk::LightObject::Pointer mitk::TwoCompartmentExchangeModel::InternalClone() const { TwoCompartmentExchangeModel::Pointer newClone = TwoCompartmentExchangeModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); } void mitk::TwoCompartmentExchangeModel::PrintSelf(std::ostream& os, ::itk::Indent indent) const { Superclass::PrintSelf(os, indent); } diff --git a/Modules/Pharmacokinetics/src/SimulationFramework/mitkImageGenerationHelper.cpp b/Modules/Pharmacokinetics/src/SimulationFramework/mitkImageGenerationHelper.cpp index fcd69410a9..8aacc9ac47 100644 --- a/Modules/Pharmacokinetics/src/SimulationFramework/mitkImageGenerationHelper.cpp +++ b/Modules/Pharmacokinetics/src/SimulationFramework/mitkImageGenerationHelper.cpp @@ -1,142 +1,143 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkImageGenerationHelper.h" #include "mitkArbitraryTimeGeometry.h" #include "mitkImageCast.h" typedef itk::Image FrameITKImageType; typedef itk::Image DynamicITKImageType; mitk::Image::Pointer mitk::ImageGenerationHelper::GenerateTestFrame(unsigned int timePointIndex) { FrameITKImageType::Pointer image = FrameITKImageType::New(); FrameITKImageType::IndexType start; start[0] = 0; // first index on X start[1] = 0; // first index on Y start[2] = 0; // first index on Z FrameITKImageType::SizeType size; size[0] = this->m_DimX; // size along X size[1] = this->m_DimY; // size along Y size[2] = this->m_DimZ; // size along Z FrameITKImageType::RegionType region; region.SetSize( size ); region.SetIndex( start ); image->SetRegions( region ); image->Allocate(); itk::ImageRegionIterator it = itk::ImageRegionIterator(image,image->GetLargestPossibleRegion()); while (!it.IsAtEnd()) { it.Set(this->m_Curve[timePointIndex]); ++it; } mitk::Image::Pointer mitkImage = mitk::Image::New(); mitkImage->InitializeByItk( image.GetPointer() ); mitkImage->SetVolume( image->GetBufferPointer() ); return mitkImage; } mitk::Image::Pointer mitk::ImageGenerationHelper::GenerateDynamicImageMITK() { unsigned int timeSteps = this->m_Grid.GetSize(); if(this->m_Curve.GetSize() != this->m_Grid.GetSize()) { itkExceptionMacro("Error. TimeGrid and ConcentrationCurve do not have same size. No Image Generation possible!"); } if(this->m_DimX == 0 && this->m_DimY == 0 && this->m_DimZ == 0) { itkExceptionMacro("Error. No Dimensions for Image Set!"); } if(this->m_Curve.GetSize() == 0 || this->m_Grid.GetSize() == 0) { itkExceptionMacro("Error. No Curve/Grid set!"); } mitk::Image::Pointer tempImage = GenerateTestFrame(0); mitk::Image::Pointer dynamicImage = mitk::Image::New(); DynamicITKImageType::Pointer dynamicITKImage = DynamicITKImageType::New(); DynamicITKImageType::RegionType dynamicITKRegion; DynamicITKImageType::PointType dynamicITKOrigin; DynamicITKImageType::IndexType dynamicITKIndex; DynamicITKImageType::SpacingType dynamicITKSpacing; dynamicITKSpacing[0] = tempImage->GetGeometry()->GetSpacing()[0]; dynamicITKSpacing[1] = tempImage->GetGeometry()->GetSpacing()[1]; dynamicITKSpacing[2] = tempImage->GetGeometry()->GetSpacing()[2]; dynamicITKSpacing[3] = 1.0; dynamicITKIndex[0] = 0; // The first pixel of the REGION dynamicITKIndex[1] = 0; dynamicITKIndex[2] = 0; dynamicITKIndex[3] = 0; dynamicITKRegion.SetSize( 0,tempImage->GetDimension(0)); dynamicITKRegion.SetSize( 1,tempImage->GetDimension(1)); dynamicITKRegion.SetSize( 2,tempImage->GetDimension(2)); dynamicITKRegion.SetSize( 3,timeSteps); dynamicITKRegion.SetIndex( dynamicITKIndex ); dynamicITKOrigin[0]=tempImage->GetGeometry()->GetOrigin()[0]; dynamicITKOrigin[1]=tempImage->GetGeometry()->GetOrigin()[1]; dynamicITKOrigin[2]=tempImage->GetGeometry()->GetOrigin()[2]; dynamicITKImage->SetOrigin(dynamicITKOrigin); dynamicITKImage->SetSpacing(dynamicITKSpacing); dynamicITKImage->SetRegions( dynamicITKRegion); dynamicITKImage->Allocate(); dynamicITKImage->FillBuffer(0); //not sure if this is necessary // Convert mitk::CastToMitkImage(dynamicITKImage, dynamicImage); ArbitraryTimeGeometry::Pointer timeGeometry = ArbitraryTimeGeometry::New(); timeGeometry->ClearAllGeometries(); - for (int i = 0; iSetVolume(frameImage->GetVolumeData()->GetData(),i); + mitk::ImageReadAccessor readAccess(frameImage, frameImage->GetVolumeData(0)); + dynamicImage->SetVolume(readAccess.GetData(),i); timeGeometry->AppendNewTimeStepClone(frameImage->GetGeometry(),this->m_Grid(i),this->m_Grid(i+1)); } dynamicImage->SetTimeGeometry(timeGeometry); return dynamicImage; } diff --git a/Modules/Pharmacokinetics/src/SimulationFramework/mitkPerfusionDataGenerator.cpp b/Modules/Pharmacokinetics/src/SimulationFramework/mitkPerfusionDataGenerator.cpp index 31ebb2749e..907839c067 100644 --- a/Modules/Pharmacokinetics/src/SimulationFramework/mitkPerfusionDataGenerator.cpp +++ b/Modules/Pharmacokinetics/src/SimulationFramework/mitkPerfusionDataGenerator.cpp @@ -1,252 +1,252 @@ #include "mitkPerfusionDataGenerator.h" #include "itkMultiOutputNaryFunctorImageFilter.h" #include "mitkArbitraryTimeGeometry.h" #include "mitkImageCast.h" #include "mitkImageAccessByItk.h" #include "mitkITKImageImport.h" void mitk::PerfusionDataGenerator::SetParameterInputImage(const ParametersIndexType parameterIndex, ParameterImageType parameterImage) { m_ParameterInputMap.insert(std::make_pair(parameterIndex,parameterImage)); } mitk::PerfusionDataGenerator::ResultImageType mitk::PerfusionDataGenerator::GetGeneratedImage() { Generate(); return m_ResultImage; } template void mitk::PerfusionDataGenerator::DoPrepareMask(itk::Image* image) { m_InternalMask = dynamic_cast(image); if (m_InternalMask.IsNull()) { MITK_INFO << "Parameter Fit Generator. Need to cast mask for parameter fit."; typedef itk::Image InputImageType; typedef itk::CastImageFilter< InputImageType, InternalMaskType > CastFilterType; typename CastFilterType::Pointer spImageCaster = CastFilterType::New(); spImageCaster->SetInput(image); m_InternalMask = spImageCaster->GetOutput(); spImageCaster->Update(); } } template void mitk::PerfusionDataGenerator::DoGenerateData(itk::Image* image) { typedef itk::Image InputFrameImageType; typedef itk::Image OutputImageType; typedef itk::MultiOutputNaryFunctorImageFilter FilterType; typename FilterType::Pointer filter; for(unsigned int i=0; im_ParameterInputMap.size(); ++i) { typename InputFrameImageType::Pointer frameImage; Image::Pointer parameterImage = m_InputParameterImages.at(i); mitk::CastToItkImage(parameterImage, frameImage); filter->SetInput(i,frameImage); } SimpleFunctorPolicy functor; functor.SetFunctor(this->m_Functor); filter->SetFunctor(functor); if (this->m_InternalMask.IsNotNull()) { filter->SetMask(this->m_InternalMask); } filter->Update(); ArbitraryTimeGeometry::Pointer timeGeometry = ArbitraryTimeGeometry::New(); timeGeometry->ClearAllGeometries(); Image::Pointer dynamicImage= Image::New(); if(filter->GetNumberOfOutputs() != this->m_Functor->GetGrid().GetSize()) { itkExceptionMacro("Error. Number of computed output Images does not match Grid size!"); } auto m_Grid = this->m_Functor->GetGrid(); for (GridType::size_type i = 0; iGetOutput(i))->Clone(); dynamicImage->SetVolume(frameImage->GetVolumeData()->GetData(),i); auto currentTimePoint = m_Grid[i]; auto nextTimePoint = m_Grid[i]; if (i+1AppendNewTimeStepClone(frameImage->GetGeometry(), currentTimePoint, nextTimePoint); } dynamicImage->SetTimeGeometry(timeGeometry); this->m_ResultImage = dynamicImage; } void mitk::PerfusionDataGenerator::SortParameterImages() { ParameterVectorType inputImages(this->m_ParameterInputMap.size()); unsigned int i = 0; for (ParameterMapType::const_iterator pos = m_ParameterInputMap.begin(); pos != m_ParameterInputMap.end(); ++pos) { i = pos->first; inputImages[i] = pos->second; } this->m_InputParameterImages = inputImages; } void mitk::PerfusionDataGenerator::Generate() { SortParameterImages(); if(this->m_Mask.IsNotNull()) { AccessFixedDimensionByItk(m_Mask, mitk::PerfusionDataGenerator::DoPrepareMask, 3); } else { this->m_InternalMask = NULL; } /** @todo #1 This did not work! The Access-Routine would be a much nicer solution, but for some reasons, the handling did not work. * Thats why the code for Generation the Data was pasted below */ // mitk::Image::Pointer firstParameterImage = this->m_InputParameterImages[0]; // AccessFixedDimensionByItk(firstParameterImage, mitk::PerfusionDataGenerator::DoGenerateData, 3); typedef itk::Image InputFrameImageType; typedef itk::Image OutputImageType; typedef itk::MultiOutputNaryFunctorImageFilter FilterType; /** @todo #3 The ParameterFitImageGenerator uses a typename instead of new. But this did not work somehow */ FilterType::Pointer filter = FilterType::New(); for(unsigned int i=0; im_ParameterInputMap.size(); ++i) { /** @todo #3 The ParameterFitImageGenerator uses a typename instead of new. But this did not work somehow */ InputFrameImageType::Pointer frameImage = InputFrameImageType::New(); Image::Pointer parameterImage = m_InputParameterImages.at(i); mitk::CastToItkImage(parameterImage, frameImage); filter->SetInput(i,frameImage); } SimpleFunctorPolicy functor; functor.SetFunctor(this->m_Functor); filter->SetFunctor(functor); if (this->m_InternalMask.IsNotNull()) { filter->SetMask(this->m_InternalMask); } filter->Update(); if (filter->GetNumberOfOutputs() != this->m_Functor->GetGrid().GetSize()) { itkExceptionMacro("Error. Number of computed output Images does not match Grid size!"); } /** @todo #1 Better solution than all this code! * This was copied from TestingHelper/TestArtifactGenerator. Just instantiating a mitk::Image and setting its Volumes * in the for-loop did not work somehow. * This was a work around */ typedef itk::Image DynamicITKImageType; Image::Pointer dynamicImage= Image::New(); mitk::Image::Pointer tempImage = mitk::ImportItkImage(filter->GetOutput(0))->Clone(); DynamicITKImageType::Pointer dynamicITKImage = DynamicITKImageType::New(); DynamicITKImageType::RegionType dynamicITKRegion; DynamicITKImageType::PointType dynamicITKOrigin; DynamicITKImageType::IndexType dynamicITKIndex; DynamicITKImageType::SpacingType dynamicITKSpacing; dynamicITKSpacing[0] = tempImage->GetGeometry()->GetSpacing()[0]; dynamicITKSpacing[1] = tempImage->GetGeometry()->GetSpacing()[1]; dynamicITKSpacing[2] = tempImage->GetGeometry()->GetSpacing()[2]; dynamicITKSpacing[3] = 3.0; dynamicITKIndex[0] = 0; // The first pixel of the REGION dynamicITKIndex[1] = 0; dynamicITKIndex[2] = 0; dynamicITKIndex[3] = 0; dynamicITKRegion.SetSize( 0,tempImage->GetDimension(0)); dynamicITKRegion.SetSize( 1,tempImage->GetDimension(1)); dynamicITKRegion.SetSize( 2,tempImage->GetDimension(2)); dynamicITKRegion.SetSize(3, filter->GetNumberOfOutputs()); dynamicITKRegion.SetIndex( dynamicITKIndex ); dynamicITKOrigin[0]=tempImage->GetGeometry()->GetOrigin()[0]; dynamicITKOrigin[1]=tempImage->GetGeometry()->GetOrigin()[1]; dynamicITKOrigin[2]=tempImage->GetGeometry()->GetOrigin()[2]; dynamicITKImage->SetOrigin(dynamicITKOrigin); dynamicITKImage->SetSpacing(dynamicITKSpacing); dynamicITKImage->SetRegions( dynamicITKRegion); dynamicITKImage->Allocate(); dynamicITKImage->FillBuffer(0); //not sure if this is necessary // Convert mitk::CastToMitkImage(dynamicITKImage, dynamicImage); ArbitraryTimeGeometry::Pointer timeGeometry = ArbitraryTimeGeometry::New(); timeGeometry->ClearAllGeometries(); auto nrOfOutputs = filter->GetNumberOfOutputs(); auto grid = this->m_Functor->GetGrid(); for (unsigned int i = 0; iGetOutput(i))->Clone(); - - dynamicImage->SetVolume(frame->GetVolumeData()->GetData(),i); + mitk::ImageReadAccessor readAccess(frame, frame->GetVolumeData(0)); + dynamicImage->SetVolume(readAccess.GetData(),i); double tmax = 0; if (i<(nrOfOutputs - 1)) { tmax = grid[i + 1] * 1000; } else { tmax = grid[i] * 1000; } timeGeometry->AppendNewTimeStepClone(frame->GetGeometry(), grid[i] * 1000, tmax); } dynamicImage->SetTimeGeometry(timeGeometry); this->m_ResultImage = dynamicImage->Clone(); } diff --git a/Modules/PharmacokineticsUI/CMakeLists.txt b/Modules/PharmacokineticsUI/CMakeLists.txt index a407d55023..f9adf7c888 100644 --- a/Modules/PharmacokineticsUI/CMakeLists.txt +++ b/Modules/PharmacokineticsUI/CMakeLists.txt @@ -1,6 +1,5 @@ MITK_CREATE_MODULE(PharmacokineticsUI INCLUDE_DIRS Common Qmitk DEPENDS MitkPharmacokinetics MitkQtWidgets MitkQtWidgetsExt PACKAGE_DEPENDS Qt5|Core CTK|CTKWidgets Boost -WARNINGS_NO_ERRORS )