diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/CudaBackProjectionAlgorithm.cpp | 5 | ||||
| -rw-r--r-- | src/CudaBackProjectionAlgorithm3D.cpp | 37 | ||||
| -rw-r--r-- | src/CudaCglsAlgorithm.cpp | 6 | ||||
| -rw-r--r-- | src/CudaCglsAlgorithm3D.cpp | 43 | ||||
| -rw-r--r-- | src/CudaEMAlgorithm.cpp | 6 | ||||
| -rw-r--r-- | src/CudaFDKAlgorithm3D.cpp | 35 | ||||
| -rw-r--r-- | src/CudaFilteredBackProjectionAlgorithm.cpp | 62 | ||||
| -rw-r--r-- | src/CudaForwardProjectionAlgorithm.cpp | 72 | ||||
| -rw-r--r-- | src/CudaForwardProjectionAlgorithm3D.cpp | 42 | ||||
| -rw-r--r-- | src/CudaProjector2D.cpp | 25 | ||||
| -rw-r--r-- | src/CudaProjector3D.cpp | 15 | ||||
| -rw-r--r-- | src/CudaReconstructionAlgorithm2D.cpp | 189 | ||||
| -rw-r--r-- | src/CudaSartAlgorithm.cpp | 5 | ||||
| -rw-r--r-- | src/CudaSirtAlgorithm.cpp | 6 | ||||
| -rw-r--r-- | src/CudaSirtAlgorithm3D.cpp | 43 | ||||
| -rw-r--r-- | src/Float32ProjectionData3D.cpp | 36 | ||||
| -rw-r--r-- | src/Logging.cpp | 60 | ||||
| -rw-r--r-- | src/ParallelProjectionGeometry2D.cpp | 5 | ||||
| -rw-r--r-- | src/ReconstructionAlgorithm2D.cpp | 25 | ||||
| -rw-r--r-- | src/ReconstructionAlgorithm3D.cpp | 19 | 
20 files changed, 460 insertions, 276 deletions
| 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/CudaBackProjectionAlgorithm3D.cpp b/src/CudaBackProjectionAlgorithm3D.cpp index fbb8f28..c9d9447 100644 --- a/src/CudaBackProjectionAlgorithm3D.cpp +++ b/src/CudaBackProjectionAlgorithm3D.cpp @@ -32,11 +32,14 @@ $Id$  #include "astra/AstraObjectManager.h" +#include "astra/CudaProjector3D.h"  #include "astra/ConeProjectionGeometry3D.h"  #include "astra/ParallelProjectionGeometry3D.h"  #include "astra/ParallelVecProjectionGeometry3D.h"  #include "astra/ConeVecProjectionGeometry3D.h" +#include "astra/Logging.h" +  #include "../cuda/3d/astra3d.h"  using namespace std; @@ -86,6 +89,24 @@ bool CCudaBackProjectionAlgorithm3D::_check()  }  //--------------------------------------------------------------------------------------- +void CCudaBackProjectionAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to BP3D_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaBackProjectionAlgorithm3D::initialize(const Config& _cfg)  { @@ -102,10 +123,18 @@ bool CCudaBackProjectionAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); -	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1); +	initializeFromProjector(); + +	// Deprecated options +	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	CFloat32ProjectionData3DMemory* pSinoMem = dynamic_cast<CFloat32ProjectionData3DMemory*>(m_pSinogram);  	ASTRA_ASSERT(pSinoMem); @@ -139,6 +168,8 @@ bool CCudaBackProjectionAlgorithm3D::initialize(CProjector3D* _pProjector,  	m_pSinogram = _pSinogram;  	m_pReconstruction = _pReconstruction; +	initializeFromProjector(); +  	// success  	m_bIsInitialized = _check();  	return m_bIsInitialized; 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/CudaCglsAlgorithm3D.cpp b/src/CudaCglsAlgorithm3D.cpp index 3457b81..1cccb6a 100644 --- a/src/CudaCglsAlgorithm3D.cpp +++ b/src/CudaCglsAlgorithm3D.cpp @@ -32,10 +32,13 @@ $Id$  #include "astra/AstraObjectManager.h" +#include "astra/CudaProjector3D.h"  #include "astra/ConeProjectionGeometry3D.h"  #include "astra/ParallelVecProjectionGeometry3D.h"  #include "astra/ConeVecProjectionGeometry3D.h" +#include "astra/Logging.h" +  #include "../cuda/3d/astra3d.h"  using namespace std; @@ -89,6 +92,26 @@ bool CCudaCglsAlgorithm3D::_check()  }  //--------------------------------------------------------------------------------------- +void CCudaCglsAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to CGLS3D_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaCglsAlgorithm3D::initialize(const Config& _cfg)  { @@ -106,12 +129,20 @@ bool CCudaCglsAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); -	CC.markOptionParsed("DetectorSuperSampling"); -	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1); +	initializeFromProjector(); + +	// Deprecated options +	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling); +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling"); +	CC.markOptionParsed("DetectorSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_pCgls = new AstraCGLS3d(); @@ -139,6 +170,8 @@ bool CCudaCglsAlgorithm3D::initialize(CProjector3D* _pProjector,  	m_pSinogram = _pSinogram;  	m_pReconstruction = _pReconstruction; +	initializeFromProjector(); +  	m_pCgls = new AstraCGLS3d;  	m_bAstraCGLSInit = 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/CudaFDKAlgorithm3D.cpp b/src/CudaFDKAlgorithm3D.cpp index 467e641..625d02a 100644 --- a/src/CudaFDKAlgorithm3D.cpp +++ b/src/CudaFDKAlgorithm3D.cpp @@ -32,8 +32,11 @@ $Id$  #include "astra/AstraObjectManager.h" +#include "astra/CudaProjector3D.h"  #include "astra/ConeProjectionGeometry3D.h" +#include "astra/Logging.h" +  #include "../cuda/3d/astra3d.h"  using namespace std; @@ -84,6 +87,24 @@ bool CCudaFDKAlgorithm3D::_check()  }  //--------------------------------------------------------------------------------------- +void CCudaFDKAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to FDK_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaFDKAlgorithm3D::initialize(const Config& _cfg)  { @@ -100,10 +121,18 @@ bool CCudaFDKAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); -	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1); +	initializeFromProjector(); + +	// Deprecated options +	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_bShortScan = _cfg.self.getOptionBool("ShortScan", false);  	CC.markOptionParsed("ShortScan"); diff --git a/src/CudaFilteredBackProjectionAlgorithm.cpp b/src/CudaFilteredBackProjectionAlgorithm.cpp index 5d6c166..bcd70c4 100644 --- a/src/CudaFilteredBackProjectionAlgorithm.cpp +++ b/src/CudaFilteredBackProjectionAlgorithm.cpp @@ -32,6 +32,7 @@ $Id$  #include <cstring>  #include "astra/AstraObjectManager.h" +#include "astra/CudaProjector2D.h"  #include "../cuda/2d/astra.h"  #include "astra/Logging.h" @@ -66,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); @@ -77,8 +96,22 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)  		clear();  	} +	// 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"); +		} +	} +	CC.markNodeParsed("ProjectorId"); + +  	// sinogram data -	XMLNode node = _cfg.self.getSingleNode("ProjectionDataId"); +	node = _cfg.self.getSingleNode("ProjectionDataId");  	ASTRA_CONFIG_CHECK(node, "CudaFBP", "No ProjectionDataId tag specified.");  	int id = boost::lexical_cast<int>(node.getContent());  	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); @@ -148,29 +181,30 @@ 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"); - -	// Pixel supersampling factor -	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", 1); -	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;  	m_bAstraFBPInit = false; -	// success -	m_bIsInitialized = true; -	return m_bIsInitialized; +	return check();  }  bool CCudaFilteredBackProjectionAlgorithm::initialize(CFloat32ProjectionData2D * _pSinogram, CFloat32VolumeData2D * _pReconstruction, E_FBPFILTER _eFilter, const float * _pfFilter /* = NULL */, int _iFilterWidth /* = 0 */, int _iGPUIndex /* = 0 */, float _fFilterParameter /* = -1.0f */) @@ -220,7 +254,7 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(CFloat32ProjectionData2D *  	m_fFilterParameter = _fFilterParameter; -	return m_bIsInitialized; +	return check();  }  void CCudaFilteredBackProjectionAlgorithm::run(int _iNrIterations /* = 0 */) @@ -340,7 +374,7 @@ bool CCudaFilteredBackProjectionAlgorithm::check()  	ASTRA_CONFIG_CHECK(m_pReconstruction->isInitialized(), "FBP_CUDA", "Reconstruction Data Object Not Initialized.");  	// check gpu index -	ASTRA_CONFIG_CHECK(m_iGPUIndex >= -1, "FBP_CUDA", "GPUIndex must be a non-negative integer."); +	ASTRA_CONFIG_CHECK(m_iGPUIndex >= -1, "FBP_CUDA", "GPUIndex must be a non-negative integer or -1.");  	// check pixel supersampling  	ASTRA_CONFIG_CHECK(m_iPixelSuperSampling >= 0, "FBP_CUDA", "PixelSuperSampling must be a non-negative integer."); diff --git a/src/CudaForwardProjectionAlgorithm.cpp b/src/CudaForwardProjectionAlgorithm.cpp index 0f97d59..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,14 +69,42 @@ 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)  {  	ASTRA_ASSERT(_cfg.self);  	ConfigStackCheck<CAlgorithm> CC("CudaForwardProjectionAlgorithm", this, _cfg); + +	// Projector +	XMLNode node = _cfg.self.getSingleNode("ProjectorId"); +	if (node) { +		int id = boost::lexical_cast<int>(node.getContent()); +		m_pProjector = CProjector2DManager::getSingleton().get(id); +	} +	CC.markNodeParsed("ProjectorId"); + +  	// sinogram data -	XMLNode node = _cfg.self.getSingleNode("ProjectionDataId"); +	node = _cfg.self.getSingleNode("ProjectionDataId");  	ASTRA_CONFIG_CHECK(node, "FP_CUDA", "No ProjectionDataId tag specified.");  	int id = boost::lexical_cast<int>(node.getContent());  	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); @@ -86,29 +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"); - -	// Detector supersampling factor -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); -	CC.markOptionParsed("DetectorSuperSampling"); - +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); -	// This isn't used yet, but passing it is not something to warn about -	node = _cfg.self.getSingleNode("ProjectorId"); -	if (node) { -		id = boost::lexical_cast<int>(node.getContent()); -		CProjector2D *projector = CProjector2DManager::getSingleton().get(id); -		if (!dynamic_cast<CCudaProjector2D*>(projector)) { -			ASTRA_WARN("non-CUDA Projector2D passed to FP_CUDA"); -		} -	} -	CC.markNodeParsed("ProjectorId"); -	  	// return success @@ -117,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/CudaForwardProjectionAlgorithm3D.cpp b/src/CudaForwardProjectionAlgorithm3D.cpp index e29b5a9..6498885 100644 --- a/src/CudaForwardProjectionAlgorithm3D.cpp +++ b/src/CudaForwardProjectionAlgorithm3D.cpp @@ -72,6 +72,23 @@ CCudaForwardProjectionAlgorithm3D::~CCudaForwardProjectionAlgorithm3D()  }  //--------------------------------------------------------------------------------------- +void CCudaForwardProjectionAlgorithm3D::initializeFromProjector() +{ +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to FP3D_CUDA"); +		} +	} else { +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaForwardProjectionAlgorithm3D::initialize(const Config& _cfg)  { @@ -97,19 +114,21 @@ bool CCudaForwardProjectionAlgorithm3D::initialize(const Config& _cfg)  	// optional: projector  	node = _cfg.self.getSingleNode("ProjectorId"); +	m_pProjector = 0;  	if (node) {  		id = boost::lexical_cast<int>(node.getContent());  		m_pProjector = CProjector3DManager::getSingleton().get(id); -	} else { -		m_pProjector = 0; // TODO: or manually construct default projector?  	}  	CC.markNodeParsed("ProjectorId"); -	// GPU number -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); +	initializeFromProjector(); + +	// Deprecated options +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex);  	CC.markOptionParsed("DetectorSuperSampling"); +	CC.markOptionParsed("GPUindex"); +  	// success  	m_bIsInitialized = check(); @@ -132,8 +151,15 @@ bool CCudaForwardProjectionAlgorithm3D::initialize(CProjector3D* _pProjector,  	m_pProjections = _pProjections;  	m_pVolume = _pVolume; -	m_iDetectorSuperSampling = _iDetectorSuperSampling; -	m_iGPUIndex = _iGPUindex; +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		// TODO: Report +		m_iDetectorSuperSampling = _iDetectorSuperSampling; +		m_iGPUIndex = _iGPUindex; +	} else { +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	}  	// success  	m_bIsInitialized = check(); diff --git a/src/CudaProjector2D.cpp b/src/CudaProjector2D.cpp index fa024c8..acf6000 100644 --- a/src/CudaProjector2D.cpp +++ b/src/CudaProjector2D.cpp @@ -59,6 +59,9 @@ void CCudaProjector2D::_clear()  	m_bIsInitialized = false;  	m_projectionKernel = ker2d_default; +	m_iVoxelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1;  }  //---------------------------------------------------------------------------------------- @@ -117,18 +120,24 @@ bool CCudaProjector2D::initialize(const Config& _cfg)  	}  	CC.markNodeParsed("ProjectionKernel"); +	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1); +	CC.markOptionParsed("VoxelSuperSampling"); +  +	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/CudaProjector3D.cpp b/src/CudaProjector3D.cpp index 41529a5..bbfbd34 100644 --- a/src/CudaProjector3D.cpp +++ b/src/CudaProjector3D.cpp @@ -62,6 +62,9 @@ void CCudaProjector3D::_clear()  	m_bIsInitialized = false;  	m_projectionKernel = ker3d_default; +	m_iVoxelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1;  }  //---------------------------------------------------------------------------------------- @@ -120,6 +123,18 @@ bool CCudaProjector3D::initialize(const Config& _cfg)  	}  	CC.markNodeParsed("ProjectionKernel"); +	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1); +	CC.markOptionParsed("VoxelSuperSampling"); +  +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); +	CC.markOptionParsed("DetectorSuperSampling"); + +	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;  } diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp index db99d42..71dddf7 100644 --- a/src/CudaReconstructionAlgorithm2D.cpp +++ b/src/CudaReconstructionAlgorithm2D.cpp @@ -84,103 +84,51 @@ void CCudaReconstructionAlgorithm2D::_clear()  }  //--------------------------------------------------------------------------------------- +void CCudaReconstructionAlgorithm2D::initializeFromProjector() +{ +	m_iPixelSuperSampling = 1; +	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"); +		} +	} else { +		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); -	// if already initialized, clear first -	if (m_bIsInitialized) { -		clear(); -	} - -	// sinogram data -	XMLNode 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"); +	m_bIsInitialized = CReconstructionAlgorithm2D::initialize(_cfg); -	// 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"); -		} -	} +	if (!m_bIsInitialized) +		return false; -	// 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"); +	initializeFromProjector(); -	// Detector supersampling factor -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); +	// Deprecated options +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", m_iPixelSuperSampling);  	CC.markOptionParsed("DetectorSuperSampling"); - -	// Pixel supersampling factor -	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", 1);  	CC.markOptionParsed("PixelSuperSampling"); - -	// This isn't used yet, but passing it is not something to warn about -	node = _cfg.self.getSingleNode("ProjectorId"); -	if (node) { -		id = boost::lexical_cast<int>(node.getContent()); -		CProjector2D *projector = CProjector2DManager::getSingleton().get(id); -		if (!dynamic_cast<CCudaProjector2D*>(projector)) { -			ASTRA_WARN("non-CUDA Projector2D passed"); -		} -	} -	CC.markNodeParsed("ProjectorId"); - +	// 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();  } @@ -191,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();  } @@ -226,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."); - -	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 +	if (!CReconstructionAlgorithm2D::_check()) +		return false; -// 	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."); +	ASTRA_CONFIG_CHECK(m_iDetectorSuperSampling >= 1, "CudaReconstructionAlgorithm2D", "DetectorSuperSampling must be a positive integer."); +	ASTRA_CONFIG_CHECK(m_iPixelSuperSampling >= 1, "CudaReconstructionAlgorithm2D", "PixelSuperSampling must be a positive integer."); +	ASTRA_CONFIG_CHECK(m_iGPUIndex >= -1, "CudaReconstructionAlgorithm2D", "GPUIndex must be a non-negative integer or -1."); -	// 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 @@ -454,10 +361,18 @@ void CCudaReconstructionAlgorithm2D::run(int _iNrIterations)  	ASTRA_ASSERT(ok); -	if (m_bUseMinConstraint) -		ok &= m_pAlgo->setMinConstraint(m_fMinValue); -	if (m_bUseMaxConstraint) -		ok &= m_pAlgo->setMaxConstraint(m_fMaxValue); +	if (m_bUseMinConstraint) { +		bool ret = m_pAlgo->setMinConstraint(m_fMinValue); +		if (!ret) { +			ASTRA_WARN("This algorithm ignores MinConstraint"); +		} +	} +	if (m_bUseMaxConstraint) { +		bool ret= m_pAlgo->setMaxConstraint(m_fMaxValue); +		if (!ret) { +			ASTRA_WARN("This algorithm ignores MaxConstraint"); +		} +	}  	ok &= m_pAlgo->iterate(_iNrIterations);  	ASTRA_ASSERT(ok); 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/CudaSirtAlgorithm3D.cpp b/src/CudaSirtAlgorithm3D.cpp index 5ad131b..67594f4 100644 --- a/src/CudaSirtAlgorithm3D.cpp +++ b/src/CudaSirtAlgorithm3D.cpp @@ -36,6 +36,9 @@ $Id$  #include "astra/ParallelProjectionGeometry3D.h"  #include "astra/ParallelVecProjectionGeometry3D.h"  #include "astra/ConeVecProjectionGeometry3D.h" +#include "astra/CudaProjector3D.h" + +#include "astra/Logging.h"  #include "../cuda/3d/astra3d.h" @@ -89,7 +92,27 @@ bool CCudaSirtAlgorithm3D::_check()  	return true;  } -//--------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +void CCudaSirtAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to SIRT3D_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//--------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaSirtAlgorithm3D::initialize(const Config& _cfg)  { @@ -107,12 +130,20 @@ bool CCudaSirtAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); -	CC.markOptionParsed("DetectorSuperSampling"); -	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1); +	initializeFromProjector(); + +	// Deprecated options +	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling); +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling"); +	CC.markOptionParsed("DetectorSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_pSirt = new AstraSIRT3d(); diff --git a/src/Float32ProjectionData3D.cpp b/src/Float32ProjectionData3D.cpp index 2bd0447..680ad55 100644 --- a/src/Float32ProjectionData3D.cpp +++ b/src/Float32ProjectionData3D.cpp @@ -53,13 +53,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator+=(const CFloat32Pro  	CProjectionGeometry3D * pThisGeometry = getGeometry();  	int iProjectionCount = pThisGeometry->getProjectionCount(); +	int iDetectorCount = pThisGeometry->getDetectorTotCount();  #ifdef _DEBUG  	CProjectionGeometry3D * pDataGeometry = _data.getGeometry(); -	int iThisProjectionDetectorCount = pThisGeometry->getDetectorRowCount() * pThisGeometry->getDetectorColCount(); -	int iDataProjectionDetectorCount = pDataGeometry->getDetectorRowCount() * pDataGeometry->getDetectorColCount(); +	int iDataProjectionDetectorCount = pDataGeometry->getDetectorTotCount();  	ASTRA_ASSERT(iProjectionCount == pDataGeometry->getProjectionCount()); -	ASTRA_ASSERT(iThisProjectionDetectorCount == iDataProjectionDetectorCount); +	ASTRA_ASSERT(iDetectorCount == iDataProjectionDetectorCount);  #endif  	for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++) @@ -67,7 +67,7 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator+=(const CFloat32Pro  		CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);  		CFloat32VolumeData2D * pDataProjection = _data.fetchProjection(iProjectionIndex); -		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) +		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorCount; iDetectorIndex++)  		{  			float32 fThisValue = pThisProjection->getData()[iDetectorIndex];  			float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; @@ -91,13 +91,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator-=(const CFloat32Pro  	CProjectionGeometry3D * pThisGeometry = getGeometry();  	int iProjectionCount = pThisGeometry->getProjectionCount(); +	int iDetectorCount = pThisGeometry->getDetectorTotCount();  #ifdef _DEBUG  	CProjectionGeometry3D * pDataGeometry = _data.getGeometry(); -	int iThisProjectionDetectorCount = pThisGeometry->getDetectorRowCount() * pThisGeometry->getDetectorColCount(); -	int iDataProjectionDetectorCount = pDataGeometry->getDetectorRowCount() * pDataGeometry->getDetectorColCount(); +	int iDataProjectionDetectorCount = pDataGeometry->getDetectorTotCount();  	ASTRA_ASSERT(iProjectionCount == pDataGeometry->getProjectionCount()); -	ASTRA_ASSERT(iThisProjectionDetectorCount == iDataProjectionDetectorCount); +	ASTRA_ASSERT(iDetectorCount == iDataProjectionDetectorCount);  #endif  	for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++) @@ -105,7 +105,7 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator-=(const CFloat32Pro  		CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);  		CFloat32VolumeData2D * pDataProjection = _data.fetchProjection(iProjectionIndex); -		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) +		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorCount; iDetectorIndex++)  		{  			float32 fThisValue = pThisProjection->getData()[iDetectorIndex];  			float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; @@ -129,13 +129,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator*=(const CFloat32Pro  	CProjectionGeometry3D * pThisGeometry = getGeometry();  	int iProjectionCount = pThisGeometry->getProjectionCount(); +	int iDetectorCount = pThisGeometry->getDetectorTotCount();  #ifdef _DEBUG  	CProjectionGeometry3D * pDataGeometry = _data.getGeometry(); -	int iThisProjectionDetectorCount = pThisGeometry->getDetectorRowCount() * pThisGeometry->getDetectorColCount(); -	int iDataProjectionDetectorCount = pDataGeometry->getDetectorRowCount() * pDataGeometry->getDetectorColCount(); +	int iDataProjectionDetectorCount = pDataGeometry->getDetectorTotCount();  	ASTRA_ASSERT(iProjectionCount == pDataGeometry->getProjectionCount()); -	ASTRA_ASSERT(iThisProjectionDetectorCount == iDataProjectionDetectorCount); +	ASTRA_ASSERT(iDetectorCount == iDataProjectionDetectorCount);  #endif  	for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++) @@ -143,7 +143,7 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator*=(const CFloat32Pro  		CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);  		CFloat32VolumeData2D * pDataProjection = _data.fetchProjection(iProjectionIndex); -		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) +		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorCount; iDetectorIndex++)  		{  			float32 fThisValue = pThisProjection->getData()[iDetectorIndex];  			float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; @@ -167,12 +167,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator*=(const float32& _f  	CProjectionGeometry3D * pThisGeometry = getGeometry();  	int iProjectionCount = pThisGeometry->getProjectionCount(); +	int iDetectorCount = pThisGeometry->getDetectorTotCount();  	for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)  	{  		CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex); -		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) +		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorCount; iDetectorIndex++)  		{  			float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; @@ -194,12 +195,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator/=(const float32& _f  	CProjectionGeometry3D * pThisGeometry = getGeometry();  	int iProjectionCount = pThisGeometry->getProjectionCount(); +	int iDetectorCount = pThisGeometry->getDetectorTotCount();  	for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)  	{  		CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex); -		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) +		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorCount; iDetectorIndex++)  		{  			float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; @@ -221,12 +223,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator+=(const float32& _f  	CProjectionGeometry3D * pThisGeometry = getGeometry();  	int iProjectionCount = pThisGeometry->getProjectionCount(); +	int iDetectorCount = pThisGeometry->getDetectorTotCount();  	for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)  	{  		CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex); -		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) +		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorCount; iDetectorIndex++)  		{  			float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; @@ -248,12 +251,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator-=(const float32& _f  	CProjectionGeometry3D * pThisGeometry = getGeometry();  	int iProjectionCount = pThisGeometry->getProjectionCount(); +	int iDetectorCount = pThisGeometry->getDetectorTotCount();  	for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)  	{  		CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex); -		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) +		for(int iDetectorIndex = 0; iDetectorIndex < iDetectorCount; iDetectorIndex++)  		{  			float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; diff --git a/src/Logging.cpp b/src/Logging.cpp index 8290ca0..cd7e3f0 100644 --- a/src/Logging.cpp +++ b/src/Logging.cpp @@ -70,37 +70,65 @@ void CLogger::disable()  void CLogger::debug(const char *sfile, int sline, const char *fmt, ...)  {  	_assureIsInitialized(); -	va_list ap; -	va_start(ap, fmt); -	if(m_bEnabledScreen) clog_debug(sfile,sline,0,fmt,ap); -	if(m_bEnabledFile && m_bFileProvided) clog_debug(sfile,sline,1,fmt,ap); +	va_list ap, apf; +	if(m_bEnabledScreen){ +        va_start(ap, fmt); +        clog_debug(sfile,sline,0,fmt,ap); +        va_end(ap); +    } +	if(m_bEnabledFile && m_bFileProvided){ +        va_start(apf, fmt); +        clog_debug(sfile,sline,1,fmt,apf); +        va_end(apf); +    }  }  void CLogger::info(const char *sfile, int sline, const char *fmt, ...)  {  	_assureIsInitialized(); -	va_list ap; -	va_start(ap, fmt); -	if(m_bEnabledScreen) clog_info(sfile,sline,0,fmt,ap); -	if(m_bEnabledFile && m_bFileProvided) clog_info(sfile,sline,1,fmt,ap); +	va_list ap, apf; +	if(m_bEnabledScreen){ +        va_start(ap, fmt); +        clog_info(sfile,sline,0,fmt,ap); +        va_end(ap); +    } +	if(m_bEnabledFile && m_bFileProvided){ +        va_start(apf, fmt); +        clog_info(sfile,sline,1,fmt,apf); +        va_end(apf); +    }  }  void CLogger::warn(const char *sfile, int sline, const char *fmt, ...)  {  	_assureIsInitialized(); -	va_list ap; -	va_start(ap, fmt); -	if(m_bEnabledScreen) clog_warn(sfile,sline,0,fmt,ap); -	if(m_bEnabledFile && m_bFileProvided) clog_warn(sfile,sline,1,fmt,ap); +	va_list ap, apf; +	if(m_bEnabledScreen){ +        va_start(ap, fmt); +        clog_warn(sfile,sline,0,fmt,ap); +        va_end(ap); +    } +	if(m_bEnabledFile && m_bFileProvided){ +        va_start(apf, fmt); +        clog_warn(sfile,sline,1,fmt,apf); +        va_end(apf); +    }  }  void CLogger::error(const char *sfile, int sline, const char *fmt, ...)  {  	_assureIsInitialized(); -	va_list ap; -	va_start(ap, fmt); -	if(m_bEnabledScreen) clog_error(sfile,sline,0,fmt,ap); -	if(m_bEnabledFile && m_bFileProvided) clog_error(sfile,sline,1,fmt,ap); +	va_list ap, apf; +	if(m_bEnabledScreen){ +        va_start(ap, fmt); +        clog_error(sfile,sline,0,fmt,ap); +        va_end(ap); +    } +	if(m_bEnabledFile && m_bFileProvided){ +        va_start(apf, fmt); +        clog_error(sfile,sline,1,fmt,apf); +        va_end(apf); +    }  }  void CLogger::_setLevel(int id, log_level m_eLevel) diff --git a/src/ParallelProjectionGeometry2D.cpp b/src/ParallelProjectionGeometry2D.cpp index 699e141..7260b83 100644 --- a/src/ParallelProjectionGeometry2D.cpp +++ b/src/ParallelProjectionGeometry2D.cpp @@ -180,6 +180,11 @@ Config* CParallelProjectionGeometry2D::getConfiguration() const  	cfg->self.addChildNode("DetectorCount", getDetectorCount());  	cfg->self.addChildNode("DetectorWidth", getDetectorWidth());  	cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount); +	if(m_pfExtraDetectorOffset!=NULL){ +		XMLNode opt = cfg->self.addChildNode("Option"); +		opt.addAttribute("key","ExtraDetectorOffset"); +		opt.setContent(m_pfExtraDetectorOffset, m_iProjectionAngleCount); +	}  	return cfg;  }  //---------------------------------------------------------------------------------------- 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; diff --git a/src/ReconstructionAlgorithm3D.cpp b/src/ReconstructionAlgorithm3D.cpp index 86b8ab2..13d4b07 100644 --- a/src/ReconstructionAlgorithm3D.cpp +++ b/src/ReconstructionAlgorithm3D.cpp @@ -106,14 +106,18 @@ bool CReconstructionAlgorithm3D::initialize(const Config& _cfg)  	XMLNode node;  	int id; -#if 0 +  	// projector -	node = _cfg.self->getSingleNode("ProjectorId"); -	ASTRA_CONFIG_CHECK(node, "Reconstruction3D", "No ProjectorId tag specified."); -	id = boost::lexical_cast<int>(node->getContent()); -	m_pProjector = CProjector3DManager::getSingleton().get(id); -	ASTRA_DELETE(node); -#endif +	node = _cfg.self.getSingleNode("ProjectorId"); +	m_pProjector = 0; +	if (node) { +		id = boost::lexical_cast<int>(node.getContent()); +		m_pProjector = CProjector3DManager::getSingleton().get(id); +		if (!m_pProjector) { +			// TODO: Report +		} +	} +	CC.markNodeParsed("ProjectorId");  	// sinogram data  	node = _cfg.self.getSingleNode("ProjectionDataId"); @@ -143,6 +147,7 @@ bool CReconstructionAlgorithm3D::initialize(const Config& _cfg)  		id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));  		m_pSinogramMask = dynamic_cast<CFloat32ProjectionData3D*>(CData3DManager::getSingleton().get(id));  	} +	CC.markOptionParsed("SinogramMaskId");  	// Constraints - NEW  	if (_cfg.self.hasOption("MinConstraint")) { | 
