-
Notifications
You must be signed in to change notification settings - Fork 204
/
Copy pathAx.py
38 lines (32 loc) · 1.26 KB
/
Ax.py
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
import copy
import numpy as np
from _Ax import _Ax_ext
from .gpu import GpuIds
def Ax(img, geo, angles, projection_type="Siddon", **kwargs):
if img.dtype != np.float32:
raise TypeError("Input data should be float32, not " + str(img.dtype))
if not np.isreal(img).all():
raise ValueError("Complex types not compatible for projection.")
if any(img.shape != geo.nVoxel):
raise ValueError(
"Input data should be of shape geo.nVoxel: "
+ str(geo.nVoxel)
+ " not:"
+ str(img.shape)
)
geox = copy.deepcopy(geo)
geox.check_geo(angles)
"""
Here we cast all values in geo to single point precision float. This way we know what behavior
to expect from pytigre to Cuda and can change single parameters accordingly.
"""
geox.cast_to_single()
# geox.checknans()
if kwargs.get("gpuids", None) is None:
gpuids = GpuIds()
else:
gpuids = kwargs["gpuids"]
# if we have more GPUs than projections to compute, reduce the amount of GPUs.
if len(angles) < len(gpuids):
gpuids.devices = list(gpuids.devices[0:len(angles)])
return _Ax_ext(img, geox, geox.angles, projection_type, geox.mode, gpuids=gpuids)