ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/xyz2pov/src/pdb2pov.c
Revision: 61
Committed: Thu Aug 1 21:12:33 2002 UTC (21 years, 11 months ago) by mmeineke
Content type: text/plain
File size: 10056 byte(s)
Log Message:
This commit was generated by cvs2svn to compensate for changes in r60, which
included commits to RCS files with non-trunk default branches.

File Contents

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