diff options
| -rw-r--r-- | include/astra/CompositeGeometryManager.h | 18 | ||||
| -rw-r--r-- | python/astra/experimental.pyx | 45 | ||||
| -rw-r--r-- | src/CompositeGeometryManager.cpp | 36 | 
3 files changed, 66 insertions, 33 deletions
diff --git a/include/astra/CompositeGeometryManager.h b/include/astra/CompositeGeometryManager.h index 08eb7af..35d1da2 100644 --- a/include/astra/CompositeGeometryManager.h +++ b/include/astra/CompositeGeometryManager.h @@ -140,7 +140,7 @@ public:  		enum {  			JOB_FP, JOB_BP, JOB_FDK, JOB_NOP  		} eType; -		enum { +		enum EMode {  			MODE_ADD, MODE_SET  		} eMode; @@ -154,22 +154,24 @@ public:  	SJob createJobFP(CProjector3D *pProjector,                       CFloat32VolumeData3D *pVolData, -                     CFloat32ProjectionData3D *pProjData); +                     CFloat32ProjectionData3D *pProjData, +	                 SJob::EMode eMode);  	SJob createJobBP(CProjector3D *pProjector,                       CFloat32VolumeData3D *pVolData, -                     CFloat32ProjectionData3D *pProjData); +                     CFloat32ProjectionData3D *pProjData, +	                 SJob::EMode eMode);  	// Convenience functions for creating and running a single FP or BP job  	bool doFP(CProjector3D *pProjector, CFloat32VolumeData3D *pVolData, -	          CFloat32ProjectionData3D *pProjData); +	          CFloat32ProjectionData3D *pProjData, SJob::EMode eMode = SJob::MODE_SET);  	bool doBP(CProjector3D *pProjector, CFloat32VolumeData3D *pVolData, -	          CFloat32ProjectionData3D *pProjData); +	          CFloat32ProjectionData3D *pProjData, SJob::EMode eMode = SJob::MODE_SET);  	bool doFDK(CProjector3D *pProjector, CFloat32VolumeData3D *pVolData,  	          CFloat32ProjectionData3D *pProjData, bool bShortScan, -	          const float *pfFilter = 0); +	          const float *pfFilter = 0, SJob::EMode eMode = SJob::MODE_SET); -	bool doFP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData); -	bool doBP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData); +	bool doFP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData, SJob::EMode eMode = SJob::MODE_SET); +	bool doBP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3D *>& volData, const std::vector<CFloat32ProjectionData3D *>& projData, SJob::EMode eMode = SJob::MODE_SET);  	void setGPUIndices(const std::vector<int>& GPUIndices); diff --git a/python/astra/experimental.pyx b/python/astra/experimental.pyx index 136165b..80dae9a 100644 --- a/python/astra/experimental.pyx +++ b/python/astra/experimental.pyx @@ -34,10 +34,15 @@ IF HAVE_CUDA==True:      from .PyIncludes cimport *      from libcpp.vector cimport vector +    cdef extern from "astra/CompositeGeometryManager.h" namespace "astra::CCompositeGeometryManager::SJob": +        cdef enum EMode: +            MODE_SET = 0 +            MODE_ADD = 1      cdef extern from "astra/CompositeGeometryManager.h" namespace "astra":          cdef cppclass CCompositeGeometryManager: -            bool doFP(CProjector3D *, vector[CFloat32VolumeData3D *], vector[CFloat32ProjectionData3D *]) -            bool doBP(CProjector3D *, vector[CFloat32VolumeData3D *], vector[CFloat32ProjectionData3D *]) +            bool doFP(CProjector3D *, vector[CFloat32VolumeData3D *], vector[CFloat32ProjectionData3D *], EMode) +            bool doBP(CProjector3D *, vector[CFloat32VolumeData3D *], vector[CFloat32ProjectionData3D *], EMode) +            bool doFDK(CProjector3D *, CFloat32VolumeData3D *, CFloat32ProjectionData3D *, bool, const float*, EMode)      cdef extern from *:          CFloat32VolumeData3D * dynamic_cast_vol_mem "dynamic_cast<astra::CFloat32VolumeData3D*>" (CFloat32Data3D * ) @@ -59,7 +64,7 @@ IF HAVE_CUDA==True:      cdef CProjector3DManager * manProj = <CProjector3DManager * >PyProjector3DManager.getSingletonPtr()      cdef CData3DManager * man3d = <CData3DManager * >PyData3DManager.getSingletonPtr() -    def do_composite(projector_id, vol_ids, proj_ids, t): +    def do_composite(projector_id, vol_ids, proj_ids, mode, t):          cdef vector[CFloat32VolumeData3D *] vol          cdef CFloat32VolumeData3D * pVolObject          cdef CFloat32ProjectionData3D * pProjObject @@ -81,14 +86,38 @@ IF HAVE_CUDA==True:          cdef CCompositeGeometryManager m          cdef CProjector3D * projector = manProj.get(projector_id) # may be NULL          if t == "FP": -            if not m.doFP(projector, vol, proj): +            if not m.doFP(projector, vol, proj, mode):                  raise Exception("Failed to perform FP") -        else: -            if not m.doBP(projector, vol, proj): +        elif t == "BP": +            if not m.doBP(projector, vol, proj, mode):                  raise Exception("Failed to perform BP") +        else: +            raise RuntimeError("internal error: wrong composite op type")      def do_composite_FP(projector_id, vol_ids, proj_ids): -        do_composite(projector_id, vol_ids, proj_ids, "FP") +        do_composite(projector_id, vol_ids, proj_ids, MODE_SET, "FP")      def do_composite_BP(projector_id, vol_ids, proj_ids): -        do_composite(projector_id, vol_ids, proj_ids, "BP") +        do_composite(projector_id, vol_ids, proj_ids, MODE_SET, "BP") + +    def accumulate_FP(projector_id, vol_id, proj_id): +        do_composite(projector_id, [vol_id], [proj_id], MODE_ADD, "FP") +    def accumulate_BP(projector_id, vol_id, proj_id): +        do_composite(projector_id, [vol_id], [proj_id], MODE_ADD, "BP") +    def accumulate_FDK(projector_id, vol_id, proj_id): +        cdef CFloat32VolumeData3D * pVolObject +        cdef CFloat32ProjectionData3D * pProjObject +        pVolObject = dynamic_cast_vol_mem(man3d.get(vol_id)) +        if pVolObject == NULL: +            raise Exception("Data object not found") +        if not pVolObject.isInitialized(): +            raise Exception("Data object not initialized properly") +        pProjObject = dynamic_cast_proj_mem(man3d.get(proj_id)) +        if pProjObject == NULL: +            raise Exception("Data object not found") +        if not pProjObject.isInitialized(): +            raise Exception("Data object not initialized properly") +        cdef CCompositeGeometryManager m +        cdef CProjector3D * projector = manProj.get(projector_id) # may be NULL +        if not m.doFDK(projector, pVolObject, pProjObject, False, NULL, MODE_ADD): +            raise Exception("Failed to perform FDK") diff --git a/src/CompositeGeometryManager.cpp b/src/CompositeGeometryManager.cpp index 184144c..470476e 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,14 @@ 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");  		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 +1218,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 +1256,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 +1264,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 +1272,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 +1311,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 +1319,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;  		}  	}  | 
