diff options
| author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2015-06-04 17:23:54 +0200 | 
|---|---|---|
| committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2015-06-23 12:10:00 +0200 | 
| commit | e622f453c6ab9de6277611e01cac415e297553f7 (patch) | |
| tree | a4aabee574d07f8b3142607d0a038781f5af0794 | |
| parent | 0985154228a63db25e9a0a0165994221d9b97a91 (diff) | |
| download | astra-e622f453c6ab9de6277611e01cac415e297553f7.tar.gz astra-e622f453c6ab9de6277611e01cac415e297553f7.tar.bz2 astra-e622f453c6ab9de6277611e01cac415e297553f7.tar.xz astra-e622f453c6ab9de6277611e01cac415e297553f7.zip | |
Use supersampling options from CudaProjector2D
| -rw-r--r-- | src/CudaFilteredBackProjectionAlgorithm.cpp | 27 | ||||
| -rw-r--r-- | src/CudaForwardProjectionAlgorithm.cpp | 38 | ||||
| -rw-r--r-- | src/CudaReconstructionAlgorithm2D.cpp | 44 | 
3 files changed, 73 insertions, 36 deletions
| diff --git a/src/CudaFilteredBackProjectionAlgorithm.cpp b/src/CudaFilteredBackProjectionAlgorithm.cpp index 5d6c166..aac96d6 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" @@ -77,8 +78,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)); @@ -152,10 +167,16 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)  	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);  	CC.markOptionParsed("GPUindex"); -	// Pixel supersampling factor -	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", 1); +	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); diff --git a/src/CudaForwardProjectionAlgorithm.cpp b/src/CudaForwardProjectionAlgorithm.cpp index 0f97d59..b382f2e 100644 --- a/src/CudaForwardProjectionAlgorithm.cpp +++ b/src/CudaForwardProjectionAlgorithm.cpp @@ -71,9 +71,24 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  {  	ASTRA_ASSERT(_cfg.self);  	ConfigStackCheck<CAlgorithm> CC("CudaForwardProjectionAlgorithm", this, _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"); +		} +	} +	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)); @@ -94,21 +109,14 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  		CC.markOptionParsed("GPUIndex");  	// Detector supersampling factor -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); -	CC.markOptionParsed("DetectorSuperSampling"); - - -	// 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"); -		} +	m_iDetectorSuperSampling = 1; +	if (pCudaProjector) { +		// New interface +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling();  	} -	CC.markNodeParsed("ProjectorId"); -	 +	// Deprecated option +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	CC.markOptionParsed("DetectorSuperSampling");  	// return success diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp index db99d42..71b6637 100644 --- a/src/CudaReconstructionAlgorithm2D.cpp +++ b/src/CudaReconstructionAlgorithm2D.cpp @@ -95,8 +95,22 @@ bool CCudaReconstructionAlgorithm2D::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, "CudaSirt2", "No ProjectionDataId tag specified.");  	int id = boost::lexical_cast<int>(node.getContent());  	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); @@ -161,27 +175,21 @@ bool CCudaReconstructionAlgorithm2D::initialize(const Config& _cfg)  	if (!_cfg.self.hasOption("GPUindex"))  		CC.markOptionParsed("GPUIndex"); -	// Detector supersampling factor -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1); +	// Supersampling factors +	m_iDetectorSuperSampling = 1; +	m_iPixelSuperSampling = 1; +	if (pCudaProjector) { +		// New interface +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iPixelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +	} +	// 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"); - -  	return _check();  } | 
