4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
11 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13 * Copyright (c) 2001-2004, The GROMACS development team,
14 * check out http://www.gromacs.org for more information.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * For more info, check our website at http://www.gromacs.org
34 * Good gRace! Old Maple Actually Chews Slate
40 /* Output from p2c, the Pascal-to-C translator */
41 /* From input file "dssp.p" */
45 /************************************************************
49 ************************************************************/
56 /* Header file for code generated by "p2c", the Pascal-to-C translator */
58 /* "p2c" Copyright (C) 1989, 1990, 1991 Free Software Foundation.
59 * By Dave Gillespie, daveg@csvax.cs.caltech.edu. Version 1.19.
60 * This file may be copied, modified, etc. in any way. It is not restricted
61 * by the licence agreement accompanying p2c itself.
69 /* If the following heuristic fails, compile -DBSD=0 for non-BSD systems,
70 or -DBSD=1 for BSD systems. */
91 #ifdef FILE /* a #define in BSD, a typedef in SYSV (hp-ux, at least) */
92 # ifndef BSD /* (a convenient, but horrible kludge!) */
118 # ifdef _INCLUDE__STDC__
123 # include <sys/types.h>
124 # if !defined(MSDOS) || defined(__TURBOC__)
130 # define __CAT__(a,b)__ID__(a)b
132 # define __CAT__(a,b)a##b
137 # include <strings.h>
138 # define memcpy(a,b,n) (bcopy(b,a,n),a)
139 # define memcmp(a,b,n) bcmp(a,b,n)
140 # define strchr(s,c) index(s,c)
141 # define strrchr(s,c) rindex(s,c)
160 #define LACK_LABS /* Undefine these if your library has these */
166 typedef struct __p2c_jmp_buf
{
167 struct __p2c_jmp_buf
*next
;
172 /* Warning: The following will not work if setjmp is used simultaneously.
173 This also violates the ANSI restriction about using vars after longjmp,
174 but a typical implementation of longjmp will get it right anyway. */
177 # define TRY(x) do { __p2c_jmp_buf __try_jb; \
178 __try_jb.next = __top_jb; \
179 if (!setjmp((__top_jb = &__try_jb)->jbuf)) {
180 # define RECOVER(x) __top_jb = __try_jb.next; } else {
181 # define RECOVER2(x,L) __top_jb = __try_jb.next; } else { \
182 if (0) { L: __top_jb = __try_jb.next; }
183 # define ENDTRY(x) } } while (0)
185 # define TRY(x) if (1) {
186 # define RECOVER(x) } else do {
187 # define RECOVER2(x,L) } else do { L: ;
188 # define ENDTRY(x) } while (0)
193 #ifdef M_XENIX /* avoid compiler bug */
194 # define SHORT_MAX (32767)
195 # define SHORT_MIN (-32768)
199 /* The following definitions work only on twos-complement machines */
201 # define SHORT_MAX ((short)(((unsigned short) -1) >> 1))
202 # define SHORT_MIN (~SHORT_MAX)
206 # define INT_MAX ((int)(((unsigned int) -1) >> 1))
207 # define INT_MIN (~INT_MAX)
211 # define LONG_MAX ((long)(((unsigned long) -1) >> 1))
212 # define LONG_MIN (~LONG_MAX)
223 # define EXIT_SUCCESS 1
224 # define EXIT_FAILURE (02000000000L)
226 # define EXIT_SUCCESS 0
227 # define EXIT_FAILURE 1
237 # define Signed signed
241 # define Void void /* Void f() = procedure */
246 # define Volatile volatile
248 # define PP(x) x /* function prototype */
249 # define PV() (void) /* null function prototype */
250 typedef void *Anyptr
;
262 typedef char *Anyptr
;
266 # define Inline inline
271 #define Register register /* Register variables */
272 #define Char char /* Characters (not bytes) */
275 # define Static static /* Private global funcs and vars */
279 # define Local static /* Nested functions */
282 typedef Signed
char schar
;
283 typedef unsigned char _uchar
;
284 typedef unsigned char boolean
;
301 extern Void PASCAL_MAIN
PP( (int, Char
**) );
302 extern Char
**P_argv
;
304 extern short P_escapecode
;
305 extern int P_ioresult
;
306 extern __p2c_jmp_buf
*__top_jb
;
309 #ifdef P2C_H_PROTO /* if you have Ansi C but non-prototyped header files */
310 extern Char
*strcat
PP( (Char
*, Const Char
*) );
311 extern Char
*strchr
PP( (Const Char
*, int) );
312 extern int strcmp
PP( (Const Char
*, Const Char
*) );
313 extern Char
*strcpy
PP( (Char
*, Const Char
*) );
314 extern size_t strlen
PP( (Const Char
*) );
315 extern Char
*strncat
PP( (Char
*, Const Char
*, size_t) );
316 extern int strncmp
PP( (Const Char
*, Const Char
*, size_t) );
317 extern Char
*strncpy
PP( (Char
*, Const Char
*, size_t) );
318 extern Char
*strrchr
PP( (Const Char
*, int) );
320 extern Anyptr memchr
PP( (Const Anyptr
, int, size_t) );
321 extern Anyptr memmove
PP( (Anyptr
, Const Anyptr
, size_t) );
322 extern Anyptr memset
PP( (Anyptr
, int, size_t) );
324 extern Anyptr memcpy
PP( (Anyptr
, Const Anyptr
, size_t) );
325 extern int memcmp
PP( (Const Anyptr
, Const Anyptr
, size_t) );
328 extern int atoi
PP( (Const Char
*) );
329 extern double atof
PP( (Const Char
*) );
330 extern long atol
PP( (Const Char
*) );
331 extern double strtod
PP( (Const Char
*, Char
**) );
332 extern long strtol
PP( (Const Char
*, Char
**, int) );
333 #endif /*P2C_H_PROTO*/
337 extern Anyptr malloc
PP( (size_t) );
338 extern Void free
PP( (Anyptr
) );
341 extern int _OutMem
PV();
342 extern int _CaseCheck
PV();
343 extern int _NilCheck
PV();
344 extern int _Escape
PP( (int) );
345 extern int _EscIO
PP( (int) );
347 extern long ipow
PP( (long, long) );
348 extern Char
*strsub
PP( (Char
*, Char
*, int, int) );
349 extern Char
*strltrim
PP( (Char
*) );
350 extern Char
*strrtrim
PP( (Char
*) );
351 extern Char
*strrpt
PP( (Char
*, Char
*, int) );
352 extern Char
*strpad
PP( (Char
*, Char
*, int, int) );
353 extern int strpos2
PP( (Char
*, Char
*, int) );
354 extern long memavail
PV();
355 extern int P_peek
PP( (FILE *) );
356 extern int P_eof
PP( (FILE *) );
357 extern int P_eoln
PP( (FILE *) );
358 extern Void P_readpaoc
PP( (FILE *, Char
*, int) );
359 extern Void P_readlnpaoc
PP( (FILE *, Char
*, int) );
360 extern long P_maxpos
PP( (FILE *) );
361 extern Char
*P_trimname
PP( (Char
*, int) );
362 extern long *P_setunion
PP( (long *, long *, long *) );
363 extern long *P_setint
PP( (long *, long *, long *) );
364 extern long *P_setdiff
PP( (long *, long *, long *) );
365 extern long *P_setxor
PP( (long *, long *, long *) );
366 extern int P_inset
PP( (unsigned, long *) );
367 extern int P_setequal
PP( (long *, long *) );
368 extern int P_subset
PP( (long *, long *) );
369 extern long *P_addset
PP( (long *, unsigned) );
370 extern long *P_addsetr
PP( (long *, unsigned, unsigned) );
371 extern long *P_remset
PP( (long *, unsigned) );
372 extern long *P_setcpy
PP( (long *, long *) );
373 extern long *P_expset
PP( (long *, long) );
374 extern long P_packset
PP( (long *) );
375 extern int P_getcmdline
PP( (int l
, int h
, Char
*line
) );
376 extern Void TimeStamp
PP( (int *Day
, int *Month
, int *Year
,
377 int *Hour
, int *Min
, int *Sec
) );
378 extern Void P_sun_argv
PP( (char *, int, int) );
381 /* I/O error handling */
382 #define _CHKIO(cond,ior,val,def) ((cond) ? P_ioresult=0,(val) \
383 : P_ioresult=(ior),(def))
384 #define _SETIO(cond,ior) (P_ioresult = (cond) ? 0 : (ior))
386 /* Following defines are suitable for the HP Pascal operating system */
387 #define FileNotFound 10
388 #define FileNotOpen 13
389 #define FileWriteError 38
390 #define BadInputFormat 14
394 #define FILEBUF(f,sc,type) sc int __CAT__(f,_BFLAGS); \
395 sc type __CAT__(f,_BUFFER)
396 #define FILEBUFNC(f,type) int __CAT__(f,_BFLAGS); \
397 type __CAT__(f,_BUFFER)
399 #define RESETBUF(f,type) (__CAT__(f,_BFLAGS) = 1)
400 #define SETUPBUF(f,type) (__CAT__(f,_BFLAGS) = 0)
402 #define GETFBUF(f,type) (*((__CAT__(f,_BFLAGS) == 1 && \
403 ((__CAT__(f,_BFLAGS) = 2), \
404 fread(&__CAT__(f,_BUFFER), \
405 sizeof(type),1,(f)))),\
406 &__CAT__(f,_BUFFER)))
407 #define AGETFBUF(f,type) ((__CAT__(f,_BFLAGS) == 1 && \
408 ((__CAT__(f,_BFLAGS) = 2), \
409 fread(__CAT__(f,_BUFFER), \
410 sizeof(type),1,(f)))),\
413 #define PUTFBUF(f,type,v) (GETFBUF(f,type) = (v))
414 #define CPUTFBUF(f,v) (PUTFBUF(f,char,v))
415 #define APUTFBUF(f,type,v) (memcpy(AGETFBUF(f,type), (v), \
416 sizeof(__CAT__(f,_BUFFER))))
418 #define GET(f,type) (__CAT__(f,_BFLAGS) == 1 ? \
419 fread(&__CAT__(f,_BUFFER),sizeof(type),1,(f)) : \
420 (__CAT__(f,_BFLAGS) = 1))
422 #define PUT(f,type) (fwrite(&__CAT__(f,_BUFFER),sizeof(type),1,(f)), \
423 (__CAT__(f,_BFLAGS) = 0))
424 #define CPUT(f) (PUT(f,char))
426 #define BUFEOF(f) (__CAT__(f,_BFLAGS) != 2 && P_eof(f))
428 #define BUFFPOS(f) (ftello(f) - (__CAT__(f,_BFLAGS) == 2))
430 #define BUFFPOS(f) (ftell(f) - (__CAT__(f,_BFLAGS) == 2))
440 /* Memory allocation */
442 # define Malloc(n) (malloc(n) ?: (Anyptr)_OutMem())
444 extern Anyptr __MallocTemp__
;
445 # define Malloc(n) ((__MallocTemp__ = malloc(n)) ? __MallocTemp__ : (Anyptr)_OutMem())
447 #define FreeR(p) (free((Anyptr)(p))) /* used if arg is an rvalue */
448 #define Free(p) (free((Anyptr)(p)), (p)=NULL)
451 #define SEXT(x,n) ((x) | -(((x) & (1L<<((n)-1))) << 1))
453 /* packed arrays */ /* BEWARE: these are untested! */
454 #define P_getbits_UB(a,i,n,L) ((int)((a)[(i)>>(L)-(n)] >> \
455 (((~(i))&((1<<(L)-(n))-1)) << (n)) & \
458 #define P_getbits_SB(a,i,n,L) ((int)((a)[(i)>>(L)-(n)] << \
459 (16 - ((((~(i))&((1<<(L)-(n))-1))+1) <<\
460 (n)) >> (16-(1<<(n))))))
462 #define P_putbits_UB(a,i,x,n,L) ((a)[(i)>>(L)-(n)] |= \
463 (x) << (((~(i))&((1<<(L)-(n))-1)) << (n)))
465 #define P_putbits_SB(a,i,x,n,L) ((a)[(i)>>(L)-(n)] |= \
466 ((x) & (1<<(1<<(n)))-1) << \
467 (((~(i))&((1<<(L)-(n))-1)) << (n)))
469 #define P_clrbits_B(a,i,n,L) ((a)[(i)>>(L)-(n)] &= \
470 ~( ((1<<(1<<(n)))-1) << \
471 (((~(i))&((1<<(L)-(n))-1)) << (n))) )
473 /* small packed arrays */
474 #define P_getbits_US(v,i,n) ((int)((v) >> ((i)<<(n)) & (1<<(1<<(n)))-1))
475 #define P_getbits_SS(v,i,n) ((int)((long)(v) << (SETBITS - (((i)+1) << (n))) >> (SETBITS-(1<<(n)))))
476 #define P_putbits_US(v,i,x,n) ((v) |= (x) << ((i) << (n)))
477 #define P_putbits_SS(v,i,x,n) ((v) |= ((x) & (1<<(1<<(n)))-1) << ((i)<<(n)))
478 #define P_clrbits_S(v,i,n) ((v) &= ~( ((1<<(1<<(n)))-1) << ((i)<<(n)) ))
480 #define P_max(a,b) ((a) > (b) ? (a) : (b))
481 #define P_min(a,b) ((a) < (b) ? (a) : (b))
488 # define labs my_labs
489 extern long my_labs
PP( (long) );
495 # define memmove my_memmove
496 extern Anyptr my_memmove
PP( (Anyptr
, Const Anyptr
, size_t) );
502 # define memcpy my_memcpy
503 extern Anyptr my_memcpy
PP( (Anyptr
, Const Anyptr
, size_t) );
506 # define memcmp my_memcmp
507 extern int my_memcmp
PP( (Const Anyptr
, Const Anyptr
, size_t) );
510 # define memset my_memset
511 extern Anyptr my_memset
PP( (Anyptr
, int, size_t) );
515 /* Fix toupper/tolower on Suns and other stupid BSD systems */
519 # define toupper(c) my_toupper(c)
520 # define tolower(c) my_tolower(c)
524 # if 'A' == 65 && 'a' == 97
525 # define _toupper(c) ((c)-'a'+'A')
526 # define _tolower(c) ((c)-'A'+'a')
529 # undef toupper /* hope these are shadowing real functions, */
530 # undef tolower /* because my_toupper calls _toupper! */
532 # define _toupper(c) toupper(c)
533 # define _tolower(c) tolower(c)
547 /************************************************************
551 ************************************************************/
553 /* Run-time library for use with "p2c", the Pascal to C translator */
555 /* "p2c" Copyright (C) 1989, 1990, 1991 Free Software Foundation.
556 * By Dave Gillespie, daveg@csvax.cs.caltech.edu. Version --VERSION--.
557 * This file may be copied, modified, etc. in any way. It is not restricted
558 * by the licence agreement accompanying p2c itself.
563 /* #include "p2c.h" */
571 #define Isspace(c) isspace(c) /* or "((c) == ' ')" if preferred */
582 long EXCP_LINE
; /* Used by Pascal workstation system */
584 Anyptr __MallocTemp__
;
586 __p2c_jmp_buf
*__top_jb
;
591 void PASCAL_MAIN(argc
, argv
)
608 /* In case your system lacks these... */
613 return((x
> 0) ? x
: -x
);
618 Anyptr
my_memmove(Anyptr d
, Const Anyptr s
, size_t n
)
620 Anyptr
my_memmove(d
, s
, n
)
625 register char *dd
= (char *)d
, *ss
= (char *)s
;
626 if (dd
< ss
|| dd
- ss
>= n
) {
639 Anyptr
my_memcpy(Anyptr d
, Const Anyptr s
, size_t n
)
641 Anyptr
my_memcpy(d
, s
, n
)
646 register char *ss
= (char *)s
, *dd
= (char *)d
;
653 int my_memcmp(Const Anyptr s1
, Const Anyptr s2
, size_t n
)
655 int my_memcmp(s1
, s2
, n
)
660 register char *a
= (char *)s1
, *b
= (char *)s2
;
663 if ((i
= (*a
++) - (*b
++)) != 0)
669 Anyptr
my_memset(Anyptr d
, int c
, size_t n
)
671 Anyptr
my_memset(d
, c
, n
)
677 register char *dd
= (char *)d
;
711 if (a
== 0 || a
== 1)
714 return (b
& 1) ? -1 : 1;
720 while ((b
>>= 1) > 0) {
731 /* Common string functions: */
733 /* Store in "ret" the substring of length "len" starting from "pos" (1-based).
734 Store a shorter or null string if out-of-range. Return "ret". */
736 char *strsub(ret
, s
, pos
, len
)
737 register char *ret
, *s
;
738 register int pos
, len
;
742 if (--pos
< 0 || len
<= 0) {
763 /* Return the index of the first occurrence of "pat" as a substring of "s",
764 starting at index "pos" (1-based). Result is 1-based, 0 if not found. */
766 int strpos2(s
, pat
, pos
)
771 register char *cp
, ch
;
776 slen
= strlen(s
) - pos
;
782 while (--slen
>= 0) {
783 if (*cp
++ == ch
&& !strncmp(cp
, pat
, pos
))
790 /* Case-insensitive version of strcmp. */
793 register char *s1
, *s2
;
795 register unsigned char c1
, c2
;
798 if (*s1
++ != *s2
++) {
801 c1
= toupper(s1
[-1]);
802 c2
= toupper(s2
[-1]);
815 /* HP and Turbo Pascal string functions: */
817 /* Trim blanks at left end of string. */
822 while (Isspace(*s
++)) ;
827 /* Trim blanks at right end of string. */
832 register char *s2
= s
;
837 while (s2
> s
&& Isspace(*--s2
))
843 /* Store in "ret" "num" copies of string "s". Return "ret". */
845 char *strrpt(ret
, s
, num
)
850 register char *s2
= ret
;
855 while ((*s2
++ = *s1
++)) ;
862 /* Store in "ret" string "s" with enough pad chars added to reach "size". */
864 char *strpad(ret
, s
, padchar
, num
)
867 register int padchar
, num
;
869 register char *d
= ret
;
874 while ((*d
++ = *s
++)) ;
884 /* Copy the substring of length "len" from index "spos" of "s" (1-based)
885 to index "dpos" of "d", lengthening "d" if necessary. Length and
886 indices must be in-range. */
888 void strmove(len
, s
, spos
, d
, dpos
)
889 register char *s
, *d
;
890 register int len
, spos
, dpos
;
894 while (*d
&& --len
>= 0)
904 /* Delete the substring of length "len" at index "pos" from "s".
905 Delete less if out-of-range. */
907 void strdelete(s
, pos
, len
)
909 register int pos
, len
;
915 slen
= strlen(s
) - pos
;
923 while ((*s
= s
[len
])) s
++;
927 /* Insert string "src" at index "pos" of "dst". */
929 void strinsert(src
, dst
, pos
)
930 register char *src
, *dst
;
933 register int slen
, dlen
;
948 } while (--dlen
>= 0);
959 /* Peek at next character of input stream; return EOF at end-of-file. */
970 return (ch
== '\n') ? ' ' : ch
;
974 /* Check if at end of file, using Pascal "eof" semantics. End-of-file for
975 stdin is broken; remove the special case for it to be broken in a
986 return 0; /* not safe to look-ahead on the keyboard! */
995 /* Check if at end of line (or end of entire file). */
1006 return (ch
== '\n');
1010 /* Read a packed array of characters from a file. */
1012 Void
P_readpaoc(f
, s
, len
)
1023 if (ch
== EOF
|| ch
== '\n')
1034 Void
P_readlnpaoc(f
, s
, len
)
1043 if (ch
== EOF
|| ch
== '\n')
1055 /* Compute maximum legal "seek" index in file (0-based). */
1061 off_t savepos
= ftello(f
);
1063 off_t savepos
= ftell(f
);
1067 if (fseek(f
, 0L, SEEK_END
))
1071 if (fseeko(f
, savepos
, SEEK_SET
))
1074 if (fseek(f
, savepos
, SEEK_SET
))
1081 /* Use packed array of char for a file name. */
1083 Char
*P_trimname(fn
, len
)
1087 static Char fnbuf
[256];
1088 register Char
*cp
= fnbuf
;
1090 while (--len
>= 0 && *fn
&& !isspace(*fn
))
1101 /* Sets are stored as an array of longs. S[0] is the size of the set;
1102 S[N] is the N'th 32-bit chunk of the set. S[0] equals the maximum
1103 I such that S[I] is nonzero. S[0] is zero for an empty set. Within
1104 each long, bits are packed from lsb to msb. The first bit of the
1105 set is the element with ordinal value 0. (Thus, for a "set of 5..99",
1106 the lowest five bits of the first long are unused and always zero.) */
1108 /* (Sets with 32 or fewer elements are normally stored as plain longs.) */
1110 long *P_setunion(d
, s1
, s2
) /* d := s1 + s2 */
1111 register long *d
, *s1
, *s2
;
1114 register int sz1
= *s1
++, sz2
= *s2
++;
1115 while (sz1
> 0 && sz2
> 0) {
1116 *d
++ = *s1
++ | *s2
++;
1123 *dbase
= d
- dbase
- 1;
1128 long *P_setint(d
, s1
, s2
) /* d := s1 * s2 */
1129 register long *d
, *s1
, *s2
;
1132 register int sz1
= *s1
++, sz2
= *s2
++;
1133 while (--sz1
>= 0 && --sz2
>= 0)
1134 *d
++ = *s1
++ & *s2
++;
1135 while (--d
> dbase
&& !*d
) ;
1141 long *P_setdiff(d
, s1
, s2
) /* d := s1 - s2 */
1142 register long *d
, *s1
, *s2
;
1145 register int sz1
= *s1
++, sz2
= *s2
++;
1146 while (--sz1
>= 0 && --sz2
>= 0)
1147 *d
++ = *s1
++ & ~*s2
++;
1152 while (--d
> dbase
&& !*d
) ;
1158 long *P_setxor(d
, s1
, s2
) /* d := s1 / s2 */
1159 register long *d
, *s1
, *s2
;
1162 register int sz1
= *s1
++, sz2
= *s2
++;
1163 while (sz1
> 0 && sz2
> 0) {
1164 *d
++ = *s1
++ ^ *s2
++;
1171 while (--d
> dbase
&& !*d
) ;
1177 int P_inset(val
, s
) /* val IN s */
1178 register unsigned val
;
1182 bit
= val
% SETBITS
;
1184 if (val
< *s
++ && ((1<<bit
) & s
[val
]))
1190 long *P_addset(s
, val
) /* s := s + [val] */
1192 register unsigned val
;
1194 register long *sbase
= s
;
1195 register int bit
, size
;
1196 bit
= val
% SETBITS
;
1211 long *P_addsetr(s
, v1
, v2
) /* s := s + [v1..v2] */
1213 register unsigned v1
, v2
;
1215 register long *sbase
= s
;
1216 register int b1
, b2
, size
;
1217 if ((int)v1
> (int)v2
)
1233 *s
|= (~((-2)<<(b2
-b1
))) << b1
;
1238 *s
|= ~((-2) << b2
);
1244 long *P_remset(s
, val
) /* s := s - [val] */
1246 register unsigned val
;
1249 bit
= val
% SETBITS
;
1252 if (!(s
[val
] &= ~(1<<bit
)))
1253 while (*s
&& !s
[*s
])
1260 int P_setequal(s1
, s2
) /* s1 = s2 */
1261 register long *s1
, *s2
;
1263 register int size
= *s1
++;
1266 while (--size
>= 0) {
1274 int P_subset(s1
, s2
) /* s1 <= s2 */
1275 register long *s1
, *s2
;
1277 register int sz1
= *s1
++, sz2
= *s2
++;
1280 while (--sz1
>= 0) {
1288 long *P_setcpy(d
, s
) /* d := s */
1289 register long *d
, *s
;
1291 register long *save_d
= d
;
1293 #ifdef SETCPY_MEMCPY
1294 memcpy(d
, s
, (*s
+ 1) * sizeof(long));
1296 register int i
= *s
+ 1;
1304 /* s is a "smallset", i.e., a 32-bit or less set stored
1305 directly in a long. */
1307 long *P_expset(d
, s
) /* d := s */
1320 long P_packset(s
) /* convert s to a small-set */
1333 /* Oregon Software Pascal extensions, courtesy of William Bader */
1335 int P_getcmdline(l
, h
, line
)
1344 for(i
= 1; i
< P_argc
; i
++) {
1347 if (len
>= h
) return len
;
1350 if (len
>= h
) return len
;
1356 Void
TimeStamp(Day
, Month
, Year
, Hour
, Min
, Sec
)
1357 int *Day
, *Month
, *Year
, *Hour
, *Min
, *Sec
;
1364 tm
= localtime(&clock
);
1366 *Month
= tm
->tm_mon
+ 1; /* Jan = 0 */
1367 *Year
= tm
->tm_year
;
1369 *Year
+= 1900; /* year since 1900 */
1370 *Hour
= tm
->tm_hour
;
1379 /* SUN Berkeley Pascal extensions */
1381 Void
P_sun_argv(s
, len
, n
)
1383 register int len
, n
;
1387 if ((unsigned)n
< P_argc
)
1391 while (*cp
&& --len
>= 0)
1419 /* The following is suitable for the HP Pascal operating system.
1420 It might want to be revised when emulating another system. */
1422 char *_ShowEscape(buf
, code
, ior
, prefix
)
1428 if (prefix
&& *prefix
) {
1429 strcpy(buf
, prefix
);
1431 bufp
= buf
+ strlen(buf
);
1436 sprintf(bufp
, "Pascal system I/O error %d", ior
);
1439 strcat(buf
, " (illegal I/O request)");
1442 strcat(buf
, " (bad file name)");
1444 case FileNotFound
: /*10*/
1445 strcat(buf
, " (file not found)");
1447 case FileNotOpen
: /*13*/
1448 strcat(buf
, " (file not open)");
1450 case BadInputFormat
: /*14*/
1451 strcat(buf
, " (bad input format)");
1454 strcat(buf
, " (not open for reading)");
1457 strcat(buf
, " (not open for writing)");
1460 strcat(buf
, " (not open for direct access)");
1463 strcat(buf
, " (string subscript out of range)");
1465 case EndOfFile
: /*30*/
1466 strcat(buf
, " (end-of-file)");
1468 case FileWriteError
: /*38*/
1469 strcat(buf
, " (file write error)");
1473 sprintf(bufp
, "Pascal system error %d", code
);
1476 strcat(buf
, " (out of memory)");
1479 strcat(buf
, " (reference to NIL pointer)");
1482 strcat(buf
, " (integer overflow)");
1485 strcat(buf
, " (divide by zero)");
1488 strcat(buf
, " (real math overflow)");
1491 strcat(buf
, " (value range error)");
1494 strcat(buf
, " (CASE value range error)");
1497 strcat(buf
, " (bus error)");
1500 strcat(buf
, " (stopped by user)");
1513 P_escapecode
= code
;
1515 __p2c_jmp_buf
*jb
= __top_jb
;
1516 __top_jb
= jb
->next
;
1517 longjmp(jb
->jbuf
, 1);
1523 fprintf(stderr
, "%s\n", _ShowEscape(buf
, P_escapecode
, P_ioresult
, ""));
1532 return _Escape(-10);
1544 /************************************************************
1548 ************************************************************/
1553 #include <stdio.h>*/
1554 static char *mon
[]={"JAN","FEB","MAR","APR","MAY","JUN",
1555 "JUL","AUG","SEP","OCT","NOV","DEC"};
1556 /* PROCEDURE DATE(VAR DATESTRING:PACKED ARRAY[1..11] OF CHAR);EXTERN; */
1557 /* activate DATE by removing comment brackets if necessary */
1567 sprintf(string
,"%d-%s-19%d\n",t
->tm_mday
,mon
[t
->tm_mon
],t
->tm_year
);
1571 /* p2c: dssp.p, line 295:
1572 * Note: Unexpected name "tapein" in program header [262] */
1573 /* p2c: dssp.p, line 295:
1574 * Note: Unexpected name "tapeout" in program header [262] */
1577 /*--------------------------------------------------------------------*/
1578 /* PROGRAM FATAL ERROR EXIT LABEL */
1579 /******************* MATHEMATICAL CONSTANTS **************************
1580 YVERTEX, - ARE Y,Z-COMPONENTS OF THE FIRST ICOSAHEDRON VERTEX. THE
1581 ZVERTEX X-COMPONENT IS 0.
1582 EPS - NUMERICAL TOLERANCE
1583 --------------------------------------------------------------------*/
1585 #define PIHALF 1.570796
1587 #define TWOPI 6.283185
1588 #define FOURPI 12.56637
1589 #define RADIAN 57.29578
1590 #define YVERTEX 0.8506508
1591 #define ZVERTEX 0.5257311
1594 /*************** ARRAY DIMENSIONING CONSTANTS ***********************
1595 NMAX - MAXIMUM NUMBER OF AMINOACID RESIDUES IN ARRAY CHAIN
1596 MAXATOM - MAXIMUM NUMBER OF SIDECHAIN ATOMS IN ARRAY SIDECHAIN
1597 MAXBRIDGE- MAXIMUM NUMBER OF BRIDGES IN ARRAY BRIDGETABLE
1598 NFACE, - NUMBER OF FACES OF POLYHEDRON. THE COORDINATES OF THE CENTRE
1599 ORDER OF EACH TRIANGULAR FACE ARE STORED IN ARRAY P, THE AREA
1600 IS STORED IN ARRAY WP IN PROCEDURE FLAGACCESS. NFACE MUST
1601 BE OF THE FORM NFACE=20*(4**ORDER), ORDER=0,1,2,...
1602 THE ACCURACY OF THE SOLVENT ACCESSIBLE SURFACE OF EACH
1603 AMINOACID RESIDUE IS ONE ANGSTROM**2 FOR ORDER=2,NFACE=320.
1604 MAXPACK - MAXIMUM NUMBER OF PROTEIN ATOMS WHICH CAN INTRUDE INTO
1605 SOLVENT AROUND ANY GIVEN TEST ATOM. THE COORDINATES OF
1606 THESE ATOMS ARE STORED IN ARRAY X, THEIR RADII IN ARRAY RX
1607 IN PROCEDURE SURFACE.
1608 MAXHIST - NUMBER OF SLOTS IN ARRAYS HELIXHIST AND BETAHIST USED FOR
1609 LENGTH STATISTICS OF SECONDARY STRUCTURE.
1610 MAXSS - MAXIMUM NUMBER OF SSBOND RECORDS ON INPUT FILE. THE
1611 DISULFIDE BOND ARE SAVED IN ARRAY SSBONDS.
1612 --------------------------------------------------------------------*/
1616 #define MAXATOM 40000L
1618 #define MAXBRIDGE 300
1625 /********************* PHYSICAL CONSTANTS **************************
1626 RN - RADIUS OF PEPTIDE NITROGEN ATOM
1627 RCA - RADIUS OF PEPTIDE ALPHA-CARBON ATOM
1628 RC - RADIUS OF PEPTIDE C'-CARBON ATOM
1629 RO - RADIUS OF PEPTIDE OXYGEN ATOM
1630 RSIDEATOM- RADIUS OF SIDECHAIN ATOM
1631 RWATER - RADIUS OF WATER MOLECULE
1632 SSDIST - MAXIMUM ALLOWED DISTANCE OF DISULFIDE BRIDGE
1633 BREAKDIST- MAXIMUM ALLOWED PEPTIDE BOND LENGTH. IF DISTANCE IS
1634 GREATER A POLYPEPTIDE CHAIN INTERRUPTION IS ASSUMED.
1635 RESRAD - MAXIMUM RADIUS OF A SPHERE AROUND C-ALPHA CONTAINING
1636 ALL ATOMS OF A RESIDUE
1637 CADIST - MINIMUM DISTANCE BETWEEN ALPHA-CARBON ATOMS SUCH THAT NO
1638 BACKBONE HYDROGEN BONDS CAN BE FORMED
1639 DIST - SMALLEST ALLOWED DISTANCE BETWEEN ANY ATOMS
1640 MAXDIST - LARGEST ALLOWED DISTANCE BETWEEN SIDECHAIN ATOM AND C-ALPHA
1642 Q - COUPLING CONSTANT FOR ELECTROSTATIC ENERGY
1643 Q=-332*0.42*0.2*1000.0
1644 HBLOW - LOWEST ALLOWED ENERGY OF A HYDROGEN BOND IN CAL/MOL
1645 HBHIGH - HIGHEST ALLOWED ENERGY OF A HYDROGEN BOND IN CAL/MOL
1646 --------------------------------------------------------------------*/
1652 #define RSIDEATOM 1.8
1655 #define BREAKDIST 2.5
1659 #define MAXDIST 10.0
1660 #define Q (-27888.0)
1662 #define HBLOW (-9900)
1663 #define HBHIGH (-500)
1667 /***************** GLOBAL DATA TYPE DEFINITIONS ***********************/
1669 typedef double vector
[3];
1670 typedef Char char4
[4];
1671 typedef Char char6
[6];
1673 parallel
, antiparallel
, nobridge
1676 symbol
, turn3
, turn4
, turn5
, bend
, chirality
, beta1
, beta2
1679 typedef struct hydrogenbond
{
1680 long residue
, energy
;
1683 typedef hydrogenbond bonds
[2];
1685 typedef struct backbone
{
1687 Char sheetlabel
, aa
;
1688 char4 threelettercode
;
1689 Char ss
[(long)beta2
- (long)symbol
+ 1];
1690 long partner
[(long)beta2
- (long)beta1
+ 1];
1692 double alpha
, kappa
;
1693 bonds acceptor
, donor
;
1694 vector h
, n
, ca
, c
, o
;
1695 long atompointer
, nsideatoms
;
1698 typedef struct bridge
{
1699 Char sheetname
, laddername
;
1701 long linkset
[MAXBRIDGE
/ 32 + 2];
1702 long ib
, ie
, jb
, je
, from
, towards
;
1706 static int bVerbose
;
1707 Static
int silentFlag
;
1708 Static
long nss
, nssintra
, nssinter
, lchain
, nbridge
;
1709 Static char6 ssbonds
[MAXSS
][2];
1710 Static backbone chain
[NMAX
+ 1];
1711 FILE *tapein
, *tapeout
;
1712 Static vector sidechain
[MAXATOM
];
1713 Static bridge bridgetable
[MAXBRIDGE
];
1715 Static Void
VecCopy(dest
,source
)
1724 Static Void
StrCopy(dest
,source
,n
)
1734 Static
double Atan2(y
, x
)
1759 Static Void
Diff(x
, y
, z
)
1770 Static
double Dot(x
, y
)
1773 return (x
[0] * y
[0] + x
[1] * y
[1] + x
[2] * y
[2]);
1779 Static Void
Cross(x
, y
, z
)
1782 z
[0] = x
[1] * y
[2] - y
[1] * x
[2];
1783 z
[1] = x
[2] * y
[0] - y
[2] * x
[0];
1784 z
[2] = x
[0] * y
[1] - y
[0] * x
[1];
1790 Static Void
Norm(x
, xnorm
)
1794 /* RETURNS INPUT VECTOR X NORMALIZED TO UNIT LENGTH.
1795 XNORM IS THE ORIGINAL LENGTH OF X. */
1796 double TEMP
, TEMP1
, TEMP2
;
1801 *xnorm
= TEMP
* TEMP
+ TEMP1
* TEMP1
+ TEMP2
* TEMP2
;
1804 *xnorm
= sqrt(*xnorm
);
1813 Static
double Dihedralangle(v1
, v2
, v3
, v4
)
1814 double *v1
, *v2
, *v3
, *v4
;
1816 /*CALCULATES TORSION ANGLE OF A SET OF 4 ATOMS V1-V2-V3-V4.
1817 DIHEDRALANGLE IS THE ANGLE BETWEEN THE PROJECTION OF
1818 V1-V2 AND THE PROJECTION OF V4-V3 ONTO A PLANE NORMAL TO
1821 double Result
, u
, v
;
1822 vector v12
, v43
, x
, y
, z
, p
;
1833 if (u
<= 0.0 || v
<= 0.0)
1835 u
= Dot(p
, x
) / sqrt(u
);
1836 v
= Dot(p
, y
) / sqrt(v
);
1837 if (u
!= 0.0 || v
!= 0.0)
1838 return (Atan2(v
, u
) * RADIAN
);
1840 } /* Dihedralangle */
1845 Static
double Cosangle(v1
, v2
, v3
, v4
)
1846 double *v1
, *v2
, *v3
, *v4
;
1853 x
= Dot(u
, u
) * Dot(v
, v
);
1855 return (Dot(u
, v
) / sqrt(x
));
1863 Static
double Distance(u
, v
)
1866 double TEMP
, TEMP1
, TEMP2
;
1869 TEMP1
= u
[1] - v
[1];
1870 TEMP2
= u
[2] - v
[2];
1871 return sqrt(TEMP
* TEMP
+ TEMP1
* TEMP1
+ TEMP2
* TEMP2
);
1877 Static
double Distsq(u
, v
)
1880 double TEMP
, TEMP1
, TEMP2
;
1883 TEMP1
= u
[1] - v
[1];
1884 TEMP2
= u
[2] - v
[2];
1885 return (TEMP
* TEMP
+ TEMP1
* TEMP1
+ TEMP2
* TEMP2
);
1889 /*--------------------------------------------------------------------*/
1891 Static boolean
Nochainbreak(i
, j
)
1897 test
= (i
>= 1 && j
<= NMAX
&& i
<= j
);
1899 while (test
&& k
<= j
) {
1900 if (chain
[k
].aa
== '!')
1906 } /* Nochainbreak */
1910 /*--------------------------------------------------------------------*/
1912 Static Void
Writeresidue(res
)
1917 for (i
= 0; i
<= 3; i
++)
1918 putchar(res
.threelettercode
[i
]);
1919 for (i
= 0; i
<= 5; i
++)
1920 putchar(res
.aaident
[i
]);
1921 } /* Writeresidue */
1924 #define MAXSIDEATOMS 20
1928 headercard
, compndcard
, sourcecard
, authorcard
, ssbondcard
, atomcard
,
1929 tercard
, endcard
, othercard
1933 typedef struct cardcontents
{
1939 char4 atomname
, aaname
;
1940 Char altloc
, residuename
;
1946 } cardcontents
; /* CARDCONTENTS TYPE DEFINITION */
1951 Static
jmp_buf _JL99
;
1953 /* Local variables for Inputcoordinates: */
1954 struct LOC_Inputcoordinates
{
1955 long *lchain
, latom
, hatoms
;
1956 boolean nmissing
, camissing
, cmissing
, omissing
, corelimit
;
1957 vector sidecoordinates
[MAXSIDEATOMS
];
1959 char4 sideatomnames
[MAXSIDEATOMS
];
1960 backbone reszero
, resinfo
;
1965 Local Char
Onelettercode(aaa
, LINK
)
1967 struct LOC_Inputcoordinates
*LINK
;
1970 Char aminoacid
[150];
1975 StrCopy(aasymbol
, "ARNDCEQGHILKMFPSTWYVBZXXXXXXXXXXXXXXXX--CCCCIPPPW-", 50L);
1976 StrCopy(string
[0], "ALAARGASNASPCYSGLUGLNGLYHISILE", 30L);
1977 StrCopy(string
[1], "LEULYSMETPHEPROSERTHRTRPTYRVAL", 30L);
1978 StrCopy(string
[2], "ASXGLXACDALBALIABUAROBASBETHSE", 30L);
1979 StrCopy(string
[3], "HYPHYLORNPCASARTAUTHYUNKACEFOR", 30L);
1980 StrCopy(string
[4], "CYHCSHCSSCYXILUPRZPR0CPRTRYHOH", 30L);
1982 for (k
= 0; k
<= 4; k
++) {
1983 for (i
= 0; i
<= 29; i
++) {
1985 aminoacid
[l
- 1] = string
[k
][i
];
1991 while (k
< 51 && a
== '-') {
1992 if (aminoacid
[i
- 1] == aaa
[0]) {
1993 if (aminoacid
[i
] == aaa
[1]) {
1994 if (aminoacid
[i
+ 1] == aaa
[2])
1995 a
= aasymbol
[k
- 1];
2002 } /* Onelettercode */
2004 /* Local variables for Checksideatoms: */
2005 struct LOC_Checksideatoms
{
2006 struct LOC_Inputcoordinates
*LINK
;
2011 Local Void
Checkdist(resinfo
, LINK
)
2013 struct LOC_Checksideatoms
*LINK
;
2018 while (i
<= resinfo
->nsideatoms
) {
2019 if (Distance(resinfo
->ca
, LINK
->LINK
->sidecoordinates
[i
- 1]) <= MAXDIST
) {
2024 printf(" !!! RESIDUE ");
2025 Writeresidue(*resinfo
);
2026 printf(" HAS ILLEGAL SIDECHAIN ATOM NAMED ");
2027 for (j
= 0; j
<= 3; j
++)
2028 putchar(LINK
->LINK
->sideatomnames
[i
- 1][j
]);
2030 printf(" THIS ATOM WILL BE IGNORED !!!\n\n");
2032 FORLIM
= resinfo
->nsideatoms
;
2033 for (j
= i
+ 1; j
<= FORLIM
; j
++) {
2034 StrCopy(LINK
->LINK
->sideatomnames
[j
- 2],
2035 LINK
->LINK
->sideatomnames
[j
- 1], sizeof(char4
));
2036 VecCopy(LINK
->LINK
->sidecoordinates
[j
- 2],
2037 LINK
->LINK
->sidecoordinates
[j
- 1]);
2039 resinfo
->nsideatoms
--;
2045 Local Void
Checksideatoms(resinfo
, LINK
)
2047 struct LOC_Inputcoordinates
*LINK
;
2049 struct LOC_Checksideatoms V
;
2056 Checkdist(resinfo
, &V
);
2063 if (c
== 'S' || c
== 'C')
2065 if (c
== 'P' || c
== 'T' || c
== 'V')
2067 if (c
== 'B' || c
== 'M' || c
== 'L' || c
== 'I' || c
== 'D' || c
== 'N')
2069 if (c
== 'Z' || c
== 'K' || c
== 'Q' || c
== 'E')
2073 if (c
== 'F' || c
== 'R')
2079 if ((resinfo
->nsideatoms
< i
) && (bVerbose
)) {
2080 printf(" !!! RESIDUE ");
2081 Writeresidue(*resinfo
);
2082 printf(" HAS%3ld INSTEAD OF EXPECTED ", resinfo
->nsideatoms
);
2083 printf("%3ld SIDECHAIN ATOMS.\n", i
);
2084 printf(" CALCULATED SOLVENT ACCESSIBILITY REFERS TO INCOMPLETE "
2085 "SIDECHAIN !!!\n\n");
2087 if (i
== -1 || resinfo
->nsideatoms
<= i
)
2090 printf(" !!! RESIDUE ");
2091 Writeresidue(*resinfo
);
2092 printf(" HAS%3ld INSTEAD OF EXPECTED ", resinfo
->nsideatoms
);
2093 printf("%3ld SIDECHAIN ATOMS.\n", i
);
2094 printf(" LAST SIDECHAIN ATOM NAME IS ");
2095 for (j
= 0; j
<= 3; j
++)
2096 putchar(LINK
->sideatomnames
[resinfo
->nsideatoms
- 1][j
]);
2097 printf("\n CALCULATED SOLVENT ACCESSIBILITY INCLUDES EXTRA ATOMS !!!\n\n");
2099 } /* Checksideatoms */
2103 Local Void
Putresidue(LINK
)
2104 struct LOC_Inputcoordinates
*LINK
;
2106 /* insert residue into protein chain */
2111 complete
= !(LINK
->nmissing
|| LINK
->camissing
|| LINK
->cmissing
||
2114 strncmp(LINK
->reszero
.aaident
, LINK
->resinfo
.aaident
, sizeof(char6
))
2116 printf(" !!! BACKBONE INCOMPLETE FOR RESIDUE ");
2117 Writeresidue(LINK
->resinfo
);
2118 printf("\n RESIDUE WILL BE IGNORED !!!\n\n");
2120 LINK
->corelimit
= (LINK
->latom
+ LINK
->resinfo
.nsideatoms
> MAXATOM
||
2121 *LINK
->lchain
> NMAX
- 2);
2122 if (complete
&& !LINK
->corelimit
) {
2123 Checksideatoms(&LINK
->resinfo
, LINK
);
2124 VecCopy(LINK
->resinfo
.h
, LINK
->resinfo
.n
);
2125 if (Nochainbreak(*LINK
->lchain
, *LINK
->lchain
)) {
2126 if (Distance(chain
[*LINK
->lchain
].c
, LINK
->resinfo
.n
) > BREAKDIST
)
2127 /* keep ! at LCHAIN */
2130 printf(" !!! EXCESSIVE C TO N DISTANCE ");
2131 printf("% .5E>% .5E\n",
2132 Distance(chain
[*LINK
->lchain
].c
, LINK
->resinfo
.n
), BREAKDIST
);
2133 printf(" BEFORE RESIDUE ");
2134 Writeresidue(LINK
->resinfo
);
2135 printf(". CHAIN BREAK RESIDUE INSERTED !!!\n\n");
2139 if (Nochainbreak(*LINK
->lchain
, *LINK
->lchain
) && LINK
->resinfo
.aa
!= 'P') {
2140 LINK
->dco
= Distance(chain
[*LINK
->lchain
].c
, chain
[*LINK
->lchain
].o
);
2141 for (i
= 0; i
<= 2; i
++)
2142 LINK
->resinfo
.h
[i
] = LINK
->resinfo
.n
[i
] +
2143 (chain
[*LINK
->lchain
].c
[i
] - chain
[*LINK
->lchain
].o
[i
]) / LINK
->dco
;
2146 chain
[*LINK
->lchain
] = LINK
->resinfo
;
2147 FORLIM
= LINK
->resinfo
.nsideatoms
;
2148 for (i
= 0; i
< FORLIM
; i
++)
2149 VecCopy(sidechain
[LINK
->latom
+ i
], LINK
->sidecoordinates
[i
]);
2150 LINK
->latom
+= LINK
->resinfo
.nsideatoms
;
2152 if (Nochainbreak(*LINK
->lchain
, *LINK
->lchain
) && !complete
)
2154 LINK
->resinfo
= LINK
->reszero
;
2155 LINK
->nmissing
= true;
2156 LINK
->camissing
= true;
2157 LINK
->cmissing
= true;
2158 LINK
->omissing
= true;
2163 Local Void
Getresidue(atomname
, coordinates
, LINK
)
2165 double *coordinates
;
2166 struct LOC_Inputcoordinates
*LINK
;
2168 boolean hydrogenatom
;
2170 hydrogenatom
= ((atomname
[0] == '9' || atomname
[0] == '8' ||
2171 atomname
[0] == '7' || atomname
[0] == '6' ||
2172 atomname
[0] == '5' || atomname
[0] == '4' ||
2173 atomname
[0] == '3' || atomname
[0] == '2' ||
2174 atomname
[0] == '1' || atomname
[0] == '0' ||
2175 atomname
[0] == ' ') &&
2176 (atomname
[1] == 'D' || atomname
[1] == 'H'));
2181 if (!strncmp(atomname
, " N ", sizeof(char4
))) {
2182 LINK
->nmissing
= false;
2183 VecCopy(LINK
->resinfo
.n
, coordinates
);
2186 if (!strncmp(atomname
, " CA ", sizeof(char4
))) {
2187 LINK
->camissing
= false;
2188 VecCopy(LINK
->resinfo
.ca
, coordinates
);
2191 if (!strncmp(atomname
, " C ", sizeof(char4
))) {
2192 LINK
->cmissing
= false;
2193 VecCopy(LINK
->resinfo
.c
, coordinates
);
2196 if (!strncmp(atomname
, " O ", sizeof(char4
))) {
2197 LINK
->omissing
= false;
2198 VecCopy(LINK
->resinfo
.o
, coordinates
);
2201 if (LINK
->resinfo
.nsideatoms
>= MAXSIDEATOMS
)
2203 LINK
->resinfo
.nsideatoms
++;
2204 VecCopy(LINK
->sidecoordinates
[LINK
->resinfo
.nsideatoms
- 1], coordinates
);
2205 StrCopy(LINK
->sideatomnames
[LINK
->resinfo
.nsideatoms
- 1], atomname
,
2211 Local Void
Readcard(cardinfo
, LINK
)
2212 cardcontents
*cardinfo
;
2213 struct LOC_Inputcoordinates
*LINK
;
2219 cardinfo
->art
= othercard
;
2221 if (!P_eof(tapein
)) {
2222 *key
= getc(tapein
);
2226 } while (!(isupper(key
[0]) | P_eof(tapein
)));
2227 if (P_eof(tapein
)) {
2228 cardinfo
->art
= endcard
;
2231 for (l
= 1; l
<= 5; l
++) {
2232 if (!P_eoln(tapein
)) {
2233 key
[l
] = getc(tapein
);
2238 if (!strncmp(key
, "HEADER", sizeof(char6
)))
2239 cardinfo
->art
= headercard
;
2240 if (!strncmp(key
, "COMPND", sizeof(char6
)))
2241 cardinfo
->art
= compndcard
;
2242 if (!strncmp(key
, "SOURCE", sizeof(char6
)))
2243 cardinfo
->art
= sourcecard
;
2244 if (!strncmp(key
, "AUTHOR", sizeof(char6
)))
2245 cardinfo
->art
= authorcard
;
2246 if (!strncmp(key
, "SSBOND", sizeof(char6
)))
2247 cardinfo
->art
= ssbondcard
;
2248 if (!strncmp(key
, "ATOM ", sizeof(char6
)))
2249 cardinfo
->art
= atomcard
;
2250 if (!strncmp(key
, "TER ", sizeof(char6
)))
2251 cardinfo
->art
= tercard
;
2252 if (!strncmp(key
, "END ", sizeof(char6
)))
2253 cardinfo
->art
= endcard
;
2254 switch (cardinfo
->art
) {
2260 for (l
= 0; l
<= 5; l
++)
2261 cardinfo
->UU
.z
[l
] = key
[l
];
2262 for (l
= 6; l
<= 126; l
++)
2263 cardinfo
->UU
.z
[l
] = ' ';
2264 cardinfo
->UU
.z
[127] = '.';
2265 if (cardinfo
->art
== headercard
)
2269 for (l
= 6; l
< m
; l
++) {
2270 if (!P_eoln(tapein
)) {
2271 cardinfo
->UU
.z
[l
] = getc(tapein
);
2272 if (cardinfo
->UU
.z
[l
] == '\n')
2273 cardinfo
->UU
.z
[l
] = ' ';
2279 for (l
= 7; l
<= 8; l
++) {
2284 for (k
= 0; k
<= 1; k
++) {
2285 for (l
= 1; l
<= 7; l
++) {
2290 cardinfo
->UU
.r
[k
][5] = getc(tapein
);
2292 if (cardinfo
->UU
.r
[k
][5] == '\n')
2293 cardinfo
->UU
.r
[k
][5] = ' ';
2296 /* minor modification suggested by Steven Sheriff */
2297 for (l
= 0; l
<= 3; l
++) {
2298 cardinfo
->UU
.r
[k
][l
] = getc(tapein
);
2299 if (cardinfo
->UU
.r
[k
][l
] == '\n')
2300 cardinfo
->UU
.r
[k
][l
] = ' ';
2303 cardinfo
->UU
.r
[k
][4] = ' ';
2305 cardinfo
->UU
.r
[k
][4] = getc(tapein
);
2306 if (cardinfo
->UU
.r
[k
][4] == '\n')
2307 cardinfo
->UU
.r
[k
][4] = ' ';
2310 /* end minor modification suggested by Steven Sheriff */
2314 for (l
= 7; l
<= 12; l
++) {
2319 for (l
= 0; l
<= 3; l
++) {
2320 cardinfo
->UU
.U5
.atomname
[l
] = getc(tapein
);
2321 if (cardinfo
->UU
.U5
.atomname
[l
] == '\n')
2322 cardinfo
->UU
.U5
.atomname
[l
] = ' ';
2324 cardinfo
->UU
.U5
.altloc
= getc(tapein
);
2325 if (cardinfo
->UU
.U5
.altloc
== '\n')
2326 cardinfo
->UU
.U5
.altloc
= ' ';
2327 for (l
= 0; l
<= 2; l
++) {
2328 cardinfo
->UU
.U5
.aaname
[l
] = getc(tapein
);
2329 if (cardinfo
->UU
.U5
.aaname
[l
] == '\n')
2330 cardinfo
->UU
.U5
.aaname
[l
] = ' ';
2332 cardinfo
->UU
.U5
.aaname
[3] = ' ';
2333 cardinfo
->UU
.U5
.residuename
= Onelettercode(cardinfo
->UU
.U5
.aaname
, LINK
);
2335 cardinfo
->UU
.U5
.reseqnum
[5] = getc(tapein
);
2338 if (cardinfo
->UU
.U5
.reseqnum
[5] == '\n')
2339 cardinfo
->UU
.U5
.reseqnum
[5] = ' ';
2340 for (l
= 0; l
<= 4; l
++) {
2341 cardinfo
->UU
.U5
.reseqnum
[l
] = getc(tapein
);
2342 if (cardinfo
->UU
.U5
.reseqnum
[l
] == '\n')
2343 cardinfo
->UU
.U5
.reseqnum
[l
] = ' ';
2345 for (l
= 0; l
<= 2; l
++)
2346 fscanf(tapein
, "%lf", &cardinfo
->UU
.U5
.coordinates
[l
]);
2355 fscanf(tapein
, "%*[^\n]");
2361 /*--------------------------------------------------------------------*/
2362 /* SEE BROOKHAVEN PROTEIN DATA BANK ATOMIC COORDINATE ENTRY FORMAT
2364 -------------------------------------------------------------------*/
2366 Static Void
Inputcoordinates(lchain_
)
2369 struct LOC_Inputcoordinates V
;
2370 Char datestring
[30];
2375 cardcontents cardinfo
;
2376 long cardhist
[(long)othercard
- (long)headercard
+ 1];
2384 for (j
= 0; j
<= 5; j
++)
2385 V
.reszero
.aaident
[j
] = ' ';
2387 V
.reszero
.access
= 0;
2388 StrCopy(V
.reszero
.threelettercode
, " ", sizeof(char4
));
2389 for (s
= symbol
; (long)s
<= (long)beta2
; s
= (structure
)((long)s
+ 1))
2390 V
.reszero
.ss
[(long)s
- (long)symbol
] = ' ';
2391 V
.reszero
.sheetlabel
= ' ';
2392 V
.reszero
.partner
[0] = 0;
2393 V
.reszero
.partner
[(long)beta2
- (long)beta1
] = 0;
2394 V
.reszero
.alpha
= 360.0;
2395 V
.reszero
.kappa
= 360.0;
2396 for (j
= 0; j
<= 1; j
++) {
2397 V
.reszero
.acceptor
[j
].residue
= 0;
2398 V
.reszero
.acceptor
[j
].energy
= 0;
2399 V
.reszero
.donor
[j
].residue
= 0;
2400 V
.reszero
.donor
[j
].energy
= 0;
2402 V
.reszero
.atompointer
= 0;
2403 V
.reszero
.nsideatoms
= 0;
2404 for (j
= 0; j
<= 2; j
++) {
2405 V
.reszero
.h
[j
] = 0.0;
2406 V
.reszero
.n
[j
] = 0.0;
2407 V
.reszero
.ca
[j
] = 0.0;
2408 V
.reszero
.c
[j
] = 0.0;
2409 V
.reszero
.o
[j
] = 0.0;
2411 for (i
= 0; i
<= NMAX
; i
++)
2412 chain
[i
] = V
.reszero
;
2413 Date(datestring
); /* DATE(DAY-MONTH-YEAR); */
2414 /* comment out this line if necessary */
2415 fprintf(tapeout
, "**** SECONDARY STRUCTURE DEFINITION ");
2416 fprintf(tapeout
, "BY THE PROGRAM DSSP, VERSION OCT. 1988 ****");
2417 fprintf(tapeout
, " DATE=%.11s", datestring
);
2418 for (i
= 106; i
<= 127; i
++)
2420 fprintf(tapeout
, ".\n");
2421 fprintf(tapeout
, "REFERENCE W. KABSCH AND C.SANDER, BIOPOLYMERS ");
2422 fprintf(tapeout
, "22 (1983) 2577-2637");
2423 for (i
= 66; i
<= 127; i
++)
2425 fprintf(tapeout
, ".\n");
2426 for (ctype
= headercard
;
2427 (long)ctype
<= (long)othercard
;
2428 ctype
= (cardtype
)((long)ctype
+ 1))
2429 cardhist
[(long)ctype
- (long)headercard
] = 0;
2430 V
.corelimit
= false;
2432 V
.resinfo
= V
.reszero
;
2438 Readcard(&cardinfo
, &V
);
2439 cardhist
[(long)cardinfo
.art
- (long)headercard
]++;
2440 switch (cardinfo
.art
) {
2446 if (cardhist
[(long)cardinfo
.art
- (long)headercard
] == 1) {
2447 for (i
= 0; i
<= 127; i
++)
2448 putc(cardinfo
.UU
.z
[i
], tapeout
);
2449 putc('\n', tapeout
);
2455 for (i
= 0; i
<= 1; i
++)
2456 StrCopy(ssbonds
[nss
- 1][i
], cardinfo
.UU
.r
[i
], sizeof(char6
));
2460 if (cardinfo
.UU
.U5
.residuename
!= '-' &&
2461 (cardinfo
.UU
.U5
.altloc
== 'A' || cardinfo
.UU
.U5
.altloc
== ' ')) {
2462 if (strncmp(V
.resinfo
.aaident
, cardinfo
.UU
.U5
.reseqnum
, sizeof(char6
))) {
2464 V
.resinfo
.atompointer
= V
.latom
;
2465 StrCopy(V
.resinfo
.aaident
, cardinfo
.UU
.U5
.reseqnum
, sizeof(char6
));
2466 V
.resinfo
.aa
= cardinfo
.UU
.U5
.residuename
;
2467 StrCopy(V
.resinfo
.threelettercode
, cardinfo
.UU
.U5
.aaname
,
2470 Getresidue(cardinfo
.UU
.U5
.atomname
, cardinfo
.UU
.U5
.coordinates
, &V
);
2472 if ((cardinfo
.UU
.U5
.residuename
== '-') && bVerbose
) {
2473 printf(" !!! RESIDUE ");
2474 for (i
= 0; i
<= 3; i
++)
2475 putchar(cardinfo
.UU
.U5
.aaname
[i
]);
2476 for (i
= 0; i
<= 5; i
++)
2477 putchar(cardinfo
.UU
.U5
.reseqnum
[i
]);
2478 printf(" HAS NONSTANDARD NAME.\n");
2479 printf(" RESIDUE WILL BE ");
2480 printf("IGNORED !!!\n");
2482 if ((cardinfo
.UU
.U5
.altloc
!= 'A' && cardinfo
.UU
.U5
.altloc
!= ' ') &&
2484 printf(" !!! IN RESIDUE");
2485 for (i
= 0; i
<= 3; i
++)
2486 printf(" %c", cardinfo
.UU
.U5
.aaname
[i
]);
2487 for (i
= 0; i
<= 5; i
++)
2488 putchar(cardinfo
.UU
.U5
.reseqnum
[i
]);
2489 printf(" ALTERNATE LOCATION INDICATOR ");
2490 printf("IS %c AND\n", cardinfo
.UU
.U5
.altloc
);
2491 printf(" NOT BLANK OR A. ATOM ");
2493 for (i
= 0; i
<= 3; i
++)
2494 putchar(cardinfo
.UU
.U5
.atomname
[i
]);
2495 printf(" WILL BE IGNORED !!!\n\n");
2512 } while (!(V
.corelimit
|| finish
));
2513 if ((V
.corelimit
) && bVerbose
) {
2514 printf(" !!! NUMBER OF ATOMS OR RESIDUES EXCEEDS ");
2515 printf("STORAGE CAPACITY !!!\n");
2517 if (!Nochainbreak(*V
.lchain
, *V
.lchain
))
2519 if ((V
.hatoms
> 0) && bVerbose
) {
2520 printf(" !!! %12ld HYDROGEN OR DEUTERIUM ATOMS WERE IGNORED\n", V
.hatoms
);
2521 printf(" IN THE CALCULATION OF SIDE CHAIN SOLVENT \n");
2522 printf(" ACCESSIBILITY !!!\n");
2525 if (cardhist
[0] < 1)
2526 printf(" !!! HEADER-CARD MISSING !!!\n");
2527 if (cardhist
[(long)compndcard
- (long)headercard
] < 1)
2528 printf(" !!! COMPOUND-CARD MISSING !!!\n");
2529 if (cardhist
[(long)sourcecard
- (long)headercard
] < 1)
2530 printf(" !!! SOURCE-CARD MISSING !!!\n");
2531 if (cardhist
[(long)authorcard
- (long)headercard
] < 1)
2532 printf(" !!! AUTHOR CARD MISSING !!!\n");
2533 if (*V
.lchain
< 1) {
2534 printf(" !!! NO RESIDUE WITH COMPLETE BACKBONE !!!\n");
2538 printf(" !!! ALL SIDECHAIN COORDINATES MISSING !!!\n");
2540 } /* Inputcoordinates */
2546 /*--------------------------------------------------------------------*/
2548 Static boolean
Testbond(i
, j
)
2551 /* TESTBOND IS TRUE IF I IS DONOR[=NH] TO J, OTHERWISE FALSE */
2555 return ((WITH
->acceptor
[0].residue
== j
&& WITH
->acceptor
[0].energy
< HBHIGH
) ||
2556 (WITH
->acceptor
[1].residue
== j
&& WITH
->acceptor
[1].energy
< HBHIGH
));
2562 Local boolean
Testssbond(i
, j
)
2570 if (!(Nochainbreak(i
, i
) & Nochainbreak(j
, j
)))
2572 while (!(ssbond
|| k
> nss
)) {
2573 ssbond
= ((!strncmp(chain
[i
].aaident
, ssbonds
[k
- 1][0], sizeof(char6
)) &&
2574 !strncmp(chain
[j
].aaident
, ssbonds
[k
- 1][1], sizeof(char6
))) ||
2575 (!strncmp(chain
[i
].aaident
, ssbonds
[k
- 1][1], sizeof(char6
)) &&
2576 !strncmp(chain
[j
].aaident
, ssbonds
[k
- 1][0], sizeof(char6
))));
2584 /*--------------------------------------------------------------------*/
2586 Static Void
Flagssbonds()
2601 FORLIM
= lchain
- 2;
2602 for (i
= 1; i
<= FORLIM
; i
++) {
2603 if (chain
[i
].aa
== 'C' && chain
[i
].nsideatoms
> 1) {
2604 ii
= chain
[i
].atompointer
+ 2;
2609 if (chain
[j
].nsideatoms
> 1 && chain
[j
].aa
== 'C')
2610 jj
= chain
[j
].atompointer
+ 2;
2614 ssbond
= (Distance(sidechain
[ii
- 1], sidechain
[jj
- 1]) < SSDIST
);
2615 } while (!(ssbond
|| j
== lchain
));
2616 if (ssbond
& (!Testssbond(i
, j
)))
2618 printf(" !!! ADDITIONAL SSBOND FOUND BETWEEN ");
2619 printf("RESIDUES ");
2620 Writeresidue(chain
[i
]);
2622 Writeresidue(chain
[j
]);
2628 FORLIM
= lchain
- 2;
2629 for (i
= 1; i
<= FORLIM
; i
++) {
2631 if (WITH
->aa
== 'C') {
2633 for (j
= i
+ 2; j
<= FORLIM1
; j
++) {
2634 if (chain
[j
].aa
== 'C') {
2635 if (Testssbond(i
, j
)) {
2638 printf(" !!! SS-BRIDGE LABEL RESTART AT a !!!\n");
2644 if (Nochainbreak(i
, j
))
2648 if (WITH
->nsideatoms
> 1) {
2649 if (chain
[j
].nsideatoms
> 1) {
2650 jj
= chain
[j
].atompointer
+ 2;
2651 ii
= WITH
->atompointer
+ 2;
2652 d
= Distance(sidechain
[ii
- 1], sidechain
[jj
- 1]);
2653 if ((d
> SSDIST
) && bVerbose
) {
2654 printf(" !!! SSBOND DISTANCE IS%5.1f BETWEEN RESIDUES", d
);
2655 Writeresidue(chain
[i
]);
2657 Writeresidue(chain
[j
]);
2668 if ((nss
!= nssintra
+ nssinter
) && bVerbose
)
2669 printf(" !!! ERROR IN SSBOND DATA RECORDS !!!\n");
2674 /*--------------------------------------------------------------------*/
2676 Static Void
Flagchirality()
2683 FORLIM
= lchain
- 2;
2684 for (i
= 2; i
<= FORLIM
; i
++) {
2686 if (Nochainbreak(i
- 1, i
+ 2)) {
2687 WITH
->alpha
= Dihedralangle(chain
[i
- 1].ca
, WITH
->ca
, chain
[i
+ 1].ca
,
2689 if (WITH
->alpha
< 0.0)
2690 WITH
->ss
[(long)chirality
- (long)symbol
] = '-';
2692 WITH
->ss
[(long)chirality
- (long)symbol
] = '+';
2695 FORLIM
= lchain
- 2;
2697 for (i
= 3; i
<= FORLIM
; i
++) {
2699 if (Nochainbreak(i
- 2, i
+ 2)) {
2700 ckap
= Cosangle(chain
[i
].ca
, chain
[i
- 2].ca
, chain
[i
+ 2].ca
,
2702 skap
= sqrt(1.0 - ckap
* ckap
);
2703 WITH
->kappa
= RADIAN
* Atan2(skap
, ckap
);
2706 } /* Flagchirality */
2711 Local
long Bondenergy(i
, j
)
2714 /*RESIDUE I IS DONOR[=NH],J IS ACCEPTOR[=CO] OF THE PROTON IN THE
2715 HYDROGEN BOND. THE BONDENERGY IS IN CAL/MOL */
2716 double dho
, dhc
, dnc
, dno
;
2722 if (WITH
->aa
== 'P')
2724 dho
= Distance(WITH
->h
, chain
[j
].o
);
2725 dhc
= Distance(WITH
->h
, chain
[j
].c
);
2726 dnc
= Distance(WITH
->n
, chain
[j
].c
);
2727 dno
= Distance(WITH
->n
, chain
[j
].o
);
2728 if (dho
< DIST
|| dhc
< DIST
|| dnc
< DIST
|| dno
< DIST
)
2731 hbe
= (long)floor(Q
/ dho
- Q
/ dhc
+ Q
/ dnc
- Q
/ dno
+ 0.5);
2735 printf(" !!! CONTACT BETWEEN RESIDUES ");
2736 Writeresidue(chain
[i
]);
2738 Writeresidue(chain
[j
]);
2739 printf(" TOO CLOSE !!!\n");
2747 Local Void
Updatebonds(b
, hb
)
2751 if (hb
.energy
< b
[0].energy
) {
2754 } else if (hb
.energy
< b
[1].energy
)
2760 Local Void
Setbonds(i
, j
)
2763 /*I IS NH, J IS CO*/
2766 hb
.energy
= Bondenergy(i
, j
);
2768 /* CO(J) IS ACCEPTOR OF NH(I) */
2769 Updatebonds(chain
[i
].acceptor
, hb
);
2771 Updatebonds(chain
[j
].donor
, hb
);
2776 /*--------------------------------------------------------------------*/
2778 Static Void
Flaghydrogenbonds()
2787 for (i
= 1; i
<= FORLIM
; i
++) {
2788 if (Nochainbreak(i
, i
)) {
2791 for (j
= i
+ 1; j
<= FORLIM1
; j
++) {
2792 if (Nochainbreak(j
, j
)) {
2793 if (Distance(WITH
->ca
, chain
[j
].ca
) < CADIST
) {
2802 } /* Flaghydrogenbonds */
2807 Local Void
Ladder(i
, j
, b
)
2817 if (b
== nobridge
|| i
>= j
)
2820 WITH
= &bridgetable
[k
- 1];
2821 if (WITH
->ib
== 0) {
2832 found
= (WITH
->btyp
== b
&& i
== WITH
->ie
+ 1) & Nochainbreak(WITH
->ie
,
2833 i
) & (((j
== WITH
->je
+ 1 && b
== parallel
) &
2834 Nochainbreak(WITH
->je
, j
)) | ((j
== WITH
->jb
- 1 &&
2835 b
== antiparallel
) & Nochainbreak(j
, WITH
->jb
)));
2836 /* p2c: dssp.p, line 1609: Note:
2837 * Line breaker spent 1.1+0.26 seconds, 3126 tries on line 1540 [251] */
2846 if (k
> MAXBRIDGE
) {
2848 printf(" !!! BRIDGETABLE OVERFLOW !!!\n");
2853 } while (!found
); /* Ladder */
2858 Local Void
Testbridge(i
)
2869 if (!Nochainbreak(i
- 1, i
+ 1))
2871 while (j2
== 0 && j
< lchain
) {
2872 if (Nochainbreak(j
- 1, j
+ 1)) {
2873 if ((Testbond(i
+ 1, j
) & Testbond(j
, i
- 1)) |
2874 (Testbond(j
+ 1, i
) & Testbond(i
, j
- 1)))
2876 else if ((Testbond(i
+ 1, j
- 1) & Testbond(j
+ 1, i
- 1)) |
2877 (Testbond(j
, i
) & Testbond(i
, j
)))
2881 if (b
!= nobridge
) {
2885 } else if (j
!= j1
) {
2897 Local Void
Extendladder()
2899 long i
, j
, ib1
, jb1
, je1
;
2906 for (i
= 1; i
<= FORLIM
; i
++) {
2907 WITH
= &bridgetable
[i
- 1];
2909 while (j
<= nbridge
&& WITH
->towards
== 0) {
2910 ib1
= bridgetable
[j
- 1].ib
;
2911 jb1
= bridgetable
[j
- 1].jb
;
2912 je1
= bridgetable
[j
- 1].je
;
2913 bulge
= (Nochainbreak(WITH
->ie
, ib1
) && ib1
- WITH
->ie
< 6 &&
2914 bridgetable
[j
- 1].btyp
== WITH
->btyp
&&
2915 bridgetable
[j
- 1].from
== 0);
2917 switch (WITH
->btyp
) {
2920 bulge
= ((jb1
- WITH
->je
< 6 && ib1
- WITH
->ie
< 3) ||
2921 (jb1
- WITH
->je
< 3) & Nochainbreak(WITH
->je
, jb1
));
2925 bulge
= ((WITH
->jb
- je1
< 6 && ib1
- WITH
->ie
< 3) ||
2926 (WITH
->jb
- je1
< 3) & Nochainbreak(je1
, WITH
->jb
));
2929 printf("Uh-oh.. this shouln't happen..\n");
2936 bridgetable
[j
- 1].from
= i
;
2942 for (i
= 1; i
<= FORLIM
; i
++) {
2943 WITH
= &bridgetable
[i
- 1];
2944 if (WITH
->from
== 0) {
2945 P_expset(WITH
->linkset
, 0L);
2948 P_addset(WITH
->linkset
, (int)j
);
2949 j
= bridgetable
[j
- 1].towards
;
2953 P_setcpy(bridgetable
[j
- 1].linkset
, WITH
->linkset
);
2954 j
= bridgetable
[j
- 1].towards
;
2958 } /* Extendladder */
2960 /* Local variables for Sheet: */
2962 long ladderset
[MAXBRIDGE
/ 32 + 2], sheetset
[MAXBRIDGE
/ 32 + 2];
2967 Local boolean
Link(l1
, l2
)
2970 /* LINK IS TRUE IF THERE IS A COMMON RESIDUE IN LADDERS L1 AND L2 */
2971 long ib1
, ie1
, jb1
, je1
, ib2
, ie2
, jb2
, je2
;
2973 ib1
= bridgetable
[l1
- 1].ib
;
2974 ie1
= bridgetable
[l1
- 1].ie
;
2975 jb1
= bridgetable
[l1
- 1].jb
;
2976 je1
= bridgetable
[l1
- 1].je
;
2977 ib2
= bridgetable
[l2
- 1].ib
;
2978 ie2
= bridgetable
[l2
- 1].ie
;
2979 jb2
= bridgetable
[l2
- 1].jb
;
2980 je2
= bridgetable
[l2
- 1].je
;
2981 return ((ie1
>= ib2
&& ib1
<= ie2
) || (ie1
>= jb2
&& ib1
<= je2
) ||
2982 (je1
>= ib2
&& jb1
<= ie2
) || (je1
>= jb2
&& jb1
<= je2
));
2987 Local Void
Findsheet(LINK
)
2988 struct LOC_Sheet
*LINK
;
2992 long FORLIM
, FORLIM1
;
2996 P_expset(LINK
->sheetset
, 0L);
2998 if (*LINK
->ladderset
!= 0L) {
3001 } while (!P_inset((int)l1
, LINK
->ladderset
));
3004 P_setcpy(LINK
->sheetset
, bridgetable
[l1
- 1].linkset
);
3010 for (l1
= 1; l1
<= FORLIM
; l1
++) {
3011 if (P_inset((int)l1
, LINK
->sheetset
)) {
3013 for (l2
= 1; l2
<= FORLIM1
; l2
++) {
3014 if (P_inset((int)l2
, LINK
->ladderset
)) {
3016 P_setunion(LINK
->sheetset
, LINK
->sheetset
,
3017 bridgetable
[l2
- 1].linkset
);
3018 P_setdiff(LINK
->ladderset
, LINK
->ladderset
,
3019 bridgetable
[l2
- 1].linkset
);
3026 } while (!finish
); /* Findsheet */
3042 P_expset(V
.ladderset
, 0L);
3044 for (i
= 1; i
<= FORLIM
; i
++)
3045 P_addset(V
.ladderset
, (int)i
);
3048 while (*V
.ladderset
!= 0L) {
3052 printf(" !!! SHEET LABEL RESTART AT A !!!\n");
3057 for (i
= 1; i
<= FORLIM
; i
++) {
3058 WITH
= &bridgetable
[i
- 1];
3059 if (P_inset((int)i
, V
.sheetset
) && WITH
->from
== 0) {
3062 printf(" !!! STRAND LABEL RESTART AT A !!!\n");
3066 if (WITH
->btyp
== parallel
)
3067 WITH
->laddername
= (Char
)(asci
+ 32);
3069 WITH
->laddername
= (Char
)asci
;
3070 WITH
->sheetname
= ccs
;
3071 P_setcpy(WITH
->linkset
, V
.sheetset
);
3074 bridgetable
[j
- 1].laddername
= WITH
->laddername
;
3075 bridgetable
[j
- 1].sheetname
= WITH
->sheetname
;
3076 P_setcpy(bridgetable
[j
- 1].linkset
, V
.sheetset
);
3077 j
= bridgetable
[j
- 1].towards
;
3086 Local Void
Markstrands()
3088 long i
, j
, l
, ib0
, ie0
, jb0
, je0
;
3089 structure beta
, betai
, betaj
;
3090 long iset
[(long)beta2
- (long)beta1
+ 1][9],
3091 jset
[(long)beta2
- (long)beta1
+ 1][9];
3093 long FORLIM
, FORLIM1
;
3102 for (i
= 1; i
<= FORLIM
; i
++) {
3103 if (bridgetable
[i
- 1].from
== 0) {
3106 (long)beta
<= (long)beta2
;
3107 beta
= (structure
)((long)beta
+ 1)) {
3108 P_setcpy(iset
[(long)beta
- (long)beta1
], P_expset(SET
, 0L));
3109 P_setcpy(jset
[(long)beta
- (long)beta1
], P_expset(SET
, 0L));
3116 WITH
= &bridgetable
[j
- 1];
3118 for (l
= WITH
->ib
; l
<= FORLIM1
; l
++) {
3121 (long)beta
<= (long)beta2
;
3122 beta
= (structure
)((long)beta
+ 1))
3123 P_setcpy(iset
[(long)beta
- (long)beta1
], P_setunion(SET1
,
3124 iset
[(long)beta
- (long)beta1
],
3125 P_addset(P_expset(SET
, 0L),
3126 WITH1
->ss
[(long)beta
- (long)symbol
])));
3129 for (l
= WITH
->jb
; l
<= FORLIM1
; l
++) {
3132 (long)beta
<= (long)beta2
;
3133 beta
= (structure
)((long)beta
+ 1))
3134 P_setcpy(jset
[(long)beta
- (long)beta1
], P_setunion(SET1
,
3135 jset
[(long)beta
- (long)beta1
],
3136 P_addset(P_expset(SET
, 0L),
3137 WITH1
->ss
[(long)beta
- (long)symbol
])));
3150 if (P_setequal(iset
[0], P_addset(P_expset(SET2
, 0L), ' ')))
3154 if (P_setequal(jset
[0], P_addset(P_expset(SET2
, 0L), ' ')))
3158 if ((!P_setequal(iset
[(long)betai
- (long)beta1
],
3159 P_addset(P_expset(SET2
, 0L), ' '))) |
3160 (!P_setequal(jset
[(long)betaj
- (long)beta1
],
3161 P_addset(P_expset(SET3
, 0L), ' '))))
3163 printf(" !!! STRAND COLUMN OVERWRITTEN !!!\n");
3165 WITH
= &bridgetable
[j
- 1];
3167 for (l
= WITH
->ib
; l
<= FORLIM1
; l
++) {
3169 WITH1
->ss
[(long)betai
- (long)symbol
] = WITH
->laddername
;
3170 if (WITH
->btyp
== parallel
)
3171 WITH1
->partner
[(long)betai
- (long)beta1
] = WITH
->jb
+ l
- WITH
->ib
;
3173 WITH1
->partner
[(long)betai
- (long)beta1
] = WITH
->je
- l
+ WITH
->ib
;
3176 for (l
= WITH
->jb
; l
<= FORLIM1
; l
++) {
3178 WITH1
->ss
[(long)betaj
- (long)symbol
] = WITH
->laddername
;
3179 if (WITH
->btyp
== parallel
)
3180 WITH1
->partner
[(long)betaj
- (long)beta1
] = WITH
->ib
+ l
- WITH
->jb
;
3182 WITH1
->partner
[(long)betaj
- (long)beta1
] = WITH
->ie
- l
+ WITH
->jb
;
3190 for (j
= ib0
; j
<= ie0
; j
++) {
3192 if (WITH1
->ss
[0] != 'E')
3195 for (j
= jb0
; j
<= je0
; j
++) {
3197 if (WITH1
->ss
[0] != 'E')
3203 for (j
= 0; j
< FORLIM
; j
++) {
3204 WITH
= &bridgetable
[j
];
3206 for (l
= WITH
->ib
; l
<= FORLIM1
; l
++)
3207 chain
[l
].sheetlabel
= WITH
->sheetname
;
3209 for (l
= WITH
->jb
; l
<= FORLIM1
; l
++)
3210 chain
[l
].sheetlabel
= WITH
->sheetname
;
3216 /*--------------------------------------------------------------------*/
3218 Static Void
Flagbridge()
3225 for (i
= 0; i
< MAXBRIDGE
; i
++) {
3226 WITH
= &bridgetable
[i
];
3231 WITH
->btyp
= nobridge
;
3235 for (i
= 2; i
< FORLIM
; i
++)
3247 Local Void
Flagsymbol()
3249 /* FLAGS ALPHA HELICES AND TURNS IN SYMBOL COLUMN */
3258 P_addset(P_expset(nhset
, 0L), '>');
3259 P_addset(nhset
, 'X');
3260 FORLIM
= lchain
- 4;
3261 for (i
= 2; i
<= FORLIM
; i
++) {
3262 if (P_inset(chain
[i
- 1].ss
[(long)turn4
- (long)symbol
], nhset
) &
3263 P_inset(chain
[i
].ss
[(long)turn4
- (long)symbol
], nhset
)) {
3264 for (j
= i
; j
<= i
+ 3; j
++)
3265 chain
[j
].ss
[0] = 'H';
3268 FORLIM
= lchain
- 3;
3269 for (i
= 2; i
<= FORLIM
; i
++) {
3270 if (P_inset(chain
[i
- 1].ss
[(long)turn3
- (long)symbol
], nhset
) &
3271 P_inset(chain
[i
].ss
[(long)turn3
- (long)symbol
], nhset
)) {
3273 for (j
= i
; j
<= i
+ 2; j
++) {
3275 if (WITH
->ss
[0] != 'G' && WITH
->ss
[0] != ' ')
3279 for (j
= i
; j
<= i
+ 2; j
++)
3280 chain
[j
].ss
[0] = 'G';
3284 FORLIM
= lchain
- 5;
3285 for (i
= 2; i
<= FORLIM
; i
++) {
3286 if (P_inset(chain
[i
- 1].ss
[(long)turn5
- (long)symbol
], nhset
) &
3287 P_inset(chain
[i
].ss
[(long)turn5
- (long)symbol
], nhset
)) {
3289 for (j
= i
; j
<= i
+ 4; j
++) {
3291 if (WITH
->ss
[0] != 'I' && WITH
->ss
[0] != ' ')
3295 for (j
= i
; j
<= i
+ 4; j
++)
3296 chain
[j
].ss
[0] = 'I';
3301 for (i
= 2; i
< FORLIM
; i
++) {
3303 if (WITH
->ss
[0] == ' ') {
3307 (long)turn
<= (long)turn5
;
3308 turn
= (structure
)((long)turn
+ 1)) {
3310 for (k
= 1; k
<= j
; k
++) {
3312 if (P_inset(chain
[i
- k
].ss
[(long)turn
- (long)symbol
], nhset
))
3318 cc
= WITH
->ss
[(long)bend
- (long)symbol
];
3326 /*--------------------------------------------------------------------*/
3328 Static Void
Flagturn()
3340 for (turn
= turn3
; (long)turn
<= (long)turn5
; turn
= (structure
)((long)turn
+ 1)) {
3343 FORLIM1
= lchain
- k
;
3344 for (i
= 1; i
<= FORLIM1
; i
++) {
3345 if (Nochainbreak(i
, i
+ k
)) {
3346 if (Testbond(i
+ k
, i
)) {
3347 chain
[i
+ k
].ss
[(long)turn
- (long)symbol
] = '<';
3348 for (j
= 1; j
< k
; j
++) {
3349 WITH
= &chain
[i
+ j
];
3350 if (WITH
->ss
[(long)turn
- (long)symbol
] == ' ')
3351 WITH
->ss
[(long)turn
- (long)symbol
] = cc
;
3354 if (WITH
->ss
[(long)turn
- (long)symbol
] == '<')
3355 WITH
->ss
[(long)turn
- (long)symbol
] = 'X';
3357 WITH
->ss
[(long)turn
- (long)symbol
] = '>';
3363 for (i
= 1; i
<= FORLIM1
; i
++) {
3365 if (WITH
->kappa
!= 360.0 && WITH
->kappa
> 70.0)
3366 WITH
->ss
[(long)bend
- (long)symbol
] = 'S';
3372 /* Local variables for Flagaccess: */
3373 struct LOC_Flagaccess
{
3379 /* Local variables for Polyeder: */
3380 struct LOC_Polyeder
{
3381 struct LOC_Flagaccess
*LINK
;
3386 Local Void
Triangle(x1
, x2
, x3
, level
, LINK
)
3387 double *x1
, *x2
, *x3
;
3389 struct LOC_Polyeder
*LINK
;
3397 for (k
= 0; k
<= 2; k
++) {
3398 x4
[k
] = x1
[k
] + x2
[k
];
3399 x5
[k
] = x2
[k
] + x3
[k
];
3400 x6
[k
] = x1
[k
] + x3
[k
];
3405 Triangle(x1
, x4
, x6
, level1
, LINK
);
3406 Triangle(x4
, x2
, x5
, level1
, LINK
);
3407 Triangle(x4
, x5
, x6
, level1
, LINK
);
3408 Triangle(x5
, x3
, x6
, level1
, LINK
);
3411 for (k
= 0; k
<= 2; k
++)
3412 x6
[k
] = x1
[k
] + x2
[k
] + x3
[k
];
3415 VecCopy(LINK
->LINK
->p
[LINK
->LINK
->np
- 1], x6
);
3420 LINK
->LINK
->wp
[LINK
->LINK
->np
- 1] = xnorm
/ 2.0;
3425 Local Void
Polyeder(LINK
)
3426 struct LOC_Flagaccess
*LINK
;
3427 { /* GENERATES ALL 12 VERTICES OF ICOSAHEDRON */
3428 struct LOC_Polyeder V
;
3431 long i
, j
, k
, level
, FORLIM
;
3439 for (i
= 1; i
<= 2; i
++) {
3441 for (j
= 1; j
<= 2; j
++) {
3459 /* GET ALL 20 FACES OF ICOSAHEDRON */
3460 for (i
= 0; i
<= 9; i
++) { /* FIND INTEGRATION POINTS */
3461 for (j
= i
+ 1; j
<= 10; j
++) {
3462 if (Distance(v
[i
], v
[j
]) < 1.1) {
3463 for (k
= j
+ 1; k
<= 11; k
++) {
3464 if ((Distance(v
[i
], v
[k
]) < 1.1) & (Distance(v
[j
], v
[k
]) < 1.1))
3465 Triangle(v
[i
], v
[j
], v
[k
], level
, &V
);
3472 for (i
= 0; i
< FORLIM
; i
++)
3476 for (i
= 0; i
< FORLIM
; i
++)
3478 } /* Polyeder (enurD idu) */
3480 /* Local variables for Surface: */
3481 struct LOC_Surface
{
3482 struct LOC_Flagaccess
*LINK
;
3490 Local boolean
Step(xx
, LINK
)
3492 struct LOC_Surface
*LINK
;
3500 while (k
<= LINK
->nx
&& one
) {
3501 TEMP
= LINK
->rx
[k
- 1] + RWATER
;
3502 if (Distsq(xx
, LINK
->x
[k
- 1]) < TEMP
* TEMP
)
3510 /* Local variables for Liste: */
3512 struct LOC_Surface
*LINK
;
3517 Local Void
Listentry(xx
, yy
, d
, r
, LINK
)
3520 struct LOC_Liste
*LINK
;
3525 delta
= Distance(xx
, yy
);
3531 if (LINK
->LINK
->nx
> MAXPACK
) {
3533 printf(" !!! TABLE OVERFLOW IN FLAGACCESS !!!\n");
3538 VecCopy(LINK
->LINK
->x
[LINK
->LINK
->nx
- 1], zz
);
3539 LINK
->LINK
->rx
[LINK
->LINK
->nx
- 1] = r
;
3544 Local Void
Liste(xx
, rxx
, LINK
)
3547 struct LOC_Surface
*LINK
;
3560 d
= rxx
+ RWATER
+ RWATER
;
3562 for (i
= 1; i
<= FORLIM
; i
++) {
3563 if (Nochainbreak(i
, i
)) {
3565 if (Distance(xx
, WITH
->ca
) < d
+ RESRAD
) {
3566 Listentry(xx
, WITH
->n
, d
, RN
, &V
);
3567 Listentry(xx
, WITH
->ca
, d
, RCA
, &V
);
3568 Listentry(xx
, WITH
->c
, d
, RC
, &V
);
3569 Listentry(xx
, WITH
->o
, d
, RO
, &V
);
3570 if (WITH
->nsideatoms
> 0) {
3571 FORLIM1
= WITH
->nsideatoms
;
3572 for (k
= 0; k
< FORLIM1
; k
++)
3573 Listentry(xx
, sidechain
[WITH
->atompointer
+ k
], d
, RSIDEATOM
, &V
);
3582 Local
double Surface(xatom
, ratom
, LINK
)
3585 struct LOC_Flagaccess
*LINK
;
3587 struct LOC_Surface V
;
3596 Liste(xatom
, ratom
, &V
);
3597 radius
= ratom
+ RWATER
;
3600 for (i
= 0; i
< FORLIM
; i
++) {
3601 for (j
= 0; j
<= 2; j
++)
3602 xx
[j
] = LINK
->p
[i
][j
] * radius
;
3606 return (radius
* radius
* f
);
3611 /*--------------------------------------------------------------------*/
3613 Static Void
Flagaccess()
3615 struct LOC_Flagaccess V
;
3626 for (i
= 1; i
<= FORLIM
; i
++) {
3627 if (Nochainbreak(i
, i
)) {
3629 f
= Surface(WITH
->n
, RN
, &V
) + Surface(WITH
->ca
, RCA
, &V
) +
3630 Surface(WITH
->c
, RC
, &V
) + Surface(WITH
->o
, RO
, &V
);
3631 if (WITH
->nsideatoms
> 0) {
3632 FORLIM1
= WITH
->nsideatoms
;
3633 for (k
= 0; k
< FORLIM1
; k
++)
3634 f
+= Surface(sidechain
[WITH
->atompointer
+ k
], RSIDEATOM
, &V
);
3636 WITH
->access
= (long)floor(f
+ 0.5);
3644 Local Void
Statistics()
3646 long i
, j
, k
, nchain
, nres
, nhbond
, lhelix
;
3651 long ladderset
[MAXBRIDGE
/ 32 + 2];
3652 long hbridge
[(long)antiparallel
- (long)parallel
+ 1];
3653 long helixhist
[MAXHIST
], sheethist
[MAXHIST
];
3654 long betahist
[(long)antiparallel
- (long)parallel
+ 1][MAXHIST
];
3655 long FORLIM
, FORLIM1
;
3665 for (i
= 0; i
< MAXHIST
; i
++) {
3666 for (b
= parallel
; (long)b
<= (long)antiparallel
; b
= (bridgetyp
)((long)b
+ 1))
3667 betahist
[(long)b
- (long)parallel
][i
] = 0;
3672 for (k
= 0; k
<= 10; k
++)
3674 for (b
= parallel
; (long)b
<= (long)antiparallel
; b
= (bridgetyp
)((long)b
+ 1))
3675 hbridge
[(long)b
- (long)parallel
] = 0;
3677 for (i
= 0; i
<= FORLIM
; i
++) {
3679 if (Nochainbreak(i
, i
)) {
3681 Surface
+= WITH
->access
;
3682 for (j
= 0; j
<= 1; j
++) {
3683 if (WITH
->donor
[j
].energy
< HBHIGH
) {
3685 k
= WITH
->donor
[j
].residue
- i
;
3692 if (WITH
->ss
[0] == 'H')
3694 else if (lhelix
> 0) {
3695 if (lhelix
> MAXHIST
)
3697 helixhist
[lhelix
- 1]++;
3703 for (i
= 1; i
<= FORLIM
; i
++) {
3704 WITH1
= &bridgetable
[i
- 1];
3705 hbridge
[(long)WITH1
->btyp
- (long)parallel
] += WITH1
->ie
- WITH1
->ib
+ 2;
3706 if (WITH1
->from
== 0) {
3710 k
+= bridgetable
[j
- 1].ie
- bridgetable
[j
- 1].ib
+ 1;
3711 j
= bridgetable
[j
- 1].towards
;
3715 betahist
[(long)WITH1
->btyp
- (long)parallel
][k
- 1]++;
3720 P_expset(ladderset
, 0L);
3722 for (i
= 1; i
<= FORLIM
; i
++)
3723 P_addset(ladderset
, (int)i
);
3725 for (i
= 1; i
<= FORLIM
; i
++) {
3726 WITH1
= &bridgetable
[i
- 1];
3727 if ((WITH1
->from
== 0) & P_inset((int)i
, ladderset
)) {
3728 if (!P_setequal(P_addset(P_expset(SET1
, 0L), (int)i
), WITH1
->linkset
) ||
3729 WITH1
->ie
> WITH1
->ib
) {
3732 for (j
= 1; j
<= FORLIM1
; j
++) {
3733 if ((bridgetable
[j
- 1].from
== 0) & P_inset((int)j
, WITH1
->linkset
))
3738 P_setdiff(ladderset
, ladderset
, WITH1
->linkset
);
3745 "%5ld%3ld%3ld%3ld%3ld TOTAL NUMBER OF RESIDUES, NUMBER OF CHAINS, NUMBER OF SS-BRIDGES(TOTAL,INTRACHAIN,INTERCHAIN) .\n",
3746 nres
, nchain
, nssinter
+ nssintra
, nssintra
, nssinter
);
3748 "%8.1f ACCESSIBLE SURFACE OF PROTEIN (ANGSTROM**2) .\n",
3751 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(J) , SAME NUMBER PER 100 RESIDUES .\n",
3752 nhbond
, 100.0 * nhbond
/ nres
);
3754 j
= hbridge
[(long)antiparallel
- (long)parallel
];
3756 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS IN PARALLEL BRIDGES, SAME NUMBER PER 100 RESIDUES .\n",
3757 i
, 100.0 * i
/ nres
);
3759 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS IN ANTIPARALLEL BRIDGES, SAME NUMBER PER 100 RESIDUES .\n",
3760 j
, 100.0 * j
/ nres
);
3761 for (i
= -5; i
<= 5; i
++) {
3768 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I%c%ld), SAME NUMBER PER 100 RESIDUES .\n",
3769 nhbturn
[i
+ 5], 100.0 * nhbturn
[i
+ 5] / nres
, cc
, k
);
3771 for (i
= 1; i
<= MAXHIST
; i
++)
3772 fprintf(tapeout
, "%3ld", i
);
3773 fprintf(tapeout
, " *** HISTOGRAMS OF *** .\n");
3774 for (i
= 0; i
< MAXHIST
; i
++)
3775 fprintf(tapeout
, "%3ld", helixhist
[i
]);
3776 fprintf(tapeout
, " RESIDUES PER ALPHA HELIX .\n");
3777 for (i
= 0; i
< MAXHIST
; i
++)
3778 fprintf(tapeout
, "%3ld", betahist
[0][i
]);
3779 fprintf(tapeout
, " PARALLEL BRIDGES PER LADDER .\n");
3780 for (i
= 0; i
< MAXHIST
; i
++)
3781 fprintf(tapeout
, "%3ld", betahist
[(long)antiparallel
- (long)parallel
][i
]);
3782 fprintf(tapeout
, " ANTIPARALLEL BRIDGES PER LADDER .\n");
3783 for (i
= 0; i
< MAXHIST
; i
++)
3784 fprintf(tapeout
, "%3ld", sheethist
[i
]);
3785 fprintf(tapeout
, " LADDERS PER SHEET .\n");
3790 Local Void
Writehb(i
, hb
)
3796 if (hb
.residue
!= 0)
3798 e
= hb
.energy
/ 1000.0;
3799 fprintf(tapeout
, "%4ld,%4.1f", hb
.residue
, e
);
3804 /*--------------------------------------------------------------------*/
3806 Static Void
Printout()
3810 double phi
, psi
, tco
;
3818 " # RESIDUE AA STRUCTURE BP1 BP2 ACC N-H-->O O-->H-N N-H-->O O-->H-N TCO KAPPA ALPHA PHI PSI X-CA Y-CA Z-CA \n");
3820 for (i
= 1; i
<= FORLIM
; i
++) {
3822 fprintf(tapeout
, "%5ld ", i
);
3823 for (j
= 0; j
<= 5; j
++)
3824 putc(WITH
->aaident
[j
], tapeout
);
3825 fprintf(tapeout
, " %c %c ", WITH
->aa
, WITH
->ss
[0]);
3826 for (s
= turn3
; (long)s
<= (long)beta2
; s
= (structure
)((long)s
+ 1))
3827 putc(WITH
->ss
[(long)s
- (long)symbol
], tapeout
);
3828 for (s
= beta1
; (long)s
<= (long)beta2
; s
= (structure
)((long)s
+ 1))
3829 fprintf(tapeout
, "%4ld", WITH
->partner
[(long)s
- (long)beta1
]);
3830 fprintf(tapeout
, "%c%4ld ", WITH
->sheetlabel
, WITH
->access
);
3831 for (j
= 0; j
<= 1; j
++) {
3832 Writehb(i
, WITH
->acceptor
[j
]);
3833 Writehb(i
, WITH
->donor
[j
]);
3838 if (Nochainbreak(i
- 1, i
)) {
3839 phi
= Dihedralangle(chain
[i
- 1].c
, WITH
->n
, WITH
->ca
, WITH
->c
);
3840 tco
= Cosangle(WITH
->c
, WITH
->o
, chain
[i
- 1].c
, chain
[i
- 1].o
);
3842 if (Nochainbreak(i
, i
+ 1))
3843 psi
= Dihedralangle(WITH
->n
, WITH
->ca
, WITH
->c
, chain
[i
+ 1].n
);
3844 fprintf(tapeout
, "%8.3f%6.1f%6.1f%6.1f%6.1f%7.1f%7.1f%7.1f\n",
3845 tco
, WITH
->kappa
, WITH
->alpha
, phi
, psi
, WITH
->ca
[0], WITH
->ca
[1],
3852 fprintf(stderr
,"Usage: dssp [-na] pdb_file dssp_file\n");
3853 fprintf(stderr
,"the -na flag disables the calculation of accessible surface\n");
3857 /*--------------------------------------------------------------------*/
3863 printf(" by Wolfgang Kabsch and Chris Sander\n");
3865 printf("Defines secondary structure and solvent exposure of proteins from\n");
3866 printf("atomic coordinates as given in Protein Data Bank format. \n");
3868 printf("_________________________________________________________________________\n");
3869 printf("This version licensed to Ethan Benatan at Univ_Pittsburgh \n");
3870 printf("for academic purposes. \n");
3871 printf("Do not redistribute. \n");
3873 printf("Commercial licenses available on request. \n");
3875 printf("Copyright by Wolfgang Kabsch and Chris Sander, 1983, 1985, 1988. \n");
3876 printf("Fax: +49-6221-387 306\n");
3878 printf("Algorithm version October 1988. Refer to Biopolymers 22(1983) 2577-2637.\n");
3879 printf("Do report errors if you find any.\n");
3881 printf("Email: Sander@embl-heidelberg.de \n");
3882 printf(" Kabsch@embl-heidelberg.de \n");
3884 printf("_________________________________________________________________________\n");
3885 printf("Related databases and datasets available from the Protein\n");
3886 printf("Design Group at EMBL via anonymous ftp from embl-heidelberg.de:\n");
3888 printf("pdb_select Representative set of protein structures.\n");
3889 printf(" By U. Hobohm, C. Sander, M. Scharf and R. Schneider.\n");
3890 printf(" See Protein Science 1, 409-417.\n");
3891 printf("DSSP Dictionary of secondary structures of proteins. \n");
3892 printf("HSSP Database of sequence-homology derived protein families.\n");
3893 printf(" By C. Sander and R.Schneider.\n");
3894 printf(" See Proteins 9, 56-68 (1991).\n");
3895 printf("FSSP Database of protein structure families with \n");
3896 printf(" common folding motifs. \n");
3897 printf(" L.Holm, C. Ouzounis, C. Sander, G.Tuparev, G. Vriend\n");
3898 printf(" See Protein Science, in the press (1992).\n");
3899 printf("In the XSSP databases, there is one dataset for each unique or\n");
3900 printf(" representative PDB protein, e.g., 1PPT.HSSP etc.\n");
3902 printf("Restrictions:Commercial users must apply for a license. \n");
3903 printf(" Not to be used for classified research.\n");
3906 void dssp_main(int bDoAcc
, int bSetVerbose
)
3908 int tt
; /*TIMELOCK*/
3909 PASCAL_MAIN(0,NULL
);
3913 bVerbose
=bSetVerbose
;
3915 tt
=time(0); /*TIMELOCK*/
3918 Inputcoordinates(&lchain
);
3919 if (!Nochainbreak(1L, lchain
))
3920 printf(" !!! POLYPEPTIDE CHAIN INTERRUPTED !!!\n");
3921 /* printf("INPUTCOORDINATES DONE%12ld\n", lchain); */
3923 /* printf("FLAGSSBONDS DONE\n"); */
3925 /* printf("FLAGCHIRALITY DONE\n"); */
3926 Flaghydrogenbonds();
3927 /* printf("FLAGHYDROGENBONDS DONE\n"); */
3929 /* printf("FLAGBRIDGE DONE\n"); */
3931 /* printf("FLAGTURN DONE\n"); */
3934 /* printf("FLAGACCESS DONE\n"); */
3937 /* printf("PRINTOUT DONE\n"); */
3942 } /* END OF PROGRAM DSSP */