ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/SHAPES/forcer.cpp
Revision: 1287
Committed: Wed Jun 23 20:18:48 2004 UTC (20 years, 2 months ago) by chrisfen
File size: 7249 byte(s)
Log Message:
Major progress towards inclusion of spherical harmonic transform capability - still having some build issues...

File Contents

# User Rev Content
1 gezelter 1240 #include <iostream>
2     #include <fstream>
3     #include <string>
4     #include <vector>
5     #include "forcerCmd.h"
6     #include "PDBReader.hpp"
7 gezelter 1271 #include "RigidBody.hpp"
8 chrisfen 1279 #include "GridBuilder.hpp"
9 gezelter 1240
10     #define MK_STR(s) # s
11     #define STR_DEFINE(t, s) t = MK_STR(s)
12     #define CHARMM 1
13     #define AMBER 2
14     #define LJ 3
15     #define GAFF 4
16     #define OPLS 5
17    
18     int count_tokens(char *line, char *delimiters);
19     using namespace std;
20    
21     class Atype{
22     public:
23     Atype() {
24     mass = 0.0;
25     rpar = 0.0;
26     eps = 0.0;
27     }
28    
29     void setMass(double m) {mass = m;}
30     void setRpar(double rp) {rpar = rp;}
31     void setEps(double e) {eps = e;}
32     void setType(char* t) {strcpy(type, t);}
33     double getMass() {return mass;}
34     double getRpar() {return rpar;}
35     double getEps() {return eps;}
36     char *getType() {return type;}
37    
38     private:
39     char type[100];
40     double mass;
41     double rpar;
42     double eps;
43     };
44    
45     int main(int argc, char* argv[]){
46    
47     gengetopt_args_info args_info;
48    
49     vector<Atype*> vdwAtypes;
50     vector<Atype*>::iterator i;
51     Atype* at;
52 gezelter 1271 RigidBody* rb;
53 gezelter 1240 vector<VDWAtom*> theAtoms;
54     vector<VDWAtom*>::iterator j;
55     VDWAtom* atom;
56 chrisfen 1279 GridBuilder* gb;
57     vector<double> sigmaGrid;
58     vector<double> epsGrid;
59     vector<double> sGrid;
60    
61 gezelter 1240 double mass, rpar, eps;
62 chrisfen 1286 double xyz3[3];
63 gezelter 1240 string fileName;
64     char vdwFileName[2002];
65     char structureFileName[2002];
66     char temp[200];
67     char readLine[500];
68 chrisfen 1286 char xyzFile[200];
69 chrisfen 1287 char shapeFile[200];
70 gezelter 1240 FILE *vdwFile, *structureFile;
71 gezelter 1244 char* ffPath_env = "VDW_PATH";
72 gezelter 1240 char* ffPath;
73     char* eof_test;
74     char* foo;
75     char* myType;
76     char* vType;
77 chrisfen 1286 char *token;
78     const char *file;
79     const char *period = ".";
80     int k;
81 gezelter 1240 int lineNum;
82     int nTokens;
83     int FF;
84 chrisfen 1275 int bandwidth;
85 chrisfen 1287 int gridwidth;
86 gezelter 1240 short int gotMatch;
87    
88     //parse the command line options
89     if (cmdline_parser (argc, argv, &args_info) != 0)
90     exit(1) ;
91    
92     if (args_info.input_given){
93     fileName = args_info.input_arg;
94     }
95     else{
96     std::cerr << "Does not have input file name" << endl;
97     exit(1);
98     }
99    
100 chrisfen 1286 file = fileName.c_str();
101     strcpy(xyzFile, file);
102     token = strtok(xyzFile, period);
103     strcpy(xyzFile, token);
104 chrisfen 1287 strcpy(shapeFile, token);
105     strcat(xyzFile, "Ref.xyz");
106     strcat(shapeFile, ".shape");
107 chrisfen 1286 ofstream xfiles(xyzFile);
108    
109 chrisfen 1281 //the bandwidth has a default value (default=16), so it is always given
110 chrisfen 1275 bandwidth = args_info.bandwidth_arg;
111 chrisfen 1287 gridwidth = bandwidth*2;
112 chrisfen 1275
113 gezelter 1240 if (args_info.charmm_given) {
114     FF=CHARMM;
115     strcpy(vdwFileName, "charmm27.vdw");
116     }
117    
118     if (args_info.amber_given) {
119     FF=AMBER;
120     strcpy(vdwFileName, "amber99.vdw");
121     }
122    
123     if (args_info.lj_given) {
124     FF=LJ;
125     strcpy(vdwFileName, "LJ.vdw");
126     }
127    
128     if (args_info.gaff_given) {
129     FF=GAFF;
130     strcpy(vdwFileName, "gaff.vdw");
131     }
132    
133     if (args_info.opls_given) {
134     FF=OPLS;
135     strcpy(vdwFileName, "oplsaal.vdw");
136     }
137    
138 gezelter 1274
139     printf ("opening %s\n", vdwFileName);
140 gezelter 1240 vdwFile = fopen( vdwFileName, "r" );
141    
142     if( vdwFile == NULL ){
143    
144     // next see if the force path enviorment variable is set
145    
146     ffPath = getenv( ffPath_env );
147     if( ffPath == NULL ) {
148     STR_DEFINE(ffPath, FRC_PATH );
149     }
150    
151     strcpy( temp, ffPath );
152     strcat( temp, "/" );
153     strcat( temp, vdwFileName );
154     strcpy( vdwFileName, temp );
155    
156 gezelter 1274 printf ("opening %s\n", vdwFileName);
157 gezelter 1240 vdwFile = fopen( vdwFileName, "r" );
158    
159     if( vdwFile == NULL ){
160    
161     printf( "Error opening the vanDerWaals parameter file: %s\n"
162 gezelter 1244 "Have you tried setting the VDW_PARAM_DIR environment "
163 gezelter 1240 "variable?\n",
164     vdwFileName );
165     exit(-1);
166     }
167 gezelter 1274 }
168     printf( "VDW file %s opened sucessfully.\n", vdwFileName );
169     lineNum = 0;
170    
171     eof_test = fgets( readLine, sizeof(readLine), vdwFile );
172     lineNum++;
173    
174     if( eof_test == NULL ){
175     printf("Error in reading Atoms from force file at line %d.\n",
176     lineNum );
177     exit(-1);
178     }
179    
180     while( eof_test != NULL ){
181     // toss comment lines
182     if( readLine[0] != '!' && readLine[0] != '#' ){
183    
184     nTokens = count_tokens(readLine, " ,;\t");
185     if (nTokens < 4) {
186     printf("Not enough tokens on line %d.\n", lineNum);
187     exit(-1);
188     }
189    
190     at = new Atype();
191     foo = strtok(readLine, " ,;\t");
192     at->setType(foo);
193     foo = strtok(NULL, " ,;\t");
194     mass = atof(foo);
195     at->setMass(mass);
196     foo = strtok(NULL, " ,;\t");
197     rpar = atof(foo);
198     at->setRpar(rpar);
199     foo = strtok(NULL, " ,;\t");
200     eps = atof(foo);
201     at->setEps(eps);
202     vdwAtypes.push_back(at);
203     }
204 gezelter 1240 eof_test = fgets( readLine, sizeof(readLine), vdwFile );
205     lineNum++;
206 gezelter 1274 }
207    
208     fclose( vdwFile );
209    
210 gezelter 1240 printf("%d Atom Types read from VDW file\n", vdwAtypes.size());
211    
212     // Now, open and parse the input file!
213    
214     strcpy(structureFileName, fileName.c_str() );
215    
216     PDBReader* PDBread = new PDBReader();
217     PDBread->setPDBfile(structureFileName);
218     theAtoms = PDBread->getAtomList();
219     printf("Found %d atoms\n", theAtoms.size());
220    
221     for( j = theAtoms.begin(); j != theAtoms.end(); ++j){
222     atom = *j;
223     myType = atom->getType();
224     gotMatch = 0;
225    
226     for( i = vdwAtypes.begin(); i != vdwAtypes.end(); ++i){
227     at = *i;
228     vType = at->getType();
229    
230     if (!strcasecmp(myType, vType)) {
231     atom->setMass(at->getMass());
232     atom->setRpar(at->getRpar());
233     atom->setEps(at->getEps());
234     gotMatch = 1;
235     }
236     }
237     if (!gotMatch) {
238     printf("No matches found for %s, ", myType);
239     myType = atom->getBase();
240     printf("trying with BaseType %s\n", myType);
241     for( i = vdwAtypes.begin(); i != vdwAtypes.end(); ++i){
242     at = *i;
243     vType = at->getType();
244     if (!strcasecmp(myType, vType)) {
245     atom->setMass(at->getMass());
246     atom->setRpar(at->getRpar());
247     atom->setEps(at->getEps());
248     gotMatch = 1;
249     }
250     }
251     }
252    
253     if (!gotMatch) {
254     printf("No matches found with BaseType!\n");
255     }
256     }
257    
258 gezelter 1271 rb = new RigidBody();
259     for( j = theAtoms.begin(); j != theAtoms.end(); ++j){
260 gezelter 1274 rb->addAtom(*j);
261 gezelter 1271 }
262 chrisfen 1281
263 chrisfen 1279 rb->calcRefCoords();
264    
265 chrisfen 1286 //print a reference coordinate xyz file
266     xfiles << rb->getNumAtoms() << "\n\n";
267     for (k=0; k<rb->getNumAtoms(); k++){
268     rb->getAtomRefCoor(xyz3, k);
269 chrisfen 1287 xfiles << rb->getAtomBase(k) << "\t" <<
270 chrisfen 1286 xyz3[0] << "\t" << xyz3[1] << "\t" <<
271     xyz3[2] << "\n";
272     }
273    
274 chrisfen 1287 gb = new GridBuilder(rb, gridwidth);
275 chrisfen 1275
276 chrisfen 1281 cout << "Doing GridBuilder calculations...\n";
277 chrisfen 1279 gb->launchProbe(FF, sigmaGrid, sGrid, epsGrid);
278 chrisfen 1281
279 chrisfen 1287 gb->printGridFiles();
280    
281     //load the grid element values to the main grid vectors
282     for (k=0; k<gridwidth*gridwidth; k++){
283     sigmaGrid.push_back(gb->passSig(k));
284     sGrid.push_back(gb->passS(k));
285     epsGrid.push_back(gb->passEps(k));
286     }
287    
288    
289    
290 gezelter 1240 }
291    
292     int count_tokens(char *line, char *delimiters) {
293     /* PURPOSE: RETURN A COUNT OF THE NUMBER OF TOKENS ON THE LINE. */
294    
295     char *working_line; /* WORKING COPY OF LINE. */
296     int ntokens; /* NUMBER OF TOKENS FOUND IN LINE. */
297     char *strtok_ptr; /* POINTER FOR STRTOK. */
298    
299     strtok_ptr= working_line= strdup(line);
300    
301     ntokens=0;
302     while (strtok(strtok_ptr,delimiters)!=NULL)
303     {
304     ntokens++;
305     strtok_ptr=NULL;
306     }
307    
308     free(working_line);
309     return(ntokens);
310     }