summaryrefslogtreecommitdiffstats
path: root/cuda/3d/astra3d.h
diff options
context:
space:
mode:
Diffstat (limited to 'cuda/3d/astra3d.h')
-rw-r--r--cuda/3d/astra3d.h314
1 files changed, 0 insertions, 314 deletions
diff --git a/cuda/3d/astra3d.h b/cuda/3d/astra3d.h
deleted file mode 100644
index 0ea752d..0000000
--- a/cuda/3d/astra3d.h
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
------------------------------------------------------------------------
-Copyright: 2010-2018, imec Vision Lab, University of Antwerp
- 2014-2018, CWI, Amsterdam
-
-Contact: astra@astra-toolbox.com
-Website: http://www.astra-toolbox.com/
-
-This file is part of the 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/>.
-
------------------------------------------------------------------------
-*/
-
-#ifndef _CUDA_ASTRA3D_H
-#define _CUDA_ASTRA3D_H
-
-#include "dims3d.h"
-
-namespace astra {
-
-
-// TODO: Switch to a class hierarchy as with the 2D algorithms
-
-
-class CProjectionGeometry3D;
-class CParallelProjectionGeometry3D;
-class CParallelVecProjectionGeometry3D;
-class CConeProjectionGeometry3D;
-class CConeVecProjectionGeometry3D;
-class CVolumeGeometry3D;
-class AstraSIRT3d_internal;
-
-using astraCUDA3d::Cuda3DProjectionKernel;
-using astraCUDA3d::ker3d_default;
-using astraCUDA3d::ker3d_sum_square_weights;
-
-
-class _AstraExport AstraSIRT3d {
-public:
-
- AstraSIRT3d();
- ~AstraSIRT3d();
-
- // Set the volume and projection geometry
- bool setGeometry(const CVolumeGeometry3D* pVolGeom,
- const CProjectionGeometry3D* pProjGeom);
-
- // Enable supersampling.
- //
- // The number of rays used in FP is the square of iDetectorSuperSampling.
- // The number of rays used in BP is the cube of iVoxelSuperSampling.
- bool enableSuperSampling(unsigned int iVoxelSuperSampling,
- unsigned int iDetectorSuperSampling);
-
- void setRelaxation(float r);
-
- // Enable volume/sinogram masks
- //
- // This may optionally be called before init().
- // If it is called, setVolumeMask()/setSinogramMask() must be called between
- // setSinogram() and iterate().
- bool enableVolumeMask();
- bool enableSinogramMask();
-
- // Set GPU index
- //
- // This should be called before init(). Note that setting the GPU index
- // in a thread which has already used the GPU may not work.
- bool setGPUIndex(int index);
-
- // Allocate GPU buffers and
- // precompute geometry-specific data.
- //
- // This must be called after calling setReconstructionGeometry() and
- // setProjectionGeometry() or setFanProjectionGeometry().
- bool init();
-
- // Setup input sinogram for a slice.
- // pfSinogram must be a float array of size XXX
- // NB: iSinogramPitch is measured in floats, not in bytes.
- //
- // This must be called after init(), and before iterate(). It may be
- // called again after iterate()/getReconstruction() to start a new slice.
- //
- // pfSinogram will only be read from during this call.
- bool setSinogram(const float* pfSinogram, unsigned int iSinogramPitch);
-
- // Setup volume mask for a slice.
- // pfMask must be a float array of size XXX
- // NB: iMaskPitch is measured in floats, not in bytes.
- //
- // It may only contain the exact values 0.0f and 1.0f. Only volume pixels
- // for which pfMask[z] is 1.0f are processed.
- bool setVolumeMask(const float* pfMask, unsigned int iMaskPitch);
-
- // Setup sinogram mask for a slice.
- // pfMask must be a float array of size XXX
- // NB: iMaskPitch is measured in floats, not in bytes.
- //
- // It may only contain the exact values 0.0f and 1.0f. Only sinogram pixels
- // for which pfMask[z] is 1.0f are processed.
- bool setSinogramMask(const float* pfMask, unsigned int iMaskPitch);
-
- // Set the starting reconstruction for SIRT.
- // pfReconstruction must be a float array of size XXX
- // NB: iReconstructionPitch is measured in floats, not in bytes.
- //
- // This may be called between setSinogram() and iterate().
- // If this function is not called before iterate(), SIRT will start
- // from a zero reconstruction.
- //
- // pfReconstruction will only be read from during this call.
- bool setStartReconstruction(const float* pfReconstruction,
- unsigned int iReconstructionPitch);
-
- // Enable min/max constraint.
- //
- // These may optionally be called between init() and iterate()
- bool setMinConstraint(float fMin);
- bool setMaxConstraint(float fMax);
-
- // Perform a number of (additive) SIRT iterations.
- // This must be called after setSinogram().
- //
- // If called multiple times, without calls to setSinogram() or
- // setStartReconstruction() in between, iterate() will continue from
- // the result of the previous call.
- // Calls to getReconstruction() are allowed between calls to iterate() and
- // do not change the state.
- bool iterate(unsigned int iIterations);
-
- // Get the reconstructed slice.
- // pfReconstruction must be a float array of size XXX
- // NB: iReconstructionPitch is measured in floats, not in bytes.
- //
- // This may be called after iterate().
- bool getReconstruction(float* pfReconstruction,
- unsigned int iReconstructionPitch) const;
-
- // Compute the norm of the difference of the FP of the current
- // reconstruction and the sinogram. (This performs one FP.)
- // It can be called after iterate().
- float computeDiffNorm();
-
- // Signal the algorithm that it should abort after the current iteration.
- // This is intended to be called from another thread.
- void signalAbort();
-
-protected:
- AstraSIRT3d_internal *pData;
-};
-
-
-class AstraCGLS3d_internal;
-
-
-class _AstraExport AstraCGLS3d {
-public:
-
- AstraCGLS3d();
- ~AstraCGLS3d();
-
- // Set the volume and projection geometry
- bool setGeometry(const CVolumeGeometry3D* pVolGeom,
- const CProjectionGeometry3D* pProjGeom);
-
- // Enable supersampling.
- //
- // The number of rays used in FP is the square of iDetectorSuperSampling.
- // The number of rays used in BP is the cube of iVoxelSuperSampling.
- bool enableSuperSampling(unsigned int iVoxelSuperSampling,
- unsigned int iDetectorSuperSampling);
-
- // Enable volume/sinogram masks
- //
- // This may optionally be called before init().
- // If it is called, setVolumeMask()/setSinogramMask() must be called between
- // setSinogram() and iterate().
- bool enableVolumeMask();
- //bool enableSinogramMask();
-
- // Set GPU index
- //
- // This should be called before init(). Note that setting the GPU index
- // in a thread which has already used the GPU may not work.
- bool setGPUIndex(int index);
-
- // Allocate GPU buffers and
- // precompute geometry-specific data.
- //
- // This must be called after calling setReconstructionGeometry() and
- // setProjectionGeometry() or setFanProjectionGeometry().
- bool init();
-
- // Setup input sinogram for a slice.
- // pfSinogram must be a float array of size XXX
- // NB: iSinogramPitch is measured in floats, not in bytes.
- //
- // This must be called after init(), and before iterate(). It may be
- // called again after iterate()/getReconstruction() to start a new slice.
- //
- // pfSinogram will only be read from during this call.
- bool setSinogram(const float* pfSinogram, unsigned int iSinogramPitch);
-
- // Setup volume mask for a slice.
- // pfMask must be a float array of size XXX
- // NB: iMaskPitch is measured in floats, not in bytes.
- //
- // It may only contain the exact values 0.0f and 1.0f. Only volume pixels
- // for which pfMask[z] is 1.0f are processed.
- bool setVolumeMask(const float* pfMask, unsigned int iMaskPitch);
-
- // Setup sinogram mask for a slice.
- // pfMask must be a float array of size XXX
- // NB: iMaskPitch is measured in floats, not in bytes.
- //
- // It may only contain the exact values 0.0f and 1.0f. Only sinogram pixels
- // for which pfMask[z] is 1.0f are processed.
- //bool setSinogramMask(const float* pfMask, unsigned int iMaskPitch);
-
- // Set the starting reconstruction for SIRT.
- // pfReconstruction must be a float array of size XXX
- // NB: iReconstructionPitch is measured in floats, not in bytes.
- //
- // This may be called between setSinogram() and iterate().
- // If this function is not called before iterate(), SIRT will start
- // from a zero reconstruction.
- //
- // pfReconstruction will only be read from during this call.
- bool setStartReconstruction(const float* pfReconstruction,
- unsigned int iReconstructionPitch);
-
- // Enable min/max constraint.
- //
- // These may optionally be called between init() and iterate()
- //bool setMinConstraint(float fMin);
- //bool setMaxConstraint(float fMax);
-
- // Perform a number of (additive) SIRT iterations.
- // This must be called after setSinogram().
- //
- // If called multiple times, without calls to setSinogram() or
- // setStartReconstruction() in between, iterate() will continue from
- // the result of the previous call.
- // Calls to getReconstruction() are allowed between calls to iterate() and
- // do not change the state.
- bool iterate(unsigned int iIterations);
-
- // Get the reconstructed slice.
- // pfReconstruction must be a float array of size XXX
- // NB: iReconstructionPitch is measured in floats, not in bytes.
- //
- // This may be called after iterate().
- bool getReconstruction(float* pfReconstruction,
- unsigned int iReconstructionPitch) const;
-
- // Compute the norm of the difference of the FP of the current
- // reconstruction and the sinogram. (This performs one FP.)
- // It can be called after iterate().
- float computeDiffNorm();
-
- // Signal the algorithm that it should abort after the current iteration.
- // This is intended to be called from another thread.
- void signalAbort();
-
-protected:
- AstraCGLS3d_internal *pData;
-};
-
-bool convertAstraGeometry_dims(const CVolumeGeometry3D* pVolGeom,
- const CProjectionGeometry3D* pProjGeom,
- astraCUDA3d::SDimensions3D& dims);
-
-bool convertAstraGeometry(const CVolumeGeometry3D* pVolGeom,
- const CProjectionGeometry3D* pProjGeom,
- SPar3DProjection*& pParProjs,
- SConeProjection*& pConeProjs,
- astraCUDA3d::SProjectorParams3D& params);
-
-_AstraExport bool astraCudaFP(const float* pfVolume, float* pfProjections,
- const CVolumeGeometry3D* pVolGeom,
- const CProjectionGeometry3D* pProjGeom,
- int iGPUIndex, int iDetectorSuperSampling,
- Cuda3DProjectionKernel projKernel);
-
-
-_AstraExport bool astraCudaBP(float* pfVolume, const float* pfProjections,
- const CVolumeGeometry3D* pVolGeom,
- const CProjectionGeometry3D* pProjGeom,
- int iGPUIndex, int iVoxelSuperSampling);
-
-_AstraExport bool astraCudaBP_SIRTWeighted(float* pfVolume, const float* pfProjections,
- const CVolumeGeometry3D* pVolGeom,
- const CProjectionGeometry3D* pProjGeom,
- int iGPUIndex, int iVoxelSuperSampling);
-
-}
-
-
-#endif