summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CompositeGeometryManager.cpp41
-rw-r--r--src/CudaFDKAlgorithm3D.cpp3
2 files changed, 24 insertions, 20 deletions
diff --git a/src/CompositeGeometryManager.cpp b/src/CompositeGeometryManager.cpp
index 184144c..8af430c 100644
--- a/src/CompositeGeometryManager.cpp
+++ b/src/CompositeGeometryManager.cpp
@@ -1115,7 +1115,8 @@ CCompositeGeometryManager::CProjectionPart* CCompositeGeometryManager::CProjecti
CCompositeGeometryManager::SJob CCompositeGeometryManager::createJobFP(CProjector3D *pProjector,
CFloat32VolumeData3D *pVolData,
- CFloat32ProjectionData3D *pProjData)
+ CFloat32ProjectionData3D *pProjData,
+ SJob::EMode eMode)
{
ASTRA_DEBUG("CCompositeGeometryManager::createJobFP");
// Create single job for FP
@@ -1141,14 +1142,15 @@ CCompositeGeometryManager::SJob CCompositeGeometryManager::createJobFP(CProjecto
FP.pOutput = boost::shared_ptr<CPart>(output);
FP.pProjector = pProjector;
FP.eType = SJob::JOB_FP;
- FP.eMode = SJob::MODE_SET;
+ FP.eMode = eMode;
return FP;
}
CCompositeGeometryManager::SJob CCompositeGeometryManager::createJobBP(CProjector3D *pProjector,
CFloat32VolumeData3D *pVolData,
- CFloat32ProjectionData3D *pProjData)
+ CFloat32ProjectionData3D *pProjData,
+ SJob::EMode eMode)
{
ASTRA_DEBUG("CCompositeGeometryManager::createJobBP");
// Create single job for BP
@@ -1172,25 +1174,25 @@ CCompositeGeometryManager::SJob CCompositeGeometryManager::createJobBP(CProjecto
BP.pOutput = boost::shared_ptr<CPart>(output);
BP.pProjector = pProjector;
BP.eType = SJob::JOB_BP;
- BP.eMode = SJob::MODE_SET;
+ BP.eMode = eMode;
return BP;
}
bool CCompositeGeometryManager::doFP(CProjector3D *pProjector, CFloat32VolumeData3D *pVolData,
- CFloat32ProjectionData3D *pProjData)
+ CFloat32ProjectionData3D *pProjData, SJob::EMode eMode)
{
TJobList L;
- L.push_back(createJobFP(pProjector, pVolData, pProjData));
+ L.push_back(createJobFP(pProjector, pVolData, pProjData, eMode));
return doJobs(L);
}
-bool CCompositeGeometryManager::doBP(CProjector3D *pProjector, CFloat32VolumeData3D *pVolData,
- CFloat32ProjectionData3D *pProjData)
+ bool CCompositeGeometryManager::doBP(CProjector3D *pProjector, CFloat32VolumeData3D *pVolData,
+ CFloat32ProjectionData3D *pProjData, SJob::EMode eMode)
{
TJobList L;
- L.push_back(createJobBP(pProjector, pVolData, pProjData));
+ L.push_back(createJobBP(pProjector, pVolData, pProjData, eMode));
return doJobs(L);
}
@@ -1198,14 +1200,15 @@ bool CCompositeGeometryManager::doBP(CProjector3D *pProjector, CFloat32VolumeDat
bool CCompositeGeometryManager::doFDK(CProjector3D *pProjector, CFloat32VolumeData3D *pVolData,
CFloat32ProjectionData3D *pProjData, bool bShortScan,
- const float *pfFilter)
+ const float *pfFilter, SJob::EMode eMode)
{
- if (!dynamic_cast<CConeProjectionGeometry3D*>(pProjData->getGeometry())) {
- ASTRA_ERROR("CCompositeGeometryManager::doFDK: cone geometry required");
+ if (!dynamic_cast<CConeProjectionGeometry3D*>(pProjData->getGeometry()) &&
+ !dynamic_cast<CConeVecProjectionGeometry3D*>(pProjData->getGeometry())) {
+ ASTRA_ERROR("CCompositeGeometryManager::doFDK: cone/cone_vec geometry required");
return false;
}
- SJob job = createJobBP(pProjector, pVolData, pProjData);
+ SJob job = createJobBP(pProjector, pVolData, pProjData, eMode);
job.eType = SJob::JOB_FDK;
job.FDKSettings.bShortScan = bShortScan;
job.FDKSettings.pfFilter = pfFilter;
@@ -1216,7 +1219,7 @@ bool CCompositeGeometryManager::doFDK(CProjector3D *pProjector, CFloat32VolumeDa
return doJobs(L);
}
-bool CCompositeGeometryManager::doFP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData)
+bool CCompositeGeometryManager::doFP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData, SJob::EMode eMode)
{
ASTRA_DEBUG("CCompositeGeometryManager::doFP, multi-volume");
@@ -1254,7 +1257,7 @@ bool CCompositeGeometryManager::doFP(CProjector3D *pProjector, const std::vector
for (i2 = outputs.begin(); i2 != outputs.end(); ++i2) {
SJob FP;
- FP.eMode = SJob::MODE_SET;
+ FP.eMode = eMode;
for (j2 = inputs.begin(); j2 != inputs.end(); ++j2) {
FP.pInput = *j2;
FP.pOutput = *i2;
@@ -1262,7 +1265,7 @@ bool CCompositeGeometryManager::doFP(CProjector3D *pProjector, const std::vector
FP.eType = SJob::JOB_FP;
L.push_back(FP);
- // Set first, add rest
+ // Always ADD rest
FP.eMode = SJob::MODE_ADD;
}
}
@@ -1270,7 +1273,7 @@ bool CCompositeGeometryManager::doFP(CProjector3D *pProjector, const std::vector
return doJobs(L);
}
-bool CCompositeGeometryManager::doBP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData)
+bool CCompositeGeometryManager::doBP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData, SJob::EMode eMode)
{
ASTRA_DEBUG("CCompositeGeometryManager::doBP, multi-volume");
@@ -1309,7 +1312,7 @@ bool CCompositeGeometryManager::doBP(CProjector3D *pProjector, const std::vector
for (i2 = outputs.begin(); i2 != outputs.end(); ++i2) {
SJob BP;
- BP.eMode = SJob::MODE_SET;
+ BP.eMode = eMode;
for (j2 = inputs.begin(); j2 != inputs.end(); ++j2) {
BP.pInput = *j2;
BP.pOutput = *i2;
@@ -1317,7 +1320,7 @@ bool CCompositeGeometryManager::doBP(CProjector3D *pProjector, const std::vector
BP.eType = SJob::JOB_BP;
L.push_back(BP);
- // Set first, add rest
+ // Always ADD rest
BP.eMode = SJob::MODE_ADD;
}
}
diff --git a/src/CudaFDKAlgorithm3D.cpp b/src/CudaFDKAlgorithm3D.cpp
index 6616a85..00e908e 100644
--- a/src/CudaFDKAlgorithm3D.cpp
+++ b/src/CudaFDKAlgorithm3D.cpp
@@ -31,6 +31,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
#include "astra/CudaProjector3D.h"
#include "astra/ConeProjectionGeometry3D.h"
+#include "astra/ConeVecProjectionGeometry3D.h"
#include "astra/CompositeGeometryManager.h"
#include "astra/Logging.h"
@@ -82,7 +83,7 @@ bool CCudaFDKAlgorithm3D::_check()
ASTRA_CONFIG_CHECK(CReconstructionAlgorithm3D::_check(), "CUDA_FDK", "Error in ReconstructionAlgorithm3D initialization");
const CProjectionGeometry3D* projgeom = m_pSinogram->getGeometry();
- ASTRA_CONFIG_CHECK(dynamic_cast<const CConeProjectionGeometry3D*>(projgeom), "CUDA_FDK", "Error setting FDK geometry");
+ ASTRA_CONFIG_CHECK(dynamic_cast<const CConeProjectionGeometry3D*>(projgeom) || dynamic_cast<const CConeVecProjectionGeometry3D*>(projgeom), "CUDA_FDK", "Error setting FDK geometry");
const CVolumeGeometry3D* volgeom = m_pReconstruction->getGeometry();