summaryrefslogtreecommitdiffstats
path: root/include/astra/DataProjectorPolicies.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/astra/DataProjectorPolicies.h')
-rw-r--r--include/astra/DataProjectorPolicies.h382
1 files changed, 382 insertions, 0 deletions
diff --git a/include/astra/DataProjectorPolicies.h b/include/astra/DataProjectorPolicies.h
new file mode 100644
index 0000000..5ec08bd
--- /dev/null
+++ b/include/astra/DataProjectorPolicies.h
@@ -0,0 +1,382 @@
+/*
+-----------------------------------------------------------------------
+Copyright 2012 iMinds-Vision Lab, University of Antwerp
+
+Contact: astra@ua.ac.be
+Website: http://astra.ua.ac.be
+
+
+This file is part of the
+All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
+
+The ASTRA Toolbox is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+The ASTRA Toolbox is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+
+-----------------------------------------------------------------------
+$Id$
+*/
+
+#ifndef _INC_ASTRA_DATAPROJECTORPOLICIES
+#define _INC_ASTRA_DATAPROJECTORPOLICIES
+
+#include "Globals.h"
+#include "Config.h"
+
+#include <list>
+
+#include "Float32ProjectionData2D.h"
+#include "Float32VolumeData2D.h"
+
+namespace astra {
+
+//enum {PixelDrivenPolicy, RayDrivenPolicy, AllPolicy} PolicyType;
+
+
+//----------------------------------------------------------------------------------------
+/** Policy for Default Forward Projection (Ray Driven)
+ */
+class DefaultFPPolicy {
+
+ //< Projection Data
+ CFloat32ProjectionData2D* m_pProjectionData;
+ //< Volume Data
+ CFloat32VolumeData2D* m_pVolumeData;
+
+public:
+ FORCEINLINE DefaultFPPolicy();
+ FORCEINLINE DefaultFPPolicy(CFloat32VolumeData2D* _pVolumeData, CFloat32ProjectionData2D* _pProjectionData);
+ FORCEINLINE ~DefaultFPPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+
+//----------------------------------------------------------------------------------------
+/** Policy for Default Back Projection. (Ray+Pixel Driven)
+ * This does VolumeData += transpose(ProjectionMap) * ProjectionData.
+ */
+class DefaultBPPolicy {
+
+ //< Projection Data
+ CFloat32ProjectionData2D* m_pProjectionData;
+ //< Volume Data
+ CFloat32VolumeData2D* m_pVolumeData;
+
+public:
+ FORCEINLINE DefaultBPPolicy();
+ FORCEINLINE DefaultBPPolicy(CFloat32VolumeData2D* _pVolumeData, CFloat32ProjectionData2D* _pProjectionData);
+ FORCEINLINE ~DefaultBPPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+
+
+//----------------------------------------------------------------------------------------
+/** Policy For Calculating the Projection Difference between Volume Data and Projection Data (Ray Driven)
+ */
+class DiffFPPolicy {
+
+ CFloat32ProjectionData2D* m_pDiffProjectionData;
+ CFloat32ProjectionData2D* m_pBaseProjectionData;
+ CFloat32VolumeData2D* m_pVolumeData;
+public:
+
+ FORCEINLINE DiffFPPolicy();
+ FORCEINLINE DiffFPPolicy(CFloat32VolumeData2D* _vol_data, CFloat32ProjectionData2D* _proj_data, CFloat32ProjectionData2D* _proj_data_base);
+ FORCEINLINE ~DiffFPPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Store Pixel Weights (Ray+Pixel Driven)
+ */
+class StorePixelWeightsPolicy {
+
+ SPixelWeight* m_pPixelWeights;
+ int m_iMaxPixelCount;
+ int m_iStoredPixelCount;
+
+public:
+
+ FORCEINLINE StorePixelWeightsPolicy();
+ FORCEINLINE StorePixelWeightsPolicy(SPixelWeight* _pPixelWeights, int _iMaxPixelCount);
+ FORCEINLINE ~StorePixelWeightsPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 _fWeight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+
+ FORCEINLINE int getStoredPixelCount();
+};
+
+
+//----------------------------------------------------------------------------------------
+/** Policy For Calculating the Total Pixel Weight Multiplied by Sinogram
+ */
+class TotalPixelWeightBySinogramPolicy {
+
+ CFloat32VolumeData2D* m_pPixelWeight;
+ CFloat32ProjectionData2D* m_pSinogram;
+
+public:
+
+ FORCEINLINE TotalPixelWeightBySinogramPolicy();
+ FORCEINLINE TotalPixelWeightBySinogramPolicy(CFloat32ProjectionData2D* _pSinogram, CFloat32VolumeData2D* _pPixelWeight);
+ FORCEINLINE ~TotalPixelWeightBySinogramPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Policy For Calculating the Total Pixel Weight
+ */
+class TotalPixelWeightPolicy {
+
+ CFloat32VolumeData2D* m_pPixelWeight;
+
+public:
+
+ FORCEINLINE TotalPixelWeightPolicy();
+ FORCEINLINE TotalPixelWeightPolicy(CFloat32VolumeData2D* _pPixelWeight);
+ FORCEINLINE ~TotalPixelWeightPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Policy For Calculating the the Total Ray Length
+ */
+class TotalRayLengthPolicy {
+
+ CFloat32ProjectionData2D* m_pRayLength;
+
+public:
+
+ FORCEINLINE TotalRayLengthPolicy();
+ FORCEINLINE TotalRayLengthPolicy(CFloat32ProjectionData2D* _pRayLength);
+ FORCEINLINE ~TotalRayLengthPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+
+//----------------------------------------------------------------------------------------
+/** Policy For Combining Two Policies
+ */
+template<typename P1, typename P2>
+class CombinePolicy {
+
+ P1 policy1;
+ P2 policy2;
+
+public:
+
+ FORCEINLINE CombinePolicy();
+ FORCEINLINE CombinePolicy(P1 _policy1, P2 _policy2);
+ FORCEINLINE ~CombinePolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Policy For Combining Three Policies
+ */
+template<typename P1, typename P2, typename P3>
+class Combine3Policy {
+
+ P1 policy1;
+ P2 policy2;
+ P3 policy3;
+
+public:
+
+ FORCEINLINE Combine3Policy();
+ FORCEINLINE Combine3Policy(P1 _policy1, P2 _policy2, P3 _policy3);
+ FORCEINLINE ~Combine3Policy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Policy For Combining Four Policies
+ */
+template<typename P1, typename P2, typename P3, typename P4>
+class Combine4Policy {
+
+ P1 policy1;
+ P2 policy2;
+ P3 policy3;
+ P4 policy4;
+
+public:
+
+ FORCEINLINE Combine4Policy();
+ FORCEINLINE Combine4Policy(P1 _policy1, P2 _policy2, P3 _policy3, P4 _policy4);
+ FORCEINLINE ~Combine4Policy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Policy For Combining a List of the same Policies
+ */
+template<typename P>
+class CombineListPolicy {
+
+ std::vector<P> policyList;
+ unsigned int size;
+
+public:
+
+ FORCEINLINE CombineListPolicy();
+ FORCEINLINE CombineListPolicy(std::vector<P> _policyList);
+ FORCEINLINE ~CombineListPolicy();
+
+ FORCEINLINE void addPolicy(P _policy);
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Empty Policy
+ */
+class EmptyPolicy {
+
+public:
+
+ FORCEINLINE EmptyPolicy();
+ FORCEINLINE ~EmptyPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Policy For SIRT Backprojection
+ */
+class SIRTBPPolicy {
+
+ CFloat32ProjectionData2D* m_pSinogram;
+ CFloat32VolumeData2D* m_pReconstruction;
+
+ CFloat32ProjectionData2D* m_pTotalRayLength;
+ CFloat32VolumeData2D* m_pTotalPixelWeight;
+
+public:
+
+ FORCEINLINE SIRTBPPolicy();
+ FORCEINLINE SIRTBPPolicy(CFloat32VolumeData2D* _pReconstruction, CFloat32ProjectionData2D* _pSinogram, CFloat32VolumeData2D* _pTotalPixelWeight, CFloat32ProjectionData2D* _pTotalRayLength);
+ FORCEINLINE ~SIRTBPPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+
+//----------------------------------------------------------------------------------------
+/** Policy For Sinogram Mask
+ */
+class SinogramMaskPolicy {
+
+ CFloat32ProjectionData2D* m_pSinogramMask;
+
+public:
+
+ FORCEINLINE SinogramMaskPolicy();
+ FORCEINLINE SinogramMaskPolicy(CFloat32ProjectionData2D* _pSinogramMask);
+ FORCEINLINE ~SinogramMaskPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+/** Policy For Reconstruction Mask
+ */
+class ReconstructionMaskPolicy {
+
+ CFloat32VolumeData2D* m_pReconstructionMask;
+
+public:
+
+ FORCEINLINE ReconstructionMaskPolicy();
+ FORCEINLINE ReconstructionMaskPolicy(CFloat32VolumeData2D* _pReconstructionMask);
+ FORCEINLINE ~ReconstructionMaskPolicy();
+
+ FORCEINLINE bool rayPrior(int _iRayIndex);
+ FORCEINLINE bool pixelPrior(int _iVolumeIndex);
+ FORCEINLINE void addWeight(int _iRayIndex, int _iVolumeIndex, float32 weight);
+ FORCEINLINE void rayPosterior(int _iRayIndex);
+ FORCEINLINE void pixelPosterior(int _iVolumeIndex);
+};
+
+//----------------------------------------------------------------------------------------
+
+#include "DataProjectorPolicies.inl"
+
+} // end namespace
+
+#endif