summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2014-10-01 17:28:40 +0200
committerWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2014-10-01 17:28:40 +0200
commit6354a9af8f1bb5443e7a56b24a84ee1c258a95af (patch)
treec6526a34c523781ef80615185cd9031bb7ca0002 /src
parent9831569ef1730b1003f8ebe4378ce31973fcdf9f (diff)
downloadastra-6354a9af8f1bb5443e7a56b24a84ee1c258a95af.tar.gz
astra-6354a9af8f1bb5443e7a56b24a84ee1c258a95af.tar.bz2
astra-6354a9af8f1bb5443e7a56b24a84ee1c258a95af.tar.xz
astra-6354a9af8f1bb5443e7a56b24a84ee1c258a95af.zip
Support flexible 2D volume geometry in CudaReconstructionAlgorithm too
Diffstat (limited to 'src')
-rw-r--r--src/CudaReconstructionAlgorithm2D.cpp71
1 files changed, 21 insertions, 50 deletions
diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp
index 0443303..f769482 100644
--- a/src/CudaReconstructionAlgorithm2D.cpp
+++ b/src/CudaReconstructionAlgorithm2D.cpp
@@ -350,7 +350,7 @@ bool CCudaReconstructionAlgorithm2D::setupGeometry()
const CVolumeGeometry2D& volgeom = *m_pReconstruction->getGeometry();
- // TODO: off-center geometry, non-square pixels
+ // TODO: non-square pixels?
dims.iVolWidth = volgeom.getGridColCount();
dims.iVolHeight = volgeom.getGridRowCount();
float fPixelSize = volgeom.getPixelLengthX();
@@ -365,66 +365,42 @@ bool CCudaReconstructionAlgorithm2D::setupGeometry()
if (parProjGeom) {
+ float *offsets, *angles, detSize, outputScale;
+
+ ok = convertAstraGeometry(&volgeom, parProjGeom, offsets, angles, detSize, outputScale);
+
dims.iProjAngles = parProjGeom->getProjectionAngleCount();
dims.iProjDets = parProjGeom->getDetectorCount();
dims.fDetScale = parProjGeom->getDetectorWidth() / fPixelSize;
ok = m_pAlgo->setGeometry(dims, parProjGeom->getProjectionAngles());
+ ok &= m_pAlgo->setTOffsets(offsets);
- } else if (fanProjGeom) {
+ // CHECKME: outputScale? detSize?
- dims.iProjAngles = fanProjGeom->getProjectionAngleCount();
- dims.iProjDets = fanProjGeom->getDetectorCount();
- dims.fDetScale = fanProjGeom->getDetectorWidth() / fPixelSize;
- float fOriginSourceDistance = fanProjGeom->getOriginSourceDistance();
- float fOriginDetectorDistance = fanProjGeom->getOriginDetectorDistance();
+ delete[] offsets;
+ delete[] angles;
- const float* angles = fanProjGeom->getProjectionAngles();
+ } else if (fanProjGeom || fanVecProjGeom) {
astraCUDA::SFanProjection* projs;
- projs = new astraCUDA::SFanProjection[dims.iProjAngles];
-
- float fSrcX0 = 0.0f;
- float fSrcY0 = -fOriginSourceDistance / fPixelSize;
- float fDetUX0 = dims.fDetScale;
- float fDetUY0 = 0.0f;
- float fDetSX0 = dims.iProjDets * fDetUX0 / -2.0f;
- float fDetSY0 = fOriginDetectorDistance / fPixelSize;
-
-#define ROTATE0(name,i,alpha) do { projs[i].f##name##X = f##name##X0 * cos(alpha) - f##name##Y0 * sin(alpha); projs[i].f##name##Y = f##name##X0 * sin(alpha) + f##name##Y0 * cos(alpha); } while(0)
- for (unsigned int i = 0; i < dims.iProjAngles; ++i) {
- ROTATE0(Src, i, angles[i]);
- ROTATE0(DetS, i, angles[i]);
- ROTATE0(DetU, i, angles[i]);
+ float outputScale;
+
+ if (fanProjGeom) {
+ ok = convertAstraGeometry(&volgeom, fanProjGeom, projs, outputScale);
+ } else {
+ ok = convertAstraGeometry(&volgeom, fanVecProjGeom, projs, outputScale);
}
-#undef ROTATE0
+ dims.iProjAngles = m_pSinogram->getGeometry()->getProjectionAngleCount();
+ dims.iProjDets = m_pSinogram->getGeometry()->getDetectorCount();
+ dims.fDetScale = m_pSinogram->getGeometry()->getDetectorWidth() / fPixelSize;
ok = m_pAlgo->setFanGeometry(dims, projs);
- delete[] projs;
-
- } else if (fanVecProjGeom) {
-
- dims.iProjAngles = fanVecProjGeom->getProjectionAngleCount();
- dims.iProjDets = fanVecProjGeom->getDetectorCount();
- dims.fDetScale = fanVecProjGeom->getDetectorWidth() / fPixelSize;
-
- const astraCUDA::SFanProjection* projs;
- projs = fanVecProjGeom->getProjectionVectors();
- // Rescale projs to fPixelSize == 1
+ // CHECKME: outputScale?
- astraCUDA::SFanProjection* scaledProjs = new astraCUDA::SFanProjection[dims.iProjAngles];
-#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 < dims.iProjAngles; ++i) {
- SCALE(Src,i,1.0f/fPixelSize);
- SCALE(DetS,i,1.0f/fPixelSize);
- SCALE(DetU,i,1.0f/fPixelSize);
- }
-
- ok = m_pAlgo->setFanGeometry(dims, scaledProjs);
-
- delete[] scaledProjs;
+ delete[] projs;
} else {
@@ -441,11 +417,6 @@ bool CCudaReconstructionAlgorithm2D::setupGeometry()
ok &= m_pAlgo->enableSinogramMask();
if (!ok) return false;
- const float *pfTOffsets = m_pSinogram->getGeometry()->getExtraDetectorOffset();
- if (pfTOffsets)
- ok &= m_pAlgo->setTOffsets(pfTOffsets);
- if (!ok) return false;
-
ok &= m_pAlgo->init();
if (!ok) return false;