summaryrefslogtreecommitdiffstats
path: root/src/Float32ProjectionData3D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Float32ProjectionData3D.cpp')
-rw-r--r--src/Float32ProjectionData3D.cpp273
1 files changed, 273 insertions, 0 deletions
diff --git a/src/Float32ProjectionData3D.cpp b/src/Float32ProjectionData3D.cpp
new file mode 100644
index 0000000..66bb5e3
--- /dev/null
+++ b/src/Float32ProjectionData3D.cpp
@@ -0,0 +1,273 @@
+/*
+-----------------------------------------------------------------------
+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/Float32ProjectionData3D.h"
+
+using namespace std;
+
+namespace astra {
+
+//----------------------------------------------------------------------------------------
+// Constructors
+//----------------------------------------------------------------------------------------
+
+
+// Default constructor
+CFloat32ProjectionData3D::CFloat32ProjectionData3D() :
+ CFloat32Data3D() {
+}
+
+// Destructor
+CFloat32ProjectionData3D::~CFloat32ProjectionData3D() {
+ delete m_pGeometry;
+ m_pGeometry = 0;
+}
+
+CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator+=(const CFloat32ProjectionData3D& _data)
+{
+ CProjectionGeometry3D * pThisGeometry = getGeometry();
+
+ int iProjectionCount = pThisGeometry->getProjectionCount();
+#ifdef _DEBUG
+ CProjectionGeometry3D * pDataGeometry = _data.getGeometry();
+ int iThisProjectionDetectorCount = pThisGeometry->getDetectorRowCount() * pThisGeometry->getDetectorColCount();
+ int iDataProjectionDetectorCount = pDataGeometry->getDetectorRowCount() * pDataGeometry->getDetectorColCount();
+
+ ASTRA_ASSERT(iProjectionCount == pDataGeometry->getProjectionCount());
+ ASTRA_ASSERT(iThisProjectionDetectorCount == iDataProjectionDetectorCount);
+#endif
+
+ for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)
+ {
+ CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);
+ CFloat32VolumeData2D * pDataProjection = _data.fetchProjection(iProjectionIndex);
+
+ for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++)
+ {
+ float32 fThisValue = pThisProjection->getData()[iDetectorIndex];
+ float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex];
+
+ fThisValue += fDataValue;
+
+ pThisProjection->getData()[iDetectorIndex] = fThisValue;
+ }
+
+ returnProjection(iProjectionIndex, pThisProjection);
+
+ delete pThisProjection;
+ delete pDataProjection;
+ }
+
+ return *this;
+}
+
+CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator-=(const CFloat32ProjectionData3D& _data)
+{
+ CProjectionGeometry3D * pThisGeometry = getGeometry();
+
+ int iProjectionCount = pThisGeometry->getProjectionCount();
+#ifdef _DEBUG
+ CProjectionGeometry3D * pDataGeometry = _data.getGeometry();
+ int iThisProjectionDetectorCount = pThisGeometry->getDetectorRowCount() * pThisGeometry->getDetectorColCount();
+ int iDataProjectionDetectorCount = pDataGeometry->getDetectorRowCount() * pDataGeometry->getDetectorColCount();
+
+ ASTRA_ASSERT(iProjectionCount == pDataGeometry->getProjectionCount());
+ ASTRA_ASSERT(iThisProjectionDetectorCount == iDataProjectionDetectorCount);
+#endif
+
+ for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)
+ {
+ CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);
+ CFloat32VolumeData2D * pDataProjection = _data.fetchProjection(iProjectionIndex);
+
+ for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++)
+ {
+ float32 fThisValue = pThisProjection->getData()[iDetectorIndex];
+ float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex];
+
+ fThisValue -= fDataValue;
+
+ pThisProjection->getData()[iDetectorIndex] = fThisValue;
+ }
+
+ returnProjection(iProjectionIndex, pThisProjection);
+
+ delete pThisProjection;
+ delete pDataProjection;
+ }
+
+ return *this;
+}
+
+CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator*=(const CFloat32ProjectionData3D& _data)
+{
+ CProjectionGeometry3D * pThisGeometry = getGeometry();
+
+ int iProjectionCount = pThisGeometry->getProjectionCount();
+#ifdef _DEBUG
+ CProjectionGeometry3D * pDataGeometry = _data.getGeometry();
+ int iThisProjectionDetectorCount = pThisGeometry->getDetectorRowCount() * pThisGeometry->getDetectorColCount();
+ int iDataProjectionDetectorCount = pDataGeometry->getDetectorRowCount() * pDataGeometry->getDetectorColCount();
+
+ ASTRA_ASSERT(iProjectionCount == pDataGeometry->getProjectionCount());
+ ASTRA_ASSERT(iThisProjectionDetectorCount == iDataProjectionDetectorCount);
+#endif
+
+ for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)
+ {
+ CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);
+ CFloat32VolumeData2D * pDataProjection = _data.fetchProjection(iProjectionIndex);
+
+ for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++)
+ {
+ float32 fThisValue = pThisProjection->getData()[iDetectorIndex];
+ float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex];
+
+ fThisValue *= fDataValue;
+
+ pThisProjection->getData()[iDetectorIndex] = fThisValue;
+ }
+
+ returnProjection(iProjectionIndex, pThisProjection);
+
+ delete pThisProjection;
+ delete pDataProjection;
+ }
+
+ return *this;
+}
+
+CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator*=(const float32& _fScalar)
+{
+ CProjectionGeometry3D * pThisGeometry = getGeometry();
+
+ int iProjectionCount = pThisGeometry->getProjectionCount();
+
+ for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)
+ {
+ CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);
+
+ for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++)
+ {
+ float32 fThisValue = pThisProjection->getData()[iDetectorIndex];
+
+ fThisValue *= _fScalar;
+
+ pThisProjection->getData()[iDetectorIndex] = fThisValue;
+ }
+
+ returnProjection(iProjectionIndex, pThisProjection);
+
+ delete pThisProjection;
+ }
+
+ return *this;
+}
+
+CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator/=(const float32& _fScalar)
+{
+ CProjectionGeometry3D * pThisGeometry = getGeometry();
+
+ int iProjectionCount = pThisGeometry->getProjectionCount();
+
+ for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)
+ {
+ CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);
+
+ for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++)
+ {
+ float32 fThisValue = pThisProjection->getData()[iDetectorIndex];
+
+ fThisValue /= _fScalar;
+
+ pThisProjection->getData()[iDetectorIndex] = fThisValue;
+ }
+
+ returnProjection(iProjectionIndex, pThisProjection);
+
+ delete pThisProjection;
+ }
+
+ return *this;
+}
+
+CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator+=(const float32& _fScalar)
+{
+ CProjectionGeometry3D * pThisGeometry = getGeometry();
+
+ int iProjectionCount = pThisGeometry->getProjectionCount();
+
+ for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)
+ {
+ CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);
+
+ for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++)
+ {
+ float32 fThisValue = pThisProjection->getData()[iDetectorIndex];
+
+ fThisValue += _fScalar;
+
+ pThisProjection->getData()[iDetectorIndex] = fThisValue;
+ }
+
+ returnProjection(iProjectionIndex, pThisProjection);
+
+ delete pThisProjection;
+ }
+
+ return *this;
+}
+
+CFloat32ProjectionData3D& CFloat32ProjectionData3D::operator-=(const float32& _fScalar)
+{
+ CProjectionGeometry3D * pThisGeometry = getGeometry();
+
+ int iProjectionCount = pThisGeometry->getProjectionCount();
+
+ for(int iProjectionIndex = 0; iProjectionIndex < iProjectionCount; iProjectionIndex++)
+ {
+ CFloat32VolumeData2D * pThisProjection = fetchProjection(iProjectionIndex);
+
+ for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++)
+ {
+ float32 fThisValue = pThisProjection->getData()[iDetectorIndex];
+
+ fThisValue -= _fScalar;
+
+ pThisProjection->getData()[iDetectorIndex] = fThisValue;
+ }
+
+ returnProjection(iProjectionIndex, pThisProjection);
+
+ delete pThisProjection;
+ }
+
+ return *this;
+}
+
+} // end namespace astra