diff --git a/Modules/ModelFit/include/mitkT2DecayModel.h b/Modules/ModelFit/include/mitkT2DecayModel.h index e9ac0ebf3e..6b65aac1a8 100644 --- a/Modules/ModelFit/include/mitkT2DecayModel.h +++ b/Modules/ModelFit/include/mitkT2DecayModel.h @@ -1,84 +1,95 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef __MITK_T2_DECAY_MODEL_H_ #define __MITK_T2_DECAY_MODEL_H_ #include "mitkModelBase.h" #include "MitkModelFitExports.h" namespace mitk { - /** Simple model of the MR T2 signal decay. */ + /** @class T2DecayModel + * @brief Simple model of the MR T2 signal decay. This corresponds to an exponential decay in the form of: + * f(t) = M0 * exp(-t/T2) with T2 being the transverse / spin-spin relaxation time. The derived parameter R2 + * is calculated from T2 by inversion. + */ class MITKMODELFIT_EXPORT T2DecayModel : public mitk::ModelBase { public: typedef T2DecayModel Self; typedef mitk::ModelBase Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef Superclass::ParameterNameType ParameterNameType; typedef Superclass::ParametersSizeType ParametersSizeType; /** Method for creation through the object factory. */ itkFactorylessNewMacro(Self); itkCloneMacro(Self); /** Run-time type information (and related methods). */ itkTypeMacro(T2DecayModel, ModelBase); std::string GetModelDisplayName() const override; std::string GetModelType() const override; FunctionStringType GetFunctionString() const override; std::string GetXName() const override; ParameterNamesType GetParameterNames() const override; ParametersSizeType GetNumberOfParameters() const override; ParameterNamesType GetStaticParameterNames() const override; ParametersSizeType GetNumberOfStaticParameters() const override; + DerivedParametersSizeType GetNumberOfDerivedParameters() const override; + + DerivedParameterNamesType GetDerivedParameterNames() const override; + + mitk::ModelBase::DerivedParameterMapType mitk::T2DecayModel::ComputeDerivedParameters( + const mitk::ModelBase::ParametersType ¶meters) const; + protected: T2DecayModel() {}; ~T2DecayModel() override {}; /** * Actual implementation of the clone method. This method should be reimplemeted * in subclasses to clone the extra required parameters. */ itk::LightObject::Pointer InternalClone() const override; ModelResultType ComputeModelfunction(const ParametersType& parameters) const override; void SetStaticParameter(const ParameterNameType& name, const StaticParameterValuesType& values) override; StaticParameterValuesType GetStaticParameterValue(const ParameterNameType& name) const override; private: //No copy constructor allowed T2DecayModel(const Self& source); void operator=(const Self&); //purposely not implemented }; } #endif diff --git a/Modules/ModelFit/src/Models/mitkT2DecayModel.cpp b/Modules/ModelFit/src/Models/mitkT2DecayModel.cpp index 0723cd7473..900a5a1bc7 100644 --- a/Modules/ModelFit/src/Models/mitkT2DecayModel.cpp +++ b/Modules/ModelFit/src/Models/mitkT2DecayModel.cpp @@ -1,100 +1,123 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkT2DecayModel.h" +#include "mitkNumericConstants.h" std::string mitk::T2DecayModel::GetModelDisplayName() const { return "T2 Decay Model"; }; std::string mitk::T2DecayModel::GetModelType() const { return "MRSignal"; }; mitk::T2DecayModel::FunctionStringType mitk::T2DecayModel::GetFunctionString() const { return "M0 * exp(-t/T2)"; }; std::string mitk::T2DecayModel::GetXName() const { return "t"; }; mitk::T2DecayModel::ParameterNamesType mitk::T2DecayModel::GetParameterNames() const { ParameterNamesType result; result.push_back("M0"); result.push_back("T2"); return result; }; mitk::T2DecayModel::ParametersSizeType mitk::T2DecayModel::GetNumberOfParameters() const { return 2; }; mitk::T2DecayModel::ModelResultType mitk::T2DecayModel::ComputeModelfunction(const ParametersType& parameters) const { ModelResultType signal(m_TimeGrid.GetSize()); ModelResultType::iterator signalPos = signal.begin(); for (const auto& gridPos : m_TimeGrid) { *signalPos = parameters[0] * exp(-1.0 * gridPos/ parameters[1]); + ++signalPos; } return signal; }; mitk::T2DecayModel::ParameterNamesType mitk::T2DecayModel::GetStaticParameterNames() const { ParameterNamesType result; return result; } mitk::T2DecayModel::ParametersSizeType mitk::T2DecayModel::GetNumberOfStaticParameters() const { return 0; } void mitk::T2DecayModel::SetStaticParameter(const ParameterNameType& /*name*/, const StaticParameterValuesType& /*values*/) { //do nothing }; mitk::T2DecayModel::StaticParameterValuesType mitk::T2DecayModel::GetStaticParameterValue( const ParameterNameType& /*name*/) const { StaticParameterValuesType result; //do nothing return result; }; +mitk::T2DecayModel::DerivedParametersSizeType mitk::T2DecayModel::GetNumberOfDerivedParameters() const +{ + return 1; +} + +mitk::T2DecayModel::DerivedParameterNamesType mitk::T2DecayModel::GetDerivedParameterNames() const +{ + ParameterNamesType result; + result.push_back("R2"); + return result; +}; + +mitk::ModelBase::DerivedParameterMapType mitk::T2DecayModel::ComputeDerivedParameters( + const mitk::ModelBase::ParametersType ¶meters) const +{ + DerivedParameterMapType result; + double inverse = 1.0 / (parameters[1] + mitk::eps); + result.insert(std::make_pair("R2", inverse)); + return result; +}; + itk::LightObject::Pointer mitk::T2DecayModel::InternalClone() const { T2DecayModel::Pointer newClone = T2DecayModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); };