diff options
Diffstat (limited to 'include/astra')
| -rw-r--r-- | include/astra/CompositeGeometryManager.h | 152 | ||||
| -rw-r--r-- | include/astra/ConeProjectionGeometry3D.h | 10 | ||||
| -rw-r--r-- | include/astra/ConeVecProjectionGeometry3D.h | 11 | ||||
| -rw-r--r-- | include/astra/GeometryUtil3D.h | 17 | ||||
| -rw-r--r-- | include/astra/ParallelProjectionGeometry3D.h | 11 | ||||
| -rw-r--r-- | include/astra/ParallelVecProjectionGeometry3D.h | 10 | ||||
| -rw-r--r-- | include/astra/ProjectionGeometry3D.h | 19 | 
7 files changed, 220 insertions, 10 deletions
| diff --git a/include/astra/CompositeGeometryManager.h b/include/astra/CompositeGeometryManager.h new file mode 100644 index 0000000..6610151 --- /dev/null +++ b/include/astra/CompositeGeometryManager.h @@ -0,0 +1,152 @@ +/* +----------------------------------------------------------------------- +Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp +           2014-2015, CWI, Amsterdam + +Contact: astra@uantwerpen.be +Website: http://sf.net/projects/astra-toolbox + +This file is part of the ASTRA Toolbox. + + +The ASTRA Toolbox is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +The ASTRA Toolbox is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. + +----------------------------------------------------------------------- +*/ + +#ifndef _INC_ASTRA_COMPOSITEGEOMETRYMANAGER +#define _INC_ASTRA_COMPOSITEGEOMETRYMANAGER + +#include "Globals.h" + +#ifdef ASTRA_CUDA + +#include <list> +#include <map> +#include <vector> +#include <boost/shared_ptr.hpp> + + +namespace astra { + +class CCompositeVolume; +class CCompositeProjections; +class CFloat32Data3DMemory; +class CFloat32ProjectionData3DMemory; +class CFloat32VolumeData3DMemory; +class CVolumeGeometry3D; +class CProjectionGeometry3D; +class CProjector3D; + + + +class _AstraExport CCompositeGeometryManager { +public: +	class CPart; +	typedef std::list<boost::shared_ptr<CPart> > TPartList; +	class CPart { +	public: +		CPart() { } +		CPart(const CPart& other); +		virtual ~CPart() { } + +		enum { +			PART_VOL, PART_PROJ +		} eType; + +		CFloat32Data3DMemory* pData; +		unsigned int subX; +		unsigned int subY; +		unsigned int subZ; + +		bool uploadToGPU(); +		bool downloadFromGPU(/*mode?*/); +		virtual TPartList split(size_t maxSize, int div) = 0; +		virtual CPart* reduce(const CPart *other) = 0; +		virtual void getDims(size_t &x, size_t &y, size_t &z) = 0; +		size_t getSize(); +	}; + +	class CVolumePart : public CPart { +	public: +		CVolumePart() { eType = PART_VOL; } +		CVolumePart(const CVolumePart& other); +		virtual ~CVolumePart(); + +		CVolumeGeometry3D* pGeom; + +		virtual TPartList split(size_t maxSize, int div); +		virtual CPart* reduce(const CPart *other); +		virtual void getDims(size_t &x, size_t &y, size_t &z); + +		CVolumePart* clone() const; +	}; +	class CProjectionPart : public CPart { +	public: +		CProjectionPart() { eType = PART_PROJ; } +		CProjectionPart(const CProjectionPart& other); +		virtual ~CProjectionPart(); + +		CProjectionGeometry3D* pGeom; + +		virtual TPartList split(size_t maxSize, int div); +		virtual CPart* reduce(const CPart *other); +		virtual void getDims(size_t &x, size_t &y, size_t &z); + +		CProjectionPart* clone() const; +	}; + +	struct SJob { +	public: +		boost::shared_ptr<CPart> pInput; +		boost::shared_ptr<CPart> pOutput; +		CProjector3D *pProjector; // For a `global' geometry. It will not match +		                          // the geometries of the input and output. + + +		enum { +			JOB_FP, JOB_BP, JOB_NOP +		} eType; +		enum { +			MODE_ADD, MODE_SET +		} eMode; + +	}; + +	typedef std::list<SJob> TJobList; +	// output part -> list of jobs for that output +	typedef std::map<CPart*, TJobList > TJobSet; + +	bool doJobs(TJobList &jobs); + +	// Convenience functions for creating and running a single FP or BP job +	bool doFP(CProjector3D *pProjector, CFloat32VolumeData3DMemory *pVolData, +	          CFloat32ProjectionData3DMemory *pProjData); +	bool doBP(CProjector3D *pProjector, CFloat32VolumeData3DMemory *pVolData, +	          CFloat32ProjectionData3DMemory *pProjData); + +	bool doFP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3DMemory *>& volData, const std::vector<CFloat32ProjectionData3DMemory *>& projData); +	bool doBP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3DMemory *>& volData, const std::vector<CFloat32ProjectionData3DMemory *>& projData); + +protected: + +	bool splitJobs(TJobSet &jobs, size_t maxSize, int div, TJobSet &split); + +}; + +} + +#endif + +#endif diff --git a/include/astra/ConeProjectionGeometry3D.h b/include/astra/ConeProjectionGeometry3D.h index 00e72ce..dede6e1 100644 --- a/include/astra/ConeProjectionGeometry3D.h +++ b/include/astra/ConeProjectionGeometry3D.h @@ -186,9 +186,15 @@ public:  	 */  	virtual CVector3D getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex) const; -	virtual void projectPoint(float32 fX, float32 fY, float32 fZ, +	virtual void projectPoint(double fX, double fY, double fZ,  	                          int iAngleIndex, -	                          float32 &fU, float32 &fV) const; +	                          double &fU, double &fV) const; +	virtual void backprojectPointX(int iAngleIndex, double fU, double fV, +	                               double fX, double &fY, double &fZ) const; +	virtual void backprojectPointY(int iAngleIndex, double fU, double fV, +	                               double fY, double &fX, double &fZ) const; +	virtual void backprojectPointZ(int iAngleIndex, double fU, double fV, +	                               double fZ, double &fX, double &fY) const;  }; diff --git a/include/astra/ConeVecProjectionGeometry3D.h b/include/astra/ConeVecProjectionGeometry3D.h index 71e8010..f76f9dd 100644 --- a/include/astra/ConeVecProjectionGeometry3D.h +++ b/include/astra/ConeVecProjectionGeometry3D.h @@ -148,9 +148,16 @@ public:  	const SConeProjection* getProjectionVectors() const { return m_pProjectionAngles; } -	virtual void projectPoint(float32 fX, float32 fY, float32 fZ, +	virtual void projectPoint(double fX, double fY, double fZ,  	                          int iAngleIndex, -	                          float32 &fU, float32 &fV) const; +	                          double &fU, double &fV) const; +	virtual void backprojectPointX(int iAngleIndex, double fU, double fV, +	                               double fX, double &fY, double &fZ) const; +	virtual void backprojectPointY(int iAngleIndex, double fU, double fV, +	                               double fY, double &fX, double &fZ) const; +	virtual void backprojectPointZ(int iAngleIndex, double fU, double fV, +	                               double fZ, double &fX, double &fY) const; +  };  } // namespace astra diff --git a/include/astra/GeometryUtil3D.h b/include/astra/GeometryUtil3D.h index 6ceac63..e4d73e4 100644 --- a/include/astra/GeometryUtil3D.h +++ b/include/astra/GeometryUtil3D.h @@ -119,6 +119,23 @@ void computeBP_UV_Coeffs(const SConeProjection& proj,                           double &fDX, double &fDY, double &fDZ, double &fDC); +SConeProjection* genConeProjections(unsigned int iProjAngles, +                                    unsigned int iProjU, +                                    unsigned int iProjV, +                                    double fOriginSourceDistance, +                                    double fOriginDetectorDistance, +                                    double fDetUSize, +                                    double fDetVSize, +                                    const float *pfAngles); + +SPar3DProjection* genPar3DProjections(unsigned int iProjAngles, +                                      unsigned int iProjU, +                                      unsigned int iProjV, +                                      double fDetUSize, +                                      double fDetVSize, +                                      const float *pfAngles); + +  } diff --git a/include/astra/ParallelProjectionGeometry3D.h b/include/astra/ParallelProjectionGeometry3D.h index 72401e5..d95c050 100644 --- a/include/astra/ParallelProjectionGeometry3D.h +++ b/include/astra/ParallelProjectionGeometry3D.h @@ -147,9 +147,16 @@ public:  	  */  	virtual CVector3D getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex) const; -	virtual void projectPoint(float32 fX, float32 fY, float32 fZ, +	virtual void projectPoint(double fX, double fY, double fZ,  	                          int iAngleIndex, -	                          float32 &fU, float32 &fV) const; +	                          double &fU, double &fV) const; +	virtual void backprojectPointX(int iAngleIndex, double fU, double fV, +	                               double fX, double &fY, double &fZ) const; +	virtual void backprojectPointY(int iAngleIndex, double fU, double fV, +	                               double fY, double &fX, double &fZ) const; +	virtual void backprojectPointZ(int iAngleIndex, double fU, double fV, +	                               double fZ, double &fX, double &fY) const; +  	 /**  	  * Creates (= allocates) a 2D projection geometry used when projecting one slice using a 2D projector diff --git a/include/astra/ParallelVecProjectionGeometry3D.h b/include/astra/ParallelVecProjectionGeometry3D.h index 59238c8..ec91086 100644 --- a/include/astra/ParallelVecProjectionGeometry3D.h +++ b/include/astra/ParallelVecProjectionGeometry3D.h @@ -149,9 +149,15 @@ public:  	const SPar3DProjection* getProjectionVectors() const { return m_pProjectionAngles; } -	virtual void projectPoint(float32 fX, float32 fY, float32 fZ, +	virtual void projectPoint(double fX, double fY, double fZ,  	                          int iAngleIndex, -	                          float32 &fU, float32 &fV) const; +	                          double &fU, double &fV) const; +	virtual void backprojectPointX(int iAngleIndex, double fU, double fV, +	                               double fX, double &fY, double &fZ) const; +	virtual void backprojectPointY(int iAngleIndex, double fU, double fV, +	                               double fY, double &fX, double &fZ) const; +	virtual void backprojectPointZ(int iAngleIndex, double fU, double fV, +	                               double fZ, double &fX, double &fY) const;  };  } // namespace astra diff --git a/include/astra/ProjectionGeometry3D.h b/include/astra/ProjectionGeometry3D.h index 19ac3ab..0b60287 100644 --- a/include/astra/ProjectionGeometry3D.h +++ b/include/astra/ProjectionGeometry3D.h @@ -317,9 +317,24 @@ public:  	 * @param iAngleIndex	the index of the angle to use  	 * @param fU,fV		the projected point.  	 */ -	virtual void projectPoint(float32 fX, float32 fY, float32 fZ, +	virtual void projectPoint(double fX, double fY, double fZ,  	                          int iAngleIndex, -	                          float32 &fU, float32 &fV) const = 0; +	                          double &fU, double &fV) const = 0; + +	/* Backproject a point onto a plane parallel to a coordinate plane. +	 * The 2D point coordinates are the (unrounded) indices of the detector +	 * column and row. The output is in 3D coordinates in units. +	 * are in units. The output fU,fV are the (unrounded) indices of the +	 * detector column and row. +	 * This may fall outside of the actual detector. +	 */ +	virtual void backprojectPointX(int iAngleIndex, double fU, double fV, +	                               double fX, double &fY, double &fZ) const = 0; +	virtual void backprojectPointY(int iAngleIndex, double fU, double fV, +	                               double fY, double &fX, double &fZ) const = 0; +	virtual void backprojectPointZ(int iAngleIndex, double fU, double fV, +	                               double fZ, double &fX, double &fY) const = 0; +  	/** Returns true if the type of geometry defined in this class is the one specified in _sType.  	 * | 
