/*
-----------------------------------------------------------------------
Copyright: 2010-2021, imec Vision Lab, University of Antwerp
2014-2021, 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_PROJECTOR3D
#define INC_ASTRA_PROJECTOR3D
#include
#include
#include "Globals.h"
#include "Config.h"
namespace astra
{
class CSparseMatrix;
class CProjectionGeometry3D;
class CVolumeGeometry3D;
/** This is a base interface class for a three-dimensional projector. Each subclass should at least
* implement the core projection functions computeProjectionRayWeights and projectPoint.
*
* \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 CProjector3D
{
protected:
CProjectionGeometry3D* m_pProjectionGeometry; ///< Used projection geometry
CVolumeGeometry3D* m_pVolumeGeometry; ///< Used volume geometry
bool m_bIsInitialized; ///< Has this class been initialized?
/** Check variable values.
*/
bool _check();
/** Clear all member variables, setting all numeric variables to 0 and all pointers to NULL.
* Should only be used by constructors. Otherwise use the clear() function.
*/
void _clear();
public:
/**
* Default Constructor.
*/
CProjector3D();
/** Destructor, is virtual to show that we are aware subclass destructor is called.
*/
virtual ~CProjector3D();
/** Clear all member variables, setting all numeric variables to 0 and all pointers to NULL.
*/
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.
*/
CProjectionGeometry3D* getProjectionGeometry();
/** Fetch the Volume Geometry of this projector.
*
* @return Volume Geometry class.
*/
CVolumeGeometry3D* getVolumeGeometry();
/** Compute the pixel weights for a single ray, from the source to a detector pixel.
*
* @param _iProjectionIndex Index of the projection.
* @param _iSliceIndex Index of the detector pixel (1-d index).
* @param _iDetectorIndex Index of the detector pixel (1-d index).
* @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 _iSliceIndex, 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.
*
* @param _iProjectionIndex Index of the projection (zero-based).
* @return Size of buffer (given in SWeightedPixel3D elements) needed to store weighted pixels.
*/
virtual int getProjectionWeightsCount(int _iProjectionIndex) = 0;
/** 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 = 0;
/**
* Returns a string describing the projector type
*/
virtual std::string getType() = 0;
private:
//< For Config unused argument checking
ConfigCheckData* configCheckData;
friend class ConfigStackCheck;
};
// inline functions
inline bool CProjector3D::isInitialized() const { return m_bIsInitialized; }
inline CProjectionGeometry3D* CProjector3D::getProjectionGeometry() { return m_pProjectionGeometry; }
inline CVolumeGeometry3D* CProjector3D::getVolumeGeometry() { return m_pVolumeGeometry; }
} // namespace astra
#endif /* INC_ASTRA_PROJECTOR3D */