diff options
| author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2015-10-08 11:24:49 +0200 | 
|---|---|---|
| committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2015-10-09 12:10:31 +0200 | 
| commit | 003663649a191fc5bc011d6e5424496576b5e793 (patch) | |
| tree | c7ae9cc0b3982ca461038f8c678dae834584b605 | |
| parent | 43a38c117405f99e3a1b498f899de4ba6d01a044 (diff) | |
| download | astra-003663649a191fc5bc011d6e5424496576b5e793.tar.gz astra-003663649a191fc5bc011d6e5424496576b5e793.tar.bz2 astra-003663649a191fc5bc011d6e5424496576b5e793.tar.xz astra-003663649a191fc5bc011d6e5424496576b5e793.zip | |
Improve option passing through CudaProjector2D
Not all constructors were reading options from the projector.
Also allow passing GPUIndex via CudaProjector2D.
Also refactor CudaReconstructionAlgorithm::initialize/check
to avoid code duplication with ReconstructionAlgorithm.
| -rw-r--r-- | include/astra/CudaBackProjectionAlgorithm.h | 5 | ||||
| -rw-r--r-- | include/astra/CudaCglsAlgorithm.h | 9 | ||||
| -rw-r--r-- | include/astra/CudaEMAlgorithm.h | 8 | ||||
| -rw-r--r-- | include/astra/CudaFilteredBackProjectionAlgorithm.h | 3 | ||||
| -rw-r--r-- | include/astra/CudaForwardProjectionAlgorithm.h | 27 | ||||
| -rw-r--r-- | include/astra/CudaProjector2D.h | 2 | ||||
| -rw-r--r-- | include/astra/CudaReconstructionAlgorithm2D.h | 22 | ||||
| -rw-r--r-- | include/astra/CudaSartAlgorithm.h | 7 | ||||
| -rw-r--r-- | include/astra/CudaSirtAlgorithm.h | 9 | ||||
| -rw-r--r-- | include/astra/ReconstructionAlgorithm2D.h | 3 | ||||
| -rw-r--r-- | src/CudaBackProjectionAlgorithm.cpp | 5 | ||||
| -rw-r--r-- | src/CudaCglsAlgorithm.cpp | 6 | ||||
| -rw-r--r-- | src/CudaEMAlgorithm.cpp | 6 | ||||
| -rw-r--r-- | src/CudaFilteredBackProjectionAlgorithm.cpp | 43 | ||||
| -rw-r--r-- | src/CudaForwardProjectionAlgorithm.cpp | 60 | ||||
| -rw-r--r-- | src/CudaProjector2D.cpp | 17 | ||||
| -rw-r--r-- | src/CudaReconstructionAlgorithm2D.cpp | 169 | ||||
| -rw-r--r-- | src/CudaSartAlgorithm.cpp | 5 | ||||
| -rw-r--r-- | src/CudaSirtAlgorithm.cpp | 6 | ||||
| -rw-r--r-- | src/ReconstructionAlgorithm2D.cpp | 25 | 
20 files changed, 169 insertions, 268 deletions
| diff --git a/include/astra/CudaBackProjectionAlgorithm.h b/include/astra/CudaBackProjectionAlgorithm.h index 84899b0..2450376 100644 --- a/include/astra/CudaBackProjectionAlgorithm.h +++ b/include/astra/CudaBackProjectionAlgorithm.h @@ -85,13 +85,10 @@ public:  	 * @param _pProjector		Projector Object. (Ignored)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection  	 */  	bool initialize(CProjector2D* _pProjector,  	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iPixelSuperSampling = 1); +					CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaCglsAlgorithm.h b/include/astra/CudaCglsAlgorithm.h index c51093c..6aa0343 100644 --- a/include/astra/CudaCglsAlgorithm.h +++ b/include/astra/CudaCglsAlgorithm.h @@ -91,18 +91,13 @@ public:  	/** Initialize class, use sequential order.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram  	 * @param _pReconstruction	VolumeData2D for storing the reconstruction -	 * @param _iGPUindex		Index of GPU to use. (Starting at 0.) -	 * @param _iDetectorSuperSampling Supersampling factor for the FP. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection  	 */  	bool initialize(CProjector2D* _pProjector,   					CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -					int _iPixelSuperSampling = 1); +					CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaEMAlgorithm.h b/include/astra/CudaEMAlgorithm.h index 97eb7ca..d313f7c 100644 --- a/include/astra/CudaEMAlgorithm.h +++ b/include/astra/CudaEMAlgorithm.h @@ -63,17 +63,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP.  	 */  	bool initialize(CProjector2D* _pProjector,  	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -	                int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -	                int _iPixelSuperSampling = 1); +					CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaFilteredBackProjectionAlgorithm.h b/include/astra/CudaFilteredBackProjectionAlgorithm.h index 33445b6..cf1f19f 100644 --- a/include/astra/CudaFilteredBackProjectionAlgorithm.h +++ b/include/astra/CudaFilteredBackProjectionAlgorithm.h @@ -85,6 +85,9 @@ protected:  	AstraFBP* m_pFBP;  	bool m_bAstraFBPInit; + +	void initializeFromProjector(); +	virtual bool requiresProjector() const { return false; }  };  // inline functions diff --git a/include/astra/CudaForwardProjectionAlgorithm.h b/include/astra/CudaForwardProjectionAlgorithm.h index d172a7a..097d499 100644 --- a/include/astra/CudaForwardProjectionAlgorithm.h +++ b/include/astra/CudaForwardProjectionAlgorithm.h @@ -33,16 +33,15 @@ $Id$  #include "Algorithm.h" -#include "ParallelProjectionGeometry2D.h" -#include "VolumeGeometry2D.h" - -#include "Float32ProjectionData2D.h" -#include "Float32VolumeData2D.h" -  #ifdef ASTRA_CUDA  namespace astra { +class CProjector2D; +class CProjectionGeometry2D; +class CFloat32ProjectionData2D; +class CFloat32VolumeData2D; +  /**   * \brief   * This class contains a GPU implementation of an algorithm that creates a forward projection  @@ -91,19 +90,15 @@ public:  	/** Initialize class.  	 * -	 * @param _pVolumeGeometry		Geometry of the volume. -	 * @param _pProjectionGeometry	Geometry of the projection. +	 * @param _pProjector		Projector2D object. (Optional)  	 * @param _pVolume				VolumeData2D object containing the phantom to compute sinogram from		  	 * @param _pSinogram			ProjectionData2D object to store sinogram data in. -	 * @param _iGPUindex		Index of GPU to use. (Starting at 0.) -	 * @param _iDetectorSuperSampling  Number of samples per detector element, used to compute the forward projection  	 * @return success  	 */ -	bool initialize(CProjectionGeometry2D* _pProjectionGeometry, -					CVolumeGeometry2D* _pVolumeGeometry,  +	bool initialize(CProjector2D* _pProjector,  					CFloat32VolumeData2D* _pVolume,  -					CFloat32ProjectionData2D* _pSinogram, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1); +					CFloat32ProjectionData2D* _pSinogram); +  	/** Get all information parameters  	 * @@ -147,6 +142,9 @@ public:  	void setGPUIndex(int _iGPUIndex);  protected: +	//< Optional Projector2D object +	CProjector2D* m_pProjector; +  	//< ProjectionData2D object containing the sinogram.  	CFloat32ProjectionData2D* m_pSinogram;  	//< VolumeData2D object containing the phantom. @@ -157,6 +155,7 @@ protected:  	//< Number of rays per detector element  	int m_iDetectorSuperSampling; +	void initializeFromProjector();  };  // inline functions diff --git a/include/astra/CudaProjector2D.h b/include/astra/CudaProjector2D.h index ecfca41..2b4bacb 100644 --- a/include/astra/CudaProjector2D.h +++ b/include/astra/CudaProjector2D.h @@ -124,12 +124,14 @@ public:  	Cuda2DProjectionKernel getProjectionKernel() const { return m_projectionKernel; }  	int getVoxelSuperSampling() const { return m_iVoxelSuperSampling; }  	int getDetectorSuperSampling() const { return m_iDetectorSuperSampling; } +	int getGPUIndex() const { return m_iGPUIndex; }  protected:  	Cuda2DProjectionKernel m_projectionKernel;  	int m_iVoxelSuperSampling;  	int m_iDetectorSuperSampling; +	int m_iGPUIndex;  };  //---------------------------------------------------------------------------------------- diff --git a/include/astra/CudaReconstructionAlgorithm2D.h b/include/astra/CudaReconstructionAlgorithm2D.h index e19bb8f..dc93a1a 100644 --- a/include/astra/CudaReconstructionAlgorithm2D.h +++ b/include/astra/CudaReconstructionAlgorithm2D.h @@ -70,28 +70,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume.  	 */ -	bool initialize(CProjector2D* _pProjector,  -					CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction); - -	/** Initialize class. -	 * -	 * @param _pProjector		Projector Object. (Ignored) -	 * @param _pSinogram		ProjectionData2D object containing the sinogram data. -	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection -	 */  	virtual bool initialize(CProjector2D* _pProjector,   	                        CFloat32ProjectionData2D* _pSinogram,  -	                        CFloat32VolumeData2D* _pReconstruction, -	                        int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -	                        int _iPixelSuperSampling = 1); +	                        CFloat32VolumeData2D* _pReconstruction);  	/** Clear this class. @@ -166,6 +151,9 @@ protected:  	int m_iGPUIndex;  	bool m_bAlgoInit; + +	void initializeFromProjector(); +	virtual bool requiresProjector() const { return false; }  };  // inline functions diff --git a/include/astra/CudaSartAlgorithm.h b/include/astra/CudaSartAlgorithm.h index b370bd0..53d1e7b 100644 --- a/include/astra/CudaSartAlgorithm.h +++ b/include/astra/CudaSartAlgorithm.h @@ -84,16 +84,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP.  	 */  	bool initialize(CProjector2D* _pProjector,  	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1); +					CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaSirtAlgorithm.h b/include/astra/CudaSirtAlgorithm.h index 607889a..751d612 100644 --- a/include/astra/CudaSirtAlgorithm.h +++ b/include/astra/CudaSirtAlgorithm.h @@ -97,18 +97,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection  	 */  	bool initialize(CProjector2D* _pProjector,  	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -					int _iPixelSuperSampling = 1); +					CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/ReconstructionAlgorithm2D.h b/include/astra/ReconstructionAlgorithm2D.h index 60584e0..ac87c4f 100644 --- a/include/astra/ReconstructionAlgorithm2D.h +++ b/include/astra/ReconstructionAlgorithm2D.h @@ -208,6 +208,9 @@ protected:  	//< Use the fixed reconstruction mask?  	bool m_bUseSinogramMask; + +	//< Specify if initialize/check should check for a valid Projector +	virtual bool requiresProjector() const { return true; }  };  // inline functions diff --git a/src/CudaBackProjectionAlgorithm.cpp b/src/CudaBackProjectionAlgorithm.cpp index 365e058..a73f895 100644 --- a/src/CudaBackProjectionAlgorithm.cpp +++ b/src/CudaBackProjectionAlgorithm.cpp @@ -76,10 +76,9 @@ bool CCudaBackProjectionAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaBackProjectionAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iPixelSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, 1, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaCglsAlgorithm.cpp b/src/CudaCglsAlgorithm.cpp index 0cedff6..9dd4f78 100644 --- a/src/CudaCglsAlgorithm.cpp +++ b/src/CudaCglsAlgorithm.cpp @@ -77,11 +77,9 @@ bool CCudaCglsAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaCglsAlgorithm::initialize(CProjector2D* _pProjector,                                      CFloat32ProjectionData2D* _pSinogram,  -                                    CFloat32VolumeData2D* _pReconstruction, -                                    int _iGPUindex, int _iDetectorSuperSampling, -                                    int _iPixelSuperSampling) +                                    CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaEMAlgorithm.cpp b/src/CudaEMAlgorithm.cpp index 5c71f3d..d0afd80 100644 --- a/src/CudaEMAlgorithm.cpp +++ b/src/CudaEMAlgorithm.cpp @@ -76,11 +76,9 @@ bool CCudaEMAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaEMAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iDetectorSuperSampling, -                                     int _iPixelSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaFilteredBackProjectionAlgorithm.cpp b/src/CudaFilteredBackProjectionAlgorithm.cpp index aac96d6..8c0659d 100644 --- a/src/CudaFilteredBackProjectionAlgorithm.cpp +++ b/src/CudaFilteredBackProjectionAlgorithm.cpp @@ -67,6 +67,24 @@ CCudaFilteredBackProjectionAlgorithm::~CCudaFilteredBackProjectionAlgorithm()  	}  } +void CCudaFilteredBackProjectionAlgorithm::initializeFromProjector() +{ +	m_iPixelSuperSampling = 1; +	m_iGPUIndex = -1; + +	// Projector +	CCudaProjector2D* pCudaProjector = dynamic_cast<CCudaProjector2D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector2D passed to FBP_CUDA"); +		} +	} else { +		m_iPixelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} +  bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)  {  	ASTRA_ASSERT(_cfg.self); @@ -163,27 +181,24 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)  	}  	CC.markNodeParsed("FilterD"); // TODO: Only for some types! -	// GPU number -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); - -	m_iPixelSuperSampling = 1; -	if (pCudaProjector) { -		// New interface -		m_iPixelSuperSampling = pCudaProjector->getVoxelSuperSampling(); -	} -	// Deprecated options -	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", m_iPixelSuperSampling); -	CC.markOptionParsed("PixelSuperSampling"); - -  	// Fan beam short scan mode  	if (m_pSinogram && dynamic_cast<CFanFlatProjectionGeometry2D*>(m_pSinogram->getGeometry())) {  		m_bShortScan = (int)_cfg.self.getOptionBool("ShortScan", false);  		CC.markOptionParsed("ShortScan");  	} +	initializeFromProjector(); +	// Deprecated options +	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", m_iPixelSuperSampling); +	CC.markOptionParsed("PixelSuperSampling"); + +	// GPU number +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex");  	m_pFBP = new AstraFBP; diff --git a/src/CudaForwardProjectionAlgorithm.cpp b/src/CudaForwardProjectionAlgorithm.cpp index b382f2e..9ca13ae 100644 --- a/src/CudaForwardProjectionAlgorithm.cpp +++ b/src/CudaForwardProjectionAlgorithm.cpp @@ -38,8 +38,11 @@ $Id$  #include <boost/lexical_cast.hpp>  #include "astra/AstraObjectManager.h" +#include "astra/ParallelProjectionGeometry2D.h"  #include "astra/FanFlatProjectionGeometry2D.h"  #include "astra/FanFlatVecProjectionGeometry2D.h" +#include "astra/Float32ProjectionData2D.h" +#include "astra/Float32VolumeData2D.h"  #include "astra/CudaProjector2D.h"  #include "astra/Logging.h" @@ -66,6 +69,24 @@ CCudaForwardProjectionAlgorithm::~CCudaForwardProjectionAlgorithm()  }  //--------------------------------------------------------------------------------------- +void CCudaForwardProjectionAlgorithm::initializeFromProjector() +{ +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	// Projector +	CCudaProjector2D* pCudaProjector = dynamic_cast<CCudaProjector2D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector2D passed to FP_CUDA"); +		} +	} else { +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  { @@ -74,14 +95,9 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  	// Projector  	XMLNode node = _cfg.self.getSingleNode("ProjectorId"); -	CCudaProjector2D* pCudaProjector = 0;  	if (node) {  		int id = boost::lexical_cast<int>(node.getContent()); -		CProjector2D *projector = CProjector2DManager::getSingleton().get(id); -		pCudaProjector = dynamic_cast<CCudaProjector2D*>(projector); -		if (!pCudaProjector) { -			ASTRA_WARN("non-CUDA Projector2D passed to FP_CUDA"); -		} +		m_pProjector = CProjector2DManager::getSingleton().get(id);  	}  	CC.markNodeParsed("ProjectorId"); @@ -101,22 +117,18 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  	m_pVolume = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));  	CC.markNodeParsed("VolumeDataId"); +	initializeFromProjector(); + +	// Deprecated options +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	CC.markOptionParsed("DetectorSuperSampling");  	// GPU number  	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);  	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); -	CC.markOptionParsed("GPUindex"); -	if (!_cfg.self.hasOption("GPUindex")) -		CC.markOptionParsed("GPUIndex"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); -	// Detector supersampling factor -	m_iDetectorSuperSampling = 1; -	if (pCudaProjector) { -		// New interface -		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); -	} -	// Deprecated option -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); -	CC.markOptionParsed("DetectorSuperSampling");  	// return success @@ -125,20 +137,16 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  //----------------------------------------------------------------------------------------  // Initialize - C++ -bool CCudaForwardProjectionAlgorithm::initialize(CProjectionGeometry2D* _pProjectionGeometry, -												 CVolumeGeometry2D* _pReconstructionGeometry, +bool CCudaForwardProjectionAlgorithm::initialize(CProjector2D* _pProjector,  												 CFloat32VolumeData2D* _pVolume, -												 CFloat32ProjectionData2D* _pSinogram, -												 int _iGPUindex, int _iDetectorSuperSampling) +												 CFloat32ProjectionData2D* _pSinogram)  {  	// store classes -	//m_pProjectionGeometry = _pProjectionGeometry; -	//m_pReconstructionGeometry = _pReconstructionGeometry; +	m_pProjector = _pProjector;  	m_pVolume = _pVolume;  	m_pSinogram = _pSinogram; -	m_iDetectorSuperSampling = _iDetectorSuperSampling; -	m_iGPUIndex = _iGPUindex; +	initializeFromProjector();  	// return success  	return check(); diff --git a/src/CudaProjector2D.cpp b/src/CudaProjector2D.cpp index a26e32d..acf6000 100644 --- a/src/CudaProjector2D.cpp +++ b/src/CudaProjector2D.cpp @@ -61,6 +61,7 @@ void CCudaProjector2D::_clear()  	m_projectionKernel = ker2d_default;  	m_iVoxelSuperSampling = 1;  	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1;  }  //---------------------------------------------------------------------------------------- @@ -125,18 +126,18 @@ bool CCudaProjector2D::initialize(const Config& _cfg)  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);  	CC.markOptionParsed("DetectorSuperSampling"); +	// GPU number +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_bIsInitialized = _check();  	return m_bIsInitialized;  } -/* -bool CProjector2D::initialize(astra::CProjectionGeometry2D *, astra::CVolumeGeometry2D *) -{ -	ASTRA_ASSERT(false); - -	return false; -} -*/  std::string CCudaProjector2D::description() const  { diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp index 71b6637..bccdb43 100644 --- a/src/CudaReconstructionAlgorithm2D.cpp +++ b/src/CudaReconstructionAlgorithm2D.cpp @@ -84,111 +84,51 @@ void CCudaReconstructionAlgorithm2D::_clear()  }  //--------------------------------------------------------------------------------------- -// Initialize - Config -bool CCudaReconstructionAlgorithm2D::initialize(const Config& _cfg) +void CCudaReconstructionAlgorithm2D::initializeFromProjector()  { -	ASTRA_ASSERT(_cfg.self); -	ConfigStackCheck<CAlgorithm> CC("CudaReconstructionAlgorithm2D", this, _cfg); - -	// if already initialized, clear first -	if (m_bIsInitialized) { -		clear(); -	} +	m_iPixelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1;  	// Projector -	XMLNode node = _cfg.self.getSingleNode("ProjectorId"); -	CCudaProjector2D* pCudaProjector = 0; -	if (node) { -		int id = boost::lexical_cast<int>(node.getContent()); -		CProjector2D *projector = CProjector2DManager::getSingleton().get(id); -		pCudaProjector = dynamic_cast<CCudaProjector2D*>(projector); -		if (!pCudaProjector) { +	CCudaProjector2D* pCudaProjector = dynamic_cast<CCudaProjector2D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) {  			ASTRA_WARN("non-CUDA Projector2D passed");  		} -	} -	CC.markNodeParsed("ProjectorId"); - - -	// sinogram data -	node = _cfg.self.getSingleNode("ProjectionDataId"); -	ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ProjectionDataId tag specified."); -	int id = boost::lexical_cast<int>(node.getContent()); -	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); -	CC.markNodeParsed("ProjectionDataId"); - -	// reconstruction data -	node = _cfg.self.getSingleNode("ReconstructionDataId"); -	ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ReconstructionDataId tag specified."); -	id = boost::lexical_cast<int>(node.getContent()); -	m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id)); -	CC.markNodeParsed("ReconstructionDataId"); - -	// fixed mask -	if (_cfg.self.hasOption("ReconstructionMaskId")) { -		m_bUseReconstructionMask = true; -		id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId")); -		m_pReconstructionMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id)); -		ASTRA_CONFIG_CHECK(m_pReconstructionMask, "CudaReconstruction2D", "Invalid ReconstructionMaskId."); -	} -	CC.markOptionParsed("ReconstructionMaskId"); -	// fixed mask -	if (_cfg.self.hasOption("SinogramMaskId")) { -		m_bUseSinogramMask = true; -		id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId")); -		m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); -		ASTRA_CONFIG_CHECK(m_pSinogramMask, "CudaReconstruction2D", "Invalid SinogramMaskId."); -	} -	CC.markOptionParsed("SinogramMaskId"); - -	// Constraints - NEW -	if (_cfg.self.hasOption("MinConstraint")) { -		m_bUseMinConstraint = true; -		m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f); -		CC.markOptionParsed("MinConstraint"); -	} else { -		// Constraint - OLD -		m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false); -		CC.markOptionParsed("UseMinConstraint"); -		if (m_bUseMinConstraint) { -			m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f); -			CC.markOptionParsed("MinConstraintValue"); -		} -	} -	if (_cfg.self.hasOption("MaxConstraint")) { -		m_bUseMaxConstraint = true; -		m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f); -		CC.markOptionParsed("MaxConstraint");  	} else { -		// Constraint - OLD -		m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false); -		CC.markOptionParsed("UseMaxConstraint"); -		if (m_bUseMaxConstraint) { -			m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f); -			CC.markOptionParsed("MaxConstraintValue"); -		} -	} - -	// GPU number -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); -	CC.markOptionParsed("GPUindex"); -	if (!_cfg.self.hasOption("GPUindex")) -		CC.markOptionParsed("GPUIndex"); - -	// Supersampling factors -	m_iDetectorSuperSampling = 1; -	m_iPixelSuperSampling = 1; -	if (pCudaProjector) { -		// New interface  		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling();  		m_iPixelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex();  	} +} + +//--------------------------------------------------------------------------------------- +// Initialize - Config +bool CCudaReconstructionAlgorithm2D::initialize(const Config& _cfg) +{ +	ASTRA_ASSERT(_cfg.self); +	ConfigStackCheck<CAlgorithm> CC("CudaReconstructionAlgorithm2D", this, _cfg); + +	m_bIsInitialized = CReconstructionAlgorithm2D::initialize(_cfg); + +	if (!m_bIsInitialized) +		return false; + +	initializeFromProjector(); +  	// Deprecated options  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling);  	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", m_iPixelSuperSampling);  	CC.markOptionParsed("DetectorSuperSampling");  	CC.markOptionParsed("PixelSuperSampling"); +	// GPU number +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex");  	return _check();  } @@ -199,32 +139,18 @@ bool CCudaReconstructionAlgorithm2D::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,                                        CFloat32VolumeData2D* _pReconstruction)  { -	return initialize(_pProjector, _pSinogram, _pReconstruction, 0, 1); -} - -//--------------------------------------------------------------------------------------- -// Initialize - C++ -bool CCudaReconstructionAlgorithm2D::initialize(CProjector2D* _pProjector, -                                     CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, -                                     int _iDetectorSuperSampling, -                                     int _iPixelSuperSampling) -{  	// if already initialized, clear first  	if (m_bIsInitialized) {  		clear();  	} -	m_pProjector = 0; +	m_pProjector = _pProjector;  	// required classes  	m_pSinogram = _pSinogram;  	m_pReconstruction = _pReconstruction; -	m_iDetectorSuperSampling = _iDetectorSuperSampling; -	m_iPixelSuperSampling = _iPixelSuperSampling; -	m_iGPUIndex = _iGPUindex; +	initializeFromProjector();  	return _check();  } @@ -234,40 +160,13 @@ bool CCudaReconstructionAlgorithm2D::initialize(CProjector2D* _pProjector,  // Check  bool CCudaReconstructionAlgorithm2D::_check()   { -	// TODO: CLEAN UP - - -	// check pointers -	//ASTRA_CONFIG_CHECK(m_pProjector, "Reconstruction2D", "Invalid Projector Object."); -	ASTRA_CONFIG_CHECK(m_pSinogram, "SIRT_CUDA", "Invalid Projection Data Object."); -	ASTRA_CONFIG_CHECK(m_pReconstruction, "SIRT_CUDA", "Invalid Reconstruction Data Object."); - -	// check initializations -	//ASTRA_CONFIG_CHECK(m_pProjector->isInitialized(), "Reconstruction2D", "Projector Object Not Initialized."); -	ASTRA_CONFIG_CHECK(m_pSinogram->isInitialized(), "SIRT_CUDA", "Projection Data Object Not Initialized."); -	ASTRA_CONFIG_CHECK(m_pReconstruction->isInitialized(), "SIRT_CUDA", "Reconstruction Data Object Not Initialized."); +	if (!CReconstructionAlgorithm2D::_check()) +		return false;  	ASTRA_CONFIG_CHECK(m_iDetectorSuperSampling >= 1, "SIRT_CUDA", "DetectorSuperSampling must be a positive integer.");  	ASTRA_CONFIG_CHECK(m_iPixelSuperSampling >= 1, "SIRT_CUDA", "PixelSuperSampling must be a positive integer.");  	ASTRA_CONFIG_CHECK(m_iGPUIndex >= -1, "SIRT_CUDA", "GPUIndex must be a non-negative integer."); -	// check compatibility between projector and data classes -//	ASTRA_CONFIG_CHECK(m_pSinogram->getGeometry()->isEqual(m_pProjector->getProjectionGeometry()), "SIRT_CUDA", "Projection Data not compatible with the specified Projector."); -//	ASTRA_CONFIG_CHECK(m_pReconstruction->getGeometry()->isEqual(m_pProjector->getVolumeGeometry()), "SIRT_CUDA", "Reconstruction Data not compatible with the specified Projector."); - -	// todo: turn some of these back on - -// 	ASTRA_CONFIG_CHECK(m_pProjectionGeometry, "SIRT_CUDA", "ProjectionGeometry not specified."); -// 	ASTRA_CONFIG_CHECK(m_pProjectionGeometry->isInitialized(), "SIRT_CUDA", "ProjectionGeometry not initialized."); -// 	ASTRA_CONFIG_CHECK(m_pReconstructionGeometry, "SIRT_CUDA", "ReconstructionGeometry not specified."); -// 	ASTRA_CONFIG_CHECK(m_pReconstructionGeometry->isInitialized(), "SIRT_CUDA", "ReconstructionGeometry not initialized."); - -	// check dimensions -	//ASTRA_CONFIG_CHECK(m_pSinogram->getAngleCount() == m_pProjectionGeometry->getProjectionAngleCount(), "SIRT_CUDA", "Sinogram data object size mismatch."); -	//ASTRA_CONFIG_CHECK(m_pSinogram->getDetectorCount() == m_pProjectionGeometry->getDetectorCount(), "SIRT_CUDA", "Sinogram data object size mismatch."); -	//ASTRA_CONFIG_CHECK(m_pReconstruction->getWidth() == m_pReconstructionGeometry->getGridColCount(), "SIRT_CUDA", "Reconstruction data object size mismatch."); -	//ASTRA_CONFIG_CHECK(m_pReconstruction->getHeight() == m_pReconstructionGeometry->getGridRowCount(), "SIRT_CUDA", "Reconstruction data object size mismatch."); -	  	// check restrictions  	// TODO: check restrictions built into cuda code diff --git a/src/CudaSartAlgorithm.cpp b/src/CudaSartAlgorithm.cpp index 8c0c6d7..d202847 100644 --- a/src/CudaSartAlgorithm.cpp +++ b/src/CudaSartAlgorithm.cpp @@ -116,10 +116,9 @@ bool CCudaSartAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaSartAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iDetectorSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, 1); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaSirtAlgorithm.cpp b/src/CudaSirtAlgorithm.cpp index d424915..ab0a418 100644 --- a/src/CudaSirtAlgorithm.cpp +++ b/src/CudaSirtAlgorithm.cpp @@ -98,11 +98,9 @@ bool CCudaSirtAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaSirtAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iDetectorSuperSampling, -                                     int _iPixelSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/ReconstructionAlgorithm2D.cpp b/src/ReconstructionAlgorithm2D.cpp index 767efe6..4575ff7 100644 --- a/src/ReconstructionAlgorithm2D.cpp +++ b/src/ReconstructionAlgorithm2D.cpp @@ -85,9 +85,16 @@ bool CReconstructionAlgorithm2D::initialize(const Config& _cfg)  	// projector  	XMLNode node = _cfg.self.getSingleNode("ProjectorId"); -	ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectorId tag specified."); -	int id = boost::lexical_cast<int>(node.getContent()); -	m_pProjector = CProjector2DManager::getSingleton().get(id); +	if (requiresProjector()) { +		ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectorId tag specified."); +	} +	int id; +	if (node) { +		id = boost::lexical_cast<int>(node.getContent()); +		m_pProjector = CProjector2DManager::getSingleton().get(id); +	} else { +		m_pProjector = 0; +	}  	CC.markNodeParsed("ProjectorId");  	// sinogram data @@ -205,18 +212,22 @@ void CReconstructionAlgorithm2D::setSinogramMask(CFloat32ProjectionData2D* _pMas  bool CReconstructionAlgorithm2D::_check()   {  	// check pointers -	ASTRA_CONFIG_CHECK(m_pProjector, "Reconstruction2D", "Invalid Projector Object."); +	if (requiresProjector()) +		ASTRA_CONFIG_CHECK(m_pProjector, "Reconstruction2D", "Invalid Projector Object.");  	ASTRA_CONFIG_CHECK(m_pSinogram, "Reconstruction2D", "Invalid Projection Data Object.");  	ASTRA_CONFIG_CHECK(m_pReconstruction, "Reconstruction2D", "Invalid Reconstruction Data Object.");  	// check initializations -	ASTRA_CONFIG_CHECK(m_pProjector->isInitialized(), "Reconstruction2D", "Projector Object Not Initialized."); +	if (requiresProjector()) +		ASTRA_CONFIG_CHECK(m_pProjector->isInitialized(), "Reconstruction2D", "Projector Object Not Initialized.");  	ASTRA_CONFIG_CHECK(m_pSinogram->isInitialized(), "Reconstruction2D", "Projection Data Object Not Initialized.");  	ASTRA_CONFIG_CHECK(m_pReconstruction->isInitialized(), "Reconstruction2D", "Reconstruction Data Object Not Initialized.");  	// check compatibility between projector and data classes -	ASTRA_CONFIG_CHECK(m_pSinogram->getGeometry()->isEqual(m_pProjector->getProjectionGeometry()), "Reconstruction2D", "Projection Data not compatible with the specified Projector."); -	ASTRA_CONFIG_CHECK(m_pReconstruction->getGeometry()->isEqual(m_pProjector->getVolumeGeometry()), "Reconstruction2D", "Reconstruction Data not compatible with the specified Projector."); +	if (requiresProjector()) { +		ASTRA_CONFIG_CHECK(m_pSinogram->getGeometry()->isEqual(m_pProjector->getProjectionGeometry()), "Reconstruction2D", "Projection Data not compatible with the specified Projector."); +		ASTRA_CONFIG_CHECK(m_pReconstruction->getGeometry()->isEqual(m_pProjector->getVolumeGeometry()), "Reconstruction2D", "Reconstruction Data not compatible with the specified Projector."); +	}  	// success  	return true; | 
