
/* PDB to grf converter.
   Author: Dr. Luca Ermanni
   29.7.2005
   Copyright: Luca Ermanni, 2005 */

#include <stdio.h>
#include <math.h>

main(an,av)
int an;
char *av[];

{

int K = 0;
FILE *fd;
int vb, ho, vo, hdst, vdst, mf;
int u1, u2, u3, hr, vr;
int i[100], n =0, l = 0, m = 0, c = 1;
char s[100][3];
float x[100], y[100], z[100];
int xtr[100], ytr[100];
int G[100][100];
int p, q;
int a[10];

for (p=0; p<100; p++)
    for (q=0; q<100; q++)
        G[p][q] = 0;

setParam(&vb, &ho, &vo, &hdst, &vdst, &mf);
if (vb == -1)
   vb = 50;
if (ho == -1)
   ho = 100;
if (vo == -1)
   vo = 100;
if (hdst == -1)
   hdst = 200;
if (vdst == -1)
   vdst = 200;
if (mf == -1)
   mf = 30;

while (++K < an) {

u1 = (int) sqrt((double) K);
u2 = (int) (K - u1*u1)/(u1+1);
u3 = (K - u1*u1)%(u1+1);
if (u2 == 0 && u3 == 0)
   { hr = u1-1;
     vr = u1-1; }
else if (u2 == 0)
   { hr = u1;
     vr = u3-1; }
else if (u2 == 1)
   { hr = u3;
     vr = u1; }

if ((fd = fopen(av[K],"r")) == NULL) {
   perror(av[K]);
   continue; }

while (c != EOF) {
      n = 0;
      if ((n = fscanf(fd, "ATOM%7d%*c%2c%*16c", &(i[l]), s[l])) == 2)
         ;
      else if ((n = fscanf(fd, "HETATM%5d%*c%2c%*16c", &(i[l]), s[l])) == 2)
         ;
      if (n == 2) {
         if (s[l][1] == 'H')
            s[l][0] = ' ';
         s[l][2] = '\0';
         n = 0;
         while ((c=getc(fd)) == ' ')
               ++n;
         ungetc(c,fd);
         if (n == 0)
            fscanf(fd, "%8f", &(x[l]));
         else if (n == 1)
            fscanf(fd, "%7f", &(x[l]));
         else if (n == 2)
            fscanf(fd, "%6f", &(x[l]));
         else if (n == 3)
            fscanf(fd, "%5f", &(x[l]));
         n = 0;
         while ((c=getc(fd)) == ' ')
               ++n;
         ungetc(c,fd);
         if (n == 0)
            fscanf(fd, "%8f", &(y[l]));
         else if (n == 1)
            fscanf(fd, "%7f", &(y[l]));
         else if (n == 2)
            fscanf(fd, "%6f", &(y[l]));
         else if (n == 3)
            fscanf(fd, "%5f", &(y[l]));
         fscanf(fd, "%8f", &(z[l]));
         xtr[l] = (int) (ho + hr*hdst + mf*x[l]);
         ytr[l] = (int) (vb + vo + vr*vdst + mf*y[l]);
         ++l;
         while ((c = getc(fd)) != '\n' && c != EOF)
               ;
         continue;  } 
      while ((c = fscanf(fd, "CONECT%d%d%d%d%d%d%d%d%d%d", &(a[0]), &(a[1]), &(a[2]), &(a[3]), &(a[4]), &(a[5]), &(a[6]),
&(a[7]), &(a[8]), &(a[9]))) > 1)
            for (p=1; p<c; p++)
                if (a[0] < a[p]) {
                   ++G[a[0]+m-1][a[p]+m-1]; ++G[a[p]+m-1][a[0]+m-1]; }
      while ((c = getc(fd)) != '\n' && c != EOF)
            ; }
for (p=m; p<l; p++)
    G[i[p]+m-1][i[p]+m-1] = getValue(s[p][0], s[p][1]);
m = l;
fclose(fd);
      }
printf("#%d ", l);
m = 0;
for (p=0; p<l; p++) 
    for (q=0; q<=p; q++)
        if ((c = G[p][q]) != 0) {
           printf("%d(%d,%d) ", c, p, q);
           if (m == 6) {
              printf("\n");
              m = 0; }
           else 
              ++m; }
printf("\njavaGraphics:\n");
for (c=0; c<l; c++)
    for (p=0; p<l; p++)
        if (i[c] - 1 == p)
           /* printf("%s, %.3f, %.3f, %.3f\n",s[c], x[c], y[c], z[c]);
           printf("%s %d %d\n", s[c], (int) (ho + hr*dst + mf*x[c]), (int) (vb + vo + vr*dst + mf*y[c])); */
           printf("%s %d %d\n", s[c], xtr[c], ytr[c]); 
}
