ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/madProps/madProps.c
Revision: 103
Committed: Thu Aug 29 17:21:54 2002 UTC (21 years, 10 months ago) by mmeineke
Content type: text/plain
File size: 9735 byte(s)
Log Message:
fixed a cosCorr and GofR flag bug, as well as the GofR scaling bug.

File Contents

# Content
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5
6
7 #include "madProps.h"
8 #include "frameCount.h"
9
10 char *program_name; /*the name of the program */
11
12 void usage(void);
13
14 int main(argc, argv)
15 int argc;
16 char *argv[];
17 {
18
19
20 struct xyz_frame *dumpArray;
21 int nFrames; // the nu8mvber of frames
22 int lineNum = 0; // keeps track of the line number
23 int n_atoms; // the number of atoms
24 int i,j; // loop counters
25 int isFirst;
26
27 char read_buffer[2000]; /*the line buffer for reading */
28 char *foo; /*the pointer to the current string token */
29 FILE *in_file; /* the input file */
30 char *in_name = NULL; /*the name of the input file */
31 char *out_prefix; // the output prefix
32 char current_flag; // used in parseing the flags
33
34
35
36 int done = 0; // multipurpose boolean
37 int have_prefix = 0; // prefix boolean
38 int calcRMSD = 0;
39
40 int calcGofR = 0;
41 char gofR1[30];
42 char gofR2[30];
43
44 int calcMuCorr = 0;
45 char muCorr[30];
46
47 int calcCosCorr = 0;
48 char cosCorr1[30];
49 char cosCorr2[30];
50
51 int startFrame = 0;
52 int haveStartFrame = 0;
53 int endFrame = 0;
54 int haveEndFrame = 0;
55
56 program_name = argv[0]; /*save the program name in case we need it*/
57
58 for( i = 1; i < argc; i++){
59
60 if(argv[i][0] =='-'){
61
62 // parse the option
63
64 if(argv[i][1] == '-' ){
65
66 // parse long word options
67
68 if( !strcmp( argv[i], "--GofR" ) ){
69 calcGofR = 1;
70 i++;
71 strcpy( gofR1, argv[i] );
72 i++;
73 strcpy( gofR2, argv[i] );
74 }
75
76 else if( !strcmp( argv[i], "--CosCorr" ) ){
77 calcCosCorr = 1;
78 i++;
79 strcpy( cosCorr1, argv[i] );
80 i++;
81 strcpy( cosCorr2, argv[i] );
82 }
83
84 else if( !strcmp( argv[i], "--MuCorr") ){
85 calcMuCorr = 1;
86 i++;
87 strcpy( muCorr, argv[i] );
88 }
89
90 else if( !strcmp( argv[i], "--startFrame" ) ){
91 haveStartFrame = 1;
92 i++;
93 startFrame = atoi(argv[i]);
94 startFrame--;
95 }
96
97 else if( !strcmp( argv[i], "--endFrame" ) ){
98 haveEndFrame = 1;
99 i++;
100 endFrame = atoi(argv[i]);
101 }
102
103 else{
104 fprintf( stderr,
105 "Invalid option \"%s\"\n", argv[i] );
106 usage();
107 }
108 }
109
110 else{
111
112 // parse single character options
113
114 done =0;
115 j = 1;
116 current_flag = argv[i][j];
117 while( (current_flag != '\0') && (!done) ){
118
119 switch(current_flag){
120
121 case 'o':
122 // -o <prefix> => the output prefix.
123
124 i++;
125 out_prefix = argv[i];
126 have_prefix = 1;
127 done = 1;
128 break;
129
130 case 'h':
131 // -h => give the usage
132
133 usage();
134 break;
135
136 case 'r':
137 // calculates the rmsd
138
139 calcRMSD = 1;
140 break;
141
142 case 'g':
143 // calculate all to all g(r)
144
145 calcGofR = 1;
146 strcpy( gofR1, "all" );
147 strcpy( gofR2, "all" );
148 break;
149
150 default:
151
152 fprintf( stderr, "about to print bad option\n" );
153
154 (void)fprintf(stderr, "Bad option \"-%s\"\n", current_flag);
155 usage();
156 }
157 j++;
158 current_flag = argv[i][j];
159 }
160 }
161 }
162
163 else{
164
165 if( in_name != NULL ){
166 fprintf( stderr,
167 "Error at \"%s\", program does not currently support\n"
168 "more than one input file.\n"
169 "\n",
170 argv[i]);
171 usage();
172 }
173
174 in_name = argv[i];
175 }
176 }
177
178 if(in_name == NULL){
179 usage();
180 }
181
182 if( !have_prefix ) out_prefix = in_name;
183
184 printf( "Counting number of frames..." );
185 fflush( stdout );
186
187 nFrames = frameCount( in_name );
188 if( !haveEndFrame ) endFrame = nFrames;
189
190 printf( "done.\n"
191 "nframes = %d\n"
192 "\n",
193 nFrames );
194 fflush( stdout );
195
196 in_file = fopen(in_name, "r");
197 if(in_file == NULL){
198 printf("Cannot open file: %s\n", in_name);
199 exit(8);
200 }
201
202 // create and initialize the array of frames
203
204 dumpArray = (struct xyz_frame*)calloc( nFrames,
205 sizeof( struct xyz_frame ) );
206 for( i=0; i<nFrames; i++ ){
207 dumpArray[i].nAtoms = 0;
208 dumpArray[i].time = 0.0;
209 dumpArray[i].boxX = 0.0;
210 dumpArray[i].boxY = 0.0;
211 dumpArray[i].boxZ = 0.0;
212 dumpArray[i].r = NULL;
213 dumpArray[i].v = NULL;
214 dumpArray[i].names = NULL;
215 }
216
217 // read the frames
218
219 printf( "Reading the frames into the coordinate arrays..." );
220 fflush( stdout );
221
222 isFirst = 1;
223 for(j =0; j<nFrames; j++ ){
224
225 // read the number of atoms
226
227 fgets(read_buffer, sizeof(read_buffer), in_file);
228 lineNum++;
229
230 n_atoms = atoi( read_buffer );
231 dumpArray[j].nAtoms = n_atoms;
232
233 dumpArray[j].r =
234 (struct coords *)calloc(n_atoms, sizeof(struct coords));
235
236 if( isFirst ) {
237 dumpArray[0].names =
238 (atomID *)calloc( n_atoms, sizeof(atomID) );
239 isFirst = 0;
240 }
241
242 if( calcMuCorr || calcCosCorr ){
243 dumpArray[j].v =
244 (struct vect *)calloc(n_atoms, sizeof(struct vect));
245 }
246
247 //read the time and the box sizes
248
249 fgets(read_buffer, sizeof(read_buffer), in_file);
250 lineNum++;
251
252 foo = strtok(read_buffer, " ,;\t");
253 if(foo == NULL){
254 printf("error in reading time at line %d\n", lineNum);
255 exit(8);
256 }
257
258 dumpArray[j].time = atof( foo );
259
260 foo = strtok(NULL, " ,;\t");
261 if(foo == NULL){
262 printf("error in reading boxX at line %d\n", lineNum);
263 exit(8);
264 }
265
266 dumpArray[j].boxX = atof( foo );
267
268 foo = strtok(NULL, " ,;\t");
269 if(foo == NULL){
270 printf("error in reading boxY at line %d\n", lineNum);
271 exit(8);
272 }
273
274 dumpArray[j].boxY = atof( foo );
275
276 foo = strtok(NULL, " ,;\t");
277 if(foo == NULL){
278 printf("error in reading boxZ at line %d\n", lineNum);
279 exit(8);
280 }
281
282 dumpArray[j].boxZ = atof( foo );
283
284
285 for( i=0; i < n_atoms; i++){
286
287 fgets(read_buffer, sizeof(read_buffer), in_file);
288 lineNum++;
289
290 // get the name and positions
291
292 foo = strtok(read_buffer, " ,;\t");
293 if(foo == NULL){
294 printf("error in reading atom name at line %d\n", lineNum );
295 exit(8);
296 }
297
298 strcpy(dumpArray[0].names[i], foo); /*copy the atom name */
299
300 foo = strtok(NULL, " ,;\t");
301 if(foo == NULL){
302 printf("error in reading position x at line %d\n", lineNum);
303 exit(8);
304 }
305
306 dumpArray[j].r[i].x = atof( foo );
307
308 foo = strtok(NULL, " ,;\t");
309 if(foo == NULL){
310 printf("error in reading position y at line %d\n", lineNum);
311 exit(8);
312 }
313
314 dumpArray[j].r[i].y = atof( foo );
315
316 foo = strtok(NULL, " ,;\t");
317 if(foo == NULL){
318 printf("error in reading position z at line %d\n", lineNum);
319 exit(8);
320 }
321
322 dumpArray[j].r[i].z = atof( foo );
323
324 if( calcCosCorr || calcMuCorr ){
325
326 foo = strtok(NULL, " ,;\t");
327 if(foo == NULL){
328
329 dumpArray[j].v[i].x = 0.0;
330 dumpArray[j].v[i].y = 0.0;
331 dumpArray[j].v[i].z = 0.0;
332 }
333 else{
334
335 dumpArray[j].v[i].x = atof( foo );
336
337 foo = strtok(NULL, " ,;\t");
338 if(foo == NULL){
339 printf("error in reading vector y at line %d\n", lineNum);
340 exit(8);
341 }
342
343 dumpArray[j].v[i].y = atof( foo );
344
345 foo = strtok(NULL, " ,;\t");
346 if(foo == NULL){
347 printf("error in reading vector z at line %d\n", lineNum);
348 exit(8);
349 }
350
351 dumpArray[j].v[i].z = atof( foo );
352 }
353 }
354
355 }
356 }
357
358 (void)fclose(in_file);
359
360 printf( "done\n"
361 "\n" );
362 fflush( stdout );
363
364
365
366 // do calculations here.
367
368 if( calcGofR ){
369
370 fprintf( stdout,
371 "Calculating the g(r) between atoms \"%s\" and \"%s\"...",
372 gofR1, gofR2 );
373 fflush( stdout );
374
375 // gofr call
376 GofR( out_prefix, gofR1, gofR2, dumpArray, nFrames, startFrame, endFrame );
377
378 fprintf( stdout,
379 " done.\n"
380 "\n");
381 fflush(stdout);
382 }
383
384 if( calcRMSD ){
385
386 fprintf( stdout,
387 "Calculating the RMSD..." );
388 fflush( stdout );
389
390 // RMSD call
391
392
393 fprintf( stdout,
394 " done.\n"
395 "\n");
396 fflush(stdout);
397 }
398
399 if( calcMuCorr ){
400
401 fprintf( stdout,
402 "Calculating the mu correlation for \"%s\"...",
403 muCorr);
404 fflush( stdout );
405
406 // muCorr call
407
408
409 fprintf( stdout,
410 " done.\n"
411 "\n");
412 fflush(stdout);
413 }
414
415 if( calcCosCorr ){
416
417 fprintf( stdout,
418 "Calculating the cos correlation between \"%s\" and \"%s\"...",
419 cosCorr1, cosCorr2 );
420 fflush( stdout );
421
422 cosCorr( out_prefix, cosCorr1, cosCorr2, dumpArray, nFrames, startFrame,
423 endFrame );
424
425 fprintf( stdout,
426 " done.\n"
427 "\n");
428 fflush(stdout);
429 }
430
431 return 0;
432
433 }
434
435
436 void map( double *x, double *y, double *z,
437 double boxX, double boxY, double boxZ ){
438
439 *x -= boxX * copysign(1.0,*x) * floor( fabs( *x/boxX ) + 0.5 );
440 *y -= boxY * copysign(1.0,*y) * floor( fabs( *y/boxY ) + 0.5 );
441 *z -= boxZ * copysign(1.0,*z) * floor( fabs( *z/boxZ ) + 0.5 );
442
443 }
444
445
446 /***************************************************************************
447 * prints out the usage for the command line arguments, then exits.
448 ***************************************************************************/
449
450 void usage(){
451 (void)fprintf(stdout,
452 "The proper usage is: %s [options] <xyz_file>\n"
453 "\n"
454 "Options:\n"
455 "\n"
456 " short:\n"
457 " ------\n"
458 " -h Display this message\n"
459 " -o <prefix> The output prefix\n"
460 " -r Calculate the RMSD\n"
461 " -g Calculate all to all g(r)\n"
462
463 "\n"
464 " long:\n"
465 " -----\n"
466 " --GofR <atom1> <atom2> Calculates g(r) between atom1 and atom 2\n"
467 " -note: \"all\" will do all atoms\n"
468 " --MuCorr <atom> Calculate mu correlation of atom\n"
469 " --CosCorr <atom1> <atom2> Calculate the cos correlation between atom1 and atom2\n"
470 " --startFrame <frame#> Specifies a frame to start correlating\n"
471 " --endFrame <frame#> Specifies a frame to stop correlating.\n"
472
473 "\n"
474 "\n",
475 program_name);
476 exit(8);
477 }