/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkDemonsImageToImageMetricv4GetValueAndDerivativeThreader_h #define itkDemonsImageToImageMetricv4GetValueAndDerivativeThreader_h #include "itkImageToImageMetricv4GetValueAndDerivativeThreader.h" namespace itk { /** \class DemonsImageToImageMetricv4GetValueAndDerivativeThreader * \brief Processes points for DemonsImageToImageMetricv4 \c * GetValueAndDerivative. * * \ingroup ITKMetricsv4 */ template class ITK_TEMPLATE_EXPORT DemonsImageToImageMetricv4GetValueAndDerivativeThreader : public ImageToImageMetricv4GetValueAndDerivativeThreader { public: ITK_DISALLOW_COPY_AND_MOVE(DemonsImageToImageMetricv4GetValueAndDerivativeThreader); /** Standard class type aliases. */ using Self = DemonsImageToImageMetricv4GetValueAndDerivativeThreader; using Superclass = ImageToImageMetricv4GetValueAndDerivativeThreader; using Pointer = SmartPointer; using ConstPointer = SmartPointer; itkOverrideGetNameOfClassMacro(DemonsImageToImageMetricv4GetValueAndDerivativeThreader); itkNewMacro(Self); using typename Superclass::DomainType; using typename Superclass::AssociateType; using ImageToImageMetricv4Type = typename Superclass::ImageToImageMetricv4Type; using typename Superclass::VirtualPointType; using typename Superclass::VirtualIndexType; using typename Superclass::FixedImagePointType; using typename Superclass::FixedImagePixelType; using typename Superclass::FixedImageGradientType; using typename Superclass::MovingImagePointType; using typename Superclass::MovingImagePixelType; using typename Superclass::MovingImageGradientType; using typename Superclass::MeasureType; using typename Superclass::DerivativeType; using typename Superclass::DerivativeValueType; using typename Superclass::InternalComputationValueType; using typename Superclass::NumberOfParametersType; using typename Superclass::ImageDimensionType; protected: DemonsImageToImageMetricv4GetValueAndDerivativeThreader() : m_DemonsAssociate(nullptr) {} /** Overload. * Get pointer to metric object. */ void BeforeThreadedExecution() override; /** This function computes the local voxel-wise contribution of * the metric to the global integral of the metric/derivative. */ bool ProcessPoint(const VirtualIndexType & virtualIndex, const VirtualPointType & virtualPoint, const FixedImagePointType & mappedFixedPoint, const FixedImagePixelType & fixedImageValue, const FixedImageGradientType & fixedImageGradient, const MovingImagePointType & mappedMovingPoint, const MovingImagePixelType & movingImageValue, const MovingImageGradientType & movingImageGradient, MeasureType & metricValueReturn, DerivativeType & localDerivativeReturn, const ThreadIdType threadId) const override; private: /** Internal pointer to the Mattes metric object in use by this threader. * This will avoid costly dynamic casting in tight loops. */ TDemonsMetric * m_DemonsAssociate{}; }; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION # include "itkDemonsImageToImageMetricv4GetValueAndDerivativeThreader.hxx" #endif #endif