diff options
Diffstat (limited to 'python/astra')
| -rw-r--r-- | python/astra/experimental.pyx | 45 | 
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") | 
