diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/CudaBackProjectionAlgorithm3D.cpp | 99 | ||||
| -rw-r--r-- | src/CudaCglsAlgorithm3D.cpp | 39 | ||||
| -rw-r--r-- | src/CudaFDKAlgorithm3D.cpp | 12 | ||||
| -rw-r--r-- | src/CudaForwardProjectionAlgorithm3D.cpp | 59 | ||||
| -rw-r--r-- | src/CudaSirtAlgorithm3D.cpp | 38 | 
5 files changed, 16 insertions, 231 deletions
| diff --git a/src/CudaBackProjectionAlgorithm3D.cpp b/src/CudaBackProjectionAlgorithm3D.cpp index c9d9447..8cf4c3b 100644 --- a/src/CudaBackProjectionAlgorithm3D.cpp +++ b/src/CudaBackProjectionAlgorithm3D.cpp @@ -136,16 +136,8 @@ bool CCudaBackProjectionAlgorithm3D::initialize(const Config& _cfg) -	CFloat32ProjectionData3DMemory* pSinoMem = dynamic_cast<CFloat32ProjectionData3DMemory*>(m_pSinogram); -	ASTRA_ASSERT(pSinoMem); -	const CProjectionGeometry3D* projgeom = pSinoMem->getGeometry(); -const CParallelProjectionGeometry3D* par3dgeom = dynamic_cast<const CParallelProjectionGeometry3D*>(projgeom); -	const CParallelVecProjectionGeometry3D* parvec3dgeom = dynamic_cast<const CParallelVecProjectionGeometry3D*>(projgeom); -	if (parvec3dgeom || par3dgeom) { -		// This option is only supported for Par3D currently -		m_bSIRTWeighting = _cfg.self.getOptionBool("SIRTWeighting", false); -		CC.markOptionParsed("SIRTWeighting"); -	} +	m_bSIRTWeighting = _cfg.self.getOptionBool("SIRTWeighting", false); +	CC.markOptionParsed("SIRTWeighting");  	// success  	m_bIsInitialized = _check(); @@ -203,88 +195,17 @@ void CCudaBackProjectionAlgorithm3D::run(int _iNrIterations)  	ASTRA_ASSERT(pReconMem);  	const CProjectionGeometry3D* projgeom = pSinoMem->getGeometry(); -	const CConeProjectionGeometry3D* conegeom = dynamic_cast<const CConeProjectionGeometry3D*>(projgeom); -	const CParallelProjectionGeometry3D* par3dgeom = dynamic_cast<const CParallelProjectionGeometry3D*>(projgeom); -	const CConeVecProjectionGeometry3D* conevecgeom = dynamic_cast<const CConeVecProjectionGeometry3D*>(projgeom); -	const CParallelVecProjectionGeometry3D* parvec3dgeom = dynamic_cast<const CParallelVecProjectionGeometry3D*>(projgeom);  	const CVolumeGeometry3D& volgeom = *pReconMem->getGeometry(); -	if (conegeom) { -		astraCudaConeBP(pReconMem->getData(), pSinoMem->getDataConst(), -		                volgeom.getGridColCount(), -		                volgeom.getGridRowCount(), -		                volgeom.getGridSliceCount(), -		                conegeom->getProjectionCount(), -		                conegeom->getDetectorColCount(), -		                conegeom->getDetectorRowCount(), -		                conegeom->getOriginSourceDistance(), -		                conegeom->getOriginDetectorDistance(), -		                conegeom->getDetectorSpacingX(), -		                conegeom->getDetectorSpacingY(), -		                conegeom->getProjectionAngles(), -		                m_iGPUIndex, m_iVoxelSuperSampling); -	} else if (par3dgeom) { -		if (!m_bSIRTWeighting) { -			astraCudaPar3DBP(pReconMem->getData(), pSinoMem->getDataConst(), -			                 volgeom.getGridColCount(), -			                 volgeom.getGridRowCount(), -			                 volgeom.getGridSliceCount(), -			                 par3dgeom->getProjectionCount(), -			                 par3dgeom->getDetectorColCount(), -			                 par3dgeom->getDetectorRowCount(), -			                 par3dgeom->getDetectorSpacingX(), -			                 par3dgeom->getDetectorSpacingY(), -			                 par3dgeom->getProjectionAngles(), -			                 m_iGPUIndex, m_iVoxelSuperSampling); -		} else { -			astraCudaPar3DBP_SIRTWeighted(pReconMem->getData(), -			                 pSinoMem->getDataConst(), -			                 volgeom.getGridColCount(), -			                 volgeom.getGridRowCount(), -			                 volgeom.getGridSliceCount(), -			                 par3dgeom->getProjectionCount(), -			                 par3dgeom->getDetectorColCount(), -			                 par3dgeom->getDetectorRowCount(), -			                 par3dgeom->getDetectorSpacingX(), -			                 par3dgeom->getDetectorSpacingY(), -			                 par3dgeom->getProjectionAngles(), -			                 m_iGPUIndex, m_iVoxelSuperSampling); -		} -	} else if (parvec3dgeom) { -		if (!m_bSIRTWeighting) { -			astraCudaPar3DBP(pReconMem->getData(), pSinoMem->getDataConst(), -			                 volgeom.getGridColCount(), -			                 volgeom.getGridRowCount(), -			                 volgeom.getGridSliceCount(), -			                 parvec3dgeom->getProjectionCount(), -			                 parvec3dgeom->getDetectorColCount(), -			                 parvec3dgeom->getDetectorRowCount(), -			                 parvec3dgeom->getProjectionVectors(), -			                 m_iGPUIndex, m_iVoxelSuperSampling); -		} else { -			astraCudaPar3DBP_SIRTWeighted(pReconMem->getData(), -			                 pSinoMem->getDataConst(), -			                 volgeom.getGridColCount(), -			                 volgeom.getGridRowCount(), -			                 volgeom.getGridSliceCount(), -			                 parvec3dgeom->getProjectionCount(), -			                 parvec3dgeom->getDetectorColCount(), -			                 parvec3dgeom->getDetectorRowCount(), -			                 parvec3dgeom->getProjectionVectors(), -			                 m_iGPUIndex, m_iVoxelSuperSampling); -		} -	} else if (conevecgeom) { -		astraCudaConeBP(pReconMem->getData(), pSinoMem->getDataConst(), -		                volgeom.getGridColCount(), -		                volgeom.getGridRowCount(), -		                volgeom.getGridSliceCount(), -		                conevecgeom->getProjectionCount(), -		                conevecgeom->getDetectorColCount(), -		                conevecgeom->getDetectorRowCount(), -		                conevecgeom->getProjectionVectors(), -		                m_iGPUIndex, m_iVoxelSuperSampling); +	if (m_bSIRTWeighting) { +		astraCudaBP_SIRTWeighted(pReconMem->getData(), +		                         pSinoMem->getDataConst(), +		                         &volgeom, projgeom, +		                         m_iGPUIndex, m_iVoxelSuperSampling);  	} else { -		ASTRA_ASSERT(false); +		astraCudaBP(pReconMem->getData(), pSinoMem->getDataConst(), +		            &volgeom, projgeom, +		            m_iGPUIndex, m_iVoxelSuperSampling);  	}  } diff --git a/src/CudaCglsAlgorithm3D.cpp b/src/CudaCglsAlgorithm3D.cpp index 1cccb6a..abc18d1 100644 --- a/src/CudaCglsAlgorithm3D.cpp +++ b/src/CudaCglsAlgorithm3D.cpp @@ -204,9 +204,6 @@ void CCudaCglsAlgorithm3D::run(int _iNrIterations)  	ASTRA_ASSERT(m_bIsInitialized);  	const CProjectionGeometry3D* projgeom = m_pSinogram->getGeometry(); -	const CConeProjectionGeometry3D* conegeom = dynamic_cast<const CConeProjectionGeometry3D*>(projgeom); -	const CParallelVecProjectionGeometry3D* parvec3dgeom = dynamic_cast<const CParallelVecProjectionGeometry3D*>(projgeom); -	const CConeVecProjectionGeometry3D* conevec3dgeom = dynamic_cast<const CConeVecProjectionGeometry3D*>(projgeom);  	const CVolumeGeometry3D& volgeom = *m_pReconstruction->getGeometry();  	bool ok = true; @@ -215,41 +212,7 @@ void CCudaCglsAlgorithm3D::run(int _iNrIterations)  		ok &= m_pCgls->setGPUIndex(m_iGPUIndex); -		ok &= m_pCgls->setReconstructionGeometry(volgeom.getGridColCount(), -		                                         volgeom.getGridRowCount(), -		                                         volgeom.getGridSliceCount()); -/* -                                  unsigned int iProjAngles, -                                  unsigned int iProjU, -                                  unsigned int iProjV, -                                  float fOriginSourceDistance, -                                  float fOriginDetectorDistance, -                                  float fDetUSize, -                                  float fDetVSize, -                                  const float *pfAngles) -*/ -		if (conegeom) { -			ok &= m_pCgls->setConeGeometry(conegeom->getProjectionCount(), -			                               conegeom->getDetectorColCount(), -			                               conegeom->getDetectorRowCount(), -			                               conegeom->getOriginSourceDistance(), -			                               conegeom->getOriginDetectorDistance(), -			                               conegeom->getDetectorSpacingX(), -			                               conegeom->getDetectorSpacingY(), -			                               conegeom->getProjectionAngles()); -		} else if (parvec3dgeom) { -			ok &= m_pCgls->setPar3DGeometry(parvec3dgeom->getProjectionCount(), -			                                parvec3dgeom->getDetectorColCount(), -			                                parvec3dgeom->getDetectorRowCount(), -			                                parvec3dgeom->getProjectionVectors()); -		} else if (conevec3dgeom) { -			ok &= m_pCgls->setConeGeometry(conevec3dgeom->getProjectionCount(), -			                               conevec3dgeom->getDetectorColCount(), -			                               conevec3dgeom->getDetectorRowCount(), -			                               conevec3dgeom->getProjectionVectors()); -		} else { -			ASTRA_ASSERT(false); -		} +		ok &= m_pCgls->setGeometry(&volgeom, projgeom);  		ok &= m_pCgls->enableSuperSampling(m_iVoxelSuperSampling, m_iDetectorSuperSampling); diff --git a/src/CudaFDKAlgorithm3D.cpp b/src/CudaFDKAlgorithm3D.cpp index 625d02a..1316daa 100644 --- a/src/CudaFDKAlgorithm3D.cpp +++ b/src/CudaFDKAlgorithm3D.cpp @@ -200,17 +200,7 @@ void CCudaFDKAlgorithm3D::run(int _iNrIterations)  	bool ok = true;  	ok = astraCudaFDK(pReconMem->getData(), pSinoMem->getDataConst(), -	                  volgeom.getGridColCount(), -	                  volgeom.getGridRowCount(), -	                  volgeom.getGridSliceCount(), -	                  conegeom->getProjectionCount(), -	                  conegeom->getDetectorColCount(), -	                  conegeom->getDetectorRowCount(), -	                  conegeom->getOriginSourceDistance(), -	                  conegeom->getOriginDetectorDistance(), -	                  conegeom->getDetectorSpacingX(), -	                  conegeom->getDetectorSpacingY(), -	                  conegeom->getProjectionAngles(), +	                  &volgeom, conegeom,  	                  m_bShortScan, m_iGPUIndex, m_iVoxelSuperSampling);  	ASTRA_ASSERT(ok); diff --git a/src/CudaForwardProjectionAlgorithm3D.cpp b/src/CudaForwardProjectionAlgorithm3D.cpp index 6498885..e57e077 100644 --- a/src/CudaForwardProjectionAlgorithm3D.cpp +++ b/src/CudaForwardProjectionAlgorithm3D.cpp @@ -264,10 +264,6 @@ void CCudaForwardProjectionAlgorithm3D::run(int)  	assert(m_bIsInitialized);  	const CProjectionGeometry3D* projgeom = m_pProjections->getGeometry(); -	const CConeProjectionGeometry3D* conegeom = dynamic_cast<const CConeProjectionGeometry3D*>(projgeom); -	const CParallelProjectionGeometry3D* par3dgeom = dynamic_cast<const CParallelProjectionGeometry3D*>(projgeom); -	const CConeVecProjectionGeometry3D* conevecgeom = dynamic_cast<const CConeVecProjectionGeometry3D*>(projgeom); -	const CParallelVecProjectionGeometry3D* parvec3dgeom = dynamic_cast<const CParallelVecProjectionGeometry3D*>(projgeom);  	const CVolumeGeometry3D& volgeom = *m_pVolume->getGeometry();  	Cuda3DProjectionKernel projKernel = ker3d_default; @@ -295,58 +291,9 @@ void CCudaForwardProjectionAlgorithm3D::run(int)  	}  #endif -	if (conegeom) { -		astraCudaConeFP(m_pVolume->getDataConst(), m_pProjections->getData(), -		                volgeom.getGridColCount(), -		                volgeom.getGridRowCount(), -		                volgeom.getGridSliceCount(), -		                conegeom->getProjectionCount(), -		                conegeom->getDetectorColCount(), -		                conegeom->getDetectorRowCount(), -		                conegeom->getOriginSourceDistance(), -		                conegeom->getOriginDetectorDistance(), -		                conegeom->getDetectorSpacingX(), -		                conegeom->getDetectorSpacingY(), -		                conegeom->getProjectionAngles(), -		                m_iGPUIndex, m_iDetectorSuperSampling); -	} else if (par3dgeom) { -		astraCudaPar3DFP(m_pVolume->getDataConst(), m_pProjections->getData(), -		                 volgeom.getGridColCount(), -		                 volgeom.getGridRowCount(), -		                 volgeom.getGridSliceCount(), -		                 par3dgeom->getProjectionCount(), -		                 par3dgeom->getDetectorColCount(), -		                 par3dgeom->getDetectorRowCount(), -		                 par3dgeom->getDetectorSpacingX(), -		                 par3dgeom->getDetectorSpacingY(), -		                 par3dgeom->getProjectionAngles(), -		                 m_iGPUIndex, m_iDetectorSuperSampling, -		                 projKernel); -	} else if (parvec3dgeom) { -		astraCudaPar3DFP(m_pVolume->getDataConst(), m_pProjections->getData(), -		                 volgeom.getGridColCount(), -		                 volgeom.getGridRowCount(), -		                 volgeom.getGridSliceCount(), -		                 parvec3dgeom->getProjectionCount(), -		                 parvec3dgeom->getDetectorColCount(), -		                 parvec3dgeom->getDetectorRowCount(), -		                 parvec3dgeom->getProjectionVectors(), -		                 m_iGPUIndex, m_iDetectorSuperSampling, -		                 projKernel); -	} else if (conevecgeom) { -		astraCudaConeFP(m_pVolume->getDataConst(), m_pProjections->getData(), -		                volgeom.getGridColCount(), -		                volgeom.getGridRowCount(), -		                volgeom.getGridSliceCount(), -		                conevecgeom->getProjectionCount(), -		                conevecgeom->getDetectorColCount(), -		                conevecgeom->getDetectorRowCount(), -		                conevecgeom->getProjectionVectors(), -		                m_iGPUIndex, m_iDetectorSuperSampling); -	} else { -		ASTRA_ASSERT(false); -	} - +	astraCudaFP(m_pVolume->getDataConst(), m_pProjections->getData(), +	            &volgeom, projgeom, +	            m_iGPUIndex, m_iDetectorSuperSampling, projKernel);  } diff --git a/src/CudaSirtAlgorithm3D.cpp b/src/CudaSirtAlgorithm3D.cpp index 67594f4..1fa0da2 100644 --- a/src/CudaSirtAlgorithm3D.cpp +++ b/src/CudaSirtAlgorithm3D.cpp @@ -203,10 +203,6 @@ void CCudaSirtAlgorithm3D::run(int _iNrIterations)  	ASTRA_ASSERT(m_bIsInitialized);  	const CProjectionGeometry3D* projgeom = m_pSinogram->getGeometry(); -	const CConeProjectionGeometry3D* conegeom = dynamic_cast<const CConeProjectionGeometry3D*>(projgeom); -	const CParallelProjectionGeometry3D* par3dgeom = dynamic_cast<const CParallelProjectionGeometry3D*>(projgeom); -	const CParallelVecProjectionGeometry3D* parvec3dgeom = dynamic_cast<const CParallelVecProjectionGeometry3D*>(projgeom); -	const CConeVecProjectionGeometry3D* conevec3dgeom = dynamic_cast<const CConeVecProjectionGeometry3D*>(projgeom);  	const CVolumeGeometry3D& volgeom = *m_pReconstruction->getGeometry();  	bool ok = true; @@ -215,39 +211,7 @@ void CCudaSirtAlgorithm3D::run(int _iNrIterations)  		ok &= m_pSirt->setGPUIndex(m_iGPUIndex); -		ok &= m_pSirt->setReconstructionGeometry(volgeom.getGridColCount(), -		                                         volgeom.getGridRowCount(), -		                                         volgeom.getGridSliceCount()); - -		if (conegeom) { -			ok &= m_pSirt->setConeGeometry(conegeom->getProjectionCount(), -			                               conegeom->getDetectorColCount(), -			                               conegeom->getDetectorRowCount(), -			                               conegeom->getOriginSourceDistance(), -			                               conegeom->getOriginDetectorDistance(), -			                               conegeom->getDetectorSpacingX(), -			                               conegeom->getDetectorSpacingY(), -			                               conegeom->getProjectionAngles()); -		} else if (par3dgeom) { -			ok &= m_pSirt->setPar3DGeometry(par3dgeom->getProjectionCount(), -			                                par3dgeom->getDetectorColCount(), -			                                par3dgeom->getDetectorRowCount(), -			                                par3dgeom->getDetectorSpacingX(), -			                                par3dgeom->getDetectorSpacingY(), -			                                par3dgeom->getProjectionAngles()); -		} else if (parvec3dgeom) { -			ok &= m_pSirt->setPar3DGeometry(parvec3dgeom->getProjectionCount(), -			                                parvec3dgeom->getDetectorColCount(), -			                                parvec3dgeom->getDetectorRowCount(), -			                                parvec3dgeom->getProjectionVectors()); -		} else if (conevec3dgeom) { -			ok &= m_pSirt->setConeGeometry(conevec3dgeom->getProjectionCount(), -			                               conevec3dgeom->getDetectorColCount(), -			                               conevec3dgeom->getDetectorRowCount(), -			                               conevec3dgeom->getProjectionVectors()); -		} else { -			ASTRA_ASSERT(false); -		} +		ok &= m_pSirt->setGeometry(&volgeom, projgeom);  		ok &= m_pSirt->enableSuperSampling(m_iVoxelSuperSampling, m_iDetectorSuperSampling); | 
