diff options
author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2014-10-01 16:52:21 +0200 |
---|---|---|
committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2014-10-01 16:52:21 +0200 |
commit | 9831569ef1730b1003f8ebe4378ce31973fcdf9f (patch) | |
tree | 6b6d7a26cd74564631b0268b9ad58cbb6c0023e6 /src/CudaForwardProjectionAlgorithm.cpp | |
parent | 78a179737366188aea505173e3a935b08c3cef55 (diff) | |
download | astra-9831569ef1730b1003f8ebe4378ce31973fcdf9f.tar.gz astra-9831569ef1730b1003f8ebe4378ce31973fcdf9f.tar.bz2 astra-9831569ef1730b1003f8ebe4378ce31973fcdf9f.tar.xz astra-9831569ef1730b1003f8ebe4378ce31973fcdf9f.zip |
Support flexible 2D volume geometry
Diffstat (limited to 'src/CudaForwardProjectionAlgorithm.cpp')
-rw-r--r-- | src/CudaForwardProjectionAlgorithm.cpp | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/src/CudaForwardProjectionAlgorithm.cpp b/src/CudaForwardProjectionAlgorithm.cpp index bd9cffb..b182251 100644 --- a/src/CudaForwardProjectionAlgorithm.cpp +++ b/src/CudaForwardProjectionAlgorithm.cpp @@ -214,52 +214,45 @@ void CCudaForwardProjectionAlgorithm::run(int) bool ok = false; if (parProjGeom) { + + float *offsets, *angles, detSize, outputScale; + ok = convertAstraGeometry(pVolGeom, parProjGeom, offsets, angles, detSize, outputScale); + + ASTRA_ASSERT(ok); // FIXME + + // FIXME: Output scaling + ok = astraCudaFP(m_pVolume->getDataConst(), m_pSinogram->getData(), pVolGeom->getGridColCount(), pVolGeom->getGridRowCount(), parProjGeom->getProjectionAngleCount(), parProjGeom->getDetectorCount(), - parProjGeom->getProjectionAngles(), - parProjGeom->getExtraDetectorOffset(), parProjGeom->getDetectorWidth() / pVolGeom->getPixelLengthX(), - m_iDetectorSuperSampling, m_iGPUIndex); + angles, offsets, detSize, + m_iDetectorSuperSampling, 1.0f * outputScale, m_iGPUIndex); - } else if (fanProjGeom) { + delete[] offsets; + delete[] angles; - ok = astraCudaFanFP(m_pVolume->getDataConst(), m_pSinogram->getData(), - pVolGeom->getGridColCount(), pVolGeom->getGridRowCount(), - fanProjGeom->getProjectionAngleCount(), - fanProjGeom->getDetectorCount(), - fanProjGeom->getProjectionAngles(), - fanProjGeom->getOriginSourceDistance(), - fanProjGeom->getOriginDetectorDistance(), - pVolGeom->getPixelLengthX(), - fanProjGeom->getDetectorWidth(), - m_iDetectorSuperSampling, m_iGPUIndex); - - } else if (fanVecProjGeom) { - - // Rescale projs to fPixelSize == 1 - float fPixelSize = pVolGeom->getPixelLengthX(); - const astraCUDA::SFanProjection* projs; - projs = fanVecProjGeom->getProjectionVectors(); - - astraCUDA::SFanProjection* scaledProjs = new astraCUDA::SFanProjection[fanVecProjGeom->getProjectionAngleCount()]; -#define SCALE(name,i,alpha) do { scaledProjs[i].f##name##X = projs[i].f##name##X * alpha; scaledProjs[i].f##name##Y = projs[i].f##name##Y * alpha; } while (0) - for (unsigned int i = 0; i < fanVecProjGeom->getProjectionAngleCount(); ++i) { - SCALE(Src,i,1.0f/fPixelSize); - SCALE(DetS,i,1.0f/fPixelSize); - SCALE(DetU,i,1.0f/fPixelSize); + } else if (fanProjGeom || fanVecProjGeom) { + + astraCUDA::SFanProjection* projs; + float outputScale; + + if (fanProjGeom) { + ok = convertAstraGeometry(pVolGeom, fanProjGeom, projs, outputScale); + } else { + ok = convertAstraGeometry(pVolGeom, fanVecProjGeom, projs, outputScale); } + ASTRA_ASSERT(ok); ok = astraCudaFanFP(m_pVolume->getDataConst(), m_pSinogram->getData(), pVolGeom->getGridColCount(), pVolGeom->getGridRowCount(), - fanVecProjGeom->getProjectionAngleCount(), - fanVecProjGeom->getDetectorCount(), - scaledProjs, - /* 1.0f / pVolGeom->getPixelLengthX(), */ - m_iDetectorSuperSampling, m_iGPUIndex); + m_pSinogram->getGeometry()->getProjectionAngleCount(), + m_pSinogram->getGeometry()->getDetectorCount(), + projs, + m_iDetectorSuperSampling, outputScale, m_iGPUIndex); - delete[] scaledProjs; + delete[] projs; } else { |