summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWim van Aarle <wimvanaarle@gmail.com>2015-05-26 15:43:08 +0200
committerWim van Aarle <wimvanaarle@gmail.com>2015-05-26 15:43:08 +0200
commit3117c7a61a83ca28ba00211d1eb65eaf13a7307a (patch)
tree4851ae878cf499deb2ae2f77575b3c48ecaf5d04 /src
parent9e884e760b71be354c08892f6bce2efe723917b3 (diff)
parent57668bcdd086145eb14598e32fd5d0dca711865c (diff)
downloadastra-3117c7a61a83ca28ba00211d1eb65eaf13a7307a.tar.gz
astra-3117c7a61a83ca28ba00211d1eb65eaf13a7307a.tar.bz2
astra-3117c7a61a83ca28ba00211d1eb65eaf13a7307a.tar.xz
astra-3117c7a61a83ca28ba00211d1eb65eaf13a7307a.zip
Merge remote-tracking branch 'upstream/master' into parallel_vec
Conflicts: astra_vc11.vcxproj.filters python/astra/functions.py src/ParallelBeamBlobKernelProjector2D.cpp src/ProjectionGeometry2D.cpp
Diffstat (limited to 'src')
-rw-r--r--src/ArtAlgorithm.cpp6
-rw-r--r--src/ConeProjectionGeometry3D.cpp30
-rw-r--r--src/ConeVecProjectionGeometry3D.cpp25
-rw-r--r--src/Config.cpp31
-rw-r--r--src/CudaBackProjectionAlgorithm3D.cpp6
-rw-r--r--src/CudaCglsAlgorithm3D.cpp6
-rw-r--r--src/CudaDartMaskAlgorithm.cpp22
-rw-r--r--src/CudaDartMaskAlgorithm3D.cpp22
-rw-r--r--src/CudaDartSmoothingAlgorithm.cpp20
-rw-r--r--src/CudaDartSmoothingAlgorithm3D.cpp20
-rw-r--r--src/CudaDataOperationAlgorithm.cpp25
-rw-r--r--src/CudaFDKAlgorithm3D.cpp6
-rw-r--r--src/CudaFilteredBackProjectionAlgorithm.cpp60
-rw-r--r--src/CudaForwardProjectionAlgorithm.cpp27
-rw-r--r--src/CudaForwardProjectionAlgorithm3D.cpp25
-rw-r--r--src/CudaProjector2D.cpp5
-rw-r--r--src/CudaProjector3D.cpp5
-rw-r--r--src/CudaReconstructionAlgorithm2D.cpp53
-rw-r--r--src/CudaRoiSelectAlgorithm.cpp13
-rw-r--r--src/CudaSartAlgorithm.cpp4
-rw-r--r--src/CudaSirtAlgorithm.cpp8
-rw-r--r--src/CudaSirtAlgorithm3D.cpp6
-rw-r--r--src/FanFlatProjectionGeometry2D.cpp22
-rw-r--r--src/FanFlatVecProjectionGeometry2D.cpp18
-rw-r--r--src/FilteredBackProjectionAlgorithm.cpp24
-rw-r--r--src/Float32ProjectionData2D.cpp19
-rw-r--r--src/Float32ProjectionData3D.cpp9
-rw-r--r--src/Float32VolumeData2D.cpp20
-rw-r--r--src/Float32VolumeData3D.cpp9
-rw-r--r--src/ForwardProjectionAlgorithm.cpp23
-rw-r--r--src/Logger.cpp77
-rw-r--r--src/Logging.cpp184
-rw-r--r--src/ParallelBeamBlobKernelProjector2D.cpp19
-rw-r--r--src/ParallelProjectionGeometry2D.cpp8
-rw-r--r--src/ParallelProjectionGeometry3D.cpp12
-rw-r--r--src/ParallelVecProjectionGeometry3D.cpp25
-rw-r--r--src/ProjectionGeometry2D.cpp15
-rw-r--r--src/ProjectionGeometry3D.cpp25
-rw-r--r--src/Projector2D.cpp6
-rw-r--r--src/Projector3D.cpp11
-rw-r--r--src/ReconstructionAlgorithm2D.cpp39
-rw-r--r--src/ReconstructionAlgorithm3D.cpp36
-rw-r--r--src/SartAlgorithm.cpp4
-rw-r--r--src/SparseMatrixProjectionGeometry2D.cpp15
-rw-r--r--src/VolumeGeometry2D.cpp30
-rw-r--r--src/VolumeGeometry3D.cpp45
-rw-r--r--src/XMLDocument.cpp10
-rw-r--r--src/XMLNode.cpp284
48 files changed, 758 insertions, 656 deletions
diff --git a/src/ArtAlgorithm.cpp b/src/ArtAlgorithm.cpp
index 8f058a3..6a699ec 100644
--- a/src/ArtAlgorithm.cpp
+++ b/src/ArtAlgorithm.cpp
@@ -132,7 +132,7 @@ bool CArtAlgorithm::initialize(const Config& _cfg)
}
// ray order
- string projOrder = _cfg.self->getOption("RayOrder", "sequential");
+ string projOrder = _cfg.self.getOption("RayOrder", "sequential");
CC.markOptionParsed("RayOrder");
m_iCurrentRay = 0;
m_iRayCount = m_pProjector->getProjectionGeometry()->getProjectionAngleCount() *
@@ -145,7 +145,7 @@ bool CArtAlgorithm::initialize(const Config& _cfg)
m_piDetectorOrder[i] = i % m_pProjector->getProjectionGeometry()->getDetectorCount();
}
} else if (projOrder == "custom") {
- vector<float32> rayOrderList = _cfg.self->getOptionNumericalArray("RayOrderList");
+ vector<float32> rayOrderList = _cfg.self.getOptionNumericalArray("RayOrderList");
m_iRayCount = rayOrderList.size() / 2;
m_piProjectionOrder = new int[m_iRayCount];
m_piDetectorOrder = new int[m_iRayCount];
@@ -158,7 +158,7 @@ bool CArtAlgorithm::initialize(const Config& _cfg)
return false;
}
- m_fLambda = _cfg.self->getOptionNumerical("Lambda", 1.0f);
+ m_fLambda = _cfg.self.getOptionNumerical("Lambda", 1.0f);
CC.markOptionParsed("Lambda");
// success
diff --git a/src/ConeProjectionGeometry3D.cpp b/src/ConeProjectionGeometry3D.cpp
index eb9adcf..dd22eba 100644
--- a/src/ConeProjectionGeometry3D.cpp
+++ b/src/ConeProjectionGeometry3D.cpp
@@ -28,6 +28,8 @@ $Id$
#include "astra/ConeProjectionGeometry3D.h"
+#include "astra/Logging.h"
+
#include <boost/lexical_cast.hpp>
#include <cstring>
@@ -85,17 +87,15 @@ bool CConeProjectionGeometry3D::initialize(const Config& _cfg)
CProjectionGeometry3D::initialize(_cfg);
// Required: DistanceOriginDetector
- XMLNode* node = _cfg.self->getSingleNode("DistanceOriginDetector");
+ XMLNode node = _cfg.self.getSingleNode("DistanceOriginDetector");
ASTRA_CONFIG_CHECK(node, "ConeProjectionGeometry3D", "No DistanceOriginDetector tag specified.");
- m_fOriginDetectorDistance = boost::lexical_cast<float32>(node->getContent());
- ASTRA_DELETE(node);
+ m_fOriginDetectorDistance = boost::lexical_cast<float32>(node.getContent());
CC.markNodeParsed("DistanceOriginDetector");
// Required: DetectorOriginSource
- node = _cfg.self->getSingleNode("DistanceOriginSource");
+ node = _cfg.self.getSingleNode("DistanceOriginSource");
ASTRA_CONFIG_CHECK(node, "ConeProjectionGeometry3D", "No DistanceOriginSource tag specified.");
- m_fOriginSourceDistance = boost::lexical_cast<float32>(node->getContent());
- ASTRA_DELETE(node);
+ m_fOriginSourceDistance = boost::lexical_cast<float32>(node.getContent());
CC.markNodeParsed("DistanceOriginSource");
// success
@@ -191,14 +191,14 @@ Config* CConeProjectionGeometry3D::getConfiguration() const
{
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry3D");
- cfg->self->addAttribute("type", "cone");
- cfg->self->addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
- cfg->self->addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
- cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
- cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
- cfg->self->addChildNode("DistanceOriginDetector", m_fOriginDetectorDistance);
- cfg->self->addChildNode("DistanceOriginSource", m_fOriginSourceDistance);
- cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+ cfg->self.addAttribute("type", "cone");
+ cfg->self.addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
+ cfg->self.addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
+ cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+ cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
+ cfg->self.addChildNode("DistanceOriginDetector", m_fOriginDetectorDistance);
+ cfg->self.addChildNode("DistanceOriginSource", m_fOriginSourceDistance);
+ cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
return cfg;
}
@@ -257,7 +257,7 @@ void CConeProjectionGeometry3D::projectPoint(float32 fX, float32 fY, float32 fZ,
// Scale fS to detector plane
fU = detectorOffsetXToColIndexFloat( (fS * (m_fOriginSourceDistance + m_fOriginDetectorDistance)) / fD );
- fprintf(stderr, "alpha: %f, D: %f, V: %f, S: %f, U: %f\n", alpha, fD, fV, fS, fU);
+ ASTRA_DEBUG("alpha: %f, D: %f, V: %f, S: %f, U: %f", alpha, fD, fV, fS, fU);
}
diff --git a/src/ConeVecProjectionGeometry3D.cpp b/src/ConeVecProjectionGeometry3D.cpp
index 9dc273d..47ed630 100644
--- a/src/ConeVecProjectionGeometry3D.cpp
+++ b/src/ConeVecProjectionGeometry3D.cpp
@@ -73,33 +73,30 @@ bool CConeVecProjectionGeometry3D::initialize(const Config& _cfg)
ASTRA_ASSERT(_cfg.self);
ConfigStackCheck<CProjectionGeometry3D> CC("ConeVecProjectionGeometry3D", this, _cfg);
- XMLNode* node;
+ XMLNode node;
// TODO: Fix up class hierarchy... this class doesn't fit very well.
// initialization of parent class
//CProjectionGeometry3D::initialize(_cfg);
// Required: DetectorRowCount
- node = _cfg.self->getSingleNode("DetectorRowCount");
+ node = _cfg.self.getSingleNode("DetectorRowCount");
ASTRA_CONFIG_CHECK(node, "ConeVecProjectionGeometry3D", "No DetectorRowCount tag specified.");
- m_iDetectorRowCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iDetectorRowCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("DetectorRowCount");
// Required: DetectorColCount
- node = _cfg.self->getSingleNode("DetectorColCount");
+ node = _cfg.self.getSingleNode("DetectorColCount");
ASTRA_CONFIG_CHECK(node, "ConeVecProjectionGeometry3D", "No DetectorColCount tag specified.");
- m_iDetectorColCount = boost::lexical_cast<int>(node->getContent());
+ m_iDetectorColCount = boost::lexical_cast<int>(node.getContent());
m_iDetectorTotCount = m_iDetectorRowCount * m_iDetectorColCount;
- ASTRA_DELETE(node);
CC.markNodeParsed("DetectorColCount");
// Required: Vectors
- node = _cfg.self->getSingleNode("Vectors");
+ node = _cfg.self.getSingleNode("Vectors");
ASTRA_CONFIG_CHECK(node, "ConeVecProjectionGeometry3D", "No Vectors tag specified.");
- vector<double> data = node->getContentNumericalArrayDouble();
+ vector<double> data = node.getContentNumericalArrayDouble();
CC.markNodeParsed("Vectors");
- ASTRA_DELETE(node);
ASTRA_CONFIG_CHECK(data.size() % 12 == 0, "ConeVecProjectionGeometry3D", "Vectors doesn't consist of 12-tuples.");
m_iProjectionAngleCount = data.size() / 12;
m_pProjectionAngles = new SConeProjection[m_iProjectionAngleCount];
@@ -208,9 +205,9 @@ Config* CConeVecProjectionGeometry3D::getConfiguration() const
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry3D");
- cfg->self->addAttribute("type", "cone_vec");
- cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
- cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
+ cfg->self.addAttribute("type", "cone_vec");
+ cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+ cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
std::string vectors = "";
for (int i = 0; i < m_iProjectionAngleCount; ++i) {
@@ -229,7 +226,7 @@ Config* CConeVecProjectionGeometry3D::getConfiguration() const
vectors += boost::lexical_cast<string>(p.fDetVZ);
if (i < m_iProjectionAngleCount-1) vectors += ';';
}
- cfg->self->addChildNode("Vectors", vectors);
+ cfg->self.addChildNode("Vectors", vectors);
return cfg;
}
diff --git a/src/Config.cpp b/src/Config.cpp
index 653935e..395080b 100644
--- a/src/Config.cpp
+++ b/src/Config.cpp
@@ -37,36 +37,41 @@ $Id$
#include "astra/Projector2D.h"
#include "astra/Projector3D.h"
+#include "astra/Logging.h"
+#include <sstream>
+
using namespace astra;
using namespace std;
//-----------------------------------------------------------------------------
// default constructor
-Config::Config()
+Config::Config() : self()
{
- self = 0;
+ _doc = 0;
}
//-----------------------------------------------------------------------------
// not so default constructor
-Config::Config(XMLNode* _self)
+Config::Config(XMLNode _self)
{
self = _self;
+ _doc = 0;
}
//-----------------------------------------------------------------------------
Config::~Config()
{
- delete self;
- self = 0;
+ delete _doc;
+ _doc = 0;
}
//-----------------------------------------------------------------------------
void Config::initialize(std::string rootname)
{
- if (self == 0) {
+ if (!self) {
XMLDocument* doc = XMLDocument::createDocument(rootname);
self = doc->getRootNode();
+ _doc = doc;
}
}
@@ -121,13 +126,13 @@ bool ConfigStackCheck<T>::stopParsing()
std::string errors;
- std::list<XMLNode*> nodes = cfg->self->getNodes();
- for (std::list<XMLNode*>::iterator i = nodes.begin(); i != nodes.end(); ++i)
+ std::list<XMLNode> nodes = cfg->self.getNodes();
+ for (std::list<XMLNode>::iterator i = nodes.begin(); i != nodes.end(); ++i)
{
- std::string nodeName = (*i)->getName();
+ std::string nodeName = i->getName();
if (nodeName == "Option") {
- nodeName = (*i)->getAttribute("key", "");
+ nodeName = i->getAttribute("key", "");
if (object->configCheckData->parsedOptions.find(nodeName) == object->configCheckData->parsedOptions.end()) {
if (!errors.empty()) errors += ", ";
errors += nodeName;
@@ -139,12 +144,12 @@ bool ConfigStackCheck<T>::stopParsing()
}
}
}
- for (std::list<XMLNode*>::iterator i = nodes.begin(); i != nodes.end(); ++i)
- delete (*i);
nodes.clear();
if (!errors.empty()) {
- cout << "Warning: " << name << ": unused configuration options: " << errors << std::endl;
+ ostringstream os;
+ os << name << ": unused configuration options: " << errors;
+ ASTRA_WARN(os.str().c_str());
return false;
}
diff --git a/src/CudaBackProjectionAlgorithm3D.cpp b/src/CudaBackProjectionAlgorithm3D.cpp
index abcf096..fbb8f28 100644
--- a/src/CudaBackProjectionAlgorithm3D.cpp
+++ b/src/CudaBackProjectionAlgorithm3D.cpp
@@ -102,9 +102,9 @@ bool CCudaBackProjectionAlgorithm3D::initialize(const Config& _cfg)
return false;
}
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
CC.markOptionParsed("GPUindex");
- m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+ m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
CC.markOptionParsed("VoxelSuperSampling");
CFloat32ProjectionData3DMemory* pSinoMem = dynamic_cast<CFloat32ProjectionData3DMemory*>(m_pSinogram);
@@ -114,7 +114,7 @@ const CParallelProjectionGeometry3D* par3dgeom = dynamic_cast<const CParallelPro
const CParallelVecProjectionGeometry3D* parvec3dgeom = dynamic_cast<const CParallelVecProjectionGeometry3D*>(projgeom);
if (parvec3dgeom || par3dgeom) {
// This option is only supported for Par3D currently
- m_bSIRTWeighting = _cfg.self->getOptionBool("SIRTWeighting", false);
+ m_bSIRTWeighting = _cfg.self.getOptionBool("SIRTWeighting", false);
CC.markOptionParsed("SIRTWeighting");
}
diff --git a/src/CudaCglsAlgorithm3D.cpp b/src/CudaCglsAlgorithm3D.cpp
index a5500d6..3457b81 100644
--- a/src/CudaCglsAlgorithm3D.cpp
+++ b/src/CudaCglsAlgorithm3D.cpp
@@ -106,11 +106,11 @@ bool CCudaCglsAlgorithm3D::initialize(const Config& _cfg)
return false;
}
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
CC.markOptionParsed("GPUindex");
- m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+ m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
CC.markOptionParsed("DetectorSuperSampling");
- m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+ m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
CC.markOptionParsed("VoxelSuperSampling");
m_pCgls = new AstraCGLS3d();
diff --git a/src/CudaDartMaskAlgorithm.cpp b/src/CudaDartMaskAlgorithm.cpp
index dcdefcc..950b428 100644
--- a/src/CudaDartMaskAlgorithm.cpp
+++ b/src/CudaDartMaskAlgorithm.cpp
@@ -65,38 +65,36 @@ bool CCudaDartMaskAlgorithm::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("CudaDartMaskAlgorithm", this, _cfg);
// reconstruction data
- XMLNode* node = _cfg.self->getSingleNode("SegmentationDataId");
+ XMLNode node = _cfg.self.getSingleNode("SegmentationDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No SegmentationDataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pSegmentation = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("SegmentationDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("MaskDataId");
+ node = _cfg.self.getSingleNode("MaskDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No MaskDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("MaskDataId");
// Option: GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
// Option: Connectivity
- m_iConn = (unsigned int)_cfg.self->getOptionNumerical("Connectivity", 8);
+ m_iConn = (unsigned int)_cfg.self.getOptionNumerical("Connectivity", 8);
CC.markOptionParsed("Connectivity");
// Option: Threshold
- m_iThreshold = (unsigned int)_cfg.self->getOptionNumerical("Threshold", 1);
+ m_iThreshold = (unsigned int)_cfg.self.getOptionNumerical("Threshold", 1);
CC.markOptionParsed("Threshold");
// Option: Radius
- m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+ m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
CC.markOptionParsed("Radius");
_check();
diff --git a/src/CudaDartMaskAlgorithm3D.cpp b/src/CudaDartMaskAlgorithm3D.cpp
index f3500b9..b0dfc5b 100644
--- a/src/CudaDartMaskAlgorithm3D.cpp
+++ b/src/CudaDartMaskAlgorithm3D.cpp
@@ -65,38 +65,36 @@ bool CCudaDartMaskAlgorithm3D::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("CudaDartMaskAlgorithm", this, _cfg);
// reconstruction data
- XMLNode* node = _cfg.self->getSingleNode("SegmentationDataId");
+ XMLNode node = _cfg.self.getSingleNode("SegmentationDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No SegmentationDataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pSegmentation = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("SegmentationDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("MaskDataId");
+ node = _cfg.self.getSingleNode("MaskDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No MaskDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pMask = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("MaskDataId");
// Option: GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
// Option: Connectivity
- m_iConn = (unsigned int)_cfg.self->getOptionNumerical("Connectivity", 8);
+ m_iConn = (unsigned int)_cfg.self.getOptionNumerical("Connectivity", 8);
CC.markOptionParsed("Connectivity");
// Option: Threshold
- m_iThreshold = (unsigned int)_cfg.self->getOptionNumerical("Threshold", 1);
+ m_iThreshold = (unsigned int)_cfg.self.getOptionNumerical("Threshold", 1);
CC.markOptionParsed("Threshold");
// Option: Radius
- m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+ m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
CC.markOptionParsed("Radius");
_check();
diff --git a/src/CudaDartSmoothingAlgorithm.cpp b/src/CudaDartSmoothingAlgorithm.cpp
index 2f2103f..7e22809 100644
--- a/src/CudaDartSmoothingAlgorithm.cpp
+++ b/src/CudaDartSmoothingAlgorithm.cpp
@@ -65,34 +65,32 @@ bool CCudaDartSmoothingAlgorithm::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("CudaDartSmoothingAlgorithm", this, _cfg);
// reconstruction data
- XMLNode* node = _cfg.self->getSingleNode("InDataId");
+ XMLNode node = _cfg.self.getSingleNode("InDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No InDataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pIn = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("InDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("OutDataId");
+ node = _cfg.self.getSingleNode("OutDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No OutDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pOut = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("OutDataId");
// Option: GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
// Option: Radius
- m_fB = (float)_cfg.self->getOptionNumerical("Intensity", 0.3f);
+ m_fB = (float)_cfg.self.getOptionNumerical("Intensity", 0.3f);
CC.markOptionParsed("Intensity");
// Option: Radius
- m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+ m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
CC.markOptionParsed("Radius");
diff --git a/src/CudaDartSmoothingAlgorithm3D.cpp b/src/CudaDartSmoothingAlgorithm3D.cpp
index f3cf015..9c4437a 100644
--- a/src/CudaDartSmoothingAlgorithm3D.cpp
+++ b/src/CudaDartSmoothingAlgorithm3D.cpp
@@ -65,34 +65,32 @@ bool CCudaDartSmoothingAlgorithm3D::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("CudaDartSmoothingAlgorithm", this, _cfg);
// reconstruction data
- XMLNode* node = _cfg.self->getSingleNode("InDataId");
+ XMLNode node = _cfg.self.getSingleNode("InDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No InDataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pIn = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("InDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("OutDataId");
+ node = _cfg.self.getSingleNode("OutDataId");
ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No OutDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pOut = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("OutDataId");
// Option: GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
// Option: Intensity
- m_fB = (float)_cfg.self->getOptionNumerical("Intensity", 0.3f);
+ m_fB = (float)_cfg.self.getOptionNumerical("Intensity", 0.3f);
CC.markOptionParsed("Intensity");
// Option: Radius
- m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+ m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
CC.markOptionParsed("Radius");
_check();
diff --git a/src/CudaDataOperationAlgorithm.cpp b/src/CudaDataOperationAlgorithm.cpp
index 79a9d7f..ae133c2 100644
--- a/src/CudaDataOperationAlgorithm.cpp
+++ b/src/CudaDataOperationAlgorithm.cpp
@@ -67,40 +67,37 @@ bool CCudaDataOperationAlgorithm::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("CCudaDataOperationAlgorithm", this, _cfg);
// operation
- XMLNode* node = _cfg.self->getSingleNode("Operation");
+ XMLNode node = _cfg.self.getSingleNode("Operation");
ASTRA_CONFIG_CHECK(node, "CCudaDataOperationAlgorithm", "No Operation tag specified.");
- m_sOperation = node->getContent();
+ m_sOperation = node.getContent();
m_sOperation.erase(std::remove(m_sOperation.begin(), m_sOperation.end(), ' '), m_sOperation.end());
- ASTRA_DELETE(node);
CC.markNodeParsed("Operation");
// data
- node = _cfg.self->getSingleNode("DataId");
+ node = _cfg.self.getSingleNode("DataId");
ASTRA_CONFIG_CHECK(node, "CCudaDataOperationAlgorithm", "No DataId tag specified.");
- vector<string> data = node->getContentArray();
+ vector<string> data = node.getContentArray();
for (vector<string>::iterator it = data.begin(); it != data.end(); it++){
int id = boost::lexical_cast<int>(*it);
m_pData.push_back(dynamic_cast<CFloat32Data2D*>(CData2DManager::getSingleton().get(id)));
}
- ASTRA_DELETE(node);
CC.markNodeParsed("DataId");
// scalar
- node = _cfg.self->getSingleNode("Scalar");
+ node = _cfg.self.getSingleNode("Scalar");
ASTRA_CONFIG_CHECK(node, "CCudaDataOperationAlgorithm", "No Scalar tag specified.");
- m_fScalar = node->getContentNumericalArray();
- ASTRA_DELETE(node);
+ m_fScalar = node.getContentNumericalArray();
CC.markNodeParsed("Scalar");
// Option: GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
- if (_cfg.self->hasOption("MaskId")) {
- int id = boost::lexical_cast<int>(_cfg.self->getOption("MaskId"));
+ if (_cfg.self.hasOption("MaskId")) {
+ int id = boost::lexical_cast<int>(_cfg.self.getOption("MaskId"));
m_pMask = dynamic_cast<CFloat32Data2D*>(CData2DManager::getSingleton().get(id));
}
CC.markOptionParsed("MaskId");
diff --git a/src/CudaFDKAlgorithm3D.cpp b/src/CudaFDKAlgorithm3D.cpp
index 7638696..467e641 100644
--- a/src/CudaFDKAlgorithm3D.cpp
+++ b/src/CudaFDKAlgorithm3D.cpp
@@ -100,12 +100,12 @@ bool CCudaFDKAlgorithm3D::initialize(const Config& _cfg)
return false;
}
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
CC.markOptionParsed("GPUindex");
- m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+ m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
CC.markOptionParsed("VoxelSuperSampling");
- m_bShortScan = _cfg.self->getOptionBool("ShortScan", false);
+ m_bShortScan = _cfg.self.getOptionBool("ShortScan", false);
CC.markOptionParsed("ShortScan");
// success
diff --git a/src/CudaFilteredBackProjectionAlgorithm.cpp b/src/CudaFilteredBackProjectionAlgorithm.cpp
index fcdf860..5d6c166 100644
--- a/src/CudaFilteredBackProjectionAlgorithm.cpp
+++ b/src/CudaFilteredBackProjectionAlgorithm.cpp
@@ -34,7 +34,7 @@ $Id$
#include "astra/AstraObjectManager.h"
#include "../cuda/2d/astra.h"
-#include <astra/Logger.h>
+#include "astra/Logging.h"
using namespace std;
using namespace astra;
@@ -78,39 +78,36 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
}
// sinogram data
- XMLNode* node = _cfg.self->getSingleNode("ProjectionDataId");
+ XMLNode node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "CudaFBP", "No ProjectionDataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("ReconstructionDataId");
+ node = _cfg.self.getSingleNode("ReconstructionDataId");
ASTRA_CONFIG_CHECK(node, "CudaFBP", "No ReconstructionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ReconstructionDataId");
// filter type
- node = _cfg.self->getSingleNode("FilterType");
- if(node != NULL)
+ node = _cfg.self.getSingleNode("FilterType");
+ if (node)
{
- m_eFilter = _convertStringToFilter(node->getContent().c_str());
+ m_eFilter = _convertStringToFilter(node.getContent().c_str());
}
else
{
m_eFilter = FILTER_RAMLAK;
}
CC.markNodeParsed("FilterType");
- ASTRA_DELETE(node);
-
+
// filter
- node = _cfg.self->getSingleNode("FilterSinogramId");
- if(node != NULL)
+ node = _cfg.self.getSingleNode("FilterSinogramId");
+ if (node)
{
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
const CFloat32ProjectionData2D * pFilterData = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
m_iFilterWidth = pFilterData->getGeometry()->getDetectorCount();
int iFilterProjectionCount = pFilterData->getGeometry()->getProjectionAngleCount();
@@ -124,13 +121,12 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
m_pfFilter = NULL;
}
CC.markNodeParsed("FilterSinogramId"); // TODO: Only for some types!
- ASTRA_DELETE(node);
// filter parameter
- node = _cfg.self->getSingleNode("FilterParameter");
- if(node != NULL)
+ node = _cfg.self.getSingleNode("FilterParameter");
+ if (node)
{
- float fParameter = boost::lexical_cast<float>(node->getContent());
+ float fParameter = boost::lexical_cast<float>(node.getContent());
m_fFilterParameter = fParameter;
}
else
@@ -138,13 +134,12 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
m_fFilterParameter = -1.0f;
}
CC.markNodeParsed("FilterParameter"); // TODO: Only for some types!
- ASTRA_DELETE(node);
// D value
- node = _cfg.self->getSingleNode("FilterD");
- if(node != NULL)
+ node = _cfg.self.getSingleNode("FilterD");
+ if (node)
{
- float fD = boost::lexical_cast<float>(node->getContent());
+ float fD = boost::lexical_cast<float>(node.getContent());
m_fFilterD = fD;
}
else
@@ -152,23 +147,22 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
m_fFilterD = 1.0f;
}
CC.markNodeParsed("FilterD"); // TODO: Only for some types!
- ASTRA_DELETE(node);
// GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
CC.markOptionParsed("GPUindex");
// Pixel supersampling factor
- m_iPixelSuperSampling = (int)_cfg.self->getOptionNumerical("PixelSuperSampling", 1);
+ m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", 1);
CC.markOptionParsed("PixelSuperSampling");
// Fan beam short scan mode
if (m_pSinogram && dynamic_cast<CFanFlatProjectionGeometry2D*>(m_pSinogram->getGeometry())) {
- m_bShortScan = (int)_cfg.self->getOptionBool("ShortScan", false);
+ m_bShortScan = (int)_cfg.self.getOptionBool("ShortScan", false);
CC.markOptionParsed("ShortScan");
}
-
+
m_pFBP = new AstraFBP;
@@ -186,7 +180,7 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(CFloat32ProjectionData2D *
{
clear();
}
-
+
// required classes
m_pSinogram = _pSinogram;
m_pReconstruction = _pReconstruction;
@@ -326,7 +320,7 @@ void CCudaFilteredBackProjectionAlgorithm::run(int _iNrIterations /* = 0 */)
const CVolumeGeometry2D& volgeom = *m_pReconstruction->getGeometry();
ok &= m_pFBP->getReconstruction(m_pReconstruction->getData(), volgeom.getGridColCount());
-
+
ASTRA_ASSERT(ok);
}
@@ -335,7 +329,7 @@ bool CCudaFilteredBackProjectionAlgorithm::check()
// check pointers
ASTRA_CONFIG_CHECK(m_pSinogram, "FBP_CUDA", "Invalid Projection Data Object.");
ASTRA_CONFIG_CHECK(m_pReconstruction, "FBP_CUDA", "Invalid Reconstruction Data Object.");
-
+
if((m_eFilter == FILTER_PROJECTION) || (m_eFilter == FILTER_SINOGRAM) || (m_eFilter == FILTER_RPROJECTION) || (m_eFilter == FILTER_RSINOGRAM))
{
ASTRA_CONFIG_CHECK(m_pfFilter, "FBP_CUDA", "Invalid filter pointer.");
@@ -387,7 +381,7 @@ static bool stringCompareLowerCase(const char * _stringA, const char * _stringB)
#else
iCmpReturn = strcasecmp(_stringA, _stringB);
#endif
-
+
return (iCmpReturn == 0);
}
@@ -485,7 +479,7 @@ E_FBPFILTER CCudaFilteredBackProjectionAlgorithm::_convertStringToFilter(const c
}
else
{
- cerr << "Failed to convert \"" << _filterType << "\" into a filter." << endl;
+ ASTRA_ERROR("Failed to convert \"%s\" into a filter.",_filterType);
}
return output;
diff --git a/src/CudaForwardProjectionAlgorithm.cpp b/src/CudaForwardProjectionAlgorithm.cpp
index ab0d643..0f97d59 100644
--- a/src/CudaForwardProjectionAlgorithm.cpp
+++ b/src/CudaForwardProjectionAlgorithm.cpp
@@ -42,6 +42,8 @@ $Id$
#include "astra/FanFlatVecProjectionGeometry2D.h"
#include "astra/CudaProjector2D.h"
+#include "astra/Logging.h"
+
using namespace std;
namespace astra {
@@ -71,42 +73,39 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("CudaForwardProjectionAlgorithm", this, _cfg);
// sinogram data
- XMLNode* node = _cfg.self->getSingleNode("ProjectionDataId");
+ XMLNode node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "FP_CUDA", "No ProjectionDataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionDataId");
// volume data
- node = _cfg.self->getSingleNode("VolumeDataId");
+ node = _cfg.self.getSingleNode("VolumeDataId");
ASTRA_CONFIG_CHECK(node, "FP_CUDA", "No VolumeDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pVolume = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("VolumeDataId");
// GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
// Detector supersampling factor
- m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+ m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
CC.markOptionParsed("DetectorSuperSampling");
// This isn't used yet, but passing it is not something to warn about
- node = _cfg.self->getSingleNode("ProjectorId");
+ node = _cfg.self.getSingleNode("ProjectorId");
if (node) {
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
CProjector2D *projector = CProjector2DManager::getSingleton().get(id);
if (!dynamic_cast<CCudaProjector2D*>(projector)) {
- cout << "Warning: non-CUDA Projector2D passed to FP_CUDA" << std::endl;
+ ASTRA_WARN("non-CUDA Projector2D passed to FP_CUDA");
}
- delete node;
}
CC.markNodeParsed("ProjectorId");
diff --git a/src/CudaForwardProjectionAlgorithm3D.cpp b/src/CudaForwardProjectionAlgorithm3D.cpp
index bb122e0..e29b5a9 100644
--- a/src/CudaForwardProjectionAlgorithm3D.cpp
+++ b/src/CudaForwardProjectionAlgorithm3D.cpp
@@ -40,6 +40,8 @@ $Id$
#include "astra/ParallelVecProjectionGeometry3D.h"
#include "astra/ConeVecProjectionGeometry3D.h"
+#include "astra/Logging.h"
+
#include "../cuda/3d/astra3d.h"
using namespace std;
@@ -76,40 +78,37 @@ bool CCudaForwardProjectionAlgorithm3D::initialize(const Config& _cfg)
ASTRA_ASSERT(_cfg.self);
ConfigStackCheck<CAlgorithm> CC("CudaForwardProjectionAlgorithm3D", this, _cfg);
- XMLNode* node;
+ XMLNode node;
int id;
// sinogram data
- node = _cfg.self->getSingleNode("ProjectionDataId");
+ node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "CudaForwardProjection3D", "No ProjectionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pProjections = dynamic_cast<CFloat32ProjectionData3DMemory*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("VolumeDataId");
+ node = _cfg.self.getSingleNode("VolumeDataId");
ASTRA_CONFIG_CHECK(node, "CudaForwardProjection3D", "No VolumeDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pVolume = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("VolumeDataId");
// optional: projector
- node = _cfg.self->getSingleNode("ProjectorId");
+ node = _cfg.self.getSingleNode("ProjectorId");
if (node) {
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pProjector = CProjector3DManager::getSingleton().get(id);
- ASTRA_DELETE(node);
} else {
m_pProjector = 0; // TODO: or manually construct default projector?
}
CC.markNodeParsed("ProjectorId");
// GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
CC.markOptionParsed("GPUindex");
- m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+ m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
CC.markOptionParsed("DetectorSuperSampling");
// success
@@ -265,7 +264,7 @@ void CCudaForwardProjectionAlgorithm3D::run(int)
for (int k = 0; k < 2; ++k) {
float fU, fV;
projgeom->projectPoint(fX[i], fY[j], fZ[k], a, fU, fV);
- fprintf(stderr, "%3d %c1,%c1,%c1 -> %12f %12f\n", a, i ? ' ' : '-', j ? ' ' : '-', k ? ' ' : '-', fU, fV);
+ ASTRA_DEBUG("%3d %c1,%c1,%c1 -> %12f %12f", a, i ? ' ' : '-', j ? ' ' : '-', k ? ' ' : '-', fU, fV);
}
}
#endif
diff --git a/src/CudaProjector2D.cpp b/src/CudaProjector2D.cpp
index 056ea3b..fa024c8 100644
--- a/src/CudaProjector2D.cpp
+++ b/src/CudaProjector2D.cpp
@@ -104,10 +104,10 @@ bool CCudaProjector2D::initialize(const Config& _cfg)
// TODO: Check the projection geometry is a supported type
- XMLNode* node = _cfg.self->getSingleNode("ProjectionKernel");
+ XMLNode node = _cfg.self.getSingleNode("ProjectionKernel");
m_projectionKernel = ker2d_default;
if (node) {
- std::string sProjKernel = node->getContent();
+ std::string sProjKernel = node.getContent();
if (sProjKernel == "default") {
@@ -115,7 +115,6 @@ bool CCudaProjector2D::initialize(const Config& _cfg)
return false;
}
}
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionKernel");
m_bIsInitialized = _check();
diff --git a/src/CudaProjector3D.cpp b/src/CudaProjector3D.cpp
index 2f4c799..41529a5 100644
--- a/src/CudaProjector3D.cpp
+++ b/src/CudaProjector3D.cpp
@@ -105,10 +105,10 @@ bool CCudaProjector3D::initialize(const Config& _cfg)
return false;
}
- XMLNode* node = _cfg.self->getSingleNode("ProjectionKernel");
+ XMLNode node = _cfg.self.getSingleNode("ProjectionKernel");
m_projectionKernel = ker3d_default;
if (node) {
- std::string sProjKernel = node->getContent();
+ std::string sProjKernel = node.getContent();
if (sProjKernel == "default") {
@@ -118,7 +118,6 @@ bool CCudaProjector3D::initialize(const Config& _cfg)
return false;
}
}
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionKernel");
m_bIsInitialized = _check();
diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp
index d3dedc5..db99d42 100644
--- a/src/CudaReconstructionAlgorithm2D.cpp
+++ b/src/CudaReconstructionAlgorithm2D.cpp
@@ -37,6 +37,8 @@ $Id$
#include "astra/FanFlatVecProjectionGeometry2D.h"
#include "astra/CudaProjector2D.h"
+#include "astra/Logging.h"
+
#include "../cuda/2d/algo.h"
#include <ctime>
@@ -94,91 +96,88 @@ bool CCudaReconstructionAlgorithm2D::initialize(const Config& _cfg)
}
// sinogram data
- XMLNode* node = _cfg.self->getSingleNode("ProjectionDataId");
+ XMLNode node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ProjectionDataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("ReconstructionDataId");
+ node = _cfg.self.getSingleNode("ReconstructionDataId");
ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ReconstructionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ReconstructionDataId");
// fixed mask
- if (_cfg.self->hasOption("ReconstructionMaskId")) {
+ if (_cfg.self.hasOption("ReconstructionMaskId")) {
m_bUseReconstructionMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("ReconstructionMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId"));
m_pReconstructionMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
ASTRA_CONFIG_CHECK(m_pReconstructionMask, "CudaReconstruction2D", "Invalid ReconstructionMaskId.");
}
CC.markOptionParsed("ReconstructionMaskId");
// fixed mask
- if (_cfg.self->hasOption("SinogramMaskId")) {
+ if (_cfg.self.hasOption("SinogramMaskId")) {
m_bUseSinogramMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
ASTRA_CONFIG_CHECK(m_pSinogramMask, "CudaReconstruction2D", "Invalid SinogramMaskId.");
}
CC.markOptionParsed("SinogramMaskId");
// Constraints - NEW
- if (_cfg.self->hasOption("MinConstraint")) {
+ if (_cfg.self.hasOption("MinConstraint")) {
m_bUseMinConstraint = true;
- m_fMinValue = _cfg.self->getOptionNumerical("MinConstraint", 0.0f);
+ m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f);
CC.markOptionParsed("MinConstraint");
} else {
// Constraint - OLD
- m_bUseMinConstraint = _cfg.self->getOptionBool("UseMinConstraint", false);
+ m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false);
CC.markOptionParsed("UseMinConstraint");
if (m_bUseMinConstraint) {
- m_fMinValue = _cfg.self->getOptionNumerical("MinConstraintValue", 0.0f);
+ m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f);
CC.markOptionParsed("MinConstraintValue");
}
}
- if (_cfg.self->hasOption("MaxConstraint")) {
+ if (_cfg.self.hasOption("MaxConstraint")) {
m_bUseMaxConstraint = true;
- m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraint", 255.0f);
+ m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f);
CC.markOptionParsed("MaxConstraint");
} else {
// Constraint - OLD
- m_bUseMaxConstraint = _cfg.self->getOptionBool("UseMaxConstraint", false);
+ m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false);
CC.markOptionParsed("UseMaxConstraint");
if (m_bUseMaxConstraint) {
- m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraintValue", 0.0f);
+ m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f);
CC.markOptionParsed("MaxConstraintValue");
}
}
// GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
// Detector supersampling factor
- m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+ m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
CC.markOptionParsed("DetectorSuperSampling");
// Pixel supersampling factor
- m_iPixelSuperSampling = (int)_cfg.self->getOptionNumerical("PixelSuperSampling", 1);
+ m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", 1);
CC.markOptionParsed("PixelSuperSampling");
// This isn't used yet, but passing it is not something to warn about
- node = _cfg.self->getSingleNode("ProjectorId");
+ node = _cfg.self.getSingleNode("ProjectorId");
if (node) {
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
CProjector2D *projector = CProjector2DManager::getSingleton().get(id);
if (!dynamic_cast<CCudaProjector2D*>(projector)) {
- cout << "Warning: non-CUDA Projector2D passed" << std::endl;
+ ASTRA_WARN("non-CUDA Projector2D passed");
}
- delete node;
}
CC.markNodeParsed("ProjectorId");
diff --git a/src/CudaRoiSelectAlgorithm.cpp b/src/CudaRoiSelectAlgorithm.cpp
index bfccb3a..7635c69 100644
--- a/src/CudaRoiSelectAlgorithm.cpp
+++ b/src/CudaRoiSelectAlgorithm.cpp
@@ -66,22 +66,21 @@ bool CCudaRoiSelectAlgorithm::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("CudaDartMaskAlgorithm", this, _cfg);
// reconstruction data
- XMLNode* node = _cfg.self->getSingleNode("DataId");
+ XMLNode node = _cfg.self.getSingleNode("DataId");
ASTRA_CONFIG_CHECK(node, "CudaRoiSelect", "No DataId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pData = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("DataId");
// Option: GPU number
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
CC.markOptionParsed("GPUindex");
- if (!_cfg.self->hasOption("GPUindex"))
+ if (!_cfg.self.hasOption("GPUindex"))
CC.markOptionParsed("GPUIndex");
// Option: Radius
- m_fRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 0.0f);
+ m_fRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 0.0f);
CC.markOptionParsed("Radius");
_check();
diff --git a/src/CudaSartAlgorithm.cpp b/src/CudaSartAlgorithm.cpp
index 8e22c59..8c0c6d7 100644
--- a/src/CudaSartAlgorithm.cpp
+++ b/src/CudaSartAlgorithm.cpp
@@ -74,7 +74,7 @@ bool CCudaSartAlgorithm::initialize(const Config& _cfg)
// projection order
int projectionCount = m_pSinogram->getGeometry()->getProjectionAngleCount();
int* projectionOrder = NULL;
- string projOrder = _cfg.self->getOption("ProjectionOrder", "random");
+ string projOrder = _cfg.self.getOption("ProjectionOrder", "random");
CC.markOptionParsed("ProjectionOrder");
if (projOrder == "sequential") {
projectionOrder = new int[projectionCount];
@@ -97,7 +97,7 @@ bool CCudaSartAlgorithm::initialize(const Config& _cfg)
sart->setProjectionOrder(projectionOrder, projectionCount);
delete[] projectionOrder;
} else if (projOrder == "custom") {
- vector<float32> projOrderList = _cfg.self->getOptionNumericalArray("ProjectionOrderList");
+ vector<float32> projOrderList = _cfg.self.getOptionNumericalArray("ProjectionOrderList");
projectionOrder = new int[projOrderList.size()];
for (int i = 0; i < projOrderList.size(); i++) {
projectionOrder[i] = static_cast<int>(projOrderList[i]);
diff --git a/src/CudaSirtAlgorithm.cpp b/src/CudaSirtAlgorithm.cpp
index f6eb79a..d424915 100644
--- a/src/CudaSirtAlgorithm.cpp
+++ b/src/CudaSirtAlgorithm.cpp
@@ -76,13 +76,13 @@ bool CCudaSirtAlgorithm::initialize(const Config& _cfg)
return false;
// min/max masks
- if (_cfg.self->hasOption("MinMaskId")) {
- int id = boost::lexical_cast<int>(_cfg.self->getOption("MinMaskId"));
+ if (_cfg.self.hasOption("MinMaskId")) {
+ int id = boost::lexical_cast<int>(_cfg.self.getOption("MinMaskId"));
m_pMinMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
}
CC.markOptionParsed("MinMaskId");
- if (_cfg.self->hasOption("MaxMaskId")) {
- int id = boost::lexical_cast<int>(_cfg.self->getOption("MaxMaskId"));
+ if (_cfg.self.hasOption("MaxMaskId")) {
+ int id = boost::lexical_cast<int>(_cfg.self.getOption("MaxMaskId"));
m_pMaxMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
}
CC.markOptionParsed("MaxMaskId");
diff --git a/src/CudaSirtAlgorithm3D.cpp b/src/CudaSirtAlgorithm3D.cpp
index da83c7e..5ad131b 100644
--- a/src/CudaSirtAlgorithm3D.cpp
+++ b/src/CudaSirtAlgorithm3D.cpp
@@ -107,11 +107,11 @@ bool CCudaSirtAlgorithm3D::initialize(const Config& _cfg)
return false;
}
- m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+ m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
CC.markOptionParsed("GPUindex");
- m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+ m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
CC.markOptionParsed("DetectorSuperSampling");
- m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+ m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
CC.markOptionParsed("VoxelSuperSampling");
m_pSirt = new AstraSIRT3d();
diff --git a/src/FanFlatProjectionGeometry2D.cpp b/src/FanFlatProjectionGeometry2D.cpp
index 9851d40..91b9578 100644
--- a/src/FanFlatProjectionGeometry2D.cpp
+++ b/src/FanFlatProjectionGeometry2D.cpp
@@ -134,17 +134,15 @@ bool CFanFlatProjectionGeometry2D::initialize(const Config& _cfg)
CProjectionGeometry2D::initialize(_cfg);
// Required: DistanceOriginDetector
- XMLNode* node = _cfg.self->getSingleNode("DistanceOriginDetector");
+ XMLNode node = _cfg.self.getSingleNode("DistanceOriginDetector");
ASTRA_CONFIG_CHECK(node, "FanFlatProjectionGeometry2D", "No DistanceOriginDetector tag specified.");
- m_fOriginDetectorDistance = boost::lexical_cast<float32>(node->getContent());
- ASTRA_DELETE(node);
+ m_fOriginDetectorDistance = boost::lexical_cast<float32>(node.getContent());
CC.markNodeParsed("DistanceOriginDetector");
// Required: DetectorOriginSource
- node = _cfg.self->getSingleNode("DistanceOriginSource");
+ node = _cfg.self.getSingleNode("DistanceOriginSource");
ASTRA_CONFIG_CHECK(node, "FanFlatProjectionGeometry2D", "No DistanceOriginSource tag specified.");
- m_fOriginSourceDistance = boost::lexical_cast<float32>(node->getContent());
- ASTRA_DELETE(node);
+ m_fOriginSourceDistance = boost::lexical_cast<float32>(node.getContent());
CC.markNodeParsed("DistanceOriginSource");
// success
@@ -209,12 +207,12 @@ Config* CFanFlatProjectionGeometry2D::getConfiguration() const
{
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry2D");
- cfg->self->addAttribute("type", "fanflat");
- cfg->self->addChildNode("DetectorCount", getDetectorCount());
- cfg->self->addChildNode("DetectorWidth", getDetectorWidth());
- cfg->self->addChildNode("DistanceOriginSource", getOriginSourceDistance());
- cfg->self->addChildNode("DistanceOriginDetector", getOriginDetectorDistance());
- cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+ cfg->self.addAttribute("type", "fanflat");
+ cfg->self.addChildNode("DetectorCount", getDetectorCount());
+ cfg->self.addChildNode("DetectorWidth", getDetectorWidth());
+ cfg->self.addChildNode("DistanceOriginSource", getOriginSourceDistance());
+ cfg->self.addChildNode("DistanceOriginDetector", getOriginDetectorDistance());
+ cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
return cfg;
}
diff --git a/src/FanFlatVecProjectionGeometry2D.cpp b/src/FanFlatVecProjectionGeometry2D.cpp
index 9c7b596..4104379 100644
--- a/src/FanFlatVecProjectionGeometry2D.cpp
+++ b/src/FanFlatVecProjectionGeometry2D.cpp
@@ -116,25 +116,23 @@ bool CFanFlatVecProjectionGeometry2D::initialize(const Config& _cfg)
ASTRA_ASSERT(_cfg.self);
ConfigStackCheck<CProjectionGeometry2D> CC("FanFlatVecProjectionGeometry2D", this, _cfg);
- XMLNode* node;
+ XMLNode node;
// TODO: Fix up class hierarchy... this class doesn't fit very well.
// initialization of parent class
//CProjectionGeometry2D::initialize(_cfg);
// Required: DetectorCount
- node = _cfg.self->getSingleNode("DetectorCount");
+ node = _cfg.self.getSingleNode("DetectorCount");
ASTRA_CONFIG_CHECK(node, "FanFlatVecProjectionGeometry3D", "No DetectorRowCount tag specified.");
- m_iDetectorCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iDetectorCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("DetectorCount");
// Required: Vectors
- node = _cfg.self->getSingleNode("Vectors");
+ node = _cfg.self.getSingleNode("Vectors");
ASTRA_CONFIG_CHECK(node, "FanFlatVecProjectionGeometry3D", "No Vectors tag specified.");
- vector<float32> data = node->getContentNumericalArray();
+ vector<float32> data = node.getContentNumericalArray();
CC.markNodeParsed("Vectors");
- ASTRA_DELETE(node);
ASTRA_CONFIG_CHECK(data.size() % 6 == 0, "FanFlatVecProjectionGeometry3D", "Vectors doesn't consist of 6-tuples.");
m_iProjectionAngleCount = data.size() / 6;
m_pProjectionAngles = new SFanProjection[m_iProjectionAngleCount];
@@ -232,8 +230,8 @@ Config* CFanFlatVecProjectionGeometry2D::getConfiguration() const
{
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry2D");
- cfg->self->addAttribute("type", "fanflat_vec");
- cfg->self->addChildNode("DetectorCount", getDetectorCount());
+ cfg->self.addAttribute("type", "fanflat_vec");
+ cfg->self.addChildNode("DetectorCount", getDetectorCount());
std::string vectors = "";
for (int i = 0; i < m_iProjectionAngleCount; ++i) {
SFanProjection& p = m_pProjectionAngles[i];
@@ -245,7 +243,7 @@ Config* CFanFlatVecProjectionGeometry2D::getConfiguration() const
vectors += boost::lexical_cast<string>(p.fDetUY);
if (i < m_iProjectionAngleCount-1) vectors += ';';
}
- cfg->self->addChildNode("Vectors", vectors);
+ cfg->self.addChildNode("Vectors", vectors);
return cfg;
}
//----------------------------------------------------------------------------------------
diff --git a/src/FilteredBackProjectionAlgorithm.cpp b/src/FilteredBackProjectionAlgorithm.cpp
index 50cf939..f494d22 100644
--- a/src/FilteredBackProjectionAlgorithm.cpp
+++ b/src/FilteredBackProjectionAlgorithm.cpp
@@ -39,6 +39,8 @@ $Id$
#include "astra/Fourier.h"
#include "astra/DataProjector.h"
+#include "astra/Logging.h"
+
using namespace std;
namespace astra {
@@ -92,30 +94,27 @@ bool CFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
ASTRA_ASSERT(_cfg.self);
// projector
- XMLNode* node = _cfg.self->getSingleNode("ProjectorId");
+ XMLNode node = _cfg.self.getSingleNode("ProjectorId");
ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ProjectorId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pProjector = CProjector2DManager::getSingleton().get(id);
- ASTRA_DELETE(node);
// sinogram data
- node = _cfg.self->getSingleNode("ProjectionDataId");
+ node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ProjectionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
// volume data
- node = _cfg.self->getSingleNode("ReconstructionDataId");
+ node = _cfg.self.getSingleNode("ReconstructionDataId");
ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ReconstructionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
- node = _cfg.self->getSingleNode("ProjectionIndex");
+ node = _cfg.self.getSingleNode("ProjectionIndex");
if (node)
{
- vector<float32> projectionIndex = node->getContentNumericalArray();
+ vector<float32> projectionIndex = node.getContentNumericalArray();
int angleCount = projectionIndex.size();
int detectorCount = m_pProjector->getProjectionGeometry()->getDetectorCount();
@@ -133,7 +132,7 @@ bool CFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
for (int i = 0; i < angleCount; i ++) {
if (projectionIndex[i] > m_pProjector->getProjectionGeometry()->getProjectionAngleCount() -1 )
{
- cout << "Invalid Projection Index" << endl;
+ ASTRA_ERROR("Invalid Projection Index");
return false;
} else {
int orgIndex = (int)projectionIndex[i];
@@ -152,7 +151,6 @@ bool CFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
m_pProjector = new CParallelBeamLineKernelProjector2D(pg,m_pReconstruction->getGeometry());
m_pSinogram = new CFloat32ProjectionData2D(pg, sinogramData2D);
}
- ASTRA_DELETE(node);
// TODO: check that the angles are linearly spaced between 0 and pi
diff --git a/src/Float32ProjectionData2D.cpp b/src/Float32ProjectionData2D.cpp
index 85e0cdd..f7f83e3 100644
--- a/src/Float32ProjectionData2D.cpp
+++ b/src/Float32ProjectionData2D.cpp
@@ -75,6 +75,16 @@ CFloat32ProjectionData2D::CFloat32ProjectionData2D(const CFloat32ProjectionData2
m_bInitialized = true;
}
+//----------------------------------------------------------------------------------------
+// Create an instance of the CFloat32ProjectionData2D class with pre-allocated data
+CFloat32ProjectionData2D::CFloat32ProjectionData2D(CProjectionGeometry2D* _pGeometry, CFloat32CustomMemory* _pCustomMemory)
+{
+ m_bInitialized = false;
+ m_bInitialized = initialize(_pGeometry, _pCustomMemory);
+}
+
+
+
// Assignment operator
CFloat32ProjectionData2D& CFloat32ProjectionData2D::operator=(const CFloat32ProjectionData2D& _other)
@@ -119,6 +129,15 @@ bool CFloat32ProjectionData2D::initialize(CProjectionGeometry2D* _pGeometry, flo
}
//----------------------------------------------------------------------------------------
+// Initialization
+bool CFloat32ProjectionData2D::initialize(CProjectionGeometry2D* _pGeometry, CFloat32CustomMemory* _pCustomMemory)
+{
+ m_pGeometry = _pGeometry->clone();
+ m_bInitialized = _initialize(m_pGeometry->getDetectorCount(), m_pGeometry->getProjectionAngleCount(), _pCustomMemory);
+ return m_bInitialized;
+}
+
+//----------------------------------------------------------------------------------------
// Destructor
CFloat32ProjectionData2D::~CFloat32ProjectionData2D()
{
diff --git a/src/Float32ProjectionData3D.cpp b/src/Float32ProjectionData3D.cpp
index d039c83..2bd0447 100644
--- a/src/Float32ProjectionData3D.cpp
+++ b/src/Float32ProjectionData3D.cpp
@@ -270,4 +270,13 @@ CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator-=(const float32& _f
return *this;
}
+void CFloat32ProjectionData3D::changeGeometry(CProjectionGeometry3D* _pGeometry)
+{
+ if (!m_bInitialized) return;
+
+ delete m_pGeometry;
+ m_pGeometry = _pGeometry->clone();
+}
+
+
} // end namespace astra
diff --git a/src/Float32VolumeData2D.cpp b/src/Float32VolumeData2D.cpp
index e11c4e4..c903c66 100644
--- a/src/Float32VolumeData2D.cpp
+++ b/src/Float32VolumeData2D.cpp
@@ -72,6 +72,15 @@ CFloat32VolumeData2D::CFloat32VolumeData2D(const CFloat32VolumeData2D& _other) :
m_bInitialized = true;
}
+//----------------------------------------------------------------------------------------
+// Create an instance of the CFloat32VolumeData2D class with pre-allocated data
+CFloat32VolumeData2D::CFloat32VolumeData2D(CVolumeGeometry2D* _pGeometry, CFloat32CustomMemory* _pCustomMemory)
+{
+ m_bInitialized = false;
+ m_bInitialized = initialize(_pGeometry, _pCustomMemory);
+}
+
+
// Assignment operator
CFloat32VolumeData2D& CFloat32VolumeData2D::operator=(const CFloat32VolumeData2D& _other)
@@ -122,6 +131,17 @@ bool CFloat32VolumeData2D::initialize(CVolumeGeometry2D* _pGeometry, float32 _fS
m_bInitialized = _initialize(m_pGeometry->getGridColCount(), m_pGeometry->getGridRowCount(), _fScalar);
return m_bInitialized;
}
+
+//----------------------------------------------------------------------------------------
+// Initialization
+bool CFloat32VolumeData2D::initialize(CVolumeGeometry2D* _pGeometry, CFloat32CustomMemory* _pCustomMemory)
+{
+ m_pGeometry = _pGeometry->clone();
+ m_bInitialized = _initialize(m_pGeometry->getGridColCount(), m_pGeometry->getGridRowCount(), _pCustomMemory);
+ return m_bInitialized;
+}
+
+
//----------------------------------------------------------------------------------------
void CFloat32VolumeData2D::changeGeometry(CVolumeGeometry2D* _pGeometry)
{
diff --git a/src/Float32VolumeData3D.cpp b/src/Float32VolumeData3D.cpp
index ce00a10..bd78001 100644
--- a/src/Float32VolumeData3D.cpp
+++ b/src/Float32VolumeData3D.cpp
@@ -266,4 +266,13 @@ CFloat32VolumeData3D& CFloat32VolumeData3D::operator-=(const float32& _fScalar)
return *this;
}
+void CFloat32VolumeData3D::changeGeometry(CVolumeGeometry3D* _pGeometry)
+{
+ if (!m_bInitialized) return;
+
+ delete m_pGeometry;
+ m_pGeometry = _pGeometry->clone();
+}
+
+
} // end namespace astra
diff --git a/src/ForwardProjectionAlgorithm.cpp b/src/ForwardProjectionAlgorithm.cpp
index b530491..f356824 100644
--- a/src/ForwardProjectionAlgorithm.cpp
+++ b/src/ForwardProjectionAlgorithm.cpp
@@ -126,37 +126,34 @@ bool CForwardProjectionAlgorithm::initialize(const Config& _cfg)
}
// projector
- XMLNode* node = _cfg.self->getSingleNode("ProjectorId");
+ XMLNode node = _cfg.self.getSingleNode("ProjectorId");
ASTRA_CONFIG_CHECK(node, "ForwardProjection", "No ProjectorId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pProjector = CProjector2DManager::getSingleton().get(id);
- ASTRA_DELETE(node);
// sinogram data
- node = _cfg.self->getSingleNode("ProjectionDataId");
+ node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "ForwardProjection", "No ProjectionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
// volume data
- node = _cfg.self->getSingleNode("VolumeDataId");
+ node = _cfg.self.getSingleNode("VolumeDataId");
ASTRA_CONFIG_CHECK(node, "ForwardProjection", "No VolumeDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pVolume = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
// volume mask
- if (_cfg.self->hasOption("VolumeMaskId")) {
+ if (_cfg.self.hasOption("VolumeMaskId")) {
m_bUseVolumeMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("VolumeMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("VolumeMaskId"));
m_pVolumeMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
}
// sino mask
- if (_cfg.self->hasOption("SinogramMaskId")) {
+ if (_cfg.self.hasOption("SinogramMaskId")) {
m_bUseSinogramMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
}
diff --git a/src/Logger.cpp b/src/Logger.cpp
deleted file mode 100644
index 148e18c..0000000
--- a/src/Logger.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
------------------------------------------------------------------------
-Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
- 2014-2015, CWI, Amsterdam
-
-Contact: astra@uantwerpen.be
-Website: http://sf.net/projects/astra-toolbox
-
-This file is part of the ASTRA Toolbox.
-
-
-The ASTRA Toolbox is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-The ASTRA Toolbox is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
-
------------------------------------------------------------------------
-$Id$
-*/
-
-#include <astra/Logger.h>
-
-using namespace astra;
-
-const char * g_loggerFileName = "astra_logger.txt";
-
-void CLogger::_assureIsInitialized()
-{
- if(!m_bInitialized)
- {
- m_pOutFile = fopen(g_loggerFileName, "r");
- if(m_pOutFile != NULL)
- {
- // file exists, users wants to log
- fclose(m_pOutFile);
- m_pOutFile = fopen(g_loggerFileName, "w");
- }
-
- m_bInitialized = true;
- }
-}
-
-void CLogger::writeLine(const char * _text)
-{
- _assureIsInitialized();
-
- if(m_pOutFile != NULL)
- {
- fprintf(m_pOutFile, "%s\n", _text);
- fflush(m_pOutFile);
- }
-}
-
-void CLogger::writeTerminalCUDAError(const char * _fileName, int _iLine, const char * _errString)
-{
- char buffer[256];
-
- sprintf(buffer, "Cuda error in file '%s' in line %i : %s.", _fileName, _iLine, _errString);
-
- writeLine(buffer);
-}
-
-CLogger::CLogger()
-{
- ;
-}
-
-FILE * CLogger::m_pOutFile = NULL;
-bool CLogger::m_bInitialized = false;
diff --git a/src/Logging.cpp b/src/Logging.cpp
new file mode 100644
index 0000000..8290ca0
--- /dev/null
+++ b/src/Logging.cpp
@@ -0,0 +1,184 @@
+/*
+-----------------------------------------------------------------------
+Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
+ 2014-2015, CWI, Amsterdam
+
+Contact: astra@uantwerpen.be
+Website: http://sf.net/projects/astra-toolbox
+
+This file is part of the ASTRA Toolbox.
+
+
+The ASTRA Toolbox is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+The ASTRA Toolbox is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+
+-----------------------------------------------------------------------
+$Id$
+*/
+
+#define CLOG_MAIN
+#include <astra/clog.h>
+
+#include <astra/Logging.h>
+
+#include <cstdio>
+
+using namespace astra;
+
+void CLogger::enableScreen()
+{
+ m_bEnabledScreen = true;
+}
+
+void CLogger::enableFile()
+{
+ m_bEnabledFile = true;
+}
+
+void CLogger::enable()
+{
+ enableScreen();
+ enableFile();
+}
+
+void CLogger::disableScreen()
+{
+ m_bEnabledScreen = false;
+}
+
+void CLogger::disableFile()
+{
+ m_bEnabledFile = false;
+}
+
+void CLogger::disable()
+{
+ disableScreen();
+ disableFile();
+}
+
+void CLogger::debug(const char *sfile, int sline, const char *fmt, ...)
+{
+ _assureIsInitialized();
+ va_list ap;
+ va_start(ap, fmt);
+ if(m_bEnabledScreen) clog_debug(sfile,sline,0,fmt,ap);
+ if(m_bEnabledFile && m_bFileProvided) clog_debug(sfile,sline,1,fmt,ap);
+}
+
+void CLogger::info(const char *sfile, int sline, const char *fmt, ...)
+{
+ _assureIsInitialized();
+ va_list ap;
+ va_start(ap, fmt);
+ if(m_bEnabledScreen) clog_info(sfile,sline,0,fmt,ap);
+ if(m_bEnabledFile && m_bFileProvided) clog_info(sfile,sline,1,fmt,ap);
+}
+
+void CLogger::warn(const char *sfile, int sline, const char *fmt, ...)
+{
+ _assureIsInitialized();
+ va_list ap;
+ va_start(ap, fmt);
+ if(m_bEnabledScreen) clog_warn(sfile,sline,0,fmt,ap);
+ if(m_bEnabledFile && m_bFileProvided) clog_warn(sfile,sline,1,fmt,ap);
+}
+
+void CLogger::error(const char *sfile, int sline, const char *fmt, ...)
+{
+ _assureIsInitialized();
+ va_list ap;
+ va_start(ap, fmt);
+ if(m_bEnabledScreen) clog_error(sfile,sline,0,fmt,ap);
+ if(m_bEnabledFile && m_bFileProvided) clog_error(sfile,sline,1,fmt,ap);
+}
+
+void CLogger::_setLevel(int id, log_level m_eLevel)
+{
+ switch(m_eLevel){
+ case LOG_DEBUG:
+ clog_set_level(id,CLOG_DEBUG);
+ break;
+ case LOG_INFO:
+ clog_set_level(id,CLOG_INFO);
+ break;
+ case LOG_WARN:
+ clog_set_level(id,CLOG_WARN);
+ break;
+ case LOG_ERROR:
+ clog_set_level(id,CLOG_ERROR);
+ break;
+ }
+}
+
+void CLogger::setOutputScreen(int fd, log_level m_eLevel)
+{
+ _assureIsInitialized();
+ if(fd==1||fd==2){
+ clog_set_fd(0, fd);
+ }else{
+ error(__FILE__,__LINE__,"Invalid file descriptor");
+ }
+ _setLevel(0,m_eLevel);
+}
+
+void CLogger::setOutputFile(const char *filename, log_level m_eLevel)
+{
+ if(m_bFileProvided){
+ clog_free(1);
+ m_bFileProvided=false;
+ }
+ if(!clog_init_path(1,filename)){
+ m_bFileProvided=true;
+ _setLevel(1,m_eLevel);
+ }
+}
+
+void CLogger::_assureIsInitialized()
+{
+ if(!m_bInitialized)
+ {
+ clog_init_fd(0, 2);
+ clog_set_level(0, CLOG_INFO);
+ clog_set_fmt(0, "%l: %m\n");
+ m_bInitialized = true;
+ }
+}
+
+void CLogger::setFormatFile(const char *fmt)
+{
+ if(m_bFileProvided){
+ clog_set_fmt(1,fmt);
+ }else{
+ error(__FILE__,__LINE__,"No log file specified");
+ }
+}
+void CLogger::setFormatScreen(const char *fmt)
+{
+ clog_set_fmt(0,fmt);
+}
+
+CLogger::CLogger()
+{
+ ;
+}
+
+bool CLogger::setCallbackScreen(void (*cb)(const char *msg, size_t len)){
+ _assureIsInitialized();
+ return clog_set_cb(0,cb)==0;
+}
+
+bool CLogger::m_bEnabledScreen = true;
+bool CLogger::m_bEnabledFile = true;
+bool CLogger::m_bFileProvided = false;
+bool CLogger::m_bInitialized = false;
diff --git a/src/ParallelBeamBlobKernelProjector2D.cpp b/src/ParallelBeamBlobKernelProjector2D.cpp
index d030576..1e6312f 100644
--- a/src/ParallelBeamBlobKernelProjector2D.cpp
+++ b/src/ParallelBeamBlobKernelProjector2D.cpp
@@ -128,34 +128,33 @@ bool CParallelBeamBlobKernelProjector2D::initialize(const Config& _cfg)
}
// required: Kernel
- XMLNode* node = _cfg.self->getSingleNode("Kernel");
+ XMLNode node = _cfg.self.getSingleNode("Kernel");
ASTRA_CONFIG_CHECK(node, "BlobProjector", "No Kernel tag specified.");
{
// Required: KernelSize
- XMLNode* node2 = node->getSingleNode("KernelSize");
+ XMLNode node2 = node.getSingleNode("KernelSize");
ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/KernelSize tag specified.");
- m_fBlobSize = boost::lexical_cast<float32>(node2->getContent());
+ m_fBlobSize = boost::lexical_cast<float32>(node2.getContent());
// Required: SampleRate
- node2 = node->getSingleNode("SampleRate");
+ node2 = node.getSingleNode("SampleRate");
ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/SampleRate tag specified.");
- m_fBlobSampleRate = boost::lexical_cast<float32>(node2->getContent());
+ m_fBlobSampleRate = boost::lexical_cast<float32>(node2.getContent());
// Required: SampleCount
- node2 = node->getSingleNode("SampleCount");
+ node2 = node.getSingleNode("SampleCount");
ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/SampleCount tag specified.");
- m_iBlobSampleCount = boost::lexical_cast<int>(node2->getContent());
+ m_iBlobSampleCount = boost::lexical_cast<int>(node2.getContent());
// Required: KernelValues
- node2 = node->getSingleNode("KernelValues");
+ node2 = node.getSingleNode("KernelValues");
ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/KernelValues tag specified.");
- vector<float32> values = node2->getContentNumericalArray();
+ vector<float32> values = node2.getContentNumericalArray();
ASTRA_CONFIG_CHECK(values.size() == (unsigned int)m_iBlobSampleCount, "BlobProjector", "Number of specified values doesn't match SampleCount.");
m_pfBlobValues = new float32[m_iBlobSampleCount];
for (int i = 0; i < m_iBlobSampleCount; i++) {
m_pfBlobValues[i] = values[i];
}
-
}
// success
diff --git a/src/ParallelProjectionGeometry2D.cpp b/src/ParallelProjectionGeometry2D.cpp
index 42ed0a0..8632b17 100644
--- a/src/ParallelProjectionGeometry2D.cpp
+++ b/src/ParallelProjectionGeometry2D.cpp
@@ -175,10 +175,10 @@ Config* CParallelProjectionGeometry2D::getConfiguration() const
{
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry2D");
- cfg->self->addAttribute("type", "parallel");
- cfg->self->addChildNode("DetectorCount", getDetectorCount());
- cfg->self->addChildNode("DetectorWidth", getDetectorWidth());
- cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+ cfg->self.addAttribute("type", "parallel");
+ cfg->self.addChildNode("DetectorCount", getDetectorCount());
+ cfg->self.addChildNode("DetectorWidth", getDetectorWidth());
+ cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
return cfg;
}
diff --git a/src/ParallelProjectionGeometry3D.cpp b/src/ParallelProjectionGeometry3D.cpp
index eb200f9..1c87157 100644
--- a/src/ParallelProjectionGeometry3D.cpp
+++ b/src/ParallelProjectionGeometry3D.cpp
@@ -164,12 +164,12 @@ Config* CParallelProjectionGeometry3D::getConfiguration() const
{
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry3D");
- cfg->self->addAttribute("type", "parallel3d");
- cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
- cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
- cfg->self->addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
- cfg->self->addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
- cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+ cfg->self.addAttribute("type", "parallel3d");
+ cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+ cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
+ cfg->self.addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
+ cfg->self.addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
+ cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
return cfg;
}
//----------------------------------------------------------------------------------------
diff --git a/src/ParallelVecProjectionGeometry3D.cpp b/src/ParallelVecProjectionGeometry3D.cpp
index dc325e9..ffad6d0 100644
--- a/src/ParallelVecProjectionGeometry3D.cpp
+++ b/src/ParallelVecProjectionGeometry3D.cpp
@@ -73,33 +73,30 @@ bool CParallelVecProjectionGeometry3D::initialize(const Config& _cfg)
ASTRA_ASSERT(_cfg.self);
ConfigStackCheck<CProjectionGeometry3D> CC("ParallelVecProjectionGeometry3D", this, _cfg);
- XMLNode* node;
+ XMLNode node;
// TODO: Fix up class hierarchy... this class doesn't fit very well.
// initialization of parent class
//CProjectionGeometry3D::initialize(_cfg);
// Required: DetectorRowCount
- node = _cfg.self->getSingleNode("DetectorRowCount");
+ node = _cfg.self.getSingleNode("DetectorRowCount");
ASTRA_CONFIG_CHECK(node, "ParallelVecProjectionGeometry3D", "No DetectorRowCount tag specified.");
- m_iDetectorRowCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iDetectorRowCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("DetectorRowCount");
// Required: DetectorCount
- node = _cfg.self->getSingleNode("DetectorColCount");
+ node = _cfg.self.getSingleNode("DetectorColCount");
ASTRA_CONFIG_CHECK(node, "", "No DetectorColCount tag specified.");
- m_iDetectorColCount = boost::lexical_cast<int>(node->getContent());
+ m_iDetectorColCount = boost::lexical_cast<int>(node.getContent());
m_iDetectorTotCount = m_iDetectorRowCount * m_iDetectorColCount;
- ASTRA_DELETE(node);
CC.markNodeParsed("DetectorColCount");
// Required: Vectors
- node = _cfg.self->getSingleNode("Vectors");
+ node = _cfg.self.getSingleNode("Vectors");
ASTRA_CONFIG_CHECK(node, "ParallelVecProjectionGeometry3D", "No Vectors tag specified.");
- vector<double> data = node->getContentNumericalArrayDouble();
+ vector<double> data = node.getContentNumericalArrayDouble();
CC.markNodeParsed("Vectors");
- ASTRA_DELETE(node);
ASTRA_CONFIG_CHECK(data.size() % 12 == 0, "ParallelVecProjectionGeometry3D", "Vectors doesn't consist of 12-tuples.");
m_iProjectionAngleCount = data.size() / 12;
m_pProjectionAngles = new SPar3DProjection[m_iProjectionAngleCount];
@@ -208,9 +205,9 @@ Config* CParallelVecProjectionGeometry3D::getConfiguration() const
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry3D");
- cfg->self->addAttribute("type", "parallel3d_vec");
- cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
- cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
+ cfg->self.addAttribute("type", "parallel3d_vec");
+ cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+ cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
std::string vectors = "";
for (int i = 0; i < m_iProjectionAngleCount; ++i) {
@@ -229,7 +226,7 @@ Config* CParallelVecProjectionGeometry3D::getConfiguration() const
vectors += boost::lexical_cast<string>(p.fDetVZ);
if (i < m_iProjectionAngleCount-1) vectors += ';';
}
- cfg->self->addChildNode("Vectors", vectors);
+ cfg->self.addChildNode("Vectors", vectors);
return cfg;
}
diff --git a/src/ProjectionGeometry2D.cpp b/src/ProjectionGeometry2D.cpp
index a51d86b..da93b9c 100644
--- a/src/ProjectionGeometry2D.cpp
+++ b/src/ProjectionGeometry2D.cpp
@@ -121,24 +121,21 @@ bool CProjectionGeometry2D::initialize(const Config& _cfg)
}
// Required: DetectorWidth
- XMLNode* node = _cfg.self->getSingleNode("DetectorWidth");
+ XMLNode node = _cfg.self.getSingleNode("DetectorWidth");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry2D", "No DetectorWidth tag specified.");
- m_fDetectorWidth = boost::lexical_cast<float32>(node->getContent());
- ASTRA_DELETE(node);
+ m_fDetectorWidth = boost::lexical_cast<float32>(node.getContent());
CC.markNodeParsed("DetectorWidth");
// Required: DetectorCount
- node = _cfg.self->getSingleNode("DetectorCount");
+ node = _cfg.self.getSingleNode("DetectorCount");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry2D", "No DetectorCount tag specified.");
- m_iDetectorCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iDetectorCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("DetectorCount");
// Required: ProjectionAngles
- node = _cfg.self->getSingleNode("ProjectionAngles");
+ node = _cfg.self.getSingleNode("ProjectionAngles");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry2D", "No ProjectionAngles tag specified.");
- vector<float32> angles = node->getContentNumericalArray();
- delete node;
+ vector<float32> angles = node.getContentNumericalArray();
m_iProjectionAngleCount = angles.size();
ASTRA_CONFIG_CHECK(m_iProjectionAngleCount > 0, "ProjectionGeometry2D", "Not enough ProjectionAngles specified.");
m_pfProjectionAngles = new float32[m_iProjectionAngleCount];
diff --git a/src/ProjectionGeometry3D.cpp b/src/ProjectionGeometry3D.cpp
index 5b77767..ef0246c 100644
--- a/src/ProjectionGeometry3D.cpp
+++ b/src/ProjectionGeometry3D.cpp
@@ -149,38 +149,34 @@ bool CProjectionGeometry3D::initialize(const Config& _cfg)
ASTRA_ASSERT(_cfg.self);
// Required: DetectorWidth
- XMLNode* node = _cfg.self->getSingleNode("DetectorSpacingX");
+ XMLNode node = _cfg.self.getSingleNode("DetectorSpacingX");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorSpacingX tag specified.");
- m_fDetectorSpacingX = boost::lexical_cast<float32>(node->getContent());
- ASTRA_DELETE(node);
+ m_fDetectorSpacingX = boost::lexical_cast<float32>(node.getContent());
CC.markNodeParsed("DetectorSpacingX");
// Required: DetectorHeight
- node = _cfg.self->getSingleNode("DetectorSpacingY");
+ node = _cfg.self.getSingleNode("DetectorSpacingY");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorSpacingY tag specified.");
- m_fDetectorSpacingY = boost::lexical_cast<float32>(node->getContent());
- ASTRA_DELETE(node);
+ m_fDetectorSpacingY = boost::lexical_cast<float32>(node.getContent());
CC.markNodeParsed("DetectorSpacingY");
// Required: DetectorRowCount
- node = _cfg.self->getSingleNode("DetectorRowCount");
+ node = _cfg.self.getSingleNode("DetectorRowCount");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorRowCount tag specified.");
- m_iDetectorRowCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iDetectorRowCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("DetectorRowCount");
// Required: DetectorCount
- node = _cfg.self->getSingleNode("DetectorColCount");
+ node = _cfg.self.getSingleNode("DetectorColCount");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorColCount tag specified.");
- m_iDetectorColCount = boost::lexical_cast<int>(node->getContent());
+ m_iDetectorColCount = boost::lexical_cast<int>(node.getContent());
m_iDetectorTotCount = m_iDetectorRowCount * m_iDetectorColCount;
- ASTRA_DELETE(node);
CC.markNodeParsed("DetectorColCount");
// Required: ProjectionAngles
- node = _cfg.self->getSingleNode("ProjectionAngles");
+ node = _cfg.self.getSingleNode("ProjectionAngles");
ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No ProjectionAngles tag specified.");
- vector<float32> angles = node->getContentNumericalArray();
+ vector<float32> angles = node.getContentNumericalArray();
m_iProjectionAngleCount = angles.size();
ASTRA_CONFIG_CHECK(m_iProjectionAngleCount > 0, "ProjectionGeometry3D", "Not enough ProjectionAngles specified.");
m_pfProjectionAngles = new float32[m_iProjectionAngleCount];
@@ -188,7 +184,6 @@ bool CProjectionGeometry3D::initialize(const Config& _cfg)
m_pfProjectionAngles[i] = angles[i];
}
CC.markNodeParsed("ProjectionAngles");
- ASTRA_DELETE(node);
// Interface class, so don't return true
return false;
diff --git a/src/Projector2D.cpp b/src/Projector2D.cpp
index b0ace92..c8743b5 100644
--- a/src/Projector2D.cpp
+++ b/src/Projector2D.cpp
@@ -115,12 +115,12 @@ bool CProjector2D::initialize(const Config& _cfg)
}
// required: ProjectionGeometry
- XMLNode* node = _cfg.self->getSingleNode("ProjectionGeometry");
+ XMLNode node = _cfg.self.getSingleNode("ProjectionGeometry");
ASTRA_CONFIG_CHECK(node, "Projector2D", "No ProjectionGeometry tag specified.");
// FIXME: Change how the base class is created. (This is duplicated
// in astra_mex_data2d.cpp.)
- std::string type = node->getAttribute("type");
+ std::string type = node.getAttribute("type");
if (type == "sparse_matrix") {
m_pProjectionGeometry = new CSparseMatrixProjectionGeometry2D();
m_pProjectionGeometry->initialize(Config(node));
@@ -146,7 +146,7 @@ bool CProjector2D::initialize(const Config& _cfg)
// required: VolumeGeometry
- node = _cfg.self->getSingleNode("VolumeGeometry");
+ node = _cfg.self.getSingleNode("VolumeGeometry");
ASTRA_CONFIG_CHECK(node, "Projector2D", "No VolumeGeometry tag specified.");
m_pVolumeGeometry = new CVolumeGeometry2D();
m_pVolumeGeometry->initialize(Config(node));
diff --git a/src/Projector3D.cpp b/src/Projector3D.cpp
index b546ee9..5e22105 100644
--- a/src/Projector3D.cpp
+++ b/src/Projector3D.cpp
@@ -92,11 +92,11 @@ bool CProjector3D::initialize(const Config& _cfg)
assert(_cfg.self);
ConfigStackCheck<CProjector3D> CC("Projector3D", this, _cfg);
- XMLNode* node;
+ XMLNode node;
- node = _cfg.self->getSingleNode("ProjectionGeometry");
+ node = _cfg.self.getSingleNode("ProjectionGeometry");
ASTRA_CONFIG_CHECK(node, "Projector3D", "No ProjectionGeometry tag specified.");
- std::string type = node->getAttribute("type");
+ std::string type = node.getAttribute("type");
CProjectionGeometry3D* pProjGeometry = 0;
if (type == "parallel3d") {
pProjGeometry = new CParallelProjectionGeometry3D();
@@ -108,18 +108,19 @@ bool CProjector3D::initialize(const Config& _cfg)
pProjGeometry = new CConeVecProjectionGeometry3D();
} else {
// Invalid geometry type
+ ASTRA_CONFIG_CHECK(false, "Projector3D", "Invalid projection geometry type specified.");
}
pProjGeometry->initialize(Config(node)); // this deletes node
m_pProjectionGeometry = pProjGeometry;
ASTRA_CONFIG_CHECK(m_pProjectionGeometry->isInitialized(), "Projector3D", "ProjectionGeometry not initialized.");
CC.markNodeParsed("ProjectionGeometry");
- node = _cfg.self->getSingleNode("VolumeGeometry");
+ node = _cfg.self.getSingleNode("VolumeGeometry");
ASTRA_CONFIG_CHECK(node, "Projector3D", "No VolumeGeometry tag specified.");
CVolumeGeometry3D* pVolGeometry = new CVolumeGeometry3D();
pVolGeometry->initialize(Config(node)); // this deletes node
m_pVolumeGeometry = pVolGeometry;
- ASTRA_CONFIG_CHECK(m_pVolumeGeometry->isInitialized(), "Projector2D", "VolumeGeometry not initialized.");
+ ASTRA_CONFIG_CHECK(m_pVolumeGeometry->isInitialized(), "Projector3D", "VolumeGeometry not initialized.");
CC.markNodeParsed("VolumeGeometry");
return true;
diff --git a/src/ReconstructionAlgorithm2D.cpp b/src/ReconstructionAlgorithm2D.cpp
index e089fac..767efe6 100644
--- a/src/ReconstructionAlgorithm2D.cpp
+++ b/src/ReconstructionAlgorithm2D.cpp
@@ -84,71 +84,68 @@ bool CReconstructionAlgorithm2D::initialize(const Config& _cfg)
ConfigStackCheck<CAlgorithm> CC("ReconstructionAlgorithm2D", this, _cfg);
// projector
- XMLNode* node = _cfg.self->getSingleNode("ProjectorId");
+ XMLNode node = _cfg.self.getSingleNode("ProjectorId");
ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectorId tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pProjector = CProjector2DManager::getSingleton().get(id);
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectorId");
// sinogram data
- node = _cfg.self->getSingleNode("ProjectionDataId");
+ node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("ReconstructionDataId");
+ node = _cfg.self.getSingleNode("ReconstructionDataId");
ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ReconstructionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ReconstructionDataId");
// fixed mask
- if (_cfg.self->hasOption("ReconstructionMaskId")) {
+ if (_cfg.self.hasOption("ReconstructionMaskId")) {
m_bUseReconstructionMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("ReconstructionMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId"));
m_pReconstructionMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
ASTRA_CONFIG_CHECK(m_pReconstructionMask, "Reconstruction2D", "Invalid ReconstructionMaskId.");
}
CC.markOptionParsed("ReconstructionMaskId");
// fixed mask
- if (_cfg.self->hasOption("SinogramMaskId")) {
+ if (_cfg.self.hasOption("SinogramMaskId")) {
m_bUseSinogramMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
ASTRA_CONFIG_CHECK(m_pSinogramMask, "Reconstruction2D", "Invalid SinogramMaskId.");
}
CC.markOptionParsed("SinogramMaskId");
// Constraints - NEW
- if (_cfg.self->hasOption("MinConstraint")) {
+ if (_cfg.self.hasOption("MinConstraint")) {
m_bUseMinConstraint = true;
- m_fMinValue = _cfg.self->getOptionNumerical("MinConstraint", 0.0f);
+ m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f);
CC.markOptionParsed("MinConstraint");
} else {
// Constraint - OLD
- m_bUseMinConstraint = _cfg.self->getOptionBool("UseMinConstraint", false);
+ m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false);
CC.markOptionParsed("UseMinConstraint");
if (m_bUseMinConstraint) {
- m_fMinValue = _cfg.self->getOptionNumerical("MinConstraintValue", 0.0f);
+ m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f);
CC.markOptionParsed("MinConstraintValue");
}
}
- if (_cfg.self->hasOption("MaxConstraint")) {
+ if (_cfg.self.hasOption("MaxConstraint")) {
m_bUseMaxConstraint = true;
- m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraint", 255.0f);
+ m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f);
CC.markOptionParsed("MaxConstraint");
} else {
// Constraint - OLD
- m_bUseMaxConstraint = _cfg.self->getOptionBool("UseMaxConstraint", false);
+ m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false);
CC.markOptionParsed("UseMaxConstraint");
if (m_bUseMaxConstraint) {
- m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraintValue", 0.0f);
+ m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f);
CC.markOptionParsed("MaxConstraintValue");
}
}
diff --git a/src/ReconstructionAlgorithm3D.cpp b/src/ReconstructionAlgorithm3D.cpp
index 13d069d..86b8ab2 100644
--- a/src/ReconstructionAlgorithm3D.cpp
+++ b/src/ReconstructionAlgorithm3D.cpp
@@ -104,7 +104,7 @@ bool CReconstructionAlgorithm3D::initialize(const Config& _cfg)
ASTRA_ASSERT(_cfg.self);
ConfigStackCheck<CAlgorithm> CC("ReconstructionAlgorithm3D", this, _cfg);
- XMLNode* node;
+ XMLNode node;
int id;
#if 0
// projector
@@ -116,60 +116,58 @@ bool CReconstructionAlgorithm3D::initialize(const Config& _cfg)
#endif
// sinogram data
- node = _cfg.self->getSingleNode("ProjectionDataId");
+ node = _cfg.self.getSingleNode("ProjectionDataId");
ASTRA_CONFIG_CHECK(node, "Reconstruction3D", "No ProjectionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pSinogram = dynamic_cast<CFloat32ProjectionData3D*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ProjectionDataId");
// reconstruction data
- node = _cfg.self->getSingleNode("ReconstructionDataId");
+ node = _cfg.self.getSingleNode("ReconstructionDataId");
ASTRA_CONFIG_CHECK(node, "Reconstruction3D", "No ReconstructionDataId tag specified.");
- id = boost::lexical_cast<int>(node->getContent());
+ id = boost::lexical_cast<int>(node.getContent());
m_pReconstruction = dynamic_cast<CFloat32VolumeData3D*>(CData3DManager::getSingleton().get(id));
- ASTRA_DELETE(node);
CC.markNodeParsed("ReconstructionDataId");
// fixed mask
- if (_cfg.self->hasOption("ReconstructionMaskId")) {
+ if (_cfg.self.hasOption("ReconstructionMaskId")) {
m_bUseReconstructionMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("ReconstructionMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId"));
m_pReconstructionMask = dynamic_cast<CFloat32VolumeData3D*>(CData3DManager::getSingleton().get(id));
}
CC.markOptionParsed("ReconstructionMaskId");
// fixed mask
- if (_cfg.self->hasOption("SinogramMaskId")) {
+ if (_cfg.self.hasOption("SinogramMaskId")) {
m_bUseSinogramMask = true;
- id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+ id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
m_pSinogramMask = dynamic_cast<CFloat32ProjectionData3D*>(CData3DManager::getSingleton().get(id));
}
// Constraints - NEW
- if (_cfg.self->hasOption("MinConstraint")) {
+ if (_cfg.self.hasOption("MinConstraint")) {
m_bUseMinConstraint = true;
- m_fMinValue = _cfg.self->getOptionNumerical("MinConstraint", 0.0f);
+ m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f);
CC.markOptionParsed("MinConstraint");
} else {
// Constraint - OLD
- m_bUseMinConstraint = _cfg.self->getOptionBool("UseMinConstraint", false);
+ m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false);
CC.markOptionParsed("UseMinConstraint");
if (m_bUseMinConstraint) {
- m_fMinValue = _cfg.self->getOptionNumerical("MinConstraintValue", 0.0f);
+ m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f);
CC.markOptionParsed("MinConstraintValue");
}
}
- if (_cfg.self->hasOption("MaxConstraint")) {
+ if (_cfg.self.hasOption("MaxConstraint")) {
m_bUseMaxConstraint = true;
- m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraint", 255.0f);
+ m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f);
CC.markOptionParsed("MaxConstraint");
} else {
// Constraint - OLD
- m_bUseMaxConstraint = _cfg.self->getOptionBool("UseMaxConstraint", false);
+ m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false);
CC.markOptionParsed("UseMaxConstraint");
if (m_bUseMaxConstraint) {
- m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraintValue", 0.0f);
+ m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f);
CC.markOptionParsed("MaxConstraintValue");
}
}
diff --git a/src/SartAlgorithm.cpp b/src/SartAlgorithm.cpp
index f7a1677..e4dc5c7 100644
--- a/src/SartAlgorithm.cpp
+++ b/src/SartAlgorithm.cpp
@@ -126,7 +126,7 @@ bool CSartAlgorithm::initialize(const Config& _cfg)
// projection order
m_iCurrentProjection = 0;
m_iProjectionCount = m_pProjector->getProjectionGeometry()->getProjectionAngleCount();
- string projOrder = _cfg.self->getOption("ProjectionOrder", "sequential");
+ string projOrder = _cfg.self.getOption("ProjectionOrder", "sequential");
CC.markOptionParsed("ProjectionOrder");
if (projOrder == "sequential") {
m_piProjectionOrder = new int[m_iProjectionCount];
@@ -145,7 +145,7 @@ bool CSartAlgorithm::initialize(const Config& _cfg)
m_piProjectionOrder[i + k] = t;
}
} else if (projOrder == "custom") {
- vector<float32> projOrderList = _cfg.self->getOptionNumericalArray("ProjectionOrderList");
+ vector<float32> projOrderList = _cfg.self.getOptionNumericalArray("ProjectionOrderList");
m_piProjectionOrder = new int[projOrderList.size()];
for (int i = 0; i < m_iProjectionCount; i++) {
m_piProjectionOrder[i] = static_cast<int>(projOrderList[i]);
diff --git a/src/SparseMatrixProjectionGeometry2D.cpp b/src/SparseMatrixProjectionGeometry2D.cpp
index 86357d2..073720f 100644
--- a/src/SparseMatrixProjectionGeometry2D.cpp
+++ b/src/SparseMatrixProjectionGeometry2D.cpp
@@ -98,11 +98,10 @@ bool CSparseMatrixProjectionGeometry2D::initialize(const Config& _cfg)
CProjectionGeometry2D::initialize(_cfg);
// get matrix
- XMLNode* node = _cfg.self->getSingleNode("MatrixID");
+ XMLNode node = _cfg.self.getSingleNode("MatrixID");
ASTRA_CONFIG_CHECK(node, "SparseMatrixProjectionGeometry2D", "No MatrixID tag specified.");
- int id = boost::lexical_cast<int>(node->getContent());
+ int id = boost::lexical_cast<int>(node.getContent());
m_pMatrix = CMatrixManager::getSingleton().get(id);
- ASTRA_DELETE(node);
CC.markNodeParsed("MatrixID");
// success
@@ -194,11 +193,11 @@ Config* CSparseMatrixProjectionGeometry2D::getConfiguration() const
{
Config* cfg = new Config();
cfg->initialize("ProjectionGeometry2D");
- cfg->self->addAttribute("type", "sparse matrix");
- cfg->self->addChildNode("DetectorCount", getDetectorCount());
- cfg->self->addChildNode("DetectorWidth", getDetectorWidth());
- cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
- cfg->self->addChildNode("MatrixID", CMatrixManager::getSingleton().getIndex(m_pMatrix));
+ cfg->self.addAttribute("type", "sparse matrix");
+ cfg->self.addChildNode("DetectorCount", getDetectorCount());
+ cfg->self.addChildNode("DetectorWidth", getDetectorWidth());
+ cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+ cfg->self.addChildNode("MatrixID", CMatrixManager::getSingleton().getIndex(m_pMatrix));
return cfg;
}
diff --git a/src/VolumeGeometry2D.cpp b/src/VolumeGeometry2D.cpp
index d412914..6eea1b2 100644
--- a/src/VolumeGeometry2D.cpp
+++ b/src/VolumeGeometry2D.cpp
@@ -164,24 +164,22 @@ bool CVolumeGeometry2D::initialize(const Config& _cfg)
}
// Required: GridColCount
- XMLNode* node = _cfg.self->getSingleNode("GridColCount");
+ XMLNode node = _cfg.self.getSingleNode("GridColCount");
ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridColCount tag specified.");
- m_iGridColCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iGridColCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("GridColCount");
// Required: GridRowCount
- node = _cfg.self->getSingleNode("GridRowCount");
+ node = _cfg.self.getSingleNode("GridRowCount");
ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridRowCount tag specified.");
- m_iGridRowCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iGridRowCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("GridRowCount");
// Optional: Window minima and maxima
- m_fWindowMinX = _cfg.self->getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
- m_fWindowMaxX = _cfg.self->getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
- m_fWindowMinY = _cfg.self->getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
- m_fWindowMaxY = _cfg.self->getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
+ m_fWindowMinX = _cfg.self.getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
+ m_fWindowMaxX = _cfg.self.getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
+ m_fWindowMinY = _cfg.self.getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
+ m_fWindowMaxY = _cfg.self.getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
CC.markOptionParsed("WindowMinX");
CC.markOptionParsed("WindowMaxX");
CC.markOptionParsed("WindowMinY");
@@ -285,13 +283,13 @@ Config* CVolumeGeometry2D::getConfiguration() const
Config* cfg = new Config();
cfg->initialize("VolumeGeometry2D");
- cfg->self->addChildNode("GridColCount", m_iGridColCount);
- cfg->self->addChildNode("GridRowCount", m_iGridRowCount);
+ cfg->self.addChildNode("GridColCount", m_iGridColCount);
+ cfg->self.addChildNode("GridRowCount", m_iGridRowCount);
- cfg->self->addOption("WindowMinX", m_fWindowMinX);
- cfg->self->addOption("WindowMaxX", m_fWindowMaxX);
- cfg->self->addOption("WindowMinY", m_fWindowMinY);
- cfg->self->addOption("WindowMaxY", m_fWindowMaxY);
+ cfg->self.addOption("WindowMinX", m_fWindowMinX);
+ cfg->self.addOption("WindowMaxX", m_fWindowMaxX);
+ cfg->self.addOption("WindowMinY", m_fWindowMinY);
+ cfg->self.addOption("WindowMaxY", m_fWindowMaxY);
return cfg;
}
diff --git a/src/VolumeGeometry3D.cpp b/src/VolumeGeometry3D.cpp
index 66e6f0c..a1cf424 100644
--- a/src/VolumeGeometry3D.cpp
+++ b/src/VolumeGeometry3D.cpp
@@ -192,33 +192,30 @@ bool CVolumeGeometry3D::initialize(const Config& _cfg)
}
// Required: GridColCount
- XMLNode* node = _cfg.self->getSingleNode("GridColCount");
+ XMLNode node = _cfg.self.getSingleNode("GridColCount");
ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridColCount tag specified.");
- m_iGridColCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iGridColCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("GridColCount");
// Required: GridRowCount
- node = _cfg.self->getSingleNode("GridRowCount");
+ node = _cfg.self.getSingleNode("GridRowCount");
ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridRowCount tag specified.");
- m_iGridRowCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iGridRowCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("GridRowCount");
// Required: GridRowCount
- node = _cfg.self->getSingleNode("GridSliceCount");
+ node = _cfg.self.getSingleNode("GridSliceCount");
ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridSliceCount tag specified.");
- m_iGridSliceCount = boost::lexical_cast<int>(node->getContent());
- ASTRA_DELETE(node);
+ m_iGridSliceCount = boost::lexical_cast<int>(node.getContent());
CC.markNodeParsed("GridSliceCount");
// Optional: Window minima and maxima
- m_fWindowMinX = _cfg.self->getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
- m_fWindowMaxX = _cfg.self->getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
- m_fWindowMinY = _cfg.self->getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
- m_fWindowMaxY = _cfg.self->getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
- m_fWindowMinZ = _cfg.self->getOptionNumerical("WindowMinZ", -m_iGridSliceCount/2.0f);
- m_fWindowMaxZ = _cfg.self->getOptionNumerical("WindowMaxZ", m_iGridSliceCount/2.0f);
+ m_fWindowMinX = _cfg.self.getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
+ m_fWindowMaxX = _cfg.self.getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
+ m_fWindowMinY = _cfg.self.getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
+ m_fWindowMaxY = _cfg.self.getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
+ m_fWindowMinZ = _cfg.self.getOptionNumerical("WindowMinZ", -m_iGridSliceCount/2.0f);
+ m_fWindowMaxZ = _cfg.self.getOptionNumerical("WindowMaxZ", m_iGridSliceCount/2.0f);
CC.markOptionParsed("WindowMinX");
CC.markOptionParsed("WindowMaxX");
CC.markOptionParsed("WindowMinY");
@@ -386,16 +383,16 @@ Config* CVolumeGeometry3D::getConfiguration() const
Config* cfg = new Config();
cfg->initialize("VolumeGeometry3D");
- cfg->self->addChildNode("GridColCount", m_iGridColCount);
- cfg->self->addChildNode("GridRowCount", m_iGridRowCount);
- cfg->self->addChildNode("GridSliceCount", m_iGridSliceCount);
+ cfg->self.addChildNode("GridColCount", m_iGridColCount);
+ cfg->self.addChildNode("GridRowCount", m_iGridRowCount);
+ cfg->self.addChildNode("GridSliceCount", m_iGridSliceCount);
- cfg->self->addOption("WindowMinX", m_fWindowMinX);
- cfg->self->addOption("WindowMaxX", m_fWindowMaxX);
- cfg->self->addOption("WindowMinY", m_fWindowMinY);
- cfg->self->addOption("WindowMaxY", m_fWindowMaxY);
- cfg->self->addOption("WindowMinZ", m_fWindowMinZ);
- cfg->self->addOption("WindowMaxZ", m_fWindowMaxZ);
+ cfg->self.addOption("WindowMinX", m_fWindowMinX);
+ cfg->self.addOption("WindowMaxX", m_fWindowMaxX);
+ cfg->self.addOption("WindowMinY", m_fWindowMinY);
+ cfg->self.addOption("WindowMaxY", m_fWindowMaxY);
+ cfg->self.addOption("WindowMinZ", m_fWindowMinZ);
+ cfg->self.addOption("WindowMaxZ", m_fWindowMaxZ);
return cfg;
}
diff --git a/src/XMLDocument.cpp b/src/XMLDocument.cpp
index 406564f..716ed9e 100644
--- a/src/XMLDocument.cpp
+++ b/src/XMLDocument.cpp
@@ -32,13 +32,8 @@ $Id$
#include <iostream>
#include <sstream>
-#ifdef _MSC_VER
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_print.hpp"
-#else
-#include "rapidxml.hpp"
-#include "rapidxml_print.hpp"
-#endif
using namespace rapidxml;
using namespace astra;
@@ -94,10 +89,9 @@ XMLDocument* XMLDocument::createDocument(string sRootName)
}
//-----------------------------------------------------------------------------
-XMLNode* XMLDocument::getRootNode()
+XMLNode XMLDocument::getRootNode()
{
- // TODO: clean up: this 'new' requires callers to do memory management
- return new XMLNode(fDOMDocument->first_node());
+ return XMLNode(fDOMDocument->first_node());
}
//-----------------------------------------------------------------------------
diff --git a/src/XMLNode.cpp b/src/XMLNode.cpp
index 4b2bdf4..0ec701f 100644
--- a/src/XMLNode.cpp
+++ b/src/XMLNode.cpp
@@ -28,15 +28,15 @@ $Id$
#include "astra/XMLNode.h"
-#ifdef _MSC_VER
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_print.hpp"
-#else
-#include "rapidxml.hpp"
-#include "rapidxml_print.hpp"
-#endif
#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+
+
using namespace rapidxml;
using namespace astra;
@@ -44,21 +44,10 @@ using namespace std;
//-----------------------------------------------------------------------------
-// Utility function to delete a list of nodes
-static void deleteNodes(list<XMLNode*>& nodes)
-{
- for (list<XMLNode*>::iterator i = nodes.begin(); i != nodes.end(); ++i)
- delete (*i);
-
- nodes.clear();
-}
-
-
-//-----------------------------------------------------------------------------
// default constructor
XMLNode::XMLNode()
{
-
+ fDOMElement = 0;
}
//-----------------------------------------------------------------------------
@@ -84,14 +73,14 @@ void XMLNode::setDOMNode(xml_node<>* n)
//-----------------------------------------------------------------------------
// print XML Node
-void XMLNode::print()
+void XMLNode::print() const
{
std::cout << fDOMElement;
}
//-----------------------------------------------------------------------------
// print XML Node
-std::string XMLNode::toString()
+std::string XMLNode::toString() const
{
std::string s;
::print(std::back_inserter(s), *fDOMElement, 0);
@@ -100,64 +89,61 @@ std::string XMLNode::toString()
//-----------------------------------------------------------------------------
// Get single node
-XMLNode* XMLNode::getSingleNode(string name)
+XMLNode XMLNode::getSingleNode(string name) const
{
xml_node<> *node = fDOMElement->first_node(name.c_str());
- if (node)
- return new XMLNode(node);
- else
- return 0;
+ return XMLNode(node);
}
//-----------------------------------------------------------------------------
// Get list of nodes
-list<XMLNode*> XMLNode::getNodes(string name)
+list<XMLNode> XMLNode::getNodes(string name) const
{
- list<XMLNode*> result;
+ list<XMLNode> result;
xml_node<> *iter;
for (iter = fDOMElement->first_node(name.c_str()); iter; iter = iter->next_sibling(name.c_str())) {
- result.push_back(new XMLNode(iter));
+ result.push_back(XMLNode(iter));
}
return result;
}
//-----------------------------------------------------------------------------
// Get list of nodes
-list<XMLNode*> XMLNode::getNodes()
+list<XMLNode> XMLNode::getNodes() const
{
- list<XMLNode*> result;
+ list<XMLNode> result;
xml_node<> *iter;
for (iter = fDOMElement->first_node(); iter; iter = iter->next_sibling()) {
- result.push_back(new XMLNode(iter));
+ result.push_back(XMLNode(iter));
}
return result;
}
//-----------------------------------------------------------------------------
// Get name of this node
-std::string XMLNode::getName()
+std::string XMLNode::getName() const
{
return fDOMElement->name();
}
//-----------------------------------------------------------------------------
// Get node content - STRING
-string XMLNode::getContent()
+string XMLNode::getContent() const
{
return fDOMElement->value();
}
//-----------------------------------------------------------------------------
// Get node content - NUMERICAL
-float32 XMLNode::getContentNumerical()
+float32 XMLNode::getContentNumerical() const
{
return boost::lexical_cast<float32>(getContent());
}
//-----------------------------------------------------------------------------
// Get node content - BOOLEAN
-bool XMLNode::getContentBool()
+bool XMLNode::getContentBool() const
{
string res = getContent();
return ((res == "1") || (res == "yes") || (res == "true") || (res == "on"));
@@ -165,21 +151,20 @@ bool XMLNode::getContentBool()
//-----------------------------------------------------------------------------
// Get node content - STRING LIST
-vector<string> XMLNode::getContentArray()
+vector<string> XMLNode::getContentArray() const
{
// get listsize
int iSize = boost::lexical_cast<int>(getAttribute("listsize"));
// create result array
vector<string> res(iSize);
// loop all list item nodes
- list<XMLNode*> nodes = getNodes("ListItem");
- for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
- int iIndex = (*it)->getAttributeNumerical("index");
- string sValue = (*it)->getAttribute("value");
+ list<XMLNode> nodes = getNodes("ListItem");
+ for (list<XMLNode>::iterator it = nodes.begin(); it != nodes.end(); it++) {
+ int iIndex = it->getAttributeNumerical("index");
+ string sValue = it->getAttribute("value");
ASTRA_ASSERT(iIndex < iSize);
res[iIndex] = sValue;
}
- deleteNodes(nodes);
// return
return res;
@@ -187,85 +172,48 @@ vector<string> XMLNode::getContentArray()
//-----------------------------------------------------------------------------
// Get node content - NUMERICAL LIST
-vector<float32> XMLNode::getContentNumericalArray()
+// NB: A 2D matrix is returned as a linear list
+vector<float32> XMLNode::getContentNumericalArray() const
{
- // is scalar
- if (!hasAttribute("listsize")) {
- vector<float32> res(1);
- res[0] = getContentNumerical();
- return res;
- }
+ string input = getContent();
- int iSize = boost::lexical_cast<int>(getAttribute("listsize"));
- // create result array
- vector<float32> res(iSize);
- // loop all list item nodes
- list<XMLNode*> nodes = getNodes("ListItem");
- for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
- int iIndex = (*it)->getAttributeNumerical("index");
- float32 fValue = (*it)->getAttributeNumerical("value");
- ASTRA_ASSERT(iIndex < iSize);
- res[iIndex] = fValue;
- }
- deleteNodes(nodes);
- // return
- return res;
-}
+ // split
+ std::vector<std::string> items;
+ boost::split(items, input, boost::is_any_of(",;"));
-vector<double> XMLNode::getContentNumericalArrayDouble()
-{
- // is scalar
- if (!hasAttribute("listsize")) {
- vector<double> res(1);
- res[0] = getContentNumerical();
- return res;
- }
+ // init list
+ vector<float32> out;
+ out.resize(items.size());
- int iSize = boost::lexical_cast<int>(getAttribute("listsize"));
- // create result array
- vector<double> res(iSize);
- // loop all list item nodes
- list<XMLNode*> nodes = getNodes("ListItem");
- for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
- int iIndex = (*it)->getAttributeNumerical("index");
- double fValue = (*it)->getAttributeNumericalDouble("value");
- ASTRA_ASSERT(iIndex < iSize);
- res[iIndex] = fValue;
+ // loop elements
+ for (unsigned int i = 0; i < items.size(); i++) {
+ out[i] = boost::lexical_cast<float32>(items[i]);
}
- deleteNodes(nodes);
- // return
- return res;
+ return out;
}
-//-----------------------------------------------------------------------------
-// Get node content - NUMERICAL LIST 2
-void XMLNode::getContentNumericalArray(float32*& _pfData, int& _iSize)
+vector<double> XMLNode::getContentNumericalArrayDouble() const
{
- // is scalar
- if (!hasAttribute("listsize")) {
- _iSize = 1;
- _pfData = new float32[_iSize];
- _pfData[0] = getContentNumerical();
- return;
- }
- // get listsize
- _iSize = boost::lexical_cast<int>(getAttribute("listsize"));
- // create result array
- _pfData = new float32[_iSize];
- // loop all list item nodes
- list<XMLNode*> nodes = getNodes("ListItem");
- for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
- int iIndex = (*it)->getAttributeNumerical("index");
- float32 fValue = (*it)->getAttributeNumerical("value");
- ASTRA_ASSERT(iIndex < _iSize);
- _pfData[iIndex] = fValue;
+ string input = getContent();
+
+ // split
+ std::vector<std::string> items;
+ boost::split(items, input, boost::is_any_of(",;"));
+
+ // init list
+ vector<double> out;
+ out.resize(items.size());
+
+ // loop elements
+ for (unsigned int i = 0; i < items.size(); i++) {
+ out[i] = boost::lexical_cast<double>(items[i]);
}
- deleteNodes(nodes);
+ return out;
}
//-----------------------------------------------------------------------------
// Is attribute?
-bool XMLNode::hasAttribute(string _sName)
+bool XMLNode::hasAttribute(string _sName) const
{
xml_attribute<> *attr = fDOMElement->first_attribute(_sName.c_str());
return (attr != 0);
@@ -273,7 +221,7 @@ bool XMLNode::hasAttribute(string _sName)
//-----------------------------------------------------------------------------
// Get attribute - STRING
-string XMLNode::getAttribute(string _sName, string _sDefaultValue)
+string XMLNode::getAttribute(string _sName, string _sDefaultValue) const
{
xml_attribute<> *attr = fDOMElement->first_attribute(_sName.c_str());
@@ -284,12 +232,12 @@ string XMLNode::getAttribute(string _sName, string _sDefaultValue)
//-----------------------------------------------------------------------------
// Get attribute - NUMERICAL
-float32 XMLNode::getAttributeNumerical(string _sName, float32 _fDefaultValue)
+float32 XMLNode::getAttributeNumerical(string _sName, float32 _fDefaultValue) const
{
if (!hasAttribute(_sName)) return _fDefaultValue;
return boost::lexical_cast<float32>(getAttribute(_sName));
}
-double XMLNode::getAttributeNumericalDouble(string _sName, double _fDefaultValue)
+double XMLNode::getAttributeNumericalDouble(string _sName, double _fDefaultValue) const
{
if (!hasAttribute(_sName)) return _fDefaultValue;
return boost::lexical_cast<double>(getAttribute(_sName));
@@ -297,7 +245,7 @@ double XMLNode::getAttributeNumericalDouble(string _sName, double _fDefaultValue
//-----------------------------------------------------------------------------
// Get attribute - BOOLEAN
-bool XMLNode::getAttributeBool(string _sName, bool _bDefaultValue)
+bool XMLNode::getAttributeBool(string _sName, bool _bDefaultValue) const
{
if (!hasAttribute(_sName)) return _bDefaultValue;
string res = getAttribute(_sName);
@@ -306,7 +254,7 @@ bool XMLNode::getAttributeBool(string _sName, bool _bDefaultValue)
//-----------------------------------------------------------------------------
// Has option?
-bool XMLNode::hasOption(string _sKey)
+bool XMLNode::hasOption(string _sKey) const
{
xml_node<> *iter;
for (iter = fDOMElement->first_node("Option"); iter; iter = iter->next_sibling("Option")) {
@@ -319,7 +267,7 @@ bool XMLNode::hasOption(string _sKey)
//-----------------------------------------------------------------------------
// Get option - STRING
-string XMLNode::getOption(string _sKey, string _sDefaultValue)
+string XMLNode::getOption(string _sKey, string _sDefaultValue) const
{
xml_node<> *iter;
for (iter = fDOMElement->first_node("Option"); iter; iter = iter->next_sibling("Option")) {
@@ -336,7 +284,7 @@ string XMLNode::getOption(string _sKey, string _sDefaultValue)
//-----------------------------------------------------------------------------
// Get option - NUMERICAL
-float32 XMLNode::getOptionNumerical(string _sKey, float32 _fDefaultValue)
+float32 XMLNode::getOptionNumerical(string _sKey, float32 _fDefaultValue) const
{
if (!hasOption(_sKey)) return _fDefaultValue;
return boost::lexical_cast<float32>(getOption(_sKey));
@@ -344,7 +292,7 @@ float32 XMLNode::getOptionNumerical(string _sKey, float32 _fDefaultValue)
//-----------------------------------------------------------------------------
// Get option - BOOL
-bool XMLNode::getOptionBool(string _sKey, bool _bDefaultValue)
+bool XMLNode::getOptionBool(string _sKey, bool _bDefaultValue) const
{
bool bHasOption = hasOption(_sKey);
if (!bHasOption) return _bDefaultValue;
@@ -354,20 +302,18 @@ bool XMLNode::getOptionBool(string _sKey, bool _bDefaultValue)
//-----------------------------------------------------------------------------
// Get option - NUMERICAL ARRAY
-vector<float32> XMLNode::getOptionNumericalArray(string _sKey)
+vector<float32> XMLNode::getOptionNumericalArray(string _sKey) const
{
if (!hasOption(_sKey)) return vector<float32>();
- list<XMLNode*> nodes = getNodes("Option");
- for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
- if ((*it)->getAttribute("key") == _sKey) {
- vector<float32> vals = (*it)->getContentNumericalArray();
- deleteNodes(nodes);
+ list<XMLNode> nodes = getNodes("Option");
+ for (list<XMLNode>::iterator it = nodes.begin(); it != nodes.end(); it++) {
+ if (it->getAttribute("key") == _sKey) {
+ vector<float32> vals = it->getContentNumericalArray();
return vals;
}
}
- deleteNodes(nodes);
return vector<float32>();
}
@@ -390,41 +336,40 @@ vector<float32> XMLNode::getOptionNumericalArray(string _sKey)
//-----------------------------------------------------------------------------
// Add child node - EMPTY
-XMLNode* XMLNode::addChildNode(string _sNodeName)
+XMLNode XMLNode::addChildNode(string _sNodeName)
{
xml_document<> *doc = fDOMElement->document();
char *node_name = doc->allocate_string(_sNodeName.c_str());
xml_node<> *node = doc->allocate_node(node_element, node_name);
fDOMElement->append_node(node);
- // TODO: clean up: this 'new' requires callers to do memory management
- return new XMLNode(node);
+ return XMLNode(node);
}
//-----------------------------------------------------------------------------
// Add child node - STRING
-XMLNode* XMLNode::addChildNode(string _sNodeName, string _sText)
+XMLNode XMLNode::addChildNode(string _sNodeName, string _sText)
{
- XMLNode* res = addChildNode(_sNodeName);
- res->setContent(_sText);
+ XMLNode res = addChildNode(_sNodeName);
+ res.setContent(_sText);
return res;
}
//-----------------------------------------------------------------------------
// Add child node - FLOAT
-XMLNode* XMLNode::addChildNode(string _sNodeName, float32 _fValue)
+XMLNode XMLNode::addChildNode(string _sNodeName, float32 _fValue)
{
- XMLNode* res = addChildNode(_sNodeName);
- res->setContent(_fValue);
+ XMLNode res = addChildNode(_sNodeName);
+ res.setContent(_fValue);
return res;
}
//-----------------------------------------------------------------------------
// Add child node - LIST
-XMLNode* XMLNode::addChildNode(string _sNodeName, float32* _pfList, int _iSize)
+XMLNode XMLNode::addChildNode(string _sNodeName, float32* _pfList, int _iSize)
{
- XMLNode* res = addChildNode(_sNodeName);
- res->setContent(_pfList, _iSize);
+ XMLNode res = addChildNode(_sNodeName);
+ res.setContent(_pfList, _iSize);
return res;
}
@@ -446,15 +391,68 @@ void XMLNode::setContent(float32 _fValue)
//-----------------------------------------------------------------------------
// Set content - LIST
-void XMLNode::setContent(float32* pfList, int _iSize)
-{
+
+template<typename T>
+static std::string setContentList_internal(T* pfList, int _iSize) {
std::string str = (_iSize > 0) ? boost::lexical_cast<std::string>(pfList[0]) : "";
for (int i = 1; i < _iSize; i++) {
str += "," + boost::lexical_cast<std::string>(pfList[i]);
}
- setContent(str);
+ return str;
+}
+
+void XMLNode::setContent(float32* pfList, int _iSize)
+{
+ setContent(setContentList_internal<float32>(pfList, _iSize));
+}
+
+void XMLNode::setContent(double* pfList, int _iSize)
+{
+ setContent(setContentList_internal<double>(pfList, _iSize));
+}
+
+//-----------------------------------------------------------------------------
+// Set content - MATRIX
+
+template<typename T>
+static std::string setContentMatrix_internal(T* _pfMatrix, int _iWidth, int _iHeight, bool transposed)
+{
+ std::string str = "";
+
+ int s1,s2;
+
+ if (!transposed) {
+ s1 = 1;
+ s2 = _iWidth;
+ } else {
+ s1 = _iHeight;
+ s2 = 1;
+ }
+
+ for (int y = 0; y < _iHeight; ++y) {
+ if (_iWidth > 0)
+ str += boost::lexical_cast<std::string>(_pfMatrix[0*s1 + y*s2]);
+ for (int x = 1; x < _iWidth; x++)
+ str += "," + boost::lexical_cast<std::string>(_pfMatrix[x*s1 + y*s2]);
+
+ if (y != _iHeight-1)
+ str += ";";
+ }
+
+ return str;
}
+void XMLNode::setContent(float32* _pfMatrix, int _iWidth, int _iHeight, bool transposed)
+{
+ setContent(setContentMatrix_internal<float32>(_pfMatrix, _iWidth, _iHeight, transposed));
+}
+
+void XMLNode::setContent(double* _pfMatrix, int _iWidth, int _iHeight, bool transposed)
+{
+ setContent(setContentMatrix_internal<double>(_pfMatrix, _iWidth, _iHeight, transposed));
+}
+
+
//-----------------------------------------------------------------------------
// Add attribute - STRING
void XMLNode::addAttribute(string _sName, string _sText)
@@ -477,20 +475,18 @@ void XMLNode::addAttribute(string _sName, float32 _fValue)
// Add option - STRING
void XMLNode::addOption(string _sName, string _sText)
{
- XMLNode* node = addChildNode("Option");
- node->addAttribute("key", _sName);
- node->addAttribute("value", _sText);
- delete node;
+ XMLNode node = addChildNode("Option");
+ node.addAttribute("key", _sName);
+ node.addAttribute("value", _sText);
}
//-----------------------------------------------------------------------------
// Add option - FLOAT
void XMLNode::addOption(string _sName, float32 _sText)
{
- XMLNode* node = addChildNode("Option");
- node->addAttribute("key", _sName);
- node->addAttribute("value", _sText);
- delete node;
+ XMLNode node = addChildNode("Option");
+ node.addAttribute("key", _sName);
+ node.addAttribute("value", _sText);
}
//-----------------------------------------------------------------------------