diff options
| -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;  } | 
