diff options
-rw-r--r-- | Wrappers/Python/ccpi/reconstruction/algs.py | 2 | ||||
-rw-r--r-- | Wrappers/Python/ccpi/reconstruction/ops.py | 2 | ||||
-rw-r--r-- | Wrappers/Python/conda-recipe/build.sh | 2 | ||||
-rw-r--r-- | Wrappers/Python/setup.py | 2 | ||||
-rw-r--r-- | Wrappers/Python/test/DemoRecIP.py | 6 | ||||
-rw-r--r-- | data/IP_data70channels.mat | bin | 0 -> 8710147 bytes | |||
-rw-r--r-- | data/__pycache__/read_IPdata.cpython-35.pyc | bin | 0 -> 1674 bytes | |||
-rw-r--r-- | data/read_IPdata.py | 58 |
8 files changed, 65 insertions, 7 deletions
diff --git a/Wrappers/Python/ccpi/reconstruction/algs.py b/Wrappers/Python/ccpi/reconstruction/algs.py index bfe9570..d957298 100644 --- a/Wrappers/Python/ccpi/reconstruction/algs.py +++ b/Wrappers/Python/ccpi/reconstruction/algs.py @@ -20,7 +20,7 @@ import numpy import time -from funcs import BaseFunction +from ccpi.reconstruction.funcs import BaseFunction def FISTA(x_init, f=None, g=None, opt=None): diff --git a/Wrappers/Python/ccpi/reconstruction/ops.py b/Wrappers/Python/ccpi/reconstruction/ops.py index 00a4a3c..e20e78d 100644 --- a/Wrappers/Python/ccpi/reconstruction/ops.py +++ b/Wrappers/Python/ccpi/reconstruction/ops.py @@ -2,7 +2,7 @@ import numpy as np import astra from scipy.sparse.linalg import svds -from framework import DataSet, VolumeData, SinogramData, DataSetProcessor +from ccpi.framework import DataSet, VolumeData, SinogramData, DataSetProcessor # Maybe operators need to know what types they take as inputs/outputs # to not just use generic DataSet diff --git a/Wrappers/Python/conda-recipe/build.sh b/Wrappers/Python/conda-recipe/build.sh index 0c6ad30..5dd97b0 100644 --- a/Wrappers/Python/conda-recipe/build.sh +++ b/Wrappers/Python/conda-recipe/build.sh @@ -5,5 +5,5 @@ fi mkdir ${SRC_DIR}/ccpi cp -r "${RECIPE_DIR}/../../../" ${SRC_DIR}/ccpi -cd ${SRC_DIR}/ccpi/Wrappers/python +cd ${SRC_DIR}/ccpi/Wrappers/Python $PYTHON setup.py install diff --git a/Wrappers/Python/setup.py b/Wrappers/Python/setup.py index 8ee6b58..bbd210f 100644 --- a/Wrappers/Python/setup.py +++ b/Wrappers/Python/setup.py @@ -35,7 +35,7 @@ if cil_version == '': setup( name="ccpi-common", version=cil_version, - packages=['ccpi'], + packages=['ccpi' , 'ccpi.reconstruction'], # Project uses reStructuredText, so ensure that the docutils get # installed or upgraded on the target machine diff --git a/Wrappers/Python/test/DemoRecIP.py b/Wrappers/Python/test/DemoRecIP.py index 790e90e..483a202 100644 --- a/Wrappers/Python/test/DemoRecIP.py +++ b/Wrappers/Python/test/DemoRecIP.py @@ -8,13 +8,13 @@ import numpy as np import matplotlib.pyplot as plt import sys -sys.path.append('../data/') +#sys.path.append('../../../data/') from read_IPdata import read_IPdata from ccpi.reconstruction.astra_ops import AstraProjector -from ccpi.reconstruction.funcs import Norm2sq +from ccpi.reconstruction.funcs import Norm2sq , BaseFunction from ccpi.reconstruction.algs import FISTA -from ccpi.reconstruction.ops import BaseFunction +#from ccpi.reconstruction.funcs import BaseFunction from ccpi.framework import VolumeData, SinogramData diff --git a/data/IP_data70channels.mat b/data/IP_data70channels.mat Binary files differnew file mode 100644 index 0000000..19b9421 --- /dev/null +++ b/data/IP_data70channels.mat diff --git a/data/__pycache__/read_IPdata.cpython-35.pyc b/data/__pycache__/read_IPdata.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..b062cf9 --- /dev/null +++ b/data/__pycache__/read_IPdata.cpython-35.pyc diff --git a/data/read_IPdata.py b/data/read_IPdata.py new file mode 100644 index 0000000..2e6a525 --- /dev/null +++ b/data/read_IPdata.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +function to read IP data and provide a dictionary with data and parameters as an output +""" +from scipy import io +import numpy as np +from collections import defaultdict + +def read_IPdata(): + # read data from mat file (specify the location) + alldata = io.loadmat('IP_data70channels.mat') + data_raw = alldata.get('Data_raw') # here is raw projection data + Phantom_ideal = alldata.get('Phantom_ideal') # here is 70 channels ideal phantom + Photon_flux = alldata.get('Photon_flux') # photon flux for normalization + del alldata + + # extract geometry-related parameters + proj_numb,detectors_numb,channels = np.shape(data_raw) + im_size = np.size(Phantom_ideal,1) + + theta = np.linspace(0,proj_numb-1,proj_numb)*360/proj_numb # projection angles + dom_width = 1.0 # width of domain in cm + src_to_rotc = 3.0 # dist. from source to rotation center + src_to_det = 5.0 # dist. from source to detector + det_width = 2.0 # detector width + + # negative log normalisation of the raw data (avoiding of log(0)) + data_norm = np.zeros(np.shape(data_raw)) + for i in range(0,channels): + slice1 = data_raw[:,:,i] + indx = np.nonzero(slice1>0) + slice2 = np.zeros((proj_numb,detectors_numb), 'float32') + slice2[indx] = -np.log(slice1[indx]/Photon_flux[i]) + indx2 = np.nonzero(slice1==0) + slice3 = np.zeros((proj_numb,detectors_numb), 'float32') + slice3[indx2] = np.log(slice2[indx2]+Photon_flux[i]) + data_norm[:,:,i] = slice2 + slice3 + del indx, indx2, slice1, slice2, slice3 + data_norm = np.float32(data_norm*(im_size/dom_width)) + + #build a dictionary for data and related parameters + dataDICT = defaultdict(list) + dataDICT['data_norm'].append(data_norm) + dataDICT['data_raw'].append(data_raw) + dataDICT['Photon_flux'].append(Photon_flux) + dataDICT['Phantom_ideal'].append(Phantom_ideal) + dataDICT['theta'].append(theta) + dataDICT['proj_numb'].append(proj_numb) + dataDICT['detectors_numb'].append(detectors_numb) + dataDICT['channels'].append(channels) + dataDICT['im_size'].append(im_size) + dataDICT['dom_width'].append(dom_width) + dataDICT['src_to_rotc'].append(src_to_rotc) + dataDICT['src_to_det'].append(src_to_det) + dataDICT['det_width'].append(det_width) + + return (dataDICT)
\ No newline at end of file |