ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/analysisPack/gOfR.c
Revision: 23
Committed: Tue Jul 9 19:00:04 2002 UTC (21 years, 11 months ago) by mmeineke
Content type: text/plain
File size: 11835 byte(s)
Log Message:
This commit was generated by cvs2svn to compensate for changes in r22, which
included commits to RCS files with non-trunk default branches.

File Contents

# Content
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <unistd.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8
9 #include "atom_parser.h"
10 #include "pov_writer.h"
11 #include "file_stuff.h"
12 #define POV_DIR "./pov"
13
14 struct linked_xyz{
15 struct coords *r;
16 struct linked_xyz *next;
17 };
18
19 char *program_name; /*the name of the program */
20 int draw_bonds = 0; /* boolean to draw bonds or not */
21 int draw_hydrogens = 1; /*boolean to draw hydrogens */
22 int draw_atoms = 1; /*boolean to draw atoms */
23
24 void usage(void);
25
26 int main(argc, argv)
27 int argc;
28 char *argv[];
29 {
30
31
32 struct coords *out_coords;
33
34 int i,j; /* loop counters */
35 mode_t dir_mode = S_IRWXU;
36
37 int generate_header = 0; /* boolean for generating the pov ray header */
38 double big_x = 0;
39 double big_y = 0; /* lets me know the biggest x y and z */
40 double big_z = 0;
41 double small_x = 0;
42 double small_y = 0; /* lets me know the smallest x, y, z */
43 double small_z = 0;
44 double rsqr; /* the square of the diagonal */
45 double diagonal; /* the diagonal length of the sim box */
46
47 unsigned int n_atoms; /*the number of atoms in each time step */
48 char read_buffer[120]; /*the line buffer for reading */
49 char *eof_test; /*ptr to see when we reach the end of the file */
50 char *foo; /*the pointer to the current string token */
51 FILE *in_file; /* the input file */
52 FILE *out_file; /*the output file */
53 char *out_prefix = NULL; /*the prefix of the output file */
54 char out_name[500]; /*the output name */
55 char temp_name[500];
56 char *in_name = NULL; /*the name of the input file */
57 unsigned int n_out = 0; /*keeps track of which output file is being written*/
58
59 struct linked_xyz *current_frame;
60 struct linked_xyz *temp_frame;
61
62 unsigned int n_interpolate = 0; /* number of frames to interpolate */
63 double dx, dy, dz; /* temp variables for interpolating distances */
64
65 char pov_dir[500]; /* the pov_dir */
66
67 program_name = argv[0]; /*save the program name in case we need it*/
68
69 for( i = 0; i < argc; i++){
70
71 if(argv[i][0] =='-'){
72
73 /* argv[i][1] is the actual option character */
74
75 switch(argv[i][1]){
76
77 /* -H => generate header */
78
79 case 'H':
80 generate_header = 1;
81 break;
82
83 /* -i # => the number of frames to interpolate.
84 * [i+1] actually starts the name
85 */
86
87 case 'i':
88 (void)sscanf(argv[i+1],"%d", &n_interpolate);
89 break;
90
91 /* -f <name> => the xyz input file
92 * [i+1] actually starts the name
93 */
94
95 case 'f':
96 in_name = argv[i+1];
97 break;
98
99 /* -o <name> => the orientation file prefix
100 * [i+1] actually starts the name
101 */
102
103 case 'o':
104 out_prefix = argv[i+1];
105 break;
106
107 default:
108 (void)fprintf(stderr, "Bad option %s\n", argv[i]);
109 usage();
110 }
111 }
112 }
113
114 if(in_name == NULL){
115 usage();
116 }
117
118
119
120 in_file = fopen(in_name, "r");
121 if(in_file == NULL){
122 printf("Cannot open file: %s\n", in_name);
123 exit(8);
124 }
125
126 if(out_prefix == NULL){
127 out_prefix = strtok(in_name, ".");
128 }
129
130 if(access(POV_DIR, F_OK)){
131 /*create the pov directory*/
132 mkdir(POV_DIR, dir_mode);
133 }
134 strcpy(pov_dir, POV_DIR); strcat(pov_dir, "/");
135
136
137 // initialize atom type parser
138
139 initializeParser();
140
141 // start reading the first frame
142
143 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
144
145 current_frame = (struct linked_xyz *)malloc(sizeof(struct linked_xyz));
146 current_frame->next = NULL;
147
148
149 while(eof_test != NULL){
150
151 (void)sscanf(read_buffer, "%d", &n_atoms);
152 current_frame->r =
153 (struct coords *)calloc(n_atoms, sizeof(struct coords));
154
155 /*read and toss the comment line */
156
157 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
158 if(eof_test == NULL){
159 printf("error in reading file\n");
160 exit(8);
161 }
162
163 for( i=0; i < n_atoms; i++){
164
165 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
166 if(eof_test == NULL){
167 printf("error in reading file\n");
168 exit(8);
169 }
170
171 foo = strtok(read_buffer, " ,;\t");
172 (void)strcpy(current_frame->r[i].name, foo); /*copy the atom name */
173
174 /* next we grab the positions */
175
176 foo = strtok(NULL, " ,;\t");
177 if(foo == NULL){
178 printf("error in reading file\n");
179 exit(8);
180 }
181 (void)sscanf(foo, "%lf",&current_frame->r[i].x);
182 if(current_frame->r[i].x > big_x) big_x = current_frame->r[i].x;
183 if(current_frame->r[i].x < small_x) small_x = current_frame->r[i].x;
184
185
186 foo = strtok(NULL, " ,;\t");
187 if(foo == NULL){
188 printf("error in reading file\n");
189 exit(8);
190 }
191 (void)sscanf(foo, "%lf", &current_frame->r[i].y);
192 if(current_frame->r[i].y > big_y) big_y = current_frame->r[i].y;
193 if(current_frame->r[i].y < small_y) small_y = current_frame->r[i].y;
194
195
196 foo = strtok(NULL, " ,;\t");
197 if(foo == NULL){
198 printf("error in reading file\n");
199 exit(8);
200 }
201 (void)sscanf(foo, "%lf", &current_frame->r[i].z);
202 if(current_frame->r[i].z > big_z) big_z = current_frame->r[i].z;
203 if(current_frame->r[i].z < small_z) small_z = current_frame->r[i].z;
204
205 }
206
207 if(n_interpolate && current_frame->next != NULL){
208
209 temp_frame = current_frame->next;
210
211 for(i = 0; i < n_interpolate; i++){
212
213 /* open the new output file */
214
215 strcpy(out_name, pov_dir);
216 make_filename(temp_name, out_prefix, n_out);
217 strcat(out_name, temp_name); strcat(out_name, ".pov");
218 out_file = fopen(out_name, "w");
219 n_out++;
220 if(out_file == NULL){
221 printf("error opening output file: %s\n", out_name);
222 exit(8);
223 }
224 (void)fprintf(out_file,
225 "// The following script was automatically generated by:\n"
226 "// xyz2pov Copyright 2001 by MATTHEW A. MEINEKE\n"
227 "\n"
228 "#include \"pov_header.pov\"\n"
229 "\n");
230
231 out_coords =
232 (struct coords *)calloc(n_atoms, sizeof(struct coords));
233
234 for(j=0; j < n_atoms; j++){
235 dx = current_frame->r[j].x - temp_frame->r[j].x;
236 dy = current_frame->r[j].y - temp_frame->r[j].y;
237 dz = current_frame->r[j].z - temp_frame->r[j].z;
238
239 dx /= (double)(n_interpolate + 1);
240 dy /= (double)(n_interpolate + 1);
241 dz /= (double)(n_interpolate + 1);
242
243 strcpy(out_coords[j].name, temp_frame->r[j].name);
244 out_coords[j].x = temp_frame->r[j].x + dx * (i+1);
245 out_coords[j].y = temp_frame->r[j].y + dy * (i+1);
246 out_coords[j].z = temp_frame->r[j].z + dz * (i+1);
247 }
248
249 pov_write(out_file, out_coords, n_atoms, draw_hydrogens, draw_bonds,
250 draw_atoms);
251 free(out_coords);
252 (void)fclose(out_file);
253 }
254 }
255
256 /* open the new output file */
257
258 strcpy(out_name, pov_dir);
259 make_filename(temp_name, out_prefix, n_out);
260 strcat(out_name, temp_name); strcat(out_name, ".pov");
261 out_file = fopen(out_name, "w");
262 n_out++;
263 if(out_file == NULL){
264 printf("error opening output file: %s\n", out_name);
265 exit(8);
266 }
267 (void)fprintf(out_file,
268 "// The following script was automatically generated by:\n"
269 "// xyz2pov Copyright 2001 by MATTHEW A. MEINEKE\n"
270 "\n"
271 "#include \"pov_header.pov\"\n"
272 "\n");
273
274 out_coords =
275 (struct coords *)calloc(n_atoms, sizeof(struct coords));
276
277 for(i = 0; i < n_atoms; i++){
278 strcpy(out_coords[i].name, current_frame->r[i].name);
279 out_coords[i].x = current_frame->r[i].x;
280 out_coords[i].y = current_frame->r[i].y;
281 out_coords[i].z = current_frame->r[i].z;
282 }
283 pov_write(out_file, out_coords, n_atoms, draw_hydrogens, draw_bonds,
284 draw_atoms);
285 free(out_coords);
286
287 (void)fclose(out_file);
288
289 /*free up memory */
290
291 temp_frame = current_frame->next;
292 current_frame->next = NULL;
293
294 if(temp_frame != NULL){
295
296 free(temp_frame->r);
297 free(temp_frame);
298 }
299
300 /* make a new frame */
301
302 temp_frame = (struct linked_xyz *)malloc(sizeof(struct linked_xyz));
303 temp_frame->next = current_frame;
304 current_frame = temp_frame;
305
306 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
307
308 }
309
310 (void)fclose(in_file);
311
312
313 if(generate_header){
314
315 dx = big_x - small_x;
316 dy = big_y - small_y;
317 dz = big_z - small_z;
318
319 rsqr = dx * dx + dy * dy + dz * dz;
320 diagonal = sqrt(rsqr);
321 diagonal *= 0.5;
322
323 dx /= 2.0;
324 dy /= 2.0;
325 dz /= 2.0;
326
327 dx += small_x;
328 dy += small_y;
329 dz += small_z;
330
331
332 /*note the y and z axis is exchanged for the different coordinate
333 system in pov-ray*/
334
335
336 out_file = fopen("pov_header.pov", "w");
337
338 fprintf(out_file,
339 "// The following script was automatically generated by:\n"
340 "// xyz2pov Copyright 2001 by MATTHEW A. MEINEKE\n"
341 "\n"
342 "\n"
343 "background { rgb <1.0, 1.0, 1.0> }\n"
344 "\n"
345 "\n"
346 );
347
348 fprintf(out_file,
349 "//******************************************************\n"
350 "// Declare the resolution, camera, and light sources.\n"
351 "//******************************************************\n"
352 "\n"
353 "// NOTE: if you plan to render at a different resoltion,\n"
354 "// be sure to update the following two lines to maintain\n"
355 "// the correct aspect ratio.\n"
356 "\n"
357 "#declare Width = 640.0;\n"
358 "#declare Height = 480.0;\n"
359 "#declare Ratio = Width / Height;\n"
360 "\n"
361 "#declare zoom = %lf;\n"
362 "\n"
363 "#declare ATOM_SPHERE_FACTOR = 0.2;\n"
364 "#declare BOND_RADIUS = 0.1;\n"
365 "\n"
366 "camera{\n"
367 " location < %lf, %lf, %lf - zoom>\n"
368 " right < Ratio , 0, 0>\n"
369 " look_at < %lf, %lf, %lf >\n"
370 "}\n"
371 "\n",
372 diagonal,
373 dx, dz, dy,
374 dx, dz, dy);
375
376 fprintf(out_file,
377 "light_source{\n"
378 " < %lf, %lf, %lf - zoom >\n"
379 " rgb < 1.0, 1.0, 1.0 > }\n",
380 dx, dz, dy);
381
382 fprintf(out_file,
383 "light_source{\n"
384 " < %lf - zoom , %lf + zoom, %lf - zoom >\n"
385 " rgb < 1.0, 1.0, 1.0 > }\n"
386 "\n"
387 "\n",
388 dx, dz, dy);
389
390 fprintf(out_file,
391 "//************************************************************\n"
392 "// Set whether or not to rotate the system.\n"
393 "//\n"
394 "// To Rotate, set ROTATE to 1.0 (true),\n"
395 "// Then set the Euler Angles PHI, THETA, and PSI in degrees.\n"
396 "//************************************************************\n"
397 "\n"
398 "#declare ROTATE = 0.0;\n"
399 "#declare PHI = 0.0;\n"
400 "#declare THETA = 0.0;\n"
401 "#declare PSI = 0.0;\n"
402 "\n"
403 "#if(ROTATE)\n"
404 " #declare phi_r = radians(PHI);\n"
405 " #declare theta_r = radians(THETA);\n"
406 " #declare psi_r = radians(PSI);\n"
407 "\n"
408 " #declare A11 = cos(phi_r) * cos(psi_r) - sin(phi_r) * cos(theta_r) * sin(psi_r);\n"
409 " #declare A12 = sin(phi_r) * cos(psi_r) + cos(phi_r) * cos(theta_r) * sin(psi_r);\n"
410 " #declare A13 = sin(theta_r) * sin(psi_r);\n"
411 "\n"
412 " #declare A21 = -cos(phi_r) * sin(psi_r) - sin(phi_r) * cos(theta_r) * cos(psi_r);\n"
413 " #declare A22 = -sin(phi_r) * sin(psi_r) + cos(phi_r) * cos(theta_r) * cos(psi_r);\n"
414 " #declare A23 = sin(theta_r) * cos(psi_r);\n"
415 "\n"
416 " #declare A31 = sin(phi_r) * sin(theta_r);\n"
417 " #declare A32 = -cos(phi_r) * sin(theta_r);\n"
418 " #declare A33 = cos(theta_r);\n"
419 "\n"
420 "#end\n"
421 "\n");
422
423
424 make_header_macros(out_file);
425
426 fclose(out_file);
427 }
428
429 return 0;
430
431 }
432
433
434
435 /***************************************************************************
436 * prints out the usage for the command line arguments, then exits.
437 ***************************************************************************/
438
439 void usage(){
440 (void)fprintf(stderr,
441 "The proper usage is: %s [options] -f <xyz_file>\n\n"
442 "Options:\n"
443 " -o <name> the output file prefix\n"
444 " -H generate a pov-ray header file\n"
445 " -i # number of frames to interpolate\n",
446 program_name);
447 exit(8);
448 }