/* ----------------------------------------------------------------------- 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 . ----------------------------------------------------------------------- $Id$ */ #ifndef _INC_ASTRA_GLOBALS #define _INC_ASTRA_GLOBALS /*! \mainpage The ASTRA-toolbox * * */ //---------------------------------------------------------------------------------------- #ifdef _MSC_VER // disable warning: 'fopen' was declared deprecated #pragma warning (disable : 4996) // disable warning: C++ exception handler used, but unwind semantics are not enables #pragma warning (disable : 4530) // disable warning: no suitable definition provided for explicit template instantiation request #pragma warning (disable : 4661) #endif //---------------------------------------------------------------------------------------- // standard includes #include #include #include #include #include #include //---------------------------------------------------------------------------------------- // macro's #define ASTRA_TOOLBOXVERSION_MAJOR 1 #define ASTRA_TOOLBOXVERSION_MINOR 6 #define ASTRA_TOOLBOXVERSION ((ASTRA_TOOLBOXVERSION_MAJOR)*100 + (ASTRA_TOOLBOXVERSION_MINOR)) #define ASTRA_TOOLBOXVERSION_STRING "1.6" #define ASTRA_ASSERT(a) assert(a) #define ASTRA_CONFIG_CHECK(value, type, msg) if (!(value)) { cout << "Configuration Error in " << type << ": " << msg << endl; return false; } #define ASTRA_CONFIG_WARNING(type, msg) { cout << "Warning in " << type << ": " << msg << endl; } #define ASTRA_DELETE(a) if (a) { delete a; a = NULL; } #define ASTRA_DELETE_ARRAY(a) if (a) { delete[] a; a = NULL; } #ifdef _MSC_VER #ifdef DLL_EXPORTS #define _AstraExport __declspec(dllexport) #define EXPIMP_TEMPLATE #else #define _AstraExport __declspec(dllimport) #define EXPIMP_TEMPLATE extern #endif #else #define _AstraExport #endif //---------------------------------------------------------------------------------------- // typedefs namespace astra { typedef float float32; typedef double float64; typedef unsigned short int uint16; typedef signed short int sint16; typedef unsigned char uchar8; typedef signed char schar8; typedef int int32; typedef short int int16; } //---------------------------------------------------------------------------------------- // globals vars & functions //namespace astra { //#define ToolboxVersion 0.1f; //float32 getVersion() { return ToolboxVersion; } //_AstraExport bool cudaEnabled() { //#ifdef ASTRA_CUDA // return true; //#else // return false; //#endif //} //} //---------------------------------------------------------------------------------------- // errors namespace astra { typedef enum {ASTRA_SUCCESS, ASTRA_ERROR_NOT_INITIALIZED, ASTRA_ERROR_INVALID_FILE, ASTRA_ERROR_OUT_OF_RANGE, ASTRA_ERROR_DIMENSION_MISMATCH, ASTRA_ERROR_EXTERNAL_LIBRARY, ASTRA_ERROR_ALLOCATION, ASTRA_ERROR_NOT_IMPLEMENTED} AstraError; } //---------------------------------------------------------------------------------------- // variables namespace astra { const float32 PI = 3.14159265358979323846264338328f; const float32 PI32 = 3.14159265358979323846264338328f; const float32 PIdiv2 = PI / 2; const float32 PIdiv4 = PI / 4; const float32 eps = 1e-7f; extern bool running_in_matlab; } //---------------------------------------------------------------------------------------- // math namespace astra { inline float32 cos_73s(float32 x) { /* const float32 c1 = 0.999999953464f; const float32 c2 = -0.4999999053455f; const float32 c3 = 0.0416635846769f; const float32 c4 = -0.0013853704264f; const float32 c5 = 0.000023233f; */ const float c1= (float)0.99940307; const float c2= (float)-0.49558072; const float c3= (float)0.03679168; float32 x2; x2 = x * x; //return (c1 + x2*(c2 + x2*(c3 + x2*(c4 + c5*x2)))); return (c1 + x2*(c2 + c3 * x2)); } inline float32 fast_cos(float32 x) { int quad; //x = fmod(x, 2*PI); // Get rid of values > 2* pi if (x < 0) x = -x; // cos(-x) = cos(x) quad = int(x/PIdiv2); // Get quadrant # (0 to 3) switch (quad) { case 0: return cos_73s(x); case 1: return -cos_73s(PI-x); case 2: return -cos_73s(x-PI); case 3: return cos_73s(2*PI-x); } return 0.0f; } inline float32 fast_sin(float32 x){ return fast_cos(PIdiv2-x); } } //---------------------------------------------------------------------------------------- // structs namespace astra { /** * Struct for storing pixel weigths **/ struct SPixelWeight { int m_iIndex; float32 m_fWeight; }; /** * Struct combining some properties of a detector in 1D detector row **/ struct SDetector2D { int m_iIndex; int m_iAngleIndex; int m_iDetectorIndex; }; /** * Struct combining some properties of a detector in 2D detector array **/ struct SDetector3D { int m_iIndex; int m_iAngleIndex; int m_iDetectorIndex; int m_iSliceIndex; }; } //---------------------------------------------------------------------------------------- // some toys // safe reinterpret cast template To safe_reinterpret_cast(From from) { BOOST_STATIC_ASSERT(sizeof(From) <= sizeof(To)); return reinterpret_cast(from); } //---------------------------------------------------------------------------------------- // functions for testing template inline void writeArray(T*** arr, int dim1, int dim2, int dim3, const std::string& filename) { std::ofstream out(filename.c_str()); int i1, i2, i3; for (i1 = 0; i1 < dim1; ++i1) { for (i2 = 0; i2 < dim2; ++i2) { for (i3 = 0; i3 < dim3; ++i3) { out << arr[i1][i2][i3] << " "; } out << std::endl; } out << std::endl; } out.close(); } template inline void writeArray(T** arr, int dim1, int dim2, const std::string& filename) { std::ofstream out(filename.c_str()); for (int i1 = 0; i1 < dim1; i1++) { for (int i2 = 0; i2 < dim2; i2++) { out << arr[i1][i2] << " "; } out << std::endl; } out.close(); } template inline void writeArray(T* arr, int dim1, const std::string& filename) { std::ofstream out(filename.c_str()); for (int i1 = 0; i1 < dim1; i1++) { out << arr[i1] << " "; } out.close(); } namespace astra { _AstraExport inline int getVersion() { return ASTRA_TOOLBOXVERSION; } _AstraExport inline const char* getVersionString() { return ASTRA_TOOLBOXVERSION_STRING; } #ifdef ASTRA_CUDA _AstraExport inline bool cudaEnabled() { return true; } #else _AstraExport inline bool cudaEnabled() { return false; } #endif } //---------------------------------------------------------------------------------------- // portability between MSVC and Linux/gcc #ifndef _MSC_VER #include "swrap.h" #define EXPIMP_TEMPLATE #if !defined(FORCEINLINE) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) #define FORCEINLINE inline __attribute__((__always_inline__)) #else #define FORCEINLINE inline #endif #else #define FORCEINLINE __forceinline #endif //---------------------------------------------------------------------------------------- // use pthreads on Linux and OSX #if defined(__linux__) || defined(__MACH__) #define USE_PTHREADS #endif #endif