diff options
author | Willem Jan Palenstijn <WillemJan.Palenstijn@uantwerpen.be> | 2013-07-01 22:34:11 +0000 |
---|---|---|
committer | wpalenst <WillemJan.Palenstijn@uantwerpen.be> | 2013-07-01 22:34:11 +0000 |
commit | b2fc6c70434674d74551c3a6c01ffb3233499312 (patch) | |
tree | b17f080ebc504ab85ebb7c3d89f917fd87ce9e00 /src/Float32VolumeData3D.cpp | |
download | astra-b2fc6c70434674d74551c3a6c01ffb3233499312.tar.gz astra-b2fc6c70434674d74551c3a6c01ffb3233499312.tar.bz2 astra-b2fc6c70434674d74551c3a6c01ffb3233499312.tar.xz astra-b2fc6c70434674d74551c3a6c01ffb3233499312.zip |
Update version to 1.3
Diffstat (limited to 'src/Float32VolumeData3D.cpp')
-rw-r--r-- | src/Float32VolumeData3D.cpp | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/src/Float32VolumeData3D.cpp b/src/Float32VolumeData3D.cpp new file mode 100644 index 0000000..d269aa8 --- /dev/null +++ b/src/Float32VolumeData3D.cpp @@ -0,0 +1,269 @@ +/* +----------------------------------------------------------------------- +Copyright 2012 iMinds-Vision Lab, University of Antwerp + +Contact: astra@ua.ac.be +Website: http://astra.ua.ac.be + + +This file is part of the +All Scale Tomographic Reconstruction Antwerp Toolbox ("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/Float32VolumeData3D.h" + +namespace astra +{ + +//---------------------------------------------------------------------------------------- +// Default constructor. +CFloat32VolumeData3D::CFloat32VolumeData3D() : + CFloat32Data3D() { + +} + +//---------------------------------------------------------------------------------------- +// Destructor +CFloat32VolumeData3D::~CFloat32VolumeData3D() { + +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator+=(const CFloat32VolumeData3D& _data) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); +#ifdef _DEBUG + CVolumeGeometry3D * pDataGeometry = _data.getGeometry(); + int iThisSlicePixelCount = pThisGeometry->getGridRowCount() * pThisGeometry->getGridColCount(); + int iDataSlicePixelCount = pDataGeometry->getGridRowCount() * pDataGeometry->getGridColCount(); + + ASTRA_ASSERT(iSliceCount == pDataGeometry->getGridSliceCount()); + ASTRA_ASSERT(iThisSlicePixelCount == iDataSlicePixelCount); +#endif + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + CFloat32VolumeData2D * pDataProjection = _data.fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; + + fThisValue += fDataValue; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + delete pDataProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator-=(const CFloat32VolumeData3D& _data) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); +#ifdef _DEBUG + CVolumeGeometry3D * pDataGeometry = _data.getGeometry(); + int iThisSlicePixelCount = pThisGeometry->getGridRowCount() * pThisGeometry->getGridColCount(); + int iDataSlicePixelCount = pDataGeometry->getGridRowCount() * pDataGeometry->getGridColCount(); + + ASTRA_ASSERT(iSliceCount == pDataGeometry->getGridSliceCount()); + ASTRA_ASSERT(iThisSlicePixelCount == iDataSlicePixelCount); +#endif + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + CFloat32VolumeData2D * pDataProjection = _data.fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; + + fThisValue -= fDataValue; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + delete pDataProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator*=(const CFloat32VolumeData3D& _data) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); +#ifdef _DEBUG + CVolumeGeometry3D * pDataGeometry = _data.getGeometry(); + int iThisSlicePixelCount = pThisGeometry->getGridRowCount() * pThisGeometry->getGridColCount(); + int iDataSlicePixelCount = pDataGeometry->getGridRowCount() * pDataGeometry->getGridColCount(); + + ASTRA_ASSERT(iSliceCount == pDataGeometry->getGridSliceCount()); + ASTRA_ASSERT(iThisSlicePixelCount == iDataSlicePixelCount); +#endif + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + CFloat32VolumeData2D * pDataProjection = _data.fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; + + fThisValue *= fDataValue; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + delete pDataProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator*=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue *= _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator/=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue /= _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator+=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue += _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator-=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue -= _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +} // end namespace astra |