summaryrefslogtreecommitdiffstats
path: root/src
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 /src
parente8be82070824fa370285142550c1e708561bd63d (diff)
downloadastra-7bfc5b3713f750efe21992fcd8d02e840d5d4867.tar.gz
astra-7bfc5b3713f750efe21992fcd8d02e840d5d4867.tar.bz2
astra-7bfc5b3713f750efe21992fcd8d02e840d5d4867.tar.xz
astra-7bfc5b3713f750efe21992fcd8d02e840d5d4867.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/Filters.cpp74
1 files changed, 43 insertions, 31 deletions
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;
}