00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdio.h>
00023 #include <stdlib.h>
00024 #include <string.h>
00025 #include <math.h>
00026 #include "Surf.h"
00027 #include "Inform.h"
00028 #include "utilities.h"
00029
00030
00031 #define VMD_FILENAME_MAX 1024
00032
00033 Surf::Surf() {}
00034
00035 int Surf::compute(float probe_r, int num, float *r,
00036 float *x, float *y, float *z) {
00037 FILE *outfile;
00038 FILE *infile;
00039 char *surfbin;
00040 char *surfcmd;
00041 static int surf_firsttime = 1;
00042
00043 if ((surfbin = getenv("SURF_BIN")) == NULL) {
00044 msgErr << "No SURF binary found; set the SURF_BIN environment variable"
00045 << sendmsg;
00046 msgErr << "to the location of your SURF executable." << sendmsg;
00047 return 0;
00048 }
00049
00050
00051
00052
00053
00054 char *dirname = vmd_tempfile("");
00055 char *ofilename = new char[VMD_FILENAME_MAX];
00056 char *ifilename = new char[VMD_FILENAME_MAX];
00057 int rndnum = (vmd_random() % 999);
00058 sprintf(ofilename, "%svmdsurf.u%d.%d.in", dirname, vmd_getuid(), rndnum);
00059 sprintf(ifilename, "%svmdsurf.u%d.%d.in.tri", dirname, vmd_getuid(), rndnum);
00060 delete [] dirname;
00061 vmd_delete_file(ofilename);
00062 vmd_delete_file(ifilename);
00063
00064
00065
00066
00067 if ((outfile=fopen(ofilename, "wt")) == NULL) {
00068 msgErr << "Failed to create Surf atom radii input file" << sendmsg;
00069 if (ofilename) delete [] ofilename;
00070 if (ifilename) delete [] ifilename;
00071 return 0;
00072 }
00073 for (int i=0; i<num; i++) {
00074 fprintf(outfile, "%d %f %f %f %f\n", i, r[i], x[i], y[i], z[i]);
00075 }
00076 fclose(outfile);
00077
00078
00079
00080
00081 if ((surfcmd = new char[strlen(ofilename) + strlen(surfbin) + 82])) {
00082 sprintf(surfcmd, "\"%s\" -W 1 -R %f %s", surfbin, probe_r, ofilename);
00083 vmd_system(surfcmd);
00084 delete [] surfcmd;
00085
00086
00087 if (surf_firsttime == 1) {
00088 surf_firsttime = 0;
00089 msgInfo << "This surface is made with SURF from UNC-Chapel Hill."
00090 << " The reference is:" << sendmsg;
00091 msgInfo << "A. Varshney, F. P. Brooks, W. V. Wright, "
00092 << "Linearly Scalable Computation" << sendmsg;
00093 msgInfo << "of Smooth Molecular Surfaces, "
00094 << "IEEE Comp. Graphics and Applications, " << sendmsg;
00095 msgInfo << "v. 14 (1994) pp. 19-25." << sendmsg;
00096 }
00097 }
00098
00099
00100
00101
00102 if ((infile = fopen(ifilename, "r")) == NULL) {
00103 msgErr << "Cannot read SURF output file: " << ifilename << sendmsg;
00104
00105
00106 vmd_delete_file(ofilename);
00107 vmd_delete_file(ifilename);
00108 if (ofilename) delete [] ofilename;
00109 if (ifilename) delete [] ifilename;
00110 return 0;
00111 }
00112
00113 msgInfo << "Reading Surf geometry output file..." << sendmsg;
00114 numtriangles = 0;
00115 int vertnum = 0;
00116 int atmindex;
00117 float vn[18];
00118
00119
00120
00121 while (fscanf(infile,
00122 "%d%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f",
00123 &atmindex,
00124 vn, vn+1, vn+2, vn+3, vn+4, vn+5,
00125 vn+6, vn+7, vn+8, vn+9,vn+10,vn+11,
00126 vn+12,vn+13,vn+14,vn+15,vn+16,vn+17) == 19) {
00127 if (!tri_degenerate(&vn[0], &vn[3], &vn[6])) {
00128 int i;
00129 ind.append(atmindex);
00130
00131 f.append(vertnum);
00132 vertnum++;
00133 f.append(vertnum);
00134 vertnum++;
00135 f.append(vertnum);
00136 vertnum++;
00137 numtriangles++;
00138
00139
00140 for (i=0; i<3; i++)
00141 v.append(vn[0+i]);
00142
00143 for (i=0; i<3; i++)
00144 n.append(vn[3+i]);
00145
00146 for (i=0; i<3; i++)
00147 v.append(vn[6+i]);
00148
00149 for (i=0; i<3; i++)
00150 n.append(vn[9+i]);
00151
00152 for (i=0; i<3; i++)
00153 v.append(vn[12+i]);
00154
00155 for (i=0; i<3; i++)
00156 n.append(vn[15+i]);
00157 }
00158 }
00159 fclose(infile);
00160
00161
00162 vmd_delete_file(ofilename);
00163 vmd_delete_file(ifilename);
00164 if (ifilename) delete [] ifilename;
00165 if (ofilename) delete [] ofilename;
00166
00167 msgInfo << "Read Surf output file, processing geometry..." << sendmsg;
00168
00169 return 1;
00170 }
00171
00172 void Surf::clear() {
00173 numtriangles=0;
00174 v.clear();
00175 n.clear();
00176 f.clear();
00177 ind.clear();
00178 }
00179