diff options
| -rw-r--r-- | cuda/3d/algo3d.cu | 15 | ||||
| -rw-r--r-- | cuda/3d/algo3d.h | 6 | ||||
| -rw-r--r-- | cuda/3d/astra3d.cu | 48 | ||||
| -rw-r--r-- | cuda/3d/cgls3d.cu | 2 | ||||
| -rw-r--r-- | cuda/3d/sirt3d.cu | 2 | 
5 files changed, 36 insertions, 37 deletions
diff --git a/cuda/3d/algo3d.cu b/cuda/3d/algo3d.cu index b775438..cc86b70 100644 --- a/cuda/3d/algo3d.cu +++ b/cuda/3d/algo3d.cu @@ -41,6 +41,7 @@ ReconAlgo3D::ReconAlgo3D()  	coneProjs = 0;  	par3DProjs = 0;  	shouldAbort = false; +	fOutputScale = 1.0f;  }  ReconAlgo3D::~ReconAlgo3D() @@ -57,9 +58,10 @@ void ReconAlgo3D::reset()  	shouldAbort = false;  } -bool ReconAlgo3D::setConeGeometry(const SDimensions3D& _dims, const SConeProjection* _angles) +bool ReconAlgo3D::setConeGeometry(const SDimensions3D& _dims, const SConeProjection* _angles, float _outputScale)  {  	dims = _dims; +	fOutputScale = _outputScale;  	coneProjs = new SConeProjection[dims.iProjAngles];  	par3DProjs = 0; @@ -69,9 +71,10 @@ bool ReconAlgo3D::setConeGeometry(const SDimensions3D& _dims, const SConeProject  	return true;  } -bool ReconAlgo3D::setPar3DGeometry(const SDimensions3D& _dims, const SPar3DProjection* _angles) +bool ReconAlgo3D::setPar3DGeometry(const SDimensions3D& _dims, const SPar3DProjection* _angles, float _outputScale)  {  	dims = _dims; +	fOutputScale = _outputScale;  	par3DProjs = new SPar3DProjection[dims.iProjAngles];  	coneProjs = 0; @@ -87,9 +90,9 @@ bool ReconAlgo3D::callFP(cudaPitchedPtr& D_volumeData,                         float outputScale)  {  	if (coneProjs) { -		return ConeFP(D_volumeData, D_projData, dims, coneProjs, outputScale); +		return ConeFP(D_volumeData, D_projData, dims, coneProjs, outputScale * this->fOutputScale);  	} else { -		return Par3DFP(D_volumeData, D_projData, dims, par3DProjs, outputScale); +		return Par3DFP(D_volumeData, D_projData, dims, par3DProjs, outputScale * this->fOutputScale);  	}  } @@ -98,9 +101,9 @@ bool ReconAlgo3D::callBP(cudaPitchedPtr& D_volumeData,                         float outputScale)  {  	if (coneProjs) { -		return ConeBP(D_volumeData, D_projData, dims, coneProjs, outputScale); +		return ConeBP(D_volumeData, D_projData, dims, coneProjs, outputScale * this->fOutputScale);  	} else { -		return Par3DBP(D_volumeData, D_projData, dims, par3DProjs, outputScale); +		return Par3DBP(D_volumeData, D_projData, dims, par3DProjs, outputScale * this->fOutputScale);  	}  } diff --git a/cuda/3d/algo3d.h b/cuda/3d/algo3d.h index 35ffc49..886b092 100644 --- a/cuda/3d/algo3d.h +++ b/cuda/3d/algo3d.h @@ -39,8 +39,8 @@ public:  	ReconAlgo3D();  	~ReconAlgo3D(); -	bool setConeGeometry(const SDimensions3D& dims, const SConeProjection* projs); -	bool setPar3DGeometry(const SDimensions3D& dims, const SPar3DProjection* projs); +	bool setConeGeometry(const SDimensions3D& dims, const SConeProjection* projs, float fOutputScale); +	bool setPar3DGeometry(const SDimensions3D& dims, const SPar3DProjection* projs, float fOutputScale);  	void signalAbort() { shouldAbort = true; } @@ -58,6 +58,8 @@ protected:  	SConeProjection* coneProjs;  	SPar3DProjection* par3DProjs; +	float fOutputScale; +  	volatile bool shouldAbort;  }; diff --git a/cuda/3d/astra3d.cu b/cuda/3d/astra3d.cu index 7589416..ae79efb 100644 --- a/cuda/3d/astra3d.cu +++ b/cuda/3d/astra3d.cu @@ -353,7 +353,7 @@ public:  	SConeProjection* projs;  	SPar3DProjection* parprojs; -	float fPixelSize; +	float fOutputScale;  	bool initialized;  	bool setStartReconstruction; @@ -390,6 +390,8 @@ AstraSIRT3d::AstraSIRT3d()  	pData->dims.iRaysPerVoxelDim = 1;  	pData->projs = 0; +	pData->parprojs = 0; +	pData->fOutputScale = 1.0f;  	pData->initialized = false;  	pData->setStartReconstruction = false; @@ -435,11 +437,10 @@ bool AstraSIRT3d::setGeometry(const CVolumeGeometry3D* pVolGeom,  	pData->projs = 0;  	pData->parprojs = 0; -	float outputScale;  	ok = convertAstraGeometry(pVolGeom, pProjGeom,  	                          pData->parprojs, pData->projs, -	                          outputScale); +	                          pData->fOutputScale);  	if (!ok)  		return false; @@ -451,8 +452,6 @@ bool AstraSIRT3d::setGeometry(const CVolumeGeometry3D* pVolGeom,  		pData->projType = PROJ_PARALLEL;  	} -	// TODO: Handle outputScale -  	return true;  } @@ -519,9 +518,9 @@ bool AstraSIRT3d::init()  	bool ok;  	if (pData->projType == PROJ_PARALLEL) { -		ok = pData->sirt.setPar3DGeometry(pData->dims, pData->parprojs); +		ok = pData->sirt.setPar3DGeometry(pData->dims, pData->parprojs, pData->fOutputScale);  	} else { -		ok = pData->sirt.setConeGeometry(pData->dims, pData->projs); +		ok = pData->sirt.setConeGeometry(pData->dims, pData->projs, pData->fOutputScale);  	}  	if (!ok) @@ -733,7 +732,7 @@ public:  	SConeProjection* projs;  	SPar3DProjection* parprojs; -	float fPixelSize; +	float fOutputScale;  	bool initialized;  	bool setStartReconstruction; @@ -770,6 +769,8 @@ AstraCGLS3d::AstraCGLS3d()  	pData->dims.iRaysPerVoxelDim = 1;  	pData->projs = 0; +	pData->parprojs = 0; +	pData->fOutputScale = 1.0f;  	pData->initialized = false;  	pData->setStartReconstruction = false; @@ -815,11 +816,10 @@ bool AstraCGLS3d::setGeometry(const CVolumeGeometry3D* pVolGeom,  	pData->projs = 0;  	pData->parprojs = 0; -	float outputScale;  	ok = convertAstraGeometry(pVolGeom, pProjGeom,  	                          pData->parprojs, pData->projs, -	                          outputScale); +	                          pData->fOutputScale);  	if (!ok)  		return false; @@ -831,8 +831,6 @@ bool AstraCGLS3d::setGeometry(const CVolumeGeometry3D* pVolGeom,  		pData->projType = PROJ_PARALLEL;  	} -	// TODO: Handle outputScale -  	return true;  } @@ -900,9 +898,9 @@ bool AstraCGLS3d::init()  	bool ok;  	if (pData->projType == PROJ_PARALLEL) { -		ok = pData->cgls.setPar3DGeometry(pData->dims, pData->parprojs); +		ok = pData->cgls.setPar3DGeometry(pData->dims, pData->parprojs, pData->fOutputScale);  	} else { -		ok = pData->cgls.setConeGeometry(pData->dims, pData->projs); +		ok = pData->cgls.setConeGeometry(pData->dims, pData->projs, pData->fOutputScale);  	}  	if (!ok) @@ -1164,10 +1162,10 @@ bool astraCudaFP(const float* pfVolume, float* pfProjections,  	if (pParProjs) {  		switch (projKernel) {  		case ker3d_default: -			ok &= Par3DFP(D_volumeData, D_projData, dims, pParProjs, 1.0f); +			ok &= Par3DFP(D_volumeData, D_projData, dims, pParProjs, outputScale);  			break;  		case ker3d_sum_square_weights: -			ok &= Par3DFP_SumSqW(D_volumeData, D_projData, dims, pParProjs, 1.0f); +			ok &= Par3DFP_SumSqW(D_volumeData, D_projData, dims, pParProjs, outputScale*outputScale);  			break;  		default:  			assert(false); @@ -1175,7 +1173,7 @@ bool astraCudaFP(const float* pfVolume, float* pfProjections,  	} else {  		switch (projKernel) {  		case ker3d_default: -			ok &= ConeFP(D_volumeData, D_projData, dims, pConeProjs, 1.0f); +			ok &= ConeFP(D_volumeData, D_projData, dims, pConeProjs, outputScale);  			break;  		default:  			assert(false); @@ -1216,8 +1214,6 @@ bool astraCudaBP(float* pfVolume, const float* pfProjections,  	                          pParProjs, pConeProjs,  	                          outputScale); -	// TODO: OutputScale -  	if (iGPUIndex != -1) {  		cudaSetDevice(iGPUIndex);  		cudaError_t err = cudaGetLastError(); @@ -1252,9 +1248,9 @@ bool astraCudaBP(float* pfVolume, const float* pfProjections,  	}  	if (pParProjs) -		ok &= Par3DBP(D_volumeData, D_projData, dims, pParProjs, 1.0f); +		ok &= Par3DBP(D_volumeData, D_projData, dims, pParProjs, outputScale);  	else -		ok &= ConeBP(D_volumeData, D_projData, dims, pConeProjs, 1.0f); +		ok &= ConeBP(D_volumeData, D_projData, dims, pConeProjs, outputScale);  	ok &= copyVolumeFromDevice(pfVolume, D_volumeData, dims, dims.iVolX); @@ -1293,8 +1289,6 @@ bool astraCudaBP_SIRTWeighted(float* pfVolume,  	                          pParProjs, pConeProjs,  	                          outputScale); -	// TODO: OutputScale -  	if (iGPUIndex != -1) {  		cudaSetDevice(iGPUIndex);  		cudaError_t err = cudaGetLastError(); @@ -1330,9 +1324,9 @@ bool astraCudaBP_SIRTWeighted(float* pfVolume,  	processSino3D<opSet>(D_projData, 1.0f, dims);  	if (pParProjs) -		ok &= Par3DBP(D_pixelWeight, D_projData, dims, pParProjs, 1.0f); +		ok &= Par3DBP(D_pixelWeight, D_projData, dims, pParProjs, outputScale);  	else -		ok &= ConeBP(D_pixelWeight, D_projData, dims, pConeProjs, 1.0f); +		ok &= ConeBP(D_pixelWeight, D_projData, dims, pConeProjs, outputScale);  	processVol3D<opInvert>(D_pixelWeight, dims);  	if (!ok) { @@ -1347,9 +1341,9 @@ bool astraCudaBP_SIRTWeighted(float* pfVolume,  	ok &= zeroVolumeData(D_volumeData, dims);  	// Do BP into D_volumeData  	if (pParProjs) -		ok &= Par3DBP(D_volumeData, D_projData, dims, pParProjs, 1.0f); +		ok &= Par3DBP(D_volumeData, D_projData, dims, pParProjs, outputScale);  	else -		ok &= ConeBP(D_volumeData, D_projData, dims, pConeProjs, 1.0f); +		ok &= ConeBP(D_volumeData, D_projData, dims, pConeProjs, outputScale);  	// Multiply with weights  	processVol3D<opMul>(D_volumeData, D_pixelWeight, dims); diff --git a/cuda/3d/cgls3d.cu b/cuda/3d/cgls3d.cu index 4f632f3..dd0e8a0 100644 --- a/cuda/3d/cgls3d.cu +++ b/cuda/3d/cgls3d.cu @@ -242,7 +242,7 @@ bool doCGLS(cudaPitchedPtr& D_volumeData,  	CGLS cgls;  	bool ok = true; -	ok &= cgls.setConeGeometry(dims, angles); +	ok &= cgls.setConeGeometry(dims, angles, 1.0f);  	if (D_maskData.ptr)  		ok &= cgls.enableVolumeMask(); diff --git a/cuda/3d/sirt3d.cu b/cuda/3d/sirt3d.cu index 0e6630a..484521e 100644 --- a/cuda/3d/sirt3d.cu +++ b/cuda/3d/sirt3d.cu @@ -347,7 +347,7 @@ bool doSIRT(cudaPitchedPtr& D_volumeData,  	SIRT sirt;  	bool ok = true; -	ok &= sirt.setConeGeometry(dims, angles); +	ok &= sirt.setConeGeometry(dims, angles, 1.0f);  	if (D_maskData.ptr)  		ok &= sirt.enableVolumeMask();  | 
