summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2018-12-05 12:03:14 +0100
committerWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2018-12-06 13:57:35 +0100
commit7bfc5b3713f750efe21992fcd8d02e840d5d4867 (patch)
tree4daeac31555bc6b568b5f8766cd27c90096d578e
parente8be82070824fa370285142550c1e708561bd63d (diff)
Read filter config for FBP from cfg.options
Since these settings are optional, they should have been in cfg.options instead of directly in cfg. The old syntax remains a fallback. This has the side-effect that the tomopy/astra interface can also supply them.
-rw-r--r--include/astra/Filters.h4
-rw-r--r--samples/matlab/s014_FBP.m2
-rw-r--r--samples/matlab/s023_FBP_filters.m10
-rw-r--r--samples/python/s014_FBP.py2
-rw-r--r--samples/python/s023_FBP_filters.py11
-rw-r--r--src/Filters.cpp74
6 files changed, 59 insertions, 44 deletions
diff --git a/include/astra/Filters.h b/include/astra/Filters.h
index a1dec97..2e229b9 100644
--- a/include/astra/Filters.h
+++ b/include/astra/Filters.h
@@ -28,6 +28,8 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
#ifndef _INC_ASTRA_FILTERS_H
#define _INC_ASTRA_FILTERS_H
+#include <string>
+
namespace astra {
struct Config;
@@ -82,7 +84,7 @@ float *genFilter(const SFilterConfig &_cfg,
int _iFFTFourierDetectorCount);
// Convert string to filter type. Returns FILTER_ERROR if unrecognized.
-E_FBPFILTER convertStringToFilter(const char * _filterType);
+E_FBPFILTER convertStringToFilter(const std::string &_filterType);
SFilterConfig getFilterConfigForAlgorithm(const Config& _cfg, CAlgorithm *_alg);
diff --git a/samples/matlab/s014_FBP.m b/samples/matlab/s014_FBP.m
index 1fc6f90..038aa90 100644
--- a/samples/matlab/s014_FBP.m
+++ b/samples/matlab/s014_FBP.m
@@ -24,7 +24,7 @@ rec_id = astra_mex_data2d('create', '-vol', vol_geom);
cfg = astra_struct('FBP_CUDA');
cfg.ReconstructionDataId = rec_id;
cfg.ProjectionDataId = sinogram_id;
-cfg.FilterType = 'Ram-Lak';
+cfg.option.FilterType = 'Ram-Lak';
% possible values for FilterType:
% none, ram-lak, shepp-logan, cosine, hamming, hann, tukey, lanczos,
diff --git a/samples/matlab/s023_FBP_filters.m b/samples/matlab/s023_FBP_filters.m
index 4abec7e..d01b0d0 100644
--- a/samples/matlab/s023_FBP_filters.m
+++ b/samples/matlab/s023_FBP_filters.m
@@ -32,7 +32,7 @@ cfg.ProjectorId = proj_id;
% 1. Use a standard Ram-Lak filter
-cfg.FilterType = 'ram-lak';
+cfg.option.FilterType = 'ram-lak';
alg_id = astra_mex_algorithm('create', cfg);
astra_mex_algorithm('run', alg_id);
@@ -53,8 +53,8 @@ filter = kernel(1:halfFilterSize);
filter_geom = astra_create_proj_geom('parallel', 1.0, halfFilterSize, [0]);
filter_id = astra_mex_data2d('create', '-sino', filter_geom, filter);
-cfg.FilterType = 'projection';
-cfg.FilterSinogramId = filter_id;
+cfg.option.FilterType = 'projection';
+cfg.option.FilterSinogramId = filter_id;
alg_id = astra_mex_algorithm('create', cfg);
astra_mex_algorithm('run', alg_id);
@@ -77,8 +77,8 @@ kernel(floor(N/2)+1) = 0.5;
kernel_geom = astra_create_proj_geom('parallel', 1.0, N, [0]);
kernel_id = astra_mex_data2d('create', '-sino', kernel_geom, kernel);
-cfg.FilterType = 'rprojection';
-cfg.FilterSinogramId = kernel_id;
+cfg.option.FilterType = 'rprojection';
+cfg.option.FilterSinogramId = kernel_id;
alg_id = astra_mex_algorithm('create', cfg);
astra_mex_algorithm('run', alg_id);
diff --git a/samples/python/s014_FBP.py b/samples/python/s014_FBP.py
index f7cefd4..1c3a341 100644
--- a/samples/python/s014_FBP.py
+++ b/samples/python/s014_FBP.py
@@ -49,7 +49,7 @@ rec_id = astra.data2d.create('-vol', vol_geom)
cfg = astra.astra_dict('FBP_CUDA')
cfg['ReconstructionDataId'] = rec_id
cfg['ProjectionDataId'] = sinogram_id
-cfg['FilterType'] = 'Ram-Lak'
+cfg['option'] = { 'FilterType': 'Ram-Lak' }
# possible values for FilterType:
# none, ram-lak, shepp-logan, cosine, hamming, hann, tukey, lanczos,
diff --git a/samples/python/s023_FBP_filters.py b/samples/python/s023_FBP_filters.py
index 11518ac..a67c338 100644
--- a/samples/python/s023_FBP_filters.py
+++ b/samples/python/s023_FBP_filters.py
@@ -47,11 +47,12 @@ cfg = astra.astra_dict('FBP')
cfg['ReconstructionDataId'] = rec_id
cfg['ProjectionDataId'] = sinogram_id
cfg['ProjectorId'] = proj_id
+cfg['option'] = {}
# 1. Use a standard Ram-Lak filter
-cfg['FilterType'] = 'ram-lak'
+cfg['option']['FilterType'] = 'ram-lak'
alg_id = astra.algorithm.create(cfg)
astra.algorithm.run(alg_id)
@@ -71,8 +72,8 @@ filter = np.reshape(kernel[0:halfFilterSize], (1, halfFilterSize))
filter_geom = astra.create_proj_geom('parallel', 1.0, halfFilterSize, [0]);
filter_id = astra.data2d.create('-sino', filter_geom, filter);
-cfg['FilterType'] = 'projection'
-cfg['FilterSinogramId'] = filter_id
+cfg['option']['FilterType'] = 'projection'
+cfg['option']['FilterSinogramId'] = filter_id
alg_id = astra.algorithm.create(cfg)
astra.algorithm.run(alg_id)
rec_filter = astra.data2d.get(rec_id)
@@ -92,8 +93,8 @@ kernel[0, N//2] = 0.5
kernel_geom = astra.create_proj_geom('parallel', 1.0, N, [0]);
kernel_id = astra.data2d.create('-sino', kernel_geom, kernel);
-cfg['FilterType'] = 'rprojection'
-cfg['FilterSinogramId'] = kernel_id
+cfg['option']['FilterType'] = 'rprojection'
+cfg['option']['FilterSinogramId'] = kernel_id
alg_id = astra.algorithm.create(cfg)
astra.algorithm.run(alg_id)
rec_kernel = astra.data2d.get(rec_id)
diff --git a/src/Filters.cpp b/src/Filters.cpp
index e756052..d5601e6 100644
--- a/src/Filters.cpp
+++ b/src/Filters.cpp
@@ -443,7 +443,7 @@ struct FilterNameMapEntry {
E_FBPFILTER m_type;
};
-E_FBPFILTER convertStringToFilter(const char * _filterType)
+E_FBPFILTER convertStringToFilter(const std::string &_filterType)
{
static const FilterNameMapEntry map[] = {
@@ -474,10 +474,10 @@ E_FBPFILTER convertStringToFilter(const char * _filterType)
const FilterNameMapEntry *i;
for (i = &map[0]; i->m_name; ++i)
- if (stringCompareLowerCase(_filterType, i->m_name))
+ if (stringCompareLowerCase(_filterType.c_str(), i->m_name))
return i->m_type;
- ASTRA_ERROR("Failed to convert \"%s\" into a filter.",_filterType);
+ ASTRA_ERROR("Failed to convert \"%s\" into a filter.",_filterType.c_str());
return FILTER_ERROR;
}
@@ -489,59 +489,71 @@ SFilterConfig getFilterConfigForAlgorithm(const Config& _cfg, CAlgorithm *_alg)
SFilterConfig c;
+ XMLNode node;
+
// filter type
- XMLNode node = _cfg.self.getSingleNode("FilterType");
- if (node)
- c.m_eType = convertStringToFilter(node.getContent().c_str());
- else
+ node = _cfg.self.getSingleNode("FilterType");
+ if (_cfg.self.hasOption("FilterType")) {
+ c.m_eType = convertStringToFilter(_cfg.self.getOption("FilterType"));
+ CC.markOptionParsed("FilterType");
+ } else if (node) {
+ // Fallback: check cfg.FilterType (instead of cfg.option.FilterType)
+ c.m_eType = convertStringToFilter(node.getContent());
+ CC.markNodeParsed("FilterType");
+ } else {
c.m_eType = FILTER_RAMLAK;
- CC.markNodeParsed("FilterType");
+ }
// filter
+ // TODO: Only for some values of FilterType
node = _cfg.self.getSingleNode("FilterSinogramId");
- if (node)
- {
- int id = node.getContentInt();
+ int id = -1;
+ if (_cfg.self.hasOption("FilterSinogramId")) {
+ id = _cfg.self.getOptionInt("FilterSinogramId");
+ CC.markOptionParsed("FilterSinogramId");
+ } else if (node) {
+ id = node.getContentInt();
+ CC.markNodeParsed("FilterSinogramId");
+ }
+
+ if (id != -1) {
const CFloat32ProjectionData2D * pFilterData = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
c.m_iCustomFilterWidth = pFilterData->getGeometry()->getDetectorCount();
c.m_iCustomFilterHeight = pFilterData->getGeometry()->getProjectionAngleCount();
c.m_pfCustomFilter = new float[c.m_iCustomFilterWidth * c.m_iCustomFilterHeight];
memcpy(c.m_pfCustomFilter, pFilterData->getDataConst(), sizeof(float) * c.m_iCustomFilterWidth * c.m_iCustomFilterHeight);
- }
- else
- {
+ } else {
c.m_iCustomFilterWidth = 0;
c.m_iCustomFilterHeight = 0;
c.m_pfCustomFilter = NULL;
}
- CC.markNodeParsed("FilterSinogramId"); // TODO: Only for some types!
// filter parameter
+ // TODO: Only for some values of FilterType
node = _cfg.self.getSingleNode("FilterParameter");
- if (node)
- {
- float fParameter = node.getContentNumerical();
- c.m_fParameter = fParameter;
- }
- else
- {
+ if (_cfg.self.hasOption("FilterParameter")) {
+ c.m_fParameter = _cfg.self.getOptionNumerical("FilterParameter");
+ CC.markOptionParsed("FilterParameter");
+ } else if (node) {
+ c.m_fParameter = node.getContentNumerical();
+ CC.markNodeParsed("FilterParameter");
+ } else {
c.m_fParameter = -1.0f;
}
- CC.markNodeParsed("FilterParameter"); // TODO: Only for some types!
// D value
+ // TODO: Only for some values of FilterType
node = _cfg.self.getSingleNode("FilterD");
- if (node)
- {
- float fD = node.getContentNumerical();
- c.m_fD = fD;
- }
- else
- {
+ if (_cfg.self.hasOption("FilterD")) {
+ c.m_fD = _cfg.self.getOptionNumerical("FilterD");
+ CC.markOptionParsed("FilterD");
+ } else if (node) {
+ c.m_fD = node.getContentNumerical();
+ CC.markNodeParsed("FilterD");
+ } else {
c.m_fD = 1.0f;
}
- CC.markNodeParsed("FilterD"); // TODO: Only for some types!
return c;
}