source: util/GetPdb.c@ bd7b85

Last change on this file since bd7b85 was a0bcf1, checked in by Frederik Heber <heber@…>, 17 years ago

-initial commit
-Minimum set of files needed from ESPACK SVN repository
-Switch to three tantamount package parts instead of all relating to pcp (as at some time Ralf's might find inclusion as well)

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*
2 Project: CP
3 Jan Hamaekers
4 1999
5
6 File: GetPdb.c
7*/
8
9#include<stdlib.h>
10#include<stdio.h>
11#include<math.h>
12#include"mergesort.h"
13struct Coord {
14 double coord[3];
15 int Z;
16};
17double GetKey(void *C) { return(((struct Coord*)C)->Z); }
18
19
20
21
22void GetPdb(FILE *source, FILE *target, int max) {
23 struct Coord **sequence;
24 int i;
25 int dummyint,dummyint2;
26 char atomchar;
27 char dummystr[80];
28 double center[3][2] = {{0.,0.},{0.,0.},{0.,0.}};
29 double Bohr = 0.52919;
30 sequence = (struct Coord **)
31 malloc(sizeof(struct Coord*)*max);
32 for (i=0; i < max; i++) {
33 sequence[i] = (struct Coord *)
34 malloc(sizeof(struct Coord));
35 fscanf(source,"%s %i %c %i %lg %lg %lg",dummystr,&dummyint,&atomchar,&dummyint2, &sequence[i]->coord[0], &sequence[i]->coord[1], &sequence[i]->coord[2]);
36 if (i==0) {
37 center[0][0] = sequence[i]->coord[0];
38 center[0][1] = sequence[i]->coord[0];
39 center[1][0] = sequence[i]->coord[1];
40 center[1][1] = sequence[i]->coord[1];
41 center[2][0] = sequence[i]->coord[2];
42 center[2][1] = sequence[i]->coord[2];
43 switch (atomchar) {
44 case 'H':
45 sequence[i]->Z = 1;
46 break;
47 case 'B':
48 sequence[i]->Z = 5;
49 break;
50 case 'N':
51 sequence[i]->Z = 7;
52 break;
53 }
54 } else {
55 if (sequence[i]->coord[0] < center[0][0]) center[0][0] = sequence[i]->coord[0];
56 if (sequence[i]->coord[0] > center[0][1]) center[0][1] = sequence[i]->coord[0];
57 if (sequence[i]->coord[1] < center[1][0]) center[1][0] = sequence[i]->coord[1];
58 if (sequence[i]->coord[1] > center[1][1]) center[1][1] = sequence[i]->coord[1];
59 if (sequence[i]->coord[2] < center[2][0]) center[2][0] = sequence[i]->coord[2];
60 if (sequence[i]->coord[2] > center[2][1]) center[2][1] = sequence[i]->coord[2];
61 switch (atomchar) {
62 case 'H':
63 sequence[i]->Z = 1;
64 break;
65 case 'B':
66 sequence[i]->Z = 5;
67 break;
68 case 'N':
69 sequence[i]->Z = 7;
70 break;
71 }
72 }
73 }
74 naturalmergesort((void **)sequence,0,max-1,&GetKey);
75 fprintf(target,"Lattice in Bohr\n%g %g, %g %g, %g %g\nCenter in Angstroem %g %g %g\n",center[0][0]/Bohr,center[0][1]/Bohr,center[1][0]/Bohr,center[1][1]/Bohr,center[2][0]/Bohr,center[2][1]/Bohr, (center[0][0]+center[0][1])/2,(center[1][0]+center[1][1])/2 , (center[2][0]+center[2][1])/2);
76 dummyint = 0;
77 dummyint2 = 0;
78 for (i =0;i < max;i++) {
79 if (sequence[i]->Z != dummyint) {
80 fprintf(target,"Atom: Following Z(%i) BeforeMax(%i)\n",sequence[i]->Z,dummyint2);
81 dummyint2=0;
82 }
83 dummyint2++;
84 dummyint = sequence[i]->Z;
85 fprintf(target,"%g %g %g\n", sequence[i]->coord[0], sequence[i]->coord[1], sequence[i]->coord[2]);
86 free(sequence[i]);
87 }
88 free(sequence);
89 fprintf(target,"Atom: BeforeMax(%i)\n",dummyint2);
90}
91
92int main(int argc, char** argv) {
93 int max;
94 FILE *source;
95 FILE *target;
96 if(argc < 4) {
97 fprintf(stderr,"Not enough arguments\nUsage: GetPdb source target nmax\n");
98 exit(1);
99 }
100 source = fopen(argv[1], "r");
101 if(source == 0) {
102 fprintf(stderr,"Could not open source\n");
103 exit(1);
104 }
105 target = fopen(argv[2], "w");
106 if(target == 0) {
107 fprintf(stderr,"Could not open target\n");
108 exit(1);
109 }
110 max = atoi(argv[3]);
111 fprintf(stderr,"Input: source: %s \ntarget: %s\nmax %i\n", argv[1], argv[2],max);
112 GetPdb(source,target,max);
113 fclose(source);
114 fclose(target);
115 return 0;
116}
Note: See TracBrowser for help on using the repository browser.