/* ----------------------------------------------------------------------- Copyright: 2010-2018, iMinds-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 . ----------------------------------------------------------------------- */ #ifndef INC_ASTRA_PROJECTOR2D #define INC_ASTRA_PROJECTOR2D #include #include #include "Globals.h" #include "Config.h" #include "Float32Data2D.h" #include "ParallelProjectionGeometry2D.h" #include "ProjectionGeometry2D.h" #include "VolumeGeometry2D.h" namespace astra { class CSparseMatrix; /** This is a base interface class for a two-dimensional projector. Each subclass should at least * implement the core projection functions computeProjectionRayWeights and projectPoint. For * extra efficiency one might also like to overwrite other functions such as computeProjectionRayWeights, * computeRayForwardProj_ART, ... * * \par XML Configuration * \astra_xml_item{ProjectionGeometry, xml node, The geometry of the projection.} * \astra_xml_item{VolumeGeometry, xml node, The geometry of the volume.} */ class _AstraExport CProjector2D { protected: CProjectionGeometry2D* m_pProjectionGeometry; ///< Used projection geometry CVolumeGeometry2D* m_pVolumeGeometry; ///< Used volume geometry bool m_bIsInitialized; ///< Has this class been initialized? /** Default Constructor. */ CProjector2D(); /** Constructor. * * @param _pProjectionGeometry Information class about the geometry of the projection. Will be HARDCOPIED. * @param _pVolumeGeometry Information class about the geometry of the reconstruction volume. Will be HARDCOPIED. */ CProjector2D(CProjectionGeometry2D* _pProjectionGeometry, CVolumeGeometry2D* _pVolumeGeometry); /** Initial clearing. Only to be used by constructors. */ virtual void _clear(); /** Check the values of this object. If everything is ok, the object can be set to the initialized state. * The following statements are then guaranteed to hold: * - no NULL pointers * - all sub-objects are initialized properly */ virtual bool _check(); public: /** Destructor. */ virtual ~CProjector2D(); /** Clear this class. */ virtual void clear(); /** Initialize the projector with a config object. * This function does not set m_bInitialized to true. * * @param _cfg Configuration Object * @return initialization successful? */ virtual bool initialize(const Config& _cfg); /** Fetch the Projection Geometry of this projector. * * @return Projection Geometry class. */ CProjectionGeometry2D* getProjectionGeometry(); /** Fetch the Volume Geometry of this projector. * * @return Volume Geometry class. */ CVolumeGeometry2D* getVolumeGeometry(); /** Compute the pixel weights for a single ray, from the source to a detector pixel. * * @param _iProjectionIndex Index of the projection * @param _iDetectorIndex Index of the detector pixel * @param _pWeightedPixels Pointer to a pre-allocated array, consisting of _iMaxPixelCount elements * of type SPixelWeight. On return, this array contains a list of the index * and weight for all pixels on the ray. * @param _iMaxPixelCount Maximum number of pixels (and corresponding weights) that can be stored in _pWeightedPixels. * This number MUST be greater than the total number of pixels on the ray. * @param _iStoredPixelCount On return, this variable contains the total number of pixels on the * ray (that have been stored in the list _pWeightedPixels). */ virtual void computeSingleRayWeights(int _iProjectionIndex, int _iDetectorIndex, SPixelWeight *_pWeightedPixels, int _iMaxPixelCount, int &_iStoredPixelCount) = 0; /** Compute the pixel weights for all rays in a single projection, from the source to a each of the * detector pixels. All pixels and their weights are stored consecutively in the array _pWeightedPixels. * The array starts with all pixels on the first ray, followed by all pixels on the second ray, the third * ray, etc. Note that a pixel may occur in the list more than once, as it can be on several rays. * * @param _iProjectionIndex Index of the projection (zero-based). * @param _pfWeightedPixels Pointer to a pre-allocated array, consisting of getProjectionWeightsCount() * elements of type SPixelWeight. On return, this array contains a list of * the index and weight for all pixels on each of the rays. The elements for * every ray start at equal offsets (ray_index * _pWeightedPixels / ray_count). * @param _piRayStoredPixelCount Pointer to a pre-allocated array, containing a single integer for each * ray in the projection. On return, this array contains the number of * pixels on the ray, for each ray in the given projection. */ virtual void computeProjectionRayWeights(int _iProjectionIndex, SPixelWeight* _pfWeightedPixels, int* _piRayStoredPixelCount); /** Create a list of detectors that are influenced by point [_iRow, _iCol]. * * @param _iRow row of the point * @param _iCol column of the point * @return list of SDetector2D structs */ virtual std::vector projectPoint(int _iRow, int _iCol) = 0; /** Returns the number of weights required for storage of all weights of one projection ray. * * @param _iProjectionIndex Index of the projection (zero-based). * @return Size of buffer (given in SPixelWeight elements) needed to store weighted pixels. */ virtual int getProjectionWeightsCount(int _iProjectionIndex) = 0; /** Returns the projection as an explicit sparse matrix. * @return a newly allocated CSparseMatrix. Delete afterwards. */ CSparseMatrix* getMatrix(); /** Has the projector been initialized? * * @return initialized successfully */ bool isInitialized() const; /** get a description of the class * * @return description string */ virtual std::string description() const {return " ";}; virtual std::string getType() { return " "; } private: //< For Config unused argument checking ConfigCheckData* configCheckData; friend class ConfigStackCheck; }; // inline functions inline bool CProjector2D::isInitialized() const { return m_bIsInitialized; } inline CProjectionGeometry2D* CProjector2D::getProjectionGeometry() { return m_pProjectionGeometry; } inline CVolumeGeometry2D* CProjector2D::getVolumeGeometry() { return m_pVolumeGeometry; } } // namespace astra #endif /* INC_ASTRA_PROJECTOR2D */