summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <WillemJan.Palenstijn@uantwerpen.be>2014-04-16 11:13:22 +0000
committerwpalenst <WillemJan.Palenstijn@uantwerpen.be>2014-04-16 11:13:22 +0000
commit0c77eee16e2f4161c1ebc110b15ce6563d4a96c2 (patch)
treed824a763da5578391839c57057d5ecee26554873 /src
parent8b046691e7cf5ba603b690e5a820869f7aba0bb6 (diff)
downloadastra-0c77eee16e2f4161c1ebc110b15ce6563d4a96c2.tar.gz
astra-0c77eee16e2f4161c1ebc110b15ce6563d4a96c2.tar.bz2
astra-0c77eee16e2f4161c1ebc110b15ce6563d4a96c2.tar.xz
astra-0c77eee16e2f4161c1ebc110b15ce6563d4a96c2.zip
Add fan beam support to FBP_CUDA
Diffstat (limited to 'src')
-rw-r--r--src/CudaFilteredBackProjectionAlgorithm.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/CudaFilteredBackProjectionAlgorithm.cpp b/src/CudaFilteredBackProjectionAlgorithm.cpp
index 3656f3f..c53ac2d 100644
--- a/src/CudaFilteredBackProjectionAlgorithm.cpp
+++ b/src/CudaFilteredBackProjectionAlgorithm.cpp
@@ -27,6 +27,7 @@ $Id$
*/
#include <astra/CudaFilteredBackProjectionAlgorithm.h>
+#include <astra/FanFlatProjectionGeometry2D.h>
#include <boost/lexical_cast.hpp>
#include <cstring>
@@ -226,7 +227,8 @@ void CCudaFilteredBackProjectionAlgorithm::run(int _iNrIterations /* = 0 */)
if (!m_bAstraFBPInit) {
const CVolumeGeometry2D& volgeom = *m_pReconstruction->getGeometry();
- const CParallelProjectionGeometry2D& projgeom = *dynamic_cast<CParallelProjectionGeometry2D*>(m_pSinogram->getGeometry());
+ const CParallelProjectionGeometry2D* parprojgeom = dynamic_cast<CParallelProjectionGeometry2D*>(m_pSinogram->getGeometry());
+ const CFanFlatProjectionGeometry2D* fanprojgeom = dynamic_cast<CFanFlatProjectionGeometry2D*>(m_pSinogram->getGeometry());
bool ok = true;
@@ -235,10 +237,26 @@ void CCudaFilteredBackProjectionAlgorithm::run(int _iNrIterations /* = 0 */)
volgeom.getGridRowCount(),
volgeom.getPixelLengthX());
// TODO: off-center geometry
- ok &= m_pFBP->setProjectionGeometry(projgeom.getProjectionAngleCount(),
- projgeom.getDetectorCount(),
- projgeom.getProjectionAngles(),
- projgeom.getDetectorWidth());
+ int iDetectorCount;
+ if (parprojgeom) {
+ ok &= m_pFBP->setProjectionGeometry(parprojgeom->getProjectionAngleCount(),
+ parprojgeom->getDetectorCount(),
+ parprojgeom->getProjectionAngles(),
+ parprojgeom->getDetectorWidth());
+ iDetectorCount = parprojgeom->getDetectorCount();
+ } else if (fanprojgeom) {
+ ok &= m_pFBP->setFanGeometry(fanprojgeom->getProjectionAngleCount(),
+ fanprojgeom->getDetectorCount(),
+ fanprojgeom->getProjectionAngles(),
+ fanprojgeom->getOriginSourceDistance(),
+ fanprojgeom->getOriginDetectorDistance(),
+ fanprojgeom->getDetectorWidth(),
+ false); // TODO: Support short-scan
+
+ iDetectorCount = fanprojgeom->getDetectorCount();
+ } else {
+ assert(false);
+ }
ok &= m_pFBP->setPixelSuperSampling(m_iPixelSuperSampling);
@@ -252,7 +270,7 @@ void CCudaFilteredBackProjectionAlgorithm::run(int _iNrIterations /* = 0 */)
ok &= m_pFBP->init(m_iGPUIndex);
ASTRA_ASSERT(ok);
- ok &= m_pFBP->setSinogram(m_pSinogram->getDataConst(), projgeom.getDetectorCount());
+ ok &= m_pFBP->setSinogram(m_pSinogram->getDataConst(), iDetectorCount);
ASTRA_ASSERT(ok);
ok &= m_pFBP->setFilter(m_eFilter, m_pfFilter, m_iFilterWidth, m_fFilterD, m_fFilterParameter);