summaryrefslogtreecommitdiffstats
path: root/python/astra/experimental.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'python/astra/experimental.pyx')
-rw-r--r--python/astra/experimental.pyx45
1 files changed, 37 insertions, 8 deletions
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")