********> bugfix.40 Author: Bill Ross Date: Jul 16 99 Programs: Carnal Severity: Moderate Description: Writing pdb files: when residue number exceeds the pdb standard field (>9999), the coordinates get pushed to the right. For example: ATOM 34033 H2 WAT 9999 16.697 72.812 10.822 TER ATOM 34034 O WAT 10000 26.851 73.486 6.500 Fix: Make the following changes to pdbgen.c: ---------------------------------------------------------------------- *** OLD pdbgen.c --- NEW pdbgen.c *************** *************** *** 128,138 **** exit(1); } for (j=0; jNres; j++) { ! int j4 = 4 * j; #ifdef DBG printf("pdbgen res %d Nres %d\n", j+1, prm->Nres); #endif /* * consider residue's connectivity to prev res */ if (NewMol[j]) --- 127,151 ---- exit(1); } for (j=0; jNres; j++) { ! char sresnum[15], sresnumplus[20]; ! int len, j4 = 4 * j; ! #ifdef DBG printf("pdbgen res %d Nres %d\n", j+1, prm->Nres); #endif /* + * try to allow for residue number overflow (>9999) + * by appropriating an extra column + */ + sprintf(sresnum, "%4d", j+1); + len = 8 - strlen(sresnum); + if (len < 0) { + fprintf(stderr, "too many residues for pdb format\n"); + exit(1); + } + sprintf(sresnumplus, "%s%.*s", sresnum, len, " "); + + /* * consider residue's connectivity to prev res */ if (NewMol[j]) *************** *** 151,158 **** else sprintf(atnam, "%.4s", &AtomNames[k4]); fprintf(file, ! "ATOM %6d %-.4s %-.4s %4d %8.3f%8.3f%8.3f\n", ! k+1, atnam, &ResNames[j4], j+1, ixyz[0], ixyz[1], ixyz[2]); ixyz += 3; --- 164,172 ---- else sprintf(atnam, "%.4s", &AtomNames[k4]); fprintf(file, ! "ATOM %6d %-.4s %-.4s %s%8.3f%8.3f%8.3f\n", ! k+1, atnam, &ResNames[j4], ! sresnumplus, ixyz[0], ixyz[1], ixyz[2]); ixyz += 3; ----------------------------------------------------------------------