summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2018-12-05 12:05:11 +0100
committerWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2018-12-06 13:57:35 +0100
commit662dfcfc37bd7658e61a3b2f6bbc815472a16786 (patch)
tree682d56a92ddacf4a31c2f3f2fa1179a7ef245540
parent7bfc5b3713f750efe21992fcd8d02e840d5d4867 (diff)
downloadastra-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.
-rw-r--r--src/FilteredBackProjectionAlgorithm.cpp5
-rw-r--r--src/Filters.cpp96
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;
}