NanoShaper  0.7.2
NanoShaper is a tool able to triangulate and inspect an arbitray triangulated surface or several types of molecular surfaces
C:/Documents and Settings/sdecherchi/My Documents/Ricerca/software nostro/NanoShaper0.7/src/globals.h
00001 
00002 //---------------------------------------------------------
00003 /*    @file             globals.h
00004 *     @brief    globals.h Includes all the common global parameters
00005 *                                                                                                               */
00006 //---------------------------------------------------------
00007 
00008 #ifndef globals_h
00009 #define globals_h
00010 
00012 //#define DBGMEM_CRT
00013 
00014 #ifdef DBGMEM_CRT
00015         // check vector bounds. To allow that you have to access vector following the
00016         // here defined access functions
00017         #define CHECK_BOUNDS
00018 #endif
00019 
00020 //if Microsoft C++ is not idenfied memory leak is deactivated
00021 #ifndef _MSC_VER 
00022         #undef DBGMEM_CRT
00023 #endif
00024 
00025 #ifdef DBGMEM_CRT
00026         #define _CRTDBG_MAP_ALLOC
00027         #define _CRTDBG_MAP_ALLOC_NEW
00028         #pragma message(" MESSAGE Microsoft Memory Leaks Detector is Enabled!")
00029         #include <stdlib.h>
00030         #include <crtdbg.h>
00031 #endif
00032 
00033 #define VERSION "0.7.2"
00034 #define PROGNAME "NanoShaper" 
00035 
00037 #include<iostream>
00038 #include<math.h>
00039 #include<vector>
00040 #include<fstream>
00041 #include<assert.h>
00042 #include<algorithm>
00043 #include<stdio.h>
00044 #include<cstring>
00045 #include<map>
00046 #include<list>
00047 #include<set>
00048 #include<time.h>
00049 #include<queue>
00050 #include<limits>
00051 #include "ConfigFile.h"
00053 
00054 using namespace std;
00055 
00057 #define WARN " <<WARNING>> "
00058 #define ERR " <<ERROR>> "
00059 #define INFO " <<INFO>> "
00060 #define CITE " <<CITATION>> "
00061 #define REMARK " <<REMARK>> "
00062 
00063 
00064 // access to EPSMAP,IDEBMAP,STATUSMAP colum-major as in Fortran
00065 // substituted by template access/writing inline functions with optional bounds check
00066 
00067 //#define EPSMAP(i,j,k,l,NX,NY,NZ) epsmap[(i)+(NX)*((j)+(NY)*((k)+(NZ)*(l)))]
00068 //#define IDEBMAP(i,j,k,NX,NY) idebmap[(i)+(NX)*((j)+(NY)*(k))]
00069 //#define STATUSMAP(i,j,k,NX,NY) status[(i)+(NX)*((j)+(NY)*(k))]
00070 //#define TEMP_STATUSMAP(i,j,k,NX,NY) tempStatus[(i)+(NX)*((j)+(NY)*(k))]
00071 //#define TEMP_STATUSMAP2(i,j,k,NX,NY) tempStatus2[(i)+(NX)*((j)+(NY)*(k))]
00072 
00074 
00075 //#define ENABLE_BOOST_THREADS
00076 //#define ENABLE_BOOST_CHRONO
00078 //#define ENABLE_CGAL
00079 
00081 
00082 #ifdef ENABLE_BOOST_THREADS
00083         #include <boost/thread/thread.hpp>
00084         #include <boost/thread/mutex.hpp>
00085         #include <boost/thread/condition_variable.hpp>
00086 #endif
00087 
00088 #ifdef ENABLE_BOOST_CHRONO
00089         #include <boost/chrono.hpp>
00090 #endif
00091 
00092 #ifndef __GNUC__
00093         #define INFINITY 1e100
00094 #endif
00095 
00096 
00098 
00100 #define BUFLEN 1024
00101 
00102 #define PI 3.14159265
00103 #define HALF_PI 1.57079633
00104 #define QUARTER_PI 0.785398163
00105 #define TWO_PI 6.28318531
00106 
00108 
00109 #define ABS(x) (x < 0 ? -(x) : (x))
00110 
00112 #define CROSS(dest,v1,v2) \
00113                 dest[0]=(v1[1])*(v2[2])-(v1[2])*(v2[1]); \
00114                 dest[1]=(v1[2])*(v2[0])-(v1[0])*(v2[2]); \
00115                 dest[2]=(v1[0])*(v2[1])-(v1[1])*(v2[0]);
00116 
00118 #define DOT(v1,v2) ((v1[0])*(v2[0])+(v1[1])*(v2[1])+(v1[2])*(v2[2]))
00119 
00122 #define NORMALIZE(v,t) \
00123                 t=sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); \
00124                 v[0]=v[0]/t; \
00125                 v[1]=v[1]/t; \
00126                 v[2]=v[2]/t;
00127 
00128 #define NORMALIZE_PLANE(v,t) \
00129                 t=sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); \
00130                 v[0]=v[0]/t; \
00131                 v[1]=v[1]/t; \
00132                 v[2]=v[2]/t; \
00133                 v[3]=v[3]/t;
00134 
00135 #define NORMALIZE_S(v,t) \
00136                 t=sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); \
00137                 v[0]=v[0]/(t+1e-20); \
00138                 v[1]=v[1]/(t+1e-20); \
00139                 v[2]=v[2]/(t+1e-20);
00140 
00141 #define NORMALIZE_S_ASSIGN(w,v,t) \
00142                 t=sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); \
00143                 w[0]=v[0]/(t+1e-20); \
00144                 w[1]=v[1]/(t+1e-20); \
00145                 w[2]=v[2]/(t+1e-20);
00146 
00148 #define ASSIGN(u,v) \
00149                 { u[0]=v[0]; \
00150                 u[1]=v[1]; \
00151                 u[2]=v[2]; }
00152 
00154 #define ASSIGN4(u,v) \
00155                 { u[0]=v[0]; \
00156                 u[1]=v[1]; \
00157                 u[2]=v[2];\
00158                 u[3]=v[3];}
00159 
00161 #define CHANGE_SIGN(u) \
00162                 {       u[0]=-u[0]; \
00163                         u[1]=-u[1]; \
00164                         u[2]=-u[2]; }
00165 
00167 #define SUB(dest,v1,v2)\
00168           dest[0]=v1[0]-v2[0]; \
00169           dest[1]=v1[1]-v2[1]; \
00170           dest[2]=v1[2]-v2[2];
00171 
00173 #define ADD(dest,v1,v2)\
00174           dest[0]=v1[0]+v2[0]; \
00175           dest[1]=v1[1]+v2[1]; \
00176           dest[2]=v1[2]+v2[2];
00177 
00179 #define MID(dest,v1,v2)\
00180           dest[0]=(v1[0]+v2[0])*0.5; \
00181           dest[1]=(v1[1]+v2[1])*0.5; \
00182           dest[2]=(v1[2]+v2[2])*0.5;
00183 
00185 #define ADD_MUL(dest,v1,v2,a)\
00186           dest[0]=v1[0]+a*v2[0]; \
00187           dest[1]=v1[1]+a*v2[1]; \
00188           dest[2]=v1[2]+a*v2[2];
00189 
00191 #define VEC_MUL(dest,v,a)\
00192           dest[0]=a*v[0]; \
00193           dest[1]=a*v[1]; \
00194           dest[2]=a*v[2];
00195 
00196 #define DIST(dist,v1,v2)\
00197           dist=sqrt((v1[0]-v2[0])*(v1[0]-v2[0])+(v1[1]-v2[1])*(v1[1]-v2[1])+(v1[2]-v2[2])*(v1[2]-v2[2])); 
00198 
00199 #define DIST2(dist,v1,v2)\
00200           dist=((v1[0]-v2[0])*(v1[0]-v2[0])+(v1[1]-v2[1])*(v1[1]-v2[1])+(v1[2]-v2[2])*(v1[2]-v2[2])); 
00201 
00203 #define MIN(x, y) ((x)<(y) ? (x):(y))
00204 
00206 #define MAX(x, y) ((x)>(y) ? (x):(y))
00207 
00208 
00209 /*      determinant of matrix
00210         Computes determinant of matrix m, returning d
00211  */
00212 #define DETERMINANT_2X2(d,m)                                            \
00213 {                                                                                                       \
00214         d = m[0][0] * m[1][1] - m[0][1] * m[1][0];              \
00215 }
00216 
00217 /*      determinant of matrix
00218         Computes determinant of matrix m, returning d
00219  */
00220 
00221 #define DETERMINANT_3X3(d,m)                                                            \
00222 {                                                                                                                       \
00223         d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]);    \
00224         d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]);   \
00225         d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]);   \
00226 }
00227 
00228 /* compute adjoint of matrix and scale
00229  Computes adjoint of matrix m, scales it by s, returning a
00230  */
00231 
00232 #define SCALE_ADJOINT_2X2(a,s,m) \
00233 {                               \
00234         a[0][0] = (s) * m[1][1];    \
00235         a[1][0] = - (s) * m[1][0];  \
00236         a[0][1] = - (s) * m[0][1];  \
00237         a[1][1] = (s) * m[0][0];    \
00238 }
00239 
00240  
00241 /*      compute adjoint of matrix and scale
00242         Computes adjoint of matrix m, scales it by s, returning a
00243  */
00244 
00245 #define SCALE_ADJOINT_3X3(a,s,m)        \
00246 {                                                                       \
00247         a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
00248         a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \
00249         a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
00250         \
00251         a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \
00252         a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \
00253         a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \
00254         \
00255         a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \
00256         a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \
00257         a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \
00258 }
00259 
00260 /*      inverse of matrix 
00261         Compute inverse of matrix a, returning determinant m and inverse b
00262  */
00263 
00264 #define INVERT_2X2(b,det,a)                     \
00265 {                                                                       \
00266         double tmp;                                             \
00267         DETERMINANT_2X2 (det, a);               \
00268         tmp = 1.0 / (det);              \
00269         SCALE_ADJOINT_2X2 (b, tmp, a);  \
00270 }
00271 
00272 /*      inverse of matrix 
00273         Compute inverse of matrix a, returning determinant m and inverse b
00274  */
00275 
00276 #define INVERT_3X3(b,det,a)             \
00277 {                                                               \
00278    double tmp;                                  \
00279    DETERMINANT_3X3 (det, a);    \
00280    tmp = 1.0 / (det);           \
00281    SCALE_ADJOINT_3X3 (b, tmp, a); \
00282 }
00283 
00284 #define PRINT_MAT3(mat) \
00285 { \
00286         cout << endl;                                   \
00287         for (int i=0;i<3;i++) \
00288         {                                               \
00289                 cout << mat[i][0] << "," << mat[i][1] << "," << mat[i][2];\
00290                 cout << endl;   \
00291         } \
00292 }
00293 
00294 #define PRINT_VEC3(vec) \
00295 { \
00296         cout << endl;                                   \
00297         cout << vec[0] << "," << vec[1] << "," << vec[2];\
00298         cout << endl;   \
00299         \
00300 }
00301 
00302 
00303 extern fstream* errorStream;
00304 extern fstream* internals;
00305 
00306 class Configuration
00307 {
00308         public:
00309         
00310                 double cavVol;
00311                 int numMol;
00312         
00313                 // grid (DelPhi) params
00314                 double scale;
00315                 double perfill;
00316                 // mol file name
00317                 string molFile;
00318                 // sys name
00319                 string sysName;
00320 
00321                 bool multi_diel;
00322                                 
00323                 // actions
00324                 bool fillCavities;
00325                 bool buildEpsmaps;
00326                 bool buildStatus;
00327                 bool tri;       
00328                 bool accTri;
00329                 bool smoothing; 
00330                 bool tri2balls;
00331                 bool projBGP;
00332                         
00333                 // save data
00334                 bool saveEpsmaps;
00335                 bool saveIdebmap;
00336                 bool saveBgps;
00337                 bool saveStatusMap;
00338                 bool saveCavities;
00339 
00340                 // global parameters
00341                 string operativeMode;           
00342                 int numthd;     
00343                 bool printAvailSurf;    
00344                 int currentSeed;
00345 
00346                 // pocket detection
00347                 bool cavAndPockets;
00348                 bool linkPockets;       
00349                 double pocketRadiusBig;         
00350                 double pocketRadiusSmall;               
00351                 double pocketRadiusLink;        
00352                 bool debug;
00353 };
00354 
00355 extern Configuration conf;
00356 
00357 #endif