diff options
author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2018-12-05 12:05:11 +0100 |
---|---|---|
committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2018-12-06 13:57:35 +0100 |
commit | 662dfcfc37bd7658e61a3b2f6bbc815472a16786 (patch) | |
tree | 682d56a92ddacf4a31c2f3f2fa1179a7ef245540 /src | |
parent | 7bfc5b3713f750efe21992fcd8d02e840d5d4867 (diff) | |
download | astra-662dfcfc37bd7658e61a3b2f6bbc815472a16786.tar.gz astra-662dfcfc37bd7658e61a3b2f6bbc815472a16786.tar.bz2 astra-662dfcfc37bd7658e61a3b2f6bbc815472a16786.tar.xz astra-662dfcfc37bd7658e61a3b2f6bbc815472a16786.zip |
Improve detection of unused config options for filters
The FilterSinogramId, FilterParameter and FilterD options now only get
marked used if they are actually used, based on the value of FilterType.
Diffstat (limited to 'src')
-rw-r--r-- | src/FilteredBackProjectionAlgorithm.cpp | 5 | ||||
-rw-r--r-- | src/Filters.cpp | 96 |
2 files changed, 67 insertions, 34 deletions
diff --git a/src/FilteredBackProjectionAlgorithm.cpp b/src/FilteredBackProjectionAlgorithm.cpp index 67a12a2..ea606f7 100644 --- a/src/FilteredBackProjectionAlgorithm.cpp +++ b/src/FilteredBackProjectionAlgorithm.cpp @@ -92,24 +92,28 @@ void CFilteredBackProjectionAlgorithm::clear() bool CFilteredBackProjectionAlgorithm::initialize(const Config& _cfg) { ASTRA_ASSERT(_cfg.self); + ConfigStackCheck<CAlgorithm> CC("FilteredBackProjectionAlgorithm", this, _cfg); // projector XMLNode node = _cfg.self.getSingleNode("ProjectorId"); ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ProjectorId tag specified."); int id = node.getContentInt(); m_pProjector = CProjector2DManager::getSingleton().get(id); + CC.markNodeParsed("ProjectorId"); // sinogram data node = _cfg.self.getSingleNode("ProjectionDataId"); ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ProjectionDataId tag specified."); id = node.getContentInt(); m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); + CC.markNodeParsed("ProjectionDataId"); // volume data node = _cfg.self.getSingleNode("ReconstructionDataId"); ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ReconstructionDataId tag specified."); id = node.getContentInt(); m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id)); + CC.markNodeParsed("ReconstructionDataId"); node = _cfg.self.getSingleNode("ProjectionIndex"); if (node) @@ -153,6 +157,7 @@ bool CFilteredBackProjectionAlgorithm::initialize(const Config& _cfg) delete[] sinogramData2D; delete[] projectionAngles; } + CC.markNodeParsed("ProjectionIndex"); m_filterConfig = getFilterConfigForAlgorithm(_cfg, this); diff --git a/src/Filters.cpp b/src/Filters.cpp index d5601e6..8f68202 100644 --- a/src/Filters.cpp +++ b/src/Filters.cpp @@ -492,28 +492,38 @@ SFilterConfig getFilterConfigForAlgorithm(const Config& _cfg, CAlgorithm *_alg) XMLNode node; // filter type - node = _cfg.self.getSingleNode("FilterType"); - if (_cfg.self.hasOption("FilterType")) { - c.m_eType = convertStringToFilter(_cfg.self.getOption("FilterType")); - CC.markOptionParsed("FilterType"); + const char *nodeName = "FilterType"; + node = _cfg.self.getSingleNode(nodeName); + if (_cfg.self.hasOption(nodeName)) { + c.m_eType = convertStringToFilter(_cfg.self.getOption(nodeName)); + CC.markOptionParsed(nodeName); } else if (node) { // Fallback: check cfg.FilterType (instead of cfg.option.FilterType) c.m_eType = convertStringToFilter(node.getContent()); - CC.markNodeParsed("FilterType"); + CC.markNodeParsed(nodeName); } else { c.m_eType = FILTER_RAMLAK; } // filter - // TODO: Only for some values of FilterType - node = _cfg.self.getSingleNode("FilterSinogramId"); + nodeName = "FilterSinogramId"; 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"); + switch (c.m_eType) { + case FILTER_PROJECTION: + case FILTER_SINOGRAM: + case FILTER_RPROJECTION: + case FILTER_RSINOGRAM: + node = _cfg.self.getSingleNode(nodeName); + if (_cfg.self.hasOption(nodeName)) { + id = _cfg.self.getOptionInt(nodeName); + CC.markOptionParsed(nodeName); + } else if (node) { + id = node.getContentInt(); + CC.markNodeParsed(nodeName); + } + break; + default: + break; } if (id != -1) { @@ -530,31 +540,49 @@ SFilterConfig getFilterConfigForAlgorithm(const Config& _cfg, CAlgorithm *_alg) } // filter parameter - // TODO: Only for some values of FilterType - node = _cfg.self.getSingleNode("FilterParameter"); - 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; + nodeName = "FilterParameter"; + c.m_fParameter = -1.0f; + switch (c.m_eType) { + case FILTER_TUKEY: + case FILTER_GAUSSIAN: + case FILTER_BLACKMAN: + case FILTER_KAISER: + node = _cfg.self.getSingleNode(nodeName); + if (_cfg.self.hasOption(nodeName)) { + c.m_fParameter = _cfg.self.getOptionNumerical(nodeName); + CC.markOptionParsed(nodeName); + } else if (node) { + c.m_fParameter = node.getContentNumerical(); + CC.markNodeParsed(nodeName); + } + break; + default: + break; } // D value - // TODO: Only for some values of FilterType - node = _cfg.self.getSingleNode("FilterD"); - 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; + nodeName = "FilterD"; + c.m_fD = 1.0f; + switch (c.m_eType) { + case FILTER_PROJECTION: + case FILTER_SINOGRAM: + case FILTER_RPROJECTION: + case FILTER_RSINOGRAM: + break; + case FILTER_NONE: + case FILTER_ERROR: + break; + default: + node = _cfg.self.getSingleNode(nodeName); + if (_cfg.self.hasOption(nodeName)) { + c.m_fD = _cfg.self.getOptionNumerical(nodeName); + CC.markOptionParsed(nodeName); + } else if (node) { + c.m_fD = node.getContentNumerical(); + CC.markNodeParsed(nodeName); + } + break; } - return c; } |