diff --git a/Modules/Pharmacokinetics/include/mitkStandardToftsModel.h b/Modules/Pharmacokinetics/include/mitkStandardToftsModel.h index ee6f7d6b4b..bea02f08d2 100644 --- a/Modules/Pharmacokinetics/include/mitkStandardToftsModel.h +++ b/Modules/Pharmacokinetics/include/mitkStandardToftsModel.h @@ -1,115 +1,113 @@ /*============================================================================ 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 mitkStandardToftsModel_h #define mitkStandardToftsModel_h #include "mitkAIFBasedModelBase.h" #include "MitkPharmacokineticsExports.h" namespace mitk { /** @class StandardToftsModel * @brief Implementation of the Model function of the Tofts pharmacokinetic model, using an Aterial Input Function * The Model calculates the Concentration-Time-Curve as a convolution of the plasma curve Cp (the AIF) and a tissue specific * residue function (in this case an exponential: R(t) = ktrans * exp(-ktrans/ve * (t)) ). * C(t) = vp * Cp(t) + conv(Cp(t),R(t)) * The parameters ktrans, ve and ve are subject to the fitting routine*/ class MITKPHARMACOKINETICS_EXPORT StandardToftsModel : public AIFBasedModelBase { public: typedef StandardToftsModel Self; typedef AIFBasedModelBase Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; /** Method for creation through the object factory. */ itkFactorylessNewMacro(Self); itkCloneMacro(Self); /** Run-time type information (and related methods). */ itkTypeMacro(StandardToftsModel, ModelBase); static const std::string NAME_PARAMETER_Ktrans; static const std::string NAME_PARAMETER_ve; static const std::string UNIT_PARAMETER_Ktrans; static const std::string UNIT_PARAMETER_ve; static const unsigned int POSITION_PARAMETER_Ktrans; static const unsigned int POSITION_PARAMETER_ve; static const unsigned int NUMBER_OF_PARAMETERS; static const std::string NAME_DERIVED_PARAMETER_kep; static const unsigned int NUMBER_OF_DERIVED_PARAMETERS; static const std::string UNIT_DERIVED_PARAMETER_kep; static const std::string MODEL_DISPLAY_NAME; static const std::string MODEL_TYPE; - static const std::string FUNCTION_STRING; - std::string GetModelDisplayName() const override; std::string GetModelType() const override; ParameterNamesType GetParameterNames() const override; ParametersSizeType GetNumberOfParameters() const override; ParamterUnitMapType GetParameterUnits() const override; ParameterNamesType GetDerivedParameterNames() const override; ParametersSizeType GetNumberOfDerivedParameters() const override; ParamterUnitMapType GetDerivedParameterUnits() const override; protected: StandardToftsModel(); ~StandardToftsModel() 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; DerivedParameterMapType ComputeDerivedParameters(const mitk::ModelBase::ParametersType& parameters) const override; void PrintSelf(std::ostream& os, ::itk::Indent indent) const override; private: //No copy constructor allowed StandardToftsModel(const Self& source); void operator=(const Self&); //purposely not implemented }; } #endif diff --git a/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp b/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp index 3adef8ab98..2dcc396a01 100644 --- a/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp +++ b/Modules/Pharmacokinetics/src/Models/mitkStandardToftsModel.cpp @@ -1,180 +1,178 @@ /*============================================================================ 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 "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 = "K^trans"; const std::string mitk::StandardToftsModel::NAME_PARAMETER_ve = "v_e"; 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; const std::string mitk::StandardToftsModel::NAME_DERIVED_PARAMETER_kep = "k_{e->p}"; const unsigned int mitk::StandardToftsModel::NUMBER_OF_DERIVED_PARAMETERS = 1; const std::string mitk::StandardToftsModel::UNIT_DERIVED_PARAMETER_kep = "1/min"; const std::string mitk::StandardToftsModel::MODEL_TYPE = "Perfusion.MR"; -const std::string mitk::StandardToftsModel::FUNCTION_STRING = ""; - std::string mitk::StandardToftsModel::GetModelDisplayName() const { return MODEL_DISPLAY_NAME; }; std::string mitk::StandardToftsModel::GetModelType() const { return MODEL_TYPE; }; 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(NAME_DERIVED_PARAMETER_kep); return result; }; mitk::StandardToftsModel::ParametersSizeType mitk::StandardToftsModel::GetNumberOfDerivedParameters() const { return NUMBER_OF_DERIVED_PARAMETERS; }; mitk::StandardToftsModel::ParamterUnitMapType mitk::StandardToftsModel::GetDerivedParameterUnits() const { ParamterUnitMapType result; result.insert(std::make_pair(NAME_DERIVED_PARAMETER_kep, UNIT_DERIVED_PARAMETER_kep)); return result; }; mitk::StandardToftsModel::ModelResultType mitk::StandardToftsModel::ComputeModelfunction( const ParametersType& parameters) const { 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(NAME_DERIVED_PARAMETER_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); };