1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
# -----------------------------------------------------------------------
# Copyright: 2010-2021, imec Vision Lab, University of Antwerp
# 2013-2021, CWI, Amsterdam
#
# Contact: astra@astra-toolbox.com
# Website: http://www.astra-toolbox.com/
#
# 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/>.
#
# -----------------------------------------------------------------------
#
# distutils: language = c++
# distutils: libraries = astra
import six
from .PyIncludes cimport *
cimport utils
from .utils import wrap_from_bytes
cimport PyProjector2DFactory
from .PyProjector2DFactory cimport CProjector2DFactory
cimport PyProjector2DManager
from .PyProjector2DManager cimport CProjector2DManager
cimport PyXMLDocument
from .PyXMLDocument cimport XMLDocument
cimport PyMatrixManager
from .PyMatrixManager cimport CMatrixManager
cdef CProjector2DManager * manProj = <CProjector2DManager * >PyProjector2DManager.getSingletonPtr()
cdef CMatrixManager * manM = <CMatrixManager * >PyMatrixManager.getSingletonPtr()
include "config.pxi"
IF HAVE_CUDA:
cdef extern from *:
CCudaProjector2D* dynamic_cast_cuda_projector "dynamic_cast<astra::CCudaProjector2D*>" (CProjector2D*)
def create(config):
cdef Config * cfg = utils.dictToConfig(six.b('Projector2D'), config)
cdef CProjector2D * proj
proj = PyProjector2DFactory.getSingletonPtr().create(cfg.self.getAttribute(six.b('type')))
if proj == NULL:
del cfg
raise Exception("Unknown Projector2D.")
if not proj.initialize(cfg[0]):
del cfg
del proj
raise Exception("Unable to initialize Projector2D.")
del cfg
return manProj.store(proj)
def delete(ids):
try:
for i in ids:
manProj.remove(i)
except TypeError:
manProj.remove(ids)
def clear():
manProj.clear()
def info():
six.print_(wrap_from_bytes(manProj.info()))
cdef CProjector2D * getObject(i) except NULL:
cdef CProjector2D * proj = manProj.get(i)
if proj == NULL:
raise Exception("Projector not initialized.")
if not proj.isInitialized():
raise Exception("Projector not initialized.")
return proj
def projection_geometry(i):
cdef CProjector2D * proj = getObject(i)
cdef Config * cfg = proj.getProjectionGeometry().getConfiguration()
dct = utils.configToDict(cfg)
del cfg
return dct
def volume_geometry(i):
cdef CProjector2D * proj = getObject(i)
cdef Config * cfg = proj.getVolumeGeometry().getConfiguration()
dct = utils.configToDict(cfg)
del cfg
return dct
def weights_single_ray(i, projection_index, detector_index):
raise Exception("Not yet implemented")
def weights_projection(i, projection_index):
raise Exception("Not yet implemented")
def splat(i, row, col):
raise Exception("Not yet implemented")
def is_cuda(i):
cdef CProjector2D * proj = getObject(i)
IF HAVE_CUDA==True:
cdef CCudaProjector2D * cudaproj = NULL
cudaproj = dynamic_cast_cuda_projector(proj)
if cudaproj==NULL:
return False
else:
return True
ELSE:
return False
def matrix(i):
cdef CProjector2D * proj = getObject(i)
cdef CSparseMatrix * mat = proj.getMatrix()
if mat == NULL:
del mat
raise Exception("Data object not found")
if not mat.isInitialized():
del mat
raise Exception("Data object not initialized properly.")
return manM.store(mat)
|