summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;
}