00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00027 #ifndef VOLTOOL_H
00028 #define VOLTOOL_H
00029
00030 #include <stdio.h>
00031 #include "VolumetricData.h"
00032 #include "VMDApp.h"
00033 #include <stdint.h>
00034 #define MIN(X,Y) (((X)<(Y))? (X) : (Y))
00035 #define MAX(X,Y) (((X)>(Y))? (X) : (Y))
00036
00037 static inline int myisnan(float f) {
00038 union { float f; uint32_t x; } u = { f };
00039 return (u.x << 1) > 0xff000000u;
00040 }
00041
00043 inline float cubic_interp(float y0, float y1, float y2, float y3, float mu) {
00044 float mu2 = mu*mu;
00045 float a0 = y3 - y2 - y0 + y1;
00046 float a1 = y0 - y1 - a0;
00047 float a2 = y2 - y0;
00048 float a3 = y1;
00049
00050 return (a0*mu*mu2+a1*mu2+a2*mu+a3);
00051 }
00052
00053
00055 inline void voxel_coord(int x, int y, int z,
00056 float &gx, float &gy, float &gz,
00057 VolumetricData *vol) {
00058 float xdelta[3], ydelta[3], zdelta[3];
00059 vol->cell_axes(xdelta, ydelta, zdelta);
00060
00061 gx = float(vol->origin[0] + (x * xdelta[0]) + (y * ydelta[0]) + (z * zdelta[0]));
00062 gy = float(vol->origin[1] + (x * xdelta[1]) + (y * ydelta[1]) + (z * zdelta[1]));
00063 gz = float(vol->origin[2] + (x * xdelta[2]) + (y * ydelta[2]) + (z * zdelta[2]));
00064 }
00065
00066
00068 inline void voxel_coord(int i, float &x, float &y, float &z,
00069 VolumetricData *vol) {
00070 float xdelta[3], ydelta[3], zdelta[3];
00071 vol->cell_axes(xdelta, ydelta, zdelta);
00072 int xsize = vol->xsize;
00073 int ysize = vol->ysize;
00074
00075 int gz = i / (ysize*xsize);
00076 int gy = (i / xsize) % ysize;
00077 int gx = i % xsize;
00078
00079 x = float(vol->origin[0] + (gx * xdelta[0]) + (gy * ydelta[0]) + (gz * zdelta[0]));
00080 y = float(vol->origin[1] + (gx * xdelta[1]) + (gy * ydelta[1]) + (gz * zdelta[1]));
00081 z = float(vol->origin[2] + (gx * xdelta[2]) + (gy * ydelta[2]) + (gz * zdelta[2]));
00082 }
00083
00084
00085
00086
00087
00089 void add(VolumetricData *mapA, VolumetricData *mapB, VolumetricData *newvol, bool interp, bool USE_UNION);
00090
00092 void subtract(VolumetricData *mapA, VolumetricData *mapB, VolumetricData *newvol, bool interp, bool USE_UNION);
00093
00095 void multiply(VolumetricData *mapA, VolumetricData *mapB, VolumetricData *newvol, bool interp, bool USE_UNION);
00096
00099 void average(VolumetricData *mapA, VolumetricData *mapB, VolumetricData *newvol, bool interp, bool USE_UNION);
00100
00101
00102
00103
00104
00106 void vol_com(VolumetricData *vol, float *com);
00107
00110 void vol_moveto(VolumetricData *vol, float *com, float *pos);
00111
00113 void vol_move(VolumetricData *vol, float *mat);
00114
00116 void init_from_union(VolumetricData *mapA, const VolumetricData *mapB, VolumetricData *newvol);
00117
00119 void init_from_intersection(VolumetricData *mapA, const VolumetricData *mapB, VolumetricData *newvol);
00120
00122 VolumetricData * init_new_volume();
00123
00125 int init_new_volume_molecule(VMDApp *app, VolumetricData *newvol, const char *name);
00126
00130 void histogram( VolumetricData *vol, int nbins, long *bins, float *midpts);
00131
00133 int write_file(VMDApp *app, Molecule *volmol, int volid, const char* filename);
00134
00135 #endif
00136