diff options
| author | Willem Jan Palenstijn <wjp@usecode.org> | 2015-02-27 11:46:29 +0100 | 
|---|---|---|
| committer | Willem Jan Palenstijn <wjp@usecode.org> | 2015-02-27 11:46:29 +0100 | 
| commit | 03a9dd972ada50eedb83386910cecf02fe8d0e35 (patch) | |
| tree | f764bff6a8109d42445bdd1db622fd739baf5d4a /src | |
| parent | 9e2bb413a937aefe57f4fcf343413543ae57258a (diff) | |
| parent | 169e912d2633cda7ffc234e78afba1b096e122ea (diff) | |
| download | astra-03a9dd972ada50eedb83386910cecf02fe8d0e35.tar.gz astra-03a9dd972ada50eedb83386910cecf02fe8d0e35.tar.bz2 astra-03a9dd972ada50eedb83386910cecf02fe8d0e35.tar.xz astra-03a9dd972ada50eedb83386910cecf02fe8d0e35.zip | |
Merge pull request #20 from wvaarle/matlab-get-geometry
'get_geometry' functions in the matlab layer
Diffstat (limited to 'src')
| -rw-r--r-- | src/ConeProjectionGeometry3D.cpp | 23 | ||||
| -rw-r--r-- | src/ConeVecProjectionGeometry3D.cpp | 38 | ||||
| -rw-r--r-- | src/Config.cpp | 12 | ||||
| -rw-r--r-- | src/FanFlatProjectionGeometry2D.cpp | 14 | ||||
| -rw-r--r-- | src/FanFlatVecProjectionGeometry2D.cpp | 24 | ||||
| -rw-r--r-- | src/ParallelProjectionGeometry2D.cpp | 14 | ||||
| -rw-r--r-- | src/ParallelProjectionGeometry3D.cpp | 22 | ||||
| -rw-r--r-- | src/ParallelVecProjectionGeometry3D.cpp | 36 | ||||
| -rw-r--r-- | src/SparseMatrixProjectionGeometry2D.cpp | 13 | ||||
| -rw-r--r-- | src/VolumeGeometry2D.cpp | 20 | ||||
| -rw-r--r-- | src/VolumeGeometry3D.cpp | 23 | ||||
| -rw-r--r-- | src/XMLDocument.cpp | 8 | ||||
| -rw-r--r-- | src/XMLNode.cpp | 10 | 
13 files changed, 219 insertions, 38 deletions
| diff --git a/src/ConeProjectionGeometry3D.cpp b/src/ConeProjectionGeometry3D.cpp index e6999df..eb9adcf 100644 --- a/src/ConeProjectionGeometry3D.cpp +++ b/src/ConeProjectionGeometry3D.cpp @@ -186,17 +186,22 @@ bool CConeProjectionGeometry3D::isOfType(const std::string& _sType) const  }  //---------------------------------------------------------------------------------------- -void CConeProjectionGeometry3D::toXML(XMLNode* _sNode) const +// Get the configuration object +Config* CConeProjectionGeometry3D::getConfiguration() const   { -	_sNode->addAttribute("type", "cone"); -	_sNode->addChildNode("DetectorSpacingX", m_fDetectorSpacingX); -	_sNode->addChildNode("DetectorSpacingY", m_fDetectorSpacingY); -	_sNode->addChildNode("DetectorRowCount", m_iDetectorRowCount); -	_sNode->addChildNode("DetectorColCount", m_iDetectorColCount); -	_sNode->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount); -	_sNode->addChildNode("DistanceOriginDetector", m_fOriginDetectorDistance); -	_sNode->addChildNode("DistanceOriginSource", m_fOriginSourceDistance); +	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); +	return cfg;  } +  //----------------------------------------------------------------------------------------  CVector3D CConeProjectionGeometry3D::getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex) const diff --git a/src/ConeVecProjectionGeometry3D.cpp b/src/ConeVecProjectionGeometry3D.cpp index cf8f76d..a4bd22d 100644 --- a/src/ConeVecProjectionGeometry3D.cpp +++ b/src/ConeVecProjectionGeometry3D.cpp @@ -198,18 +198,42 @@ bool CConeVecProjectionGeometry3D::isEqual(const CProjectionGeometry3D * _pGeom2  // is of type  bool CConeVecProjectionGeometry3D::isOfType(const std::string& _sType) const  { -	 return (_sType == "cone3d_vec"); +	 return (_sType == "cone_vec");  }  //---------------------------------------------------------------------------------------- -void CConeVecProjectionGeometry3D::toXML(XMLNode* _sNode) const +// Get the configuration object +Config* CConeVecProjectionGeometry3D::getConfiguration() const   { -	_sNode->addAttribute("type","cone3d_vec"); -	_sNode->addChildNode("DetectorRowCount", m_iDetectorRowCount); -	_sNode->addChildNode("DetectorColCount", m_iDetectorColCount); -	// TODO: -	//_sNode->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount); +	Config* cfg = new Config(); +	cfg->initialize("ProjectionGeometry3D"); + +	cfg->self->addAttribute("type", "cone"); +	cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount); +	cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount); + +	std::string vectors = ""; +	for (int i = 0; i < m_iProjectionAngleCount; ++i) { +		SConeProjection& p = m_pProjectionAngles[i]; +		vectors += boost::lexical_cast<string>(p.fSrcX) + ","; +		vectors += boost::lexical_cast<string>(p.fSrcY) + ","; +		vectors += boost::lexical_cast<string>(p.fSrcZ) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSX + 0.5f*m_iDetectorRowCount*p.fDetUX + 0.5f*m_iDetectorColCount*p.fDetVX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSY + 0.5f*m_iDetectorRowCount*p.fDetUY + 0.5f*m_iDetectorColCount*p.fDetVY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSZ + 0.5f*m_iDetectorRowCount*p.fDetUZ + 0.5f*m_iDetectorColCount*p.fDetVZ) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUZ) + ","; +		vectors += boost::lexical_cast<string>(p.fDetVX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetVY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetVZ); +		if (i < m_iProjectionAngleCount-1) vectors += ';'; +	} +	cfg->self->addChildNode("Vectors", vectors); + +	return cfg;  } +//----------------------------------------------------------------------------------------  CVector3D CConeVecProjectionGeometry3D::getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex) const  { diff --git a/src/Config.cpp b/src/Config.cpp index 3a3cb53..653935e 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -54,12 +54,24 @@ Config::Config(XMLNode* _self)  	self = _self;  } +//-----------------------------------------------------------------------------  Config::~Config()  {  	delete self;  	self = 0;  } +//----------------------------------------------------------------------------- +void Config::initialize(std::string rootname) +{ +	if (self == 0) { +		XMLDocument* doc = XMLDocument::createDocument(rootname); +		self = doc->getRootNode();		 +	} +} + + +//-----------------------------------------------------------------------------  template <class T>  ConfigStackCheck<T>::ConfigStackCheck(const char *_name, T* _obj, const Config& _cfg)  	: object(_obj), cfg(&_cfg), name(_name) diff --git a/src/FanFlatProjectionGeometry2D.cpp b/src/FanFlatProjectionGeometry2D.cpp index bfc7fa9..d757f18 100644 --- a/src/FanFlatProjectionGeometry2D.cpp +++ b/src/FanFlatProjectionGeometry2D.cpp @@ -204,6 +204,20 @@ CVector3D CFanFlatProjectionGeometry2D::getProjectionDirection(int _iProjectionI  }  //---------------------------------------------------------------------------------------- +// Get the configuration object +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); +	return cfg; +} +//----------------------------------------------------------------------------------------  } // namespace astra diff --git a/src/FanFlatVecProjectionGeometry2D.cpp b/src/FanFlatVecProjectionGeometry2D.cpp index 77f9db7..9c7b596 100644 --- a/src/FanFlatVecProjectionGeometry2D.cpp +++ b/src/FanFlatVecProjectionGeometry2D.cpp @@ -194,7 +194,7 @@ bool CFanFlatVecProjectionGeometry2D::isEqual(CProjectionGeometry2D* _pGeom2) co  // Is of type  bool CFanFlatVecProjectionGeometry2D::isOfType(const std::string& _sType)  { -	 return (_sType == "fanflat_vec"); +	return (_sType == "fanflat_vec");  }  //---------------------------------------------------------------------------------------- @@ -227,6 +227,28 @@ bool CFanFlatVecProjectionGeometry2D::_check()  //---------------------------------------------------------------------------------------- +// Get the configuration object +Config* CFanFlatVecProjectionGeometry2D::getConfiguration() const  +{ +	Config* cfg = new Config(); +	cfg->initialize("ProjectionGeometry2D"); +	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]; +		vectors += boost::lexical_cast<string>(p.fSrcX) + ","; +		vectors += boost::lexical_cast<string>(p.fSrcY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSX + 0.5f * m_iDetectorCount * p.fDetUX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSY + 0.5f * m_iDetectorCount * p.fDetUY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUY); +		if (i < m_iProjectionAngleCount-1) vectors += ';'; +	} +	cfg->self->addChildNode("Vectors", vectors); +	return cfg; +} +//----------------------------------------------------------------------------------------  } // namespace astra diff --git a/src/ParallelProjectionGeometry2D.cpp b/src/ParallelProjectionGeometry2D.cpp index 8f8faa4..cac8f30 100644 --- a/src/ParallelProjectionGeometry2D.cpp +++ b/src/ParallelProjectionGeometry2D.cpp @@ -27,6 +27,7 @@ $Id$  */  #include "astra/ParallelProjectionGeometry2D.h" +#include <boost/lexical_cast.hpp>  #include <cstring> @@ -168,6 +169,19 @@ bool CParallelProjectionGeometry2D::isOfType(const std::string& _sType)  {  	 return (_sType == "parallel");  } + +//---------------------------------------------------------------------------------------- +// Get the configuration object +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); +	return cfg; +}  //----------------------------------------------------------------------------------------  CVector3D CParallelProjectionGeometry2D::getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex /* = 0 */) diff --git a/src/ParallelProjectionGeometry3D.cpp b/src/ParallelProjectionGeometry3D.cpp index 8a13f0f..eb200f9 100644 --- a/src/ParallelProjectionGeometry3D.cpp +++ b/src/ParallelProjectionGeometry3D.cpp @@ -27,6 +27,7 @@ $Id$  */  #include "astra/ParallelProjectionGeometry3D.h" +#include <boost/lexical_cast.hpp>  #include <cstring> @@ -154,19 +155,24 @@ bool CParallelProjectionGeometry3D::isEqual(const CProjectionGeometry3D * _pGeom  // is of type  bool CParallelProjectionGeometry3D::isOfType(const std::string& _sType) const  { -	 return (_sType == "parallel"); +	 return (_sType == "parallel3d");  }  //---------------------------------------------------------------------------------------- -void CParallelProjectionGeometry3D::toXML(XMLNode* _sNode) const +// Get the configuration object +Config* CParallelProjectionGeometry3D::getConfiguration() const   { -	_sNode->addAttribute("type","parallel3d"); -	_sNode->addChildNode("DetectorSpacingX", m_fDetectorSpacingX); -	_sNode->addChildNode("DetectorSpacingY", m_fDetectorSpacingY); -	_sNode->addChildNode("DetectorRowCount", m_iDetectorRowCount); -	_sNode->addChildNode("DetectorColCount", m_iDetectorColCount); -	_sNode->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount); +	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); +	return cfg;  } +//----------------------------------------------------------------------------------------  CVector3D CParallelProjectionGeometry3D::getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex) const  { diff --git a/src/ParallelVecProjectionGeometry3D.cpp b/src/ParallelVecProjectionGeometry3D.cpp index 17f00a4..cfac485 100644 --- a/src/ParallelVecProjectionGeometry3D.cpp +++ b/src/ParallelVecProjectionGeometry3D.cpp @@ -202,14 +202,38 @@ bool CParallelVecProjectionGeometry3D::isOfType(const std::string& _sType) const  }  //---------------------------------------------------------------------------------------- -void CParallelVecProjectionGeometry3D::toXML(XMLNode* _sNode) const +// Get the configuration object +Config* CParallelVecProjectionGeometry3D::getConfiguration() const   { -	_sNode->addAttribute("type","parallel3d_vec"); -	_sNode->addChildNode("DetectorRowCount", m_iDetectorRowCount); -	_sNode->addChildNode("DetectorColCount", m_iDetectorColCount); -	// TODO: -	//_sNode->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount); +	Config* cfg = new Config(); +	cfg->initialize("ProjectionGeometry3D"); + +	cfg->self->addAttribute("type", "parallel3d"); +	cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount); +	cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount); + +	std::string vectors = ""; +	for (int i = 0; i < m_iProjectionAngleCount; ++i) { +		SPar3DProjection& p = m_pProjectionAngles[i]; +		vectors += boost::lexical_cast<string>(p.fRayX) + ","; +		vectors += boost::lexical_cast<string>(p.fRayY) + ","; +		vectors += boost::lexical_cast<string>(p.fRayZ) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSX + 0.5f*m_iDetectorRowCount*p.fDetUX + 0.5f*m_iDetectorColCount*p.fDetVX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSY + 0.5f*m_iDetectorRowCount*p.fDetUY + 0.5f*m_iDetectorColCount*p.fDetVY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetSZ + 0.5f*m_iDetectorRowCount*p.fDetUZ + 0.5f*m_iDetectorColCount*p.fDetVZ) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetUZ) + ","; +		vectors += boost::lexical_cast<string>(p.fDetVX) + ","; +		vectors += boost::lexical_cast<string>(p.fDetVY) + ","; +		vectors += boost::lexical_cast<string>(p.fDetVZ); +		if (i < m_iProjectionAngleCount-1) vectors += ';'; +	} +	cfg->self->addChildNode("Vectors", vectors); + +	return cfg;  } +//----------------------------------------------------------------------------------------  CVector3D CParallelVecProjectionGeometry3D::getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex) const  { diff --git a/src/SparseMatrixProjectionGeometry2D.cpp b/src/SparseMatrixProjectionGeometry2D.cpp index 7f14d9d..86357d2 100644 --- a/src/SparseMatrixProjectionGeometry2D.cpp +++ b/src/SparseMatrixProjectionGeometry2D.cpp @@ -189,7 +189,20 @@ bool CSparseMatrixProjectionGeometry2D::isOfType(const std::string& _sType)  	 return (_sType == "sparse_matrix");  }  //---------------------------------------------------------------------------------------- +// Get the configuration object +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)); +	return cfg; +} +//----------------------------------------------------------------------------------------  CVector3D CSparseMatrixProjectionGeometry2D::getProjectionDirection(int _iProjectionIndex, int _iDetectorIndex)  {  	CVector3D vOutput(0.0f, 0.0f, 0.0f); diff --git a/src/VolumeGeometry2D.cpp b/src/VolumeGeometry2D.cpp index 19aa905..d412914 100644 --- a/src/VolumeGeometry2D.cpp +++ b/src/VolumeGeometry2D.cpp @@ -152,7 +152,7 @@ CVolumeGeometry2D* CVolumeGeometry2D::clone()  }  //---------------------------------------------------------------------------------------- -// Initialization witha COnfig object +// Initialization witha Config object  bool CVolumeGeometry2D::initialize(const Config& _cfg)  {  	ASTRA_ASSERT(_cfg.self); @@ -277,6 +277,24 @@ bool CVolumeGeometry2D::isEqual(CVolumeGeometry2D* _pGeom2) const  	return true;  } + +//---------------------------------------------------------------------------------------- +// Get the configuration object +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->addOption("WindowMinX", m_fWindowMinX); +	cfg->self->addOption("WindowMaxX", m_fWindowMaxX); +	cfg->self->addOption("WindowMinY", m_fWindowMinY); +	cfg->self->addOption("WindowMaxY", m_fWindowMaxY); + +	return cfg; +}  //----------------------------------------------------------------------------------------  } // namespace astra diff --git a/src/VolumeGeometry3D.cpp b/src/VolumeGeometry3D.cpp index d7a93a9..66e6f0c 100644 --- a/src/VolumeGeometry3D.cpp +++ b/src/VolumeGeometry3D.cpp @@ -380,5 +380,28 @@ CVolumeGeometry2D * CVolumeGeometry3D::createVolumeGeometry2D() const  }  //---------------------------------------------------------------------------------------- +// Get the configuration object +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->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; +} +//---------------------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------------------  } // namespace astra diff --git a/src/XMLDocument.cpp b/src/XMLDocument.cpp index b39875b..406564f 100644 --- a/src/XMLDocument.cpp +++ b/src/XMLDocument.cpp @@ -109,4 +109,12 @@ void XMLDocument::saveToFile(string sFilename)  }  //----------------------------------------------------------------------------- +std::string XMLDocument::toString() +{ +	std::stringstream ss; +	ss << *fDOMDocument->first_node(); +	return ss.str(); +} + +//----------------------------------------------------------------------------- diff --git a/src/XMLNode.cpp b/src/XMLNode.cpp index a5b6796..4b2bdf4 100644 --- a/src/XMLNode.cpp +++ b/src/XMLNode.cpp @@ -448,13 +448,11 @@ void XMLNode::setContent(float32 _fValue)  // Set content - LIST  void XMLNode::setContent(float32* pfList, int _iSize)   { -	addAttribute("listsize", _iSize); -	for (int i = 0; i < _iSize; i++) { -		XMLNode* item = addChildNode("ListItem"); -		item->addAttribute("index", i); -		item->addAttribute("value",pfList[i]); -		delete item; +	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);  }  //-----------------------------------------------------------------------------	 | 
