4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * Great Red Oystrich Makes All Chemists Sane
29 static char *SRCID_dsspcore_c
= "$Id$";
31 /* Output from p2c, the Pascal-to-C translator */
32 /* From input file "dssp.p" */
36 /* ------------------------------------------------------------------ */
39 DSSP version October 1988.
40 This copy for Rudi Drunen at Univ_Groningen
41 who have agreed to the following software license agreement:
44 An academic license for the DSSP program
45 ((c) W. Kabsch, C. Sander and MPI-MF, 1983, 1985, 1988)
46 is granted to in exchange for the following commitments:
50 (1) I am an academic user at an academic research institution. In
51 using the software, I will respect the interests of the authors
52 and their institutions.
54 (2) I will not use the software in commercial activities without
55 a written commercial license agreement; commercial activities
56 include, in particular, work under contract from a commercial
59 (3) I will not redistribute the software to others outside of my
60 immediate research group. I will suggest to other interested
61 research groups to contact the authors directly.
63 (4) I will not alter or suppress the run-time copyright message.
65 (5) I will acknowledge the program authors on any publication of
66 scientific results based in part on use of the program and
67 cite the article in which the program was described.
69 (6) I will report evidence of program bugs to the authors.
71 (7) I will send the source code of any bug corrections and program
72 extensions, major or minor, to the original authors, for free
73 academic use. If I have made major extensions which are incor-
74 porated by the authors, I reserve the right to be appropriately
75 included in any future commercial license agreement.
77 (8) I will not extract part of the software, e.g. modules or sub-
78 routines, for use in other contexts without permission by the
81 (9) I will not use the program in the context of classified research.
83 /* PREVIOUS RELEASE: VERSION OCTOBER 1985 */
84 /* PREVIOUS RELEASE: VERSION JUNE 1983 */
85 /* LANGUAGE: STANDARD PASCAL WITH 128 CHARACTER ASCII SET */
86 /* AUTHORS AND COPYRIGHT (1983,1985,1988):
87 Wolfgang Kabsch and Chris Sander, Max Planck Institut
88 fuer Medizinische Forschung, Jahnstr. 29, 6900 Heidelberg, Germany
89 Telephone: +49-6221-486 276 Telex: 461505 mpimf d
91 Current address for Chris Sander:
92 Biocomputing, EMBL, 6900 Heidelberg, Germany
93 Telephone: +49-6221-387 361 Telex: 461613 embl d
94 Telefax: +49-6221-387 306
96 Do report errors if you find any.
97 Reference: Kabsch,W. and Sander,C. (1983) Biopolymers 22, 2577-2637*/
98 /*--------------------------------------------------------------------*/
99 /* DEFINES SECONDARY STRUCTURE AND SOLVENT EXPOSURE OF PROTEINS FROM
100 ATOMIC COORDINATES AS GIVEN BY THE BROOKHAVEN PROTEIN DATA BANK. */
101 /*--------------------------------------------------------------------*/
102 /* This program including sample input and output files for dataset 1PPT
103 is available from the authors in exchange for an academic or
104 commercial license agreement. The program is no longer available
105 from the Brookhaven Protein Data Bank */
106 /*--------------------------------------------------------------------*/
107 /* CORRECTION AND MODIFICATION LOG SINCE JUNE 1983 */
108 /* (1) MODIFICATIONS THAT AFFECT OUTPUT ON FILE TAPEOUT FOR AT LEAST ONE
109 OF THE 62 PROTEIN DATA SETS IN THE 1983 BIOPOLYMERS PAPER:
110 - SIDECHAIN ATOMS MORE THAN MAXDIST ANGSTROM DISTANT FROM ATOM CA ARE
111 DECLARED ILLEGAL AND IGNORED. OUTPUT CHANGE: ACCESSIBILITY VALUES
112 FOR ASN 76 OF 1SBT (ILLEGAL ATOM OD1) AND PRO 49 OF 156B (ILLEGAL
114 - ANY RESIDUE WITH INCOMPLETE BACKBONE IS IGNORED. OUTPUT CHANGE:
115 CHAIN BREAK BETWEEN RESIDUE SER 11 AND ILE 16 IN 2GCH
116 (DUE TO INCOMPLETE COORDINATES FOR SER 11) IS NOW CORRECT.
117 (2) MODIFICATIONS THAT DO NOT AFFECT OUTPUT ON FILE TAPEOUT FOR ANY
118 OF THE 62 PROTEIN DATA SETS IN THE 1983 BIOPOLYMERS PAPER:
119 - SPELLING OF FLAGCHIRALITY AND TESTSSBOND CORRECTED.
120 - WARNING MESSAGE FOR RESIDUES WITH NON-STANDARD NUMBER OF
121 SIDECHAIN ATOMS HAS BEEN ADDED. FOR EXAMPLE, THIS ALERTS THE USER
122 TO BAD DATA FOR RESIDUES 8,12,21,24 AND 44 OF DATA SET 2RXN.
123 - WARNING MESSAGE FOR RESIDUES IGNORED DUE TO NON-STANDARD RESIDUE
124 NAME SUCH AS 'ACE' AND 'FOR' HAS BEEN ADDED.
125 - WARNING MESSAGE FOR ALTERNATE ATOM LOCATION IDENTIFIER HAS BEEN
126 ADDED. FOR EXAMPLE, THE USER IS NOW WARNED THAT ATOM CH2 IN ANY
127 TRP OF DATA SET 1APP IS IGNORED DUE TO BAD ALTERNATE LOCATION
129 WE THANK STEVEN SHERIFF, FRANCOIS COLONNA AND JOHN MOULT FOR
130 REPORTING PROBLEMS AND STEVEN SHERIF, JANET THORNTON AND
131 WILLIE TAYLOR FOR RESULTS OF TEST RUNS ON VAX COMPUTERS.
135 - program speeded up by a factor of two or three by avoiding use
137 - hydrogen atoms in data set ignored on input (H of NH of backbone
139 - 18-AUG-1988: CADIST=9.0, replacing CADIST=8.0. Has affected output
140 for 63/300 proteins in a minor way. Thanks to Jean Richelle (Bruxelles)
141 for pointing out this bug.
143 Output changes due to change in parameter CADIST (8 to 9 Angstrom) :
144 additional backbone-backbone Hbonds found with slight
145 adjustments in secondary structure summary. In about 300 protein
146 data sets from the Fall 1988 PDB release, 63 additional
147 Hbonds were found, i.e. 0.2 Hbonds per protein (29 of type
148 i,i+5; 16 of type i,i+4; 6 of type i,i+3; 10 in antiparallel beta
149 bridges and 2 in a parallel beta bridge). These additional
150 Hbonds affected the secondary structure summary of 26 of these
151 protein data sets in a minor way, typically joining a 4-turn to
152 an alpha-helix, changing a geometrical turn to a hydrogen-
153 bonded turn or adding an extra residue pair to a beta ladder.
154 The changes are (using _ for blank):
156 [protein id, old secstruc summary > corrected summary]
158 1FC2_E > EE and _T > ET
161 1HDSS > T and GGGGGG > TTHHHH
166 1MEV__ > TT and _BS > TBS and SSS > TTS
168 1PP2_E > EE and _S > ES
169 1RN3E_SS_E > EEEEEE and _E > EE (>3-res beta bulge)
173 2CPPSS > TT and GGGGGG > HHHHTT
185 Note that this bugfix results in a small variation in the total
186 number of Hbonds, compared to the variation which would
187 result, say, from changing the (somewhat arbitrary) cutoff of
188 -0.5 kcal/mol for the Hbond electrostatic potential energy. We
189 cannot here solve the fundamental difficulty of arbitrary
190 cutoffs involved in extracting binary classifications (an Hbond
191 exists, yes/no) from real numbers (coordinates, energies).
192 However, for most purposes the secondary structure summary agrees
193 will with anyone's intuitive definition, especially for well-refined and
194 high resolution structures. For a more clearcut assignment of protein
195 substructure, we recommend using the detailed H-bond and other assignments
196 in the columns following the summary column, i.e. columns 19-38 (xxx):
198 ....;....1....;....2....;....3....;....4....;....5....;....6....;....7..
203 |||.-- geometrical bend
205 |||||.-- beta bridge label
206 ||||||.-- beta bridge label
207 ||||||| .-- beta bridge partner resnum
208 ||||||| | .-- beta bridge partner resnum
209 ||||||| | |.-- beta sheet label
210 ||||||| | || .-- solvent accessibility
213 36 48 R E > S- K 0 39C 97
214 37 49 Q T 3 S+ 0 0 86 (example from 1EST)
215 38 50 N T 3 S+ 0 0 34
216 39 51 W E < -KL 36 98C 6
218 /*--------------------------------------------------------------------*/
219 /* GENERAL PROGRAM INSTALLATION GUIDE. */
220 /* (1) THE PROGRAM REQUIRES THE FULL STANDARD ASCII 128 CHARACTER SET,
221 IN PARTICULAR LOWER CASE LETTERS 'abcdefg....'.
222 (2) STANDARD PASCAL MAY NOT RECOGNIZE REAL NUMBERS SUCH AS .1, +.1,
223 -.1 ON INPUT. CHANGE TO 0.1,+0.1,-0.1.
224 (3) THE NON-STANDARD PROCEDURE 'DATE' RETURNS THE CURRENT DAY, MONTH,
225 AND YEAR. IF THE PROCEDURE IS NOT CALLED (LINE COMMENTED OUT)
226 THE PSYCHEDELIC DATE DEC 24, 2001 IS RETURNED. YOU MAY REPLACE
227 'DATE' BY THE CORRESPONDING PROCEDURE FROM YOUR PASCAL
228 IMPLEMENTATION. THE EXAMPLE GIVEN WORKS IN DEC VAX VMS 5.0.
229 (4) DUE TO INCOMPATIBLE ASCII CODES, SQUARE BRACKETS '[' AND ']'
230 MAY APPEAR AS '!','?' ETC. USE YOUR EDITOR TO CONVERT THESE. */
231 /* INSTALLATION GUIDE FOR VAX/VMS USERS. */
232 /* (1) THE /OPTIMIZE OPTION OF THE PASCAL COMPILER PRODUCED
233 INCORRECT CODE ON THE VAX 8600 AT EMBL RUNNING UNDER VMS V4.2.
234 LATER VERSIONS OF VMS (E.G. VMS 5.0) PRODUCED CORRECT CODE.
235 IF IN DOUBT, COMPILE USING PASCAL /NOOPTIMIZE.
236 (2) COPY BROOKHAVEN DATA BANK COORDINATE INPUT TO A FILE NAMED
237 TAPEIN.DAT . OUTPUT WILL BE IN A FILE NAMED TAPEOUT.DAT */
238 /* IMPLEMENTATION ON OTHER COMPUTERS */
239 /* (1) NORD-500. EXECUTION TIME COMPARABLE TO VAX 780.
240 (2) SUN-3. EXECUTION TIME COMPARABLE TO VAX 780.
242 in ORDER to map upper case letters in keywords
243 and identifiers to lower case.
244 (3) ATARI 520 ST. RUNS FACTOR 60 SLOWER THAN NORD-500 DUE TO
245 SOFTWARE-EMULATED FLOATING POINT OPERATIONS ON MC68000. */
246 /*--------------------------------------------------------------------*/
247 /* INPUT/OUTPUT FILES. */
248 /* INPUT: DEFAULT INPUT UNIT, E.G. YOUR TERMINAL
249 OUTPUT: DEFAULT OUTPUT UNIT, E.G. YOUR TERMINAL,
250 USED FOR RUN-TIME MESSAGES. WARNINGS AND ERRORS LOOK
251 LIKE THIS: !!! TEXT !!!
252 TAPEIN: FILE WITH PROTEIN DATA BANK COORDINATES, E.G. PDB3PTI.COO
253 TAPEOUT: DSSP OUTPUT OF LINE LENGTH 128, E.G. PAPER PRINTER */
254 /*--------------------------------------------------------------------*/
255 /* DESCRIPTION OF OUTPUT ON FILE TAPEOUT:
256 LINE LENGTH OF OUTPUT IS 128 CHARCTERS.
257 FOR DEFINITONS, SEE ABOVE BIOPOLYMERS ARTICLE.
259 HISTOGRAMS - E.G. 2 UNDER COLUMN '8' IN LINE 'RESIDUES PER ALPHA
260 HELIX' MEANS: THERE ARE 2 ALPHA HELICES OF LENGTH 8
261 RESIDUES IN THIS DATA SET.
262 # RESIDUE AA STRUCTURE BP1 BP2 ACC ..ETC..FOR EACH RESIDUE I:
263 # RESIDUE - TWO COLUMNS OF RESIDUE NUMBERS. FIRST COLUMN IS DSSP'S
264 SEQUENTIAL RESIDUE NUMBER, STARTING AT THE FIRST
265 RESIDUE ACTUALLY IN THE DATA SET AND INCLUDING CHAIN BREAKS;
266 THIS NUMBER IS USED TO REFER TO RESIDUES THROUGHOUT. SECOND
267 COLUMN GIVES CRYSTALLOGRAPHERS' 'RESIDUE SEQUENCE
268 NUMBER','INSERTION CODE' AND 'CHAIN IDENTIFIER' (SEE PROTEIN
269 DATA BANK FILE RECORD FORMAT MANUAL), GIVEN FOR REFERENCE
270 ONLY AND NOT USED FURTHER..
271 AA - ONE LETTER AMINO ACID CODE, LOWER CASE FOR SS-BRIDGE CYS.
272 STRUCTURE - SEE BIOPOLYMERS
273 BP1 BP2 - RESIDUE NUMBER OF FIRST AND SECOND BRIDGE PARTNER
274 FOLLOWED BY ONE LETTER SHEET LABEL
275 ACC - NUMBER OF WATER MOLECULES IN CONTACT WITH THIS RESIDUE *10.
276 OR RESIDUE WATER EXPOSED SURFACE IN ANGSTROM**2.
277 N-H-->O ETC. - HYDROGEN BONDS. E.G. -3,-1.4 MEANS: IF THIS RESIDUE
278 IS RESIDUE I THEN N-H OF I IS H-BONDED TO C=O OF I-3
279 WITH AN ELECTROSTATIC H-BOND ENERGY OF -1.4 KCAL/MOL.
280 TCO - COSINE OF ANGLE BETWEEN C=O OF RESIDUE I AND C=O OF
281 RESIDUE I-1. FOR ALPHA-HELICES, TCO IS NEAR +1, FOR
282 BETA-SHEETS TCO IS NEAR -1. NOT USED FOR STRUCTURE
284 KAPPA - VIRTUAL BOND ANGLE (BEND ANGLE) DEFINED BY THE THREE
285 C-ALPHA ATOMS OF RESIDUES I-2,I,I+2. USED TO DEFINE
286 BEND (STRUCTURE CODE 'S').
287 ALPHA - VIRTUAL TORSION ANGLE (DIHEDRAL ANGLE) DEFINED BY THE FOUR
288 C-ALPHA ATOMS OF RESIDUES I-1,I,I+1,I+2. USED TO DEFINE
289 CHIRALITY (STRUCTURE CODE '+' OR '-').
290 PHI PSI - IUPAC PEPTIDE BACKBONE TORSION ANGLES
291 X-CA Y-CA Z-CA - ECHO OF C-ALPHA ATOM COORDINATES */
292 /*--------------------------------------------------------------------*/
293 /* WORDS OF CAUTION */
294 /* THE VALUES FOR SOLVENT EXPOSURE MAY NOT MEAN WHAT YOU THINK!
295 (A) EFFECTS LEADING TO LARGER THAN EXPECTED VALUES:
296 SOLVENT EXPOSURE CALCULATION IGNORES UNUSUAL RESIDUES, LIKE ACE,
297 OR RESIDUES WITH INCOMPLETE BACKBONE, LIKE ALA 1 OF DATA SET 1CPA.
298 IT ALSO IGNORES HETATOMS, LIKE A HEME OR METAL LIGANDS.
299 ALSO, SIDE CHAINS MAY BE INCOMPLETE (AN ERROR MESSAGE IS WRITTEN).
300 (B) EFFECTS LEADING TO SMALLER THAN EXPECTED VALUES:
301 IF YOU APPLY THIS PROGRAM TO PROTEIN DATA BANK DATA SETS
302 CONTAINING OLIGOMERS, SOLVENT EXPOSURE IS FOR THE ENTIRE ASSEMBLY,
303 NOT FOR THE MONOMER. ALSO, ATOM OXT OF C-TERMINAL RESIDUES IS
304 TREATED LIKE A SIDE CHAIN ATOM IF IT IS LISTED AS PART OF THE LAST
305 RESIDUE. ALSO, PEPTIDE SUBSTRATES, WHEN LISTED AS ATOMS RATHER THAN
306 HETATOMS, ARE TREATED AS PART OF THE PROTEIN, E.G. RESIDUES 499 S
307 AND 500 S IN 1CPA. */
308 /* UNKNOWN OR UNUSUAL RESIDUES ARE NAMED X ON OUTPUT AND THEY ARE
309 NOT CHECKED FOR STANDARD NUMBER OF SIDECHAIN ATOMS. */
310 /* ALL EXPLICIT WATER MOLECULES, LIKE OTHER HETATOMS, ARE IGNORED. */
311 /* END OF INTRODUCTORY COMMENTS */
312 /**********************************************************************/
315 /************************************************************
319 ************************************************************/
326 /* Header file for code generated by "p2c", the Pascal-to-C translator */
328 /* "p2c" Copyright (C) 1989, 1990, 1991 Free Software Foundation.
329 * By Dave Gillespie, daveg@csvax.cs.caltech.edu. Version 1.19.
330 * This file may be copied, modified, etc. in any way. It is not restricted
331 * by the licence agreement accompanying p2c itself.
339 /* If the following heuristic fails, compile -DBSD=0 for non-BSD systems,
340 or -DBSD=1 for BSD systems. */
361 #ifdef FILE /* a #define in BSD, a typedef in SYSV (hp-ux, at least) */
362 # ifndef BSD /* (a convenient, but horrible kludge!) */
388 # ifdef _INCLUDE__STDC__
393 # include <sys/types.h>
394 # if !defined(MSDOS) || defined(__TURBOC__)
400 # define __CAT__(a,b)__ID__(a)b
402 # define __CAT__(a,b)a##b
407 # include <strings.h>
408 # define memcpy(a,b,n) (bcopy(b,a,n),a)
409 # define memcmp(a,b,n) bcmp(a,b,n)
410 # define strchr(s,c) index(s,c)
411 # define strrchr(s,c) rindex(s,c)
430 #define LACK_LABS /* Undefine these if your library has these */
436 typedef struct __p2c_jmp_buf
{
437 struct __p2c_jmp_buf
*next
;
442 /* Warning: The following will not work if setjmp is used simultaneously.
443 This also violates the ANSI restriction about using vars after longjmp,
444 but a typical implementation of longjmp will get it right anyway. */
447 # define TRY(x) do { __p2c_jmp_buf __try_jb; \
448 __try_jb.next = __top_jb; \
449 if (!setjmp((__top_jb = &__try_jb)->jbuf)) {
450 # define RECOVER(x) __top_jb = __try_jb.next; } else {
451 # define RECOVER2(x,L) __top_jb = __try_jb.next; } else { \
452 if (0) { L: __top_jb = __try_jb.next; }
453 # define ENDTRY(x) } } while (0)
455 # define TRY(x) if (1) {
456 # define RECOVER(x) } else do {
457 # define RECOVER2(x,L) } else do { L: ;
458 # define ENDTRY(x) } while (0)
463 #ifdef M_XENIX /* avoid compiler bug */
464 # define SHORT_MAX (32767)
465 # define SHORT_MIN (-32768)
469 /* The following definitions work only on twos-complement machines */
471 # define SHORT_MAX ((short)(((unsigned short) -1) >> 1))
472 # define SHORT_MIN (~SHORT_MAX)
476 # define INT_MAX ((int)(((unsigned int) -1) >> 1))
477 # define INT_MIN (~INT_MAX)
481 # define LONG_MAX ((long)(((unsigned long) -1) >> 1))
482 # define LONG_MIN (~LONG_MAX)
493 # define EXIT_SUCCESS 1
494 # define EXIT_FAILURE (02000000000L)
496 # define EXIT_SUCCESS 0
497 # define EXIT_FAILURE 1
507 # define Signed signed
511 # define Void void /* Void f() = procedure */
516 # define Volatile volatile
518 # define PP(x) x /* function prototype */
519 # define PV() (void) /* null function prototype */
520 typedef void *Anyptr
;
532 typedef char *Anyptr
;
536 # define Inline inline
541 #define Register register /* Register variables */
542 #define Char char /* Characters (not bytes) */
545 # define Static static /* Private global funcs and vars */
549 # define Local static /* Nested functions */
552 typedef Signed
char schar
;
553 typedef unsigned char _uchar
;
554 typedef unsigned char boolean
;
571 extern Void PASCAL_MAIN
PP( (int, Char
**) );
572 extern Char
**P_argv
;
574 extern short P_escapecode
;
575 extern int P_ioresult
;
576 extern __p2c_jmp_buf
*__top_jb
;
579 #ifdef P2C_H_PROTO /* if you have Ansi C but non-prototyped header files */
580 extern Char
*strcat
PP( (Char
*, Const Char
*) );
581 extern Char
*strchr
PP( (Const Char
*, int) );
582 extern int strcmp
PP( (Const Char
*, Const Char
*) );
583 extern Char
*strcpy
PP( (Char
*, Const Char
*) );
584 extern size_t strlen
PP( (Const Char
*) );
585 extern Char
*strncat
PP( (Char
*, Const Char
*, size_t) );
586 extern int strncmp
PP( (Const Char
*, Const Char
*, size_t) );
587 extern Char
*strncpy
PP( (Char
*, Const Char
*, size_t) );
588 extern Char
*strrchr
PP( (Const Char
*, int) );
590 extern Anyptr memchr
PP( (Const Anyptr
, int, size_t) );
591 extern Anyptr memmove
PP( (Anyptr
, Const Anyptr
, size_t) );
592 extern Anyptr memset
PP( (Anyptr
, int, size_t) );
594 extern Anyptr memcpy
PP( (Anyptr
, Const Anyptr
, size_t) );
595 extern int memcmp
PP( (Const Anyptr
, Const Anyptr
, size_t) );
598 extern int atoi
PP( (Const Char
*) );
599 extern double atof
PP( (Const Char
*) );
600 extern long atol
PP( (Const Char
*) );
601 extern double strtod
PP( (Const Char
*, Char
**) );
602 extern long strtol
PP( (Const Char
*, Char
**, int) );
603 #endif /*P2C_H_PROTO*/
606 extern Anyptr malloc
PP( (size_t) );
607 extern Void free
PP( (Anyptr
) );
610 extern int _OutMem
PV();
611 extern int _CaseCheck
PV();
612 extern int _NilCheck
PV();
613 extern int _Escape
PP( (int) );
614 extern int _EscIO
PP( (int) );
616 extern long ipow
PP( (long, long) );
617 extern Char
*strsub
PP( (Char
*, Char
*, int, int) );
618 extern Char
*strltrim
PP( (Char
*) );
619 extern Char
*strrtrim
PP( (Char
*) );
620 extern Char
*strrpt
PP( (Char
*, Char
*, int) );
621 extern Char
*strpad
PP( (Char
*, Char
*, int, int) );
622 extern int strpos2
PP( (Char
*, Char
*, int) );
623 extern long memavail
PV();
624 extern int P_peek
PP( (FILE *) );
625 extern int P_eof
PP( (FILE *) );
626 extern int P_eoln
PP( (FILE *) );
627 extern Void P_readpaoc
PP( (FILE *, Char
*, int) );
628 extern Void P_readlnpaoc
PP( (FILE *, Char
*, int) );
629 extern long P_maxpos
PP( (FILE *) );
630 extern Char
*P_trimname
PP( (Char
*, int) );
631 extern long *P_setunion
PP( (long *, long *, long *) );
632 extern long *P_setint
PP( (long *, long *, long *) );
633 extern long *P_setdiff
PP( (long *, long *, long *) );
634 extern long *P_setxor
PP( (long *, long *, long *) );
635 extern int P_inset
PP( (unsigned, long *) );
636 extern int P_setequal
PP( (long *, long *) );
637 extern int P_subset
PP( (long *, long *) );
638 extern long *P_addset
PP( (long *, unsigned) );
639 extern long *P_addsetr
PP( (long *, unsigned, unsigned) );
640 extern long *P_remset
PP( (long *, unsigned) );
641 extern long *P_setcpy
PP( (long *, long *) );
642 extern long *P_expset
PP( (long *, long) );
643 extern long P_packset
PP( (long *) );
644 extern int P_getcmdline
PP( (int l
, int h
, Char
*line
) );
645 extern Void TimeStamp
PP( (int *Day
, int *Month
, int *Year
,
646 int *Hour
, int *Min
, int *Sec
) );
647 extern Void P_sun_argv
PP( (char *, int, int) );
650 /* I/O error handling */
651 #define _CHKIO(cond,ior,val,def) ((cond) ? P_ioresult=0,(val) \
652 : P_ioresult=(ior),(def))
653 #define _SETIO(cond,ior) (P_ioresult = (cond) ? 0 : (ior))
655 /* Following defines are suitable for the HP Pascal operating system */
656 #define FileNotFound 10
657 #define FileNotOpen 13
658 #define FileWriteError 38
659 #define BadInputFormat 14
662 /* Creating temporary files */
663 #if (defined(BSD) || defined(NO_TMPFILE)) && !defined(HAVE_TMPFILE)
664 # define tmpfile() (fopen(tmpnam(NULL), "w+"))
668 #define FILEBUF(f,sc,type) sc int __CAT__(f,_BFLAGS); \
669 sc type __CAT__(f,_BUFFER)
670 #define FILEBUFNC(f,type) int __CAT__(f,_BFLAGS); \
671 type __CAT__(f,_BUFFER)
673 #define RESETBUF(f,type) (__CAT__(f,_BFLAGS) = 1)
674 #define SETUPBUF(f,type) (__CAT__(f,_BFLAGS) = 0)
676 #define GETFBUF(f,type) (*((__CAT__(f,_BFLAGS) == 1 && \
677 ((__CAT__(f,_BFLAGS) = 2), \
678 fread(&__CAT__(f,_BUFFER), \
679 sizeof(type),1,(f)))),\
680 &__CAT__(f,_BUFFER)))
681 #define AGETFBUF(f,type) ((__CAT__(f,_BFLAGS) == 1 && \
682 ((__CAT__(f,_BFLAGS) = 2), \
683 fread(__CAT__(f,_BUFFER), \
684 sizeof(type),1,(f)))),\
687 #define PUTFBUF(f,type,v) (GETFBUF(f,type) = (v))
688 #define CPUTFBUF(f,v) (PUTFBUF(f,char,v))
689 #define APUTFBUF(f,type,v) (memcpy(AGETFBUF(f,type), (v), \
690 sizeof(__CAT__(f,_BUFFER))))
692 #define GET(f,type) (__CAT__(f,_BFLAGS) == 1 ? \
693 fread(&__CAT__(f,_BUFFER),sizeof(type),1,(f)) : \
694 (__CAT__(f,_BFLAGS) = 1))
696 #define PUT(f,type) (fwrite(&__CAT__(f,_BUFFER),sizeof(type),1,(f)), \
697 (__CAT__(f,_BFLAGS) = 0))
698 #define CPUT(f) (PUT(f,char))
700 #define BUFEOF(f) (__CAT__(f,_BFLAGS) != 2 && P_eof(f))
701 #define BUFFPOS(f) (ftell(f) - (__CAT__(f,_BFLAGS) == 2))
709 /* Memory allocation */
711 # define Malloc(n) (malloc(n) ?: (Anyptr)_OutMem())
713 extern Anyptr __MallocTemp__
;
714 # define Malloc(n) ((__MallocTemp__ = malloc(n)) ? __MallocTemp__ : (Anyptr)_OutMem())
716 #define FreeR(p) (free((Anyptr)(p))) /* used if arg is an rvalue */
717 #define Free(p) (free((Anyptr)(p)), (p)=NULL)
720 #define SEXT(x,n) ((x) | -(((x) & (1L<<((n)-1))) << 1))
722 /* packed arrays */ /* BEWARE: these are untested! */
723 #define P_getbits_UB(a,i,n,L) ((int)((a)[(i)>>(L)-(n)] >> \
724 (((~(i))&((1<<(L)-(n))-1)) << (n)) & \
727 #define P_getbits_SB(a,i,n,L) ((int)((a)[(i)>>(L)-(n)] << \
728 (16 - ((((~(i))&((1<<(L)-(n))-1))+1) <<\
729 (n)) >> (16-(1<<(n))))))
731 #define P_putbits_UB(a,i,x,n,L) ((a)[(i)>>(L)-(n)] |= \
732 (x) << (((~(i))&((1<<(L)-(n))-1)) << (n)))
734 #define P_putbits_SB(a,i,x,n,L) ((a)[(i)>>(L)-(n)] |= \
735 ((x) & (1<<(1<<(n)))-1) << \
736 (((~(i))&((1<<(L)-(n))-1)) << (n)))
738 #define P_clrbits_B(a,i,n,L) ((a)[(i)>>(L)-(n)] &= \
739 ~( ((1<<(1<<(n)))-1) << \
740 (((~(i))&((1<<(L)-(n))-1)) << (n))) )
742 /* small packed arrays */
743 #define P_getbits_US(v,i,n) ((int)((v) >> ((i)<<(n)) & (1<<(1<<(n)))-1))
744 #define P_getbits_SS(v,i,n) ((int)((long)(v) << (SETBITS - (((i)+1) << (n))) >> (SETBITS-(1<<(n)))))
745 #define P_putbits_US(v,i,x,n) ((v) |= (x) << ((i) << (n)))
746 #define P_putbits_SS(v,i,x,n) ((v) |= ((x) & (1<<(1<<(n)))-1) << ((i)<<(n)))
747 #define P_clrbits_S(v,i,n) ((v) &= ~( ((1<<(1<<(n)))-1) << ((i)<<(n)) ))
749 #define P_max(a,b) ((a) > (b) ? (a) : (b))
750 #define P_min(a,b) ((a) < (b) ? (a) : (b))
757 # define labs my_labs
758 extern long my_labs
PP( (long) );
764 # define memmove my_memmove
765 extern Anyptr my_memmove
PP( (Anyptr
, Const Anyptr
, size_t) );
771 # define memcpy my_memcpy
772 extern Anyptr my_memcpy
PP( (Anyptr
, Const Anyptr
, size_t) );
775 # define memcmp my_memcmp
776 extern int my_memcmp
PP( (Const Anyptr
, Const Anyptr
, size_t) );
779 # define memset my_memset
780 extern Anyptr my_memset
PP( (Anyptr
, int, size_t) );
784 /* Fix toupper/tolower on Suns and other stupid BSD systems */
788 # define toupper(c) my_toupper(c)
789 # define tolower(c) my_tolower(c)
793 # if 'A' == 65 && 'a' == 97
794 # define _toupper(c) ((c)-'a'+'A')
795 # define _tolower(c) ((c)-'A'+'a')
798 # undef toupper /* hope these are shadowing real functions, */
799 # undef tolower /* because my_toupper calls _toupper! */
801 # define _toupper(c) toupper(c)
802 # define _tolower(c) tolower(c)
816 /************************************************************
820 ************************************************************/
822 /* Run-time library for use with "p2c", the Pascal to C translator */
824 /* "p2c" Copyright (C) 1989, 1990, 1991 Free Software Foundation.
825 * By Dave Gillespie, daveg@csvax.cs.caltech.edu. Version --VERSION--.
826 * This file may be copied, modified, etc. in any way. It is not restricted
827 * by the licence agreement accompanying p2c itself.
832 /* #include "p2c.h" */
840 #define Isspace(c) isspace(c) /* or "((c) == ' ')" if preferred */
851 long EXCP_LINE
; /* Used by Pascal workstation system */
853 Anyptr __MallocTemp__
;
855 __p2c_jmp_buf
*__top_jb
;
860 void PASCAL_MAIN(argc
, argv
)
877 /* In case your system lacks these... */
882 return((x
> 0) ? x
: -x
);
887 Anyptr
my_memmove(Anyptr d
, Const Anyptr s
, size_t n
)
889 Anyptr
my_memmove(d
, s
, n
)
894 register char *dd
= (char *)d
, *ss
= (char *)s
;
895 if (dd
< ss
|| dd
- ss
>= n
) {
908 Anyptr
my_memcpy(Anyptr d
, Const Anyptr s
, size_t n
)
910 Anyptr
my_memcpy(d
, s
, n
)
915 register char *ss
= (char *)s
, *dd
= (char *)d
;
922 int my_memcmp(Const Anyptr s1
, Const Anyptr s2
, size_t n
)
924 int my_memcmp(s1
, s2
, n
)
929 register char *a
= (char *)s1
, *b
= (char *)s2
;
932 if ((i
= (*a
++) - (*b
++)) != 0)
938 Anyptr
my_memset(Anyptr d
, int c
, size_t n
)
940 Anyptr
my_memset(d
, c
, n
)
946 register char *dd
= (char *)d
;
980 if (a
== 0 || a
== 1)
983 return (b
& 1) ? -1 : 1;
989 while ((b
>>= 1) > 0) {
1000 /* Common string functions: */
1002 /* Store in "ret" the substring of length "len" starting from "pos" (1-based).
1003 Store a shorter or null string if out-of-range. Return "ret". */
1005 char *strsub(ret
, s
, pos
, len
)
1006 register char *ret
, *s
;
1007 register int pos
, len
;
1011 if (--pos
< 0 || len
<= 0) {
1023 while (--len
>= 0) {
1024 if (!(*s2
++ = *s
++))
1032 /* Return the index of the first occurrence of "pat" as a substring of "s",
1033 starting at index "pos" (1-based). Result is 1-based, 0 if not found. */
1035 int strpos2(s
, pat
, pos
)
1040 register char *cp
, ch
;
1045 slen
= strlen(s
) - pos
;
1051 while (--slen
>= 0) {
1052 if (*cp
++ == ch
&& !strncmp(cp
, pat
, pos
))
1059 /* Case-insensitive version of strcmp. */
1061 int strcicmp(s1
, s2
)
1062 register char *s1
, *s2
;
1064 register unsigned char c1
, c2
;
1067 if (*s1
++ != *s2
++) {
1070 c1
= toupper(s1
[-1]);
1071 c2
= toupper(s2
[-1]);
1084 /* HP and Turbo Pascal string functions: */
1086 /* Trim blanks at left end of string. */
1091 while (Isspace(*s
++)) ;
1096 /* Trim blanks at right end of string. */
1101 register char *s2
= s
;
1106 while (s2
> s
&& Isspace(*--s2
))
1112 /* Store in "ret" "num" copies of string "s". Return "ret". */
1114 char *strrpt(ret
, s
, num
)
1119 register char *s2
= ret
;
1122 while (--num
>= 0) {
1124 while ((*s2
++ = *s1
++)) ;
1131 /* Store in "ret" string "s" with enough pad chars added to reach "size". */
1133 char *strpad(ret
, s
, padchar
, num
)
1136 register int padchar
, num
;
1138 register char *d
= ret
;
1143 while ((*d
++ = *s
++)) ;
1153 /* Copy the substring of length "len" from index "spos" of "s" (1-based)
1154 to index "dpos" of "d", lengthening "d" if necessary. Length and
1155 indices must be in-range. */
1157 void strmove(len
, s
, spos
, d
, dpos
)
1158 register char *s
, *d
;
1159 register int len
, spos
, dpos
;
1163 while (*d
&& --len
>= 0)
1173 /* Delete the substring of length "len" at index "pos" from "s".
1174 Delete less if out-of-range. */
1176 void strdelete(s
, pos
, len
)
1178 register int pos
, len
;
1184 slen
= strlen(s
) - pos
;
1192 while ((*s
= s
[len
])) s
++;
1196 /* Insert string "src" at index "pos" of "dst". */
1198 void strinsert(src
, dst
, pos
)
1199 register char *src
, *dst
;
1202 register int slen
, dlen
;
1217 } while (--dlen
>= 0);
1226 /* File functions */
1228 /* Peek at next character of input stream; return EOF at end-of-file. */
1239 return (ch
== '\n') ? ' ' : ch
;
1243 /* Check if at end of file, using Pascal "eof" semantics. End-of-file for
1244 stdin is broken; remove the special case for it to be broken in a
1255 return 0; /* not safe to look-ahead on the keyboard! */
1264 /* Check if at end of line (or end of entire file). */
1275 return (ch
== '\n');
1279 /* Read a packed array of characters from a file. */
1281 Void
P_readpaoc(f
, s
, len
)
1292 if (ch
== EOF
|| ch
== '\n')
1303 Void
P_readlnpaoc(f
, s
, len
)
1312 if (ch
== EOF
|| ch
== '\n')
1324 /* Compute maximum legal "seek" index in file (0-based). */
1329 long savepos
= ftell(f
);
1332 if (fseek(f
, 0L, SEEK_END
))
1335 if (fseek(f
, savepos
, SEEK_SET
))
1341 /* Use packed array of char for a file name. */
1343 Char
*P_trimname(fn
, len
)
1347 static Char fnbuf
[256];
1348 register Char
*cp
= fnbuf
;
1350 while (--len
>= 0 && *fn
&& !isspace(*fn
))
1361 /* Sets are stored as an array of longs. S[0] is the size of the set;
1362 S[N] is the N'th 32-bit chunk of the set. S[0] equals the maximum
1363 I such that S[I] is nonzero. S[0] is zero for an empty set. Within
1364 each long, bits are packed from lsb to msb. The first bit of the
1365 set is the element with ordinal value 0. (Thus, for a "set of 5..99",
1366 the lowest five bits of the first long are unused and always zero.) */
1368 /* (Sets with 32 or fewer elements are normally stored as plain longs.) */
1370 long *P_setunion(d
, s1
, s2
) /* d := s1 + s2 */
1371 register long *d
, *s1
, *s2
;
1374 register int sz1
= *s1
++, sz2
= *s2
++;
1375 while (sz1
> 0 && sz2
> 0) {
1376 *d
++ = *s1
++ | *s2
++;
1383 *dbase
= d
- dbase
- 1;
1388 long *P_setint(d
, s1
, s2
) /* d := s1 * s2 */
1389 register long *d
, *s1
, *s2
;
1392 register int sz1
= *s1
++, sz2
= *s2
++;
1393 while (--sz1
>= 0 && --sz2
>= 0)
1394 *d
++ = *s1
++ & *s2
++;
1395 while (--d
> dbase
&& !*d
) ;
1401 long *P_setdiff(d
, s1
, s2
) /* d := s1 - s2 */
1402 register long *d
, *s1
, *s2
;
1405 register int sz1
= *s1
++, sz2
= *s2
++;
1406 while (--sz1
>= 0 && --sz2
>= 0)
1407 *d
++ = *s1
++ & ~*s2
++;
1412 while (--d
> dbase
&& !*d
) ;
1418 long *P_setxor(d
, s1
, s2
) /* d := s1 / s2 */
1419 register long *d
, *s1
, *s2
;
1422 register int sz1
= *s1
++, sz2
= *s2
++;
1423 while (sz1
> 0 && sz2
> 0) {
1424 *d
++ = *s1
++ ^ *s2
++;
1431 while (--d
> dbase
&& !*d
) ;
1437 int P_inset(val
, s
) /* val IN s */
1438 register unsigned val
;
1442 bit
= val
% SETBITS
;
1444 if (val
< *s
++ && ((1<<bit
) & s
[val
]))
1450 long *P_addset(s
, val
) /* s := s + [val] */
1452 register unsigned val
;
1454 register long *sbase
= s
;
1455 register int bit
, size
;
1456 bit
= val
% SETBITS
;
1471 long *P_addsetr(s
, v1
, v2
) /* s := s + [v1..v2] */
1473 register unsigned v1
, v2
;
1475 register long *sbase
= s
;
1476 register int b1
, b2
, size
;
1477 if ((int)v1
> (int)v2
)
1493 *s
|= (~((-2)<<(b2
-b1
))) << b1
;
1498 *s
|= ~((-2) << b2
);
1504 long *P_remset(s
, val
) /* s := s - [val] */
1506 register unsigned val
;
1509 bit
= val
% SETBITS
;
1512 if (!(s
[val
] &= ~(1<<bit
)))
1513 while (*s
&& !s
[*s
])
1520 int P_setequal(s1
, s2
) /* s1 = s2 */
1521 register long *s1
, *s2
;
1523 register int size
= *s1
++;
1526 while (--size
>= 0) {
1534 int P_subset(s1
, s2
) /* s1 <= s2 */
1535 register long *s1
, *s2
;
1537 register int sz1
= *s1
++, sz2
= *s2
++;
1540 while (--sz1
>= 0) {
1548 long *P_setcpy(d
, s
) /* d := s */
1549 register long *d
, *s
;
1551 register long *save_d
= d
;
1553 #ifdef SETCPY_MEMCPY
1554 memcpy(d
, s
, (*s
+ 1) * sizeof(long));
1556 register int i
= *s
+ 1;
1564 /* s is a "smallset", i.e., a 32-bit or less set stored
1565 directly in a long. */
1567 long *P_expset(d
, s
) /* d := s */
1580 long P_packset(s
) /* convert s to a small-set */
1593 /* Oregon Software Pascal extensions, courtesy of William Bader */
1595 int P_getcmdline(l
, h
, line
)
1604 for(i
= 1; i
< P_argc
; i
++) {
1607 if (len
>= h
) return len
;
1610 if (len
>= h
) return len
;
1616 Void
TimeStamp(Day
, Month
, Year
, Hour
, Min
, Sec
)
1617 int *Day
, *Month
, *Year
, *Hour
, *Min
, *Sec
;
1624 tm
= localtime(&clock
);
1626 *Month
= tm
->tm_mon
+ 1; /* Jan = 0 */
1627 *Year
= tm
->tm_year
;
1629 *Year
+= 1900; /* year since 1900 */
1630 *Hour
= tm
->tm_hour
;
1639 /* SUN Berkeley Pascal extensions */
1641 Void
P_sun_argv(s
, len
, n
)
1643 register int len
, n
;
1647 if ((unsigned)n
< P_argc
)
1651 while (*cp
&& --len
>= 0)
1679 /* The following is suitable for the HP Pascal operating system.
1680 It might want to be revised when emulating another system. */
1682 char *_ShowEscape(buf
, code
, ior
, prefix
)
1688 if (prefix
&& *prefix
) {
1689 strcpy(buf
, prefix
);
1691 bufp
= buf
+ strlen(buf
);
1696 sprintf(bufp
, "Pascal system I/O error %d", ior
);
1699 strcat(buf
, " (illegal I/O request)");
1702 strcat(buf
, " (bad file name)");
1704 case FileNotFound
: /*10*/
1705 strcat(buf
, " (file not found)");
1707 case FileNotOpen
: /*13*/
1708 strcat(buf
, " (file not open)");
1710 case BadInputFormat
: /*14*/
1711 strcat(buf
, " (bad input format)");
1714 strcat(buf
, " (not open for reading)");
1717 strcat(buf
, " (not open for writing)");
1720 strcat(buf
, " (not open for direct access)");
1723 strcat(buf
, " (string subscript out of range)");
1725 case EndOfFile
: /*30*/
1726 strcat(buf
, " (end-of-file)");
1728 case FileWriteError
: /*38*/
1729 strcat(buf
, " (file write error)");
1733 sprintf(bufp
, "Pascal system error %d", code
);
1736 strcat(buf
, " (out of memory)");
1739 strcat(buf
, " (reference to NIL pointer)");
1742 strcat(buf
, " (integer overflow)");
1745 strcat(buf
, " (divide by zero)");
1748 strcat(buf
, " (real math overflow)");
1751 strcat(buf
, " (value range error)");
1754 strcat(buf
, " (CASE value range error)");
1757 strcat(buf
, " (bus error)");
1760 strcat(buf
, " (stopped by user)");
1773 P_escapecode
= code
;
1775 __p2c_jmp_buf
*jb
= __top_jb
;
1776 __top_jb
= jb
->next
;
1777 longjmp(jb
->jbuf
, 1);
1783 fprintf(stderr
, "%s\n", _ShowEscape(buf
, P_escapecode
, P_ioresult
, ""));
1791 return _Escape(-10);
1803 /************************************************************
1807 ************************************************************/
1812 #include <stdio.h>*/
1813 static char *mon
[]={"JAN","FEB","MAR","APR","MAY","JUN",
1814 "JUL","AUG","SEP","OCT","NOV","DEC"};
1815 /* PROCEDURE DATE(VAR DATESTRING:PACKED ARRAY[1..11] OF CHAR);EXTERN; */
1816 /* activate DATE by removing comment brackets if necessary */
1826 sprintf(string
,"%d-%s-19%d\n",t
->tm_mday
,mon
[t
->tm_mon
],t
->tm_year
);
1830 /* p2c: dssp.p, line 295:
1831 * Note: Unexpected name "tapein" in program header [262] */
1832 /* p2c: dssp.p, line 295:
1833 * Note: Unexpected name "tapeout" in program header [262] */
1836 /*--------------------------------------------------------------------*/
1837 /* PROGRAM FATAL ERROR EXIT LABEL */
1838 /******************* MATHEMATICAL CONSTANTS **************************
1839 YVERTEX, - ARE Y,Z-COMPONENTS OF THE FIRST ICOSAHEDRON VERTEX. THE
1840 ZVERTEX X-COMPONENT IS 0.
1841 EPS - NUMERICAL TOLERANCE
1842 --------------------------------------------------------------------*/
1844 #define PIHALF 1.570796
1846 #define TWOPI 6.283185
1847 #define FOURPI 12.56637
1848 #define RADIAN 57.29578
1849 #define YVERTEX 0.8506508
1850 #define ZVERTEX 0.5257311
1853 /*************** ARRAY DIMENSIONING CONSTANTS ***********************
1854 NMAX - MAXIMUM NUMBER OF AMINOACID RESIDUES IN ARRAY CHAIN
1855 MAXATOM - MAXIMUM NUMBER OF SIDECHAIN ATOMS IN ARRAY SIDECHAIN
1856 MAXBRIDGE- MAXIMUM NUMBER OF BRIDGES IN ARRAY BRIDGETABLE
1857 NFACE, - NUMBER OF FACES OF POLYHEDRON. THE COORDINATES OF THE CENTRE
1858 ORDER OF EACH TRIANGULAR FACE ARE STORED IN ARRAY P, THE AREA
1859 IS STORED IN ARRAY WP IN PROCEDURE FLAGACCESS. NFACE MUST
1860 BE OF THE FORM NFACE=20*(4**ORDER), ORDER=0,1,2,...
1861 THE ACCURACY OF THE SOLVENT ACCESSIBLE SURFACE OF EACH
1862 AMINOACID RESIDUE IS ONE ANGSTROM**2 FOR ORDER=2,NFACE=320.
1863 MAXPACK - MAXIMUM NUMBER OF PROTEIN ATOMS WHICH CAN INTRUDE INTO
1864 SOLVENT AROUND ANY GIVEN TEST ATOM. THE COORDINATES OF
1865 THESE ATOMS ARE STORED IN ARRAY X, THEIR RADII IN ARRAY RX
1866 IN PROCEDURE SURFACE.
1867 MAXHIST - NUMBER OF SLOTS IN ARRAYS HELIXHIST AND BETAHIST USED FOR
1868 LENGTH STATISTICS OF SECONDARY STRUCTURE.
1869 MAXSS - MAXIMUM NUMBER OF SSBOND RECORDS ON INPUT FILE. THE
1870 DISULFIDE BOND ARE SAVED IN ARRAY SSBONDS.
1871 --------------------------------------------------------------------*/
1875 #define MAXATOM 40000L
1877 #define MAXBRIDGE 300
1884 /********************* PHYSICAL CONSTANTS **************************
1885 RN - RADIUS OF PEPTIDE NITROGEN ATOM
1886 RCA - RADIUS OF PEPTIDE ALPHA-CARBON ATOM
1887 RC - RADIUS OF PEPTIDE C'-CARBON ATOM
1888 RO - RADIUS OF PEPTIDE OXYGEN ATOM
1889 RSIDEATOM- RADIUS OF SIDECHAIN ATOM
1890 RWATER - RADIUS OF WATER MOLECULE
1891 SSDIST - MAXIMUM ALLOWED DISTANCE OF DISULFIDE BRIDGE
1892 BREAKDIST- MAXIMUM ALLOWED PEPTIDE BOND LENGTH. IF DISTANCE IS
1893 GREATER A POLYPEPTIDE CHAIN INTERRUPTION IS ASSUMED.
1894 RESRAD - MAXIMUM RADIUS OF A SPHERE AROUND C-ALPHA CONTAINING
1895 ALL ATOMS OF A RESIDUE
1896 CADIST - MINIMUM DISTANCE BETWEEN ALPHA-CARBON ATOMS SUCH THAT NO
1897 BACKBONE HYDROGEN BONDS CAN BE FORMED
1898 DIST - SMALLEST ALLOWED DISTANCE BETWEEN ANY ATOMS
1899 MAXDIST - LARGEST ALLOWED DISTANCE BETWEEN SIDECHAIN ATOM AND C-ALPHA
1901 Q - COUPLING CONSTANT FOR ELECTROSTATIC ENERGY
1902 Q=-332*0.42*0.2*1000.0
1903 HBLOW - LOWEST ALLOWED ENERGY OF A HYDROGEN BOND IN CAL/MOL
1904 HBHIGH - HIGHEST ALLOWED ENERGY OF A HYDROGEN BOND IN CAL/MOL
1905 --------------------------------------------------------------------*/
1911 #define RSIDEATOM 1.8
1914 #define BREAKDIST 2.5
1918 #define MAXDIST 10.0
1919 #define Q (-27888.0)
1921 #define HBLOW (-9900)
1922 #define HBHIGH (-500)
1926 /***************** GLOBAL DATA TYPE DEFINITIONS ***********************/
1928 typedef double vector
[3];
1929 typedef Char char4
[4];
1930 typedef Char char6
[6];
1932 parallel
, antiparallel
, nobridge
1935 symbol
, turn3
, turn4
, turn5
, bend
, chirality
, beta1
, beta2
1938 typedef struct hydrogenbond
{
1939 long residue
, energy
;
1942 typedef hydrogenbond bonds
[2];
1944 typedef struct backbone
{
1946 Char sheetlabel
, aa
;
1947 char4 threelettercode
;
1948 Char ss
[(long)beta2
- (long)symbol
+ 1];
1949 long partner
[(long)beta2
- (long)beta1
+ 1];
1951 double alpha
, kappa
;
1952 bonds acceptor
, donor
;
1953 vector h
, n
, ca
, c
, o
;
1954 long atompointer
, nsideatoms
;
1957 typedef struct bridge
{
1958 Char sheetname
, laddername
;
1960 long linkset
[MAXBRIDGE
/ 32 + 2];
1961 long ib
, ie
, jb
, je
, from
, towards
;
1965 static int bVerbose
;
1966 Static
int silentFlag
;
1967 Static
long nss
, nssintra
, nssinter
, lchain
, nbridge
;
1968 Static char6 ssbonds
[MAXSS
][2];
1969 Static backbone chain
[NMAX
+ 1];
1970 FILE *tapein
, *tapeout
;
1971 Static vector sidechain
[MAXATOM
];
1972 Static bridge bridgetable
[MAXBRIDGE
];
1974 Static Void
VecCopy(dest
,source
)
1983 Static Void
StrCopy(dest
,source
,n
)
1993 Static
double Atan2(y
, x
)
2018 Static Void
Diff(x
, y
, z
)
2029 Static
double Dot(x
, y
)
2032 return (x
[0] * y
[0] + x
[1] * y
[1] + x
[2] * y
[2]);
2038 Static Void
Cross(x
, y
, z
)
2041 z
[0] = x
[1] * y
[2] - y
[1] * x
[2];
2042 z
[1] = x
[2] * y
[0] - y
[2] * x
[0];
2043 z
[2] = x
[0] * y
[1] - y
[0] * x
[1];
2049 Static Void
Norm(x
, xnorm
)
2053 /* RETURNS INPUT VECTOR X NORMALIZED TO UNIT LENGTH.
2054 XNORM IS THE ORIGINAL LENGTH OF X. */
2055 double TEMP
, TEMP1
, TEMP2
;
2060 *xnorm
= TEMP
* TEMP
+ TEMP1
* TEMP1
+ TEMP2
* TEMP2
;
2063 *xnorm
= sqrt(*xnorm
);
2072 Static
double Dihedralangle(v1
, v2
, v3
, v4
)
2073 double *v1
, *v2
, *v3
, *v4
;
2075 /*CALCULATES TORSION ANGLE OF A SET OF 4 ATOMS V1-V2-V3-V4.
2076 DIHEDRALANGLE IS THE ANGLE BETWEEN THE PROJECTION OF
2077 V1-V2 AND THE PROJECTION OF V4-V3 ONTO A PLANE NORMAL TO
2080 double Result
, u
, v
;
2081 vector v12
, v43
, x
, y
, z
, p
;
2092 if (u
<= 0.0 || v
<= 0.0)
2094 u
= Dot(p
, x
) / sqrt(u
);
2095 v
= Dot(p
, y
) / sqrt(v
);
2096 if (u
!= 0.0 || v
!= 0.0)
2097 return (Atan2(v
, u
) * RADIAN
);
2099 } /* Dihedralangle */
2104 Static
double Cosangle(v1
, v2
, v3
, v4
)
2105 double *v1
, *v2
, *v3
, *v4
;
2112 x
= Dot(u
, u
) * Dot(v
, v
);
2114 return (Dot(u
, v
) / sqrt(x
));
2122 Static
double Distance(u
, v
)
2125 double TEMP
, TEMP1
, TEMP2
;
2128 TEMP1
= u
[1] - v
[1];
2129 TEMP2
= u
[2] - v
[2];
2130 return sqrt(TEMP
* TEMP
+ TEMP1
* TEMP1
+ TEMP2
* TEMP2
);
2136 Static
double Distsq(u
, v
)
2139 double TEMP
, TEMP1
, TEMP2
;
2142 TEMP1
= u
[1] - v
[1];
2143 TEMP2
= u
[2] - v
[2];
2144 return (TEMP
* TEMP
+ TEMP1
* TEMP1
+ TEMP2
* TEMP2
);
2148 /*--------------------------------------------------------------------*/
2150 Static boolean
Nochainbreak(i
, j
)
2156 test
= (i
>= 1 && j
<= NMAX
&& i
<= j
);
2158 while (test
&& k
<= j
) {
2159 if (chain
[k
].aa
== '!')
2165 } /* Nochainbreak */
2169 /*--------------------------------------------------------------------*/
2171 Static Void
Writeresidue(res
)
2176 for (i
= 0; i
<= 3; i
++)
2177 putchar(res
.threelettercode
[i
]);
2178 for (i
= 0; i
<= 5; i
++)
2179 putchar(res
.aaident
[i
]);
2180 } /* Writeresidue */
2183 #define MAXSIDEATOMS 20
2187 headercard
, compndcard
, sourcecard
, authorcard
, ssbondcard
, atomcard
,
2188 tercard
, endcard
, othercard
2192 typedef struct cardcontents
{
2198 char4 atomname
, aaname
;
2199 Char altloc
, residuename
;
2205 } cardcontents
; /* CARDCONTENTS TYPE DEFINITION */
2210 Static
jmp_buf _JL99
;
2212 /* Local variables for Inputcoordinates: */
2213 struct LOC_Inputcoordinates
{
2214 long *lchain
, latom
, hatoms
;
2215 boolean nmissing
, camissing
, cmissing
, omissing
, corelimit
;
2216 vector sidecoordinates
[MAXSIDEATOMS
];
2218 char4 sideatomnames
[MAXSIDEATOMS
];
2219 backbone reszero
, resinfo
;
2224 Local Char
Onelettercode(aaa
, LINK
)
2226 struct LOC_Inputcoordinates
*LINK
;
2229 Char aminoacid
[150];
2234 StrCopy(aasymbol
, "ARNDCEQGHILKMFPSTWYVBZXXXXXXXXXXXXXXXX--CCCCIPPPW-", 50L);
2235 StrCopy(string
[0], "ALAARGASNASPCYSGLUGLNGLYHISILE", 30L);
2236 StrCopy(string
[1], "LEULYSMETPHEPROSERTHRTRPTYRVAL", 30L);
2237 StrCopy(string
[2], "ASXGLXACDALBALIABUAROBASBETHSE", 30L);
2238 StrCopy(string
[3], "HYPHYLORNPCASARTAUTHYUNKACEFOR", 30L);
2239 StrCopy(string
[4], "CYHCSHCSSCYXILUPRZPR0CPRTRYHOH", 30L);
2241 for (k
= 0; k
<= 4; k
++) {
2242 for (i
= 0; i
<= 29; i
++) {
2244 aminoacid
[l
- 1] = string
[k
][i
];
2250 while (k
< 51 && a
== '-') {
2251 if (aminoacid
[i
- 1] == aaa
[0]) {
2252 if (aminoacid
[i
] == aaa
[1]) {
2253 if (aminoacid
[i
+ 1] == aaa
[2])
2254 a
= aasymbol
[k
- 1];
2261 } /* Onelettercode */
2263 /* Local variables for Checksideatoms: */
2264 struct LOC_Checksideatoms
{
2265 struct LOC_Inputcoordinates
*LINK
;
2270 Local Void
Checkdist(resinfo
, LINK
)
2272 struct LOC_Checksideatoms
*LINK
;
2277 while (i
<= resinfo
->nsideatoms
) {
2278 if (Distance(resinfo
->ca
, LINK
->LINK
->sidecoordinates
[i
- 1]) <= MAXDIST
) {
2283 printf(" !!! RESIDUE ");
2284 Writeresidue(*resinfo
);
2285 printf(" HAS ILLEGAL SIDECHAIN ATOM NAMED ");
2286 for (j
= 0; j
<= 3; j
++)
2287 putchar(LINK
->LINK
->sideatomnames
[i
- 1][j
]);
2289 printf(" THIS ATOM WILL BE IGNORED !!!\n\n");
2291 FORLIM
= resinfo
->nsideatoms
;
2292 for (j
= i
+ 1; j
<= FORLIM
; j
++) {
2293 StrCopy(LINK
->LINK
->sideatomnames
[j
- 2],
2294 LINK
->LINK
->sideatomnames
[j
- 1], sizeof(char4
));
2295 VecCopy(LINK
->LINK
->sidecoordinates
[j
- 2],
2296 LINK
->LINK
->sidecoordinates
[j
- 1]);
2298 resinfo
->nsideatoms
--;
2304 Local Void
Checksideatoms(resinfo
, LINK
)
2306 struct LOC_Inputcoordinates
*LINK
;
2308 struct LOC_Checksideatoms V
;
2315 Checkdist(resinfo
, &V
);
2322 if (c
== 'S' || c
== 'C')
2324 if (c
== 'P' || c
== 'T' || c
== 'V')
2326 if (c
== 'B' || c
== 'M' || c
== 'L' || c
== 'I' || c
== 'D' || c
== 'N')
2328 if (c
== 'Z' || c
== 'K' || c
== 'Q' || c
== 'E')
2332 if (c
== 'F' || c
== 'R')
2338 if ((resinfo
->nsideatoms
< i
) && (bVerbose
)) {
2339 printf(" !!! RESIDUE ");
2340 Writeresidue(*resinfo
);
2341 printf(" HAS%3ld INSTEAD OF EXPECTED ", resinfo
->nsideatoms
);
2342 printf("%3ld SIDECHAIN ATOMS.\n", i
);
2343 printf(" CALCULATED SOLVENT ACCESSIBILITY REFERS TO INCOMPLETE "
2344 "SIDECHAIN !!!\n\n");
2346 if (i
== -1 || resinfo
->nsideatoms
<= i
)
2349 printf(" !!! RESIDUE ");
2350 Writeresidue(*resinfo
);
2351 printf(" HAS%3ld INSTEAD OF EXPECTED ", resinfo
->nsideatoms
);
2352 printf("%3ld SIDECHAIN ATOMS.\n", i
);
2353 printf(" LAST SIDECHAIN ATOM NAME IS ");
2354 for (j
= 0; j
<= 3; j
++)
2355 putchar(LINK
->sideatomnames
[resinfo
->nsideatoms
- 1][j
]);
2356 printf("\n CALCULATED SOLVENT ACCESSIBILITY INCLUDES EXTRA ATOMS !!!\n\n");
2358 } /* Checksideatoms */
2362 Local Void
Putresidue(LINK
)
2363 struct LOC_Inputcoordinates
*LINK
;
2365 /* insert residue into protein chain */
2370 complete
= !(LINK
->nmissing
|| LINK
->camissing
|| LINK
->cmissing
||
2373 strncmp(LINK
->reszero
.aaident
, LINK
->resinfo
.aaident
, sizeof(char6
))
2375 printf(" !!! BACKBONE INCOMPLETE FOR RESIDUE ");
2376 Writeresidue(LINK
->resinfo
);
2377 printf("\n RESIDUE WILL BE IGNORED !!!\n\n");
2379 LINK
->corelimit
= (LINK
->latom
+ LINK
->resinfo
.nsideatoms
> MAXATOM
||
2380 *LINK
->lchain
> NMAX
- 2);
2381 if (complete
&& !LINK
->corelimit
) {
2382 Checksideatoms(&LINK
->resinfo
, LINK
);
2383 VecCopy(LINK
->resinfo
.h
, LINK
->resinfo
.n
);
2384 if (Nochainbreak(*LINK
->lchain
, *LINK
->lchain
)) {
2385 if (Distance(chain
[*LINK
->lchain
].c
, LINK
->resinfo
.n
) > BREAKDIST
)
2386 /* keep ! at LCHAIN */
2389 printf(" !!! EXCESSIVE C TO N DISTANCE ");
2390 printf("% .5E>% .5E\n",
2391 Distance(chain
[*LINK
->lchain
].c
, LINK
->resinfo
.n
), BREAKDIST
);
2392 printf(" BEFORE RESIDUE ");
2393 Writeresidue(LINK
->resinfo
);
2394 printf(". CHAIN BREAK RESIDUE INSERTED !!!\n\n");
2398 if (Nochainbreak(*LINK
->lchain
, *LINK
->lchain
) && LINK
->resinfo
.aa
!= 'P') {
2399 LINK
->dco
= Distance(chain
[*LINK
->lchain
].c
, chain
[*LINK
->lchain
].o
);
2400 for (i
= 0; i
<= 2; i
++)
2401 LINK
->resinfo
.h
[i
] = LINK
->resinfo
.n
[i
] +
2402 (chain
[*LINK
->lchain
].c
[i
] - chain
[*LINK
->lchain
].o
[i
]) / LINK
->dco
;
2405 chain
[*LINK
->lchain
] = LINK
->resinfo
;
2406 FORLIM
= LINK
->resinfo
.nsideatoms
;
2407 for (i
= 0; i
< FORLIM
; i
++)
2408 VecCopy(sidechain
[LINK
->latom
+ i
], LINK
->sidecoordinates
[i
]);
2409 LINK
->latom
+= LINK
->resinfo
.nsideatoms
;
2411 if (Nochainbreak(*LINK
->lchain
, *LINK
->lchain
) && !complete
)
2413 LINK
->resinfo
= LINK
->reszero
;
2414 LINK
->nmissing
= true;
2415 LINK
->camissing
= true;
2416 LINK
->cmissing
= true;
2417 LINK
->omissing
= true;
2422 Local Void
Getresidue(atomname
, coordinates
, LINK
)
2424 double *coordinates
;
2425 struct LOC_Inputcoordinates
*LINK
;
2427 boolean hydrogenatom
;
2429 hydrogenatom
= ((atomname
[0] == '9' || atomname
[0] == '8' ||
2430 atomname
[0] == '7' || atomname
[0] == '6' ||
2431 atomname
[0] == '5' || atomname
[0] == '4' ||
2432 atomname
[0] == '3' || atomname
[0] == '2' ||
2433 atomname
[0] == '1' || atomname
[0] == '0' ||
2434 atomname
[0] == ' ') &&
2435 (atomname
[1] == 'D' || atomname
[1] == 'H'));
2440 if (!strncmp(atomname
, " N ", sizeof(char4
))) {
2441 LINK
->nmissing
= false;
2442 VecCopy(LINK
->resinfo
.n
, coordinates
);
2445 if (!strncmp(atomname
, " CA ", sizeof(char4
))) {
2446 LINK
->camissing
= false;
2447 VecCopy(LINK
->resinfo
.ca
, coordinates
);
2450 if (!strncmp(atomname
, " C ", sizeof(char4
))) {
2451 LINK
->cmissing
= false;
2452 VecCopy(LINK
->resinfo
.c
, coordinates
);
2455 if (!strncmp(atomname
, " O ", sizeof(char4
))) {
2456 LINK
->omissing
= false;
2457 VecCopy(LINK
->resinfo
.o
, coordinates
);
2460 if (LINK
->resinfo
.nsideatoms
>= MAXSIDEATOMS
)
2462 LINK
->resinfo
.nsideatoms
++;
2463 VecCopy(LINK
->sidecoordinates
[LINK
->resinfo
.nsideatoms
- 1], coordinates
);
2464 StrCopy(LINK
->sideatomnames
[LINK
->resinfo
.nsideatoms
- 1], atomname
,
2470 Local Void
Readcard(cardinfo
, LINK
)
2471 cardcontents
*cardinfo
;
2472 struct LOC_Inputcoordinates
*LINK
;
2478 cardinfo
->art
= othercard
;
2480 if (!P_eof(tapein
)) {
2481 *key
= getc(tapein
);
2485 } while (!(isupper(key
[0]) | P_eof(tapein
)));
2486 if (P_eof(tapein
)) {
2487 cardinfo
->art
= endcard
;
2490 for (l
= 1; l
<= 5; l
++) {
2491 if (!P_eoln(tapein
)) {
2492 key
[l
] = getc(tapein
);
2497 if (!strncmp(key
, "HEADER", sizeof(char6
)))
2498 cardinfo
->art
= headercard
;
2499 if (!strncmp(key
, "COMPND", sizeof(char6
)))
2500 cardinfo
->art
= compndcard
;
2501 if (!strncmp(key
, "SOURCE", sizeof(char6
)))
2502 cardinfo
->art
= sourcecard
;
2503 if (!strncmp(key
, "AUTHOR", sizeof(char6
)))
2504 cardinfo
->art
= authorcard
;
2505 if (!strncmp(key
, "SSBOND", sizeof(char6
)))
2506 cardinfo
->art
= ssbondcard
;
2507 if (!strncmp(key
, "ATOM ", sizeof(char6
)))
2508 cardinfo
->art
= atomcard
;
2509 if (!strncmp(key
, "TER ", sizeof(char6
)))
2510 cardinfo
->art
= tercard
;
2511 if (!strncmp(key
, "END ", sizeof(char6
)))
2512 cardinfo
->art
= endcard
;
2513 switch (cardinfo
->art
) {
2519 for (l
= 0; l
<= 5; l
++)
2520 cardinfo
->UU
.z
[l
] = key
[l
];
2521 for (l
= 6; l
<= 126; l
++)
2522 cardinfo
->UU
.z
[l
] = ' ';
2523 cardinfo
->UU
.z
[127] = '.';
2524 if (cardinfo
->art
== headercard
)
2528 for (l
= 6; l
< m
; l
++) {
2529 if (!P_eoln(tapein
)) {
2530 cardinfo
->UU
.z
[l
] = getc(tapein
);
2531 if (cardinfo
->UU
.z
[l
] == '\n')
2532 cardinfo
->UU
.z
[l
] = ' ';
2538 for (l
= 7; l
<= 8; l
++) {
2543 for (k
= 0; k
<= 1; k
++) {
2544 for (l
= 1; l
<= 7; l
++) {
2549 cardinfo
->UU
.r
[k
][5] = getc(tapein
);
2551 if (cardinfo
->UU
.r
[k
][5] == '\n')
2552 cardinfo
->UU
.r
[k
][5] = ' ';
2555 /* minor modification suggested by Steven Sheriff */
2556 for (l
= 0; l
<= 3; l
++) {
2557 cardinfo
->UU
.r
[k
][l
] = getc(tapein
);
2558 if (cardinfo
->UU
.r
[k
][l
] == '\n')
2559 cardinfo
->UU
.r
[k
][l
] = ' ';
2562 cardinfo
->UU
.r
[k
][4] = ' ';
2564 cardinfo
->UU
.r
[k
][4] = getc(tapein
);
2565 if (cardinfo
->UU
.r
[k
][4] == '\n')
2566 cardinfo
->UU
.r
[k
][4] = ' ';
2569 /* end minor modification suggested by Steven Sheriff */
2573 for (l
= 7; l
<= 12; l
++) {
2578 for (l
= 0; l
<= 3; l
++) {
2579 cardinfo
->UU
.U5
.atomname
[l
] = getc(tapein
);
2580 if (cardinfo
->UU
.U5
.atomname
[l
] == '\n')
2581 cardinfo
->UU
.U5
.atomname
[l
] = ' ';
2583 cardinfo
->UU
.U5
.altloc
= getc(tapein
);
2584 if (cardinfo
->UU
.U5
.altloc
== '\n')
2585 cardinfo
->UU
.U5
.altloc
= ' ';
2586 for (l
= 0; l
<= 2; l
++) {
2587 cardinfo
->UU
.U5
.aaname
[l
] = getc(tapein
);
2588 if (cardinfo
->UU
.U5
.aaname
[l
] == '\n')
2589 cardinfo
->UU
.U5
.aaname
[l
] = ' ';
2591 cardinfo
->UU
.U5
.aaname
[3] = ' ';
2592 cardinfo
->UU
.U5
.residuename
= Onelettercode(cardinfo
->UU
.U5
.aaname
, LINK
);
2594 cardinfo
->UU
.U5
.reseqnum
[5] = getc(tapein
);
2597 if (cardinfo
->UU
.U5
.reseqnum
[5] == '\n')
2598 cardinfo
->UU
.U5
.reseqnum
[5] = ' ';
2599 for (l
= 0; l
<= 4; l
++) {
2600 cardinfo
->UU
.U5
.reseqnum
[l
] = getc(tapein
);
2601 if (cardinfo
->UU
.U5
.reseqnum
[l
] == '\n')
2602 cardinfo
->UU
.U5
.reseqnum
[l
] = ' ';
2604 for (l
= 0; l
<= 2; l
++)
2605 fscanf(tapein
, "%lf", &cardinfo
->UU
.U5
.coordinates
[l
]);
2614 fscanf(tapein
, "%*[^\n]");
2620 /*--------------------------------------------------------------------*/
2621 /* SEE BROOKHAVEN PROTEIN DATA BANK ATOMIC COORDINATE ENTRY FORMAT
2623 -------------------------------------------------------------------*/
2625 Static Void
Inputcoordinates(lchain_
)
2628 struct LOC_Inputcoordinates V
;
2629 Char datestring
[30];
2634 cardcontents cardinfo
;
2635 long cardhist
[(long)othercard
- (long)headercard
+ 1];
2643 for (j
= 0; j
<= 5; j
++)
2644 V
.reszero
.aaident
[j
] = ' ';
2646 V
.reszero
.access
= 0;
2647 StrCopy(V
.reszero
.threelettercode
, " ", sizeof(char4
));
2648 for (s
= symbol
; (long)s
<= (long)beta2
; s
= (structure
)((long)s
+ 1))
2649 V
.reszero
.ss
[(long)s
- (long)symbol
] = ' ';
2650 V
.reszero
.sheetlabel
= ' ';
2651 V
.reszero
.partner
[0] = 0;
2652 V
.reszero
.partner
[(long)beta2
- (long)beta1
] = 0;
2653 V
.reszero
.alpha
= 360.0;
2654 V
.reszero
.kappa
= 360.0;
2655 for (j
= 0; j
<= 1; j
++) {
2656 V
.reszero
.acceptor
[j
].residue
= 0;
2657 V
.reszero
.acceptor
[j
].energy
= 0;
2658 V
.reszero
.donor
[j
].residue
= 0;
2659 V
.reszero
.donor
[j
].energy
= 0;
2661 V
.reszero
.atompointer
= 0;
2662 V
.reszero
.nsideatoms
= 0;
2663 for (j
= 0; j
<= 2; j
++) {
2664 V
.reszero
.h
[j
] = 0.0;
2665 V
.reszero
.n
[j
] = 0.0;
2666 V
.reszero
.ca
[j
] = 0.0;
2667 V
.reszero
.c
[j
] = 0.0;
2668 V
.reszero
.o
[j
] = 0.0;
2670 for (i
= 0; i
<= NMAX
; i
++)
2671 chain
[i
] = V
.reszero
;
2672 Date(datestring
); /* DATE(DAY-MONTH-YEAR); */
2673 /* comment out this line if necessary */
2674 fprintf(tapeout
, "**** SECONDARY STRUCTURE DEFINITION ");
2675 fprintf(tapeout
, "BY THE PROGRAM DSSP, VERSION OCT. 1988 ****");
2676 fprintf(tapeout
, " DATE=%.11s", datestring
);
2677 for (i
= 106; i
<= 127; i
++)
2679 fprintf(tapeout
, ".\n");
2680 fprintf(tapeout
, "REFERENCE W. KABSCH AND C.SANDER, BIOPOLYMERS ");
2681 fprintf(tapeout
, "22 (1983) 2577-2637");
2682 for (i
= 66; i
<= 127; i
++)
2684 fprintf(tapeout
, ".\n");
2685 for (ctype
= headercard
;
2686 (long)ctype
<= (long)othercard
;
2687 ctype
= (cardtype
)((long)ctype
+ 1))
2688 cardhist
[(long)ctype
- (long)headercard
] = 0;
2689 V
.corelimit
= false;
2691 V
.resinfo
= V
.reszero
;
2697 Readcard(&cardinfo
, &V
);
2698 cardhist
[(long)cardinfo
.art
- (long)headercard
]++;
2699 switch (cardinfo
.art
) {
2705 if (cardhist
[(long)cardinfo
.art
- (long)headercard
] == 1) {
2706 for (i
= 0; i
<= 127; i
++)
2707 putc(cardinfo
.UU
.z
[i
], tapeout
);
2708 putc('\n', tapeout
);
2714 for (i
= 0; i
<= 1; i
++)
2715 StrCopy(ssbonds
[nss
- 1][i
], cardinfo
.UU
.r
[i
], sizeof(char6
));
2719 if (cardinfo
.UU
.U5
.residuename
!= '-' &&
2720 (cardinfo
.UU
.U5
.altloc
== 'A' || cardinfo
.UU
.U5
.altloc
== ' ')) {
2721 if (strncmp(V
.resinfo
.aaident
, cardinfo
.UU
.U5
.reseqnum
, sizeof(char6
))) {
2723 V
.resinfo
.atompointer
= V
.latom
;
2724 StrCopy(V
.resinfo
.aaident
, cardinfo
.UU
.U5
.reseqnum
, sizeof(char6
));
2725 V
.resinfo
.aa
= cardinfo
.UU
.U5
.residuename
;
2726 StrCopy(V
.resinfo
.threelettercode
, cardinfo
.UU
.U5
.aaname
,
2729 Getresidue(cardinfo
.UU
.U5
.atomname
, cardinfo
.UU
.U5
.coordinates
, &V
);
2731 if ((cardinfo
.UU
.U5
.residuename
== '-') && bVerbose
) {
2732 printf(" !!! RESIDUE ");
2733 for (i
= 0; i
<= 3; i
++)
2734 putchar(cardinfo
.UU
.U5
.aaname
[i
]);
2735 for (i
= 0; i
<= 5; i
++)
2736 putchar(cardinfo
.UU
.U5
.reseqnum
[i
]);
2737 printf(" HAS NONSTANDARD NAME.\n");
2738 printf(" RESIDUE WILL BE ");
2739 printf("IGNORED !!!\n");
2741 if ((cardinfo
.UU
.U5
.altloc
!= 'A' && cardinfo
.UU
.U5
.altloc
!= ' ') &&
2743 printf(" !!! IN RESIDUE");
2744 for (i
= 0; i
<= 3; i
++)
2745 printf(" %c", cardinfo
.UU
.U5
.aaname
[i
]);
2746 for (i
= 0; i
<= 5; i
++)
2747 putchar(cardinfo
.UU
.U5
.reseqnum
[i
]);
2748 printf(" ALTERNATE LOCATION INDICATOR ");
2749 printf("IS %c AND\n", cardinfo
.UU
.U5
.altloc
);
2750 printf(" NOT BLANK OR A. ATOM ");
2752 for (i
= 0; i
<= 3; i
++)
2753 putchar(cardinfo
.UU
.U5
.atomname
[i
]);
2754 printf(" WILL BE IGNORED !!!\n\n");
2771 } while (!(V
.corelimit
|| finish
));
2772 if ((V
.corelimit
) && bVerbose
) {
2773 printf(" !!! NUMBER OF ATOMS OR RESIDUES EXCEEDS ");
2774 printf("STORAGE CAPACITY !!!\n");
2776 if (!Nochainbreak(*V
.lchain
, *V
.lchain
))
2778 if ((V
.hatoms
> 0) && bVerbose
) {
2779 printf(" !!! %12ld HYDROGEN OR DEUTERIUM ATOMS WERE IGNORED\n", V
.hatoms
);
2780 printf(" IN THE CALCULATION OF SIDE CHAIN SOLVENT \n");
2781 printf(" ACCESSIBILITY !!!\n");
2784 if (cardhist
[0] < 1)
2785 printf(" !!! HEADER-CARD MISSING !!!\n");
2786 if (cardhist
[(long)compndcard
- (long)headercard
] < 1)
2787 printf(" !!! COMPOUND-CARD MISSING !!!\n");
2788 if (cardhist
[(long)sourcecard
- (long)headercard
] < 1)
2789 printf(" !!! SOURCE-CARD MISSING !!!\n");
2790 if (cardhist
[(long)authorcard
- (long)headercard
] < 1)
2791 printf(" !!! AUTHOR CARD MISSING !!!\n");
2792 if (*V
.lchain
< 1) {
2793 printf(" !!! NO RESIDUE WITH COMPLETE BACKBONE !!!\n");
2797 printf(" !!! ALL SIDECHAIN COORDINATES MISSING !!!\n");
2799 } /* Inputcoordinates */
2805 /*--------------------------------------------------------------------*/
2807 Static boolean
Testbond(i
, j
)
2810 /* TESTBOND IS TRUE IF I IS DONOR[=NH] TO J, OTHERWISE FALSE */
2814 return (WITH
->acceptor
[0].residue
== j
&& WITH
->acceptor
[0].energy
< HBHIGH
||
2815 WITH
->acceptor
[1].residue
== j
&& WITH
->acceptor
[1].energy
< HBHIGH
);
2821 Local boolean
Testssbond(i
, j
)
2829 if (!(Nochainbreak(i
, i
) & Nochainbreak(j
, j
)))
2831 while (!(ssbond
|| k
> nss
)) {
2832 ssbond
= ((!strncmp(chain
[i
].aaident
, ssbonds
[k
- 1][0], sizeof(char6
)) &&
2833 !strncmp(chain
[j
].aaident
, ssbonds
[k
- 1][1], sizeof(char6
))) ||
2834 (!strncmp(chain
[i
].aaident
, ssbonds
[k
- 1][1], sizeof(char6
)) &&
2835 !strncmp(chain
[j
].aaident
, ssbonds
[k
- 1][0], sizeof(char6
))));
2843 /*--------------------------------------------------------------------*/
2845 Static Void
Flagssbonds()
2860 FORLIM
= lchain
- 2;
2861 for (i
= 1; i
<= FORLIM
; i
++) {
2862 if (chain
[i
].aa
== 'C' && chain
[i
].nsideatoms
> 1) {
2863 ii
= chain
[i
].atompointer
+ 2;
2868 if (chain
[j
].nsideatoms
> 1 && chain
[j
].aa
== 'C')
2869 jj
= chain
[j
].atompointer
+ 2;
2873 ssbond
= (Distance(sidechain
[ii
- 1], sidechain
[jj
- 1]) < SSDIST
);
2874 } while (!(ssbond
|| j
== lchain
));
2875 if (ssbond
& (!Testssbond(i
, j
)))
2877 printf(" !!! ADDITIONAL SSBOND FOUND BETWEEN ");
2878 printf("RESIDUES ");
2879 Writeresidue(chain
[i
]);
2881 Writeresidue(chain
[j
]);
2887 FORLIM
= lchain
- 2;
2888 for (i
= 1; i
<= FORLIM
; i
++) {
2890 if (WITH
->aa
== 'C') {
2892 for (j
= i
+ 2; j
<= FORLIM1
; j
++) {
2893 if (chain
[j
].aa
== 'C') {
2894 if (Testssbond(i
, j
)) {
2897 printf(" !!! SS-BRIDGE LABEL RESTART AT a !!!\n");
2903 if (Nochainbreak(i
, j
))
2907 if (WITH
->nsideatoms
> 1) {
2908 if (chain
[j
].nsideatoms
> 1) {
2909 jj
= chain
[j
].atompointer
+ 2;
2910 ii
= WITH
->atompointer
+ 2;
2911 d
= Distance(sidechain
[ii
- 1], sidechain
[jj
- 1]);
2912 if ((d
> SSDIST
) && bVerbose
) {
2913 printf(" !!! SSBOND DISTANCE IS%5.1f BETWEEN RESIDUES", d
);
2914 Writeresidue(chain
[i
]);
2916 Writeresidue(chain
[j
]);
2927 if ((nss
!= nssintra
+ nssinter
) && bVerbose
)
2928 printf(" !!! ERROR IN SSBOND DATA RECORDS !!!\n");
2933 /*--------------------------------------------------------------------*/
2935 Static Void
Flagchirality()
2942 FORLIM
= lchain
- 2;
2943 for (i
= 2; i
<= FORLIM
; i
++) {
2945 if (Nochainbreak(i
- 1, i
+ 2)) {
2946 WITH
->alpha
= Dihedralangle(chain
[i
- 1].ca
, WITH
->ca
, chain
[i
+ 1].ca
,
2948 if (WITH
->alpha
< 0.0)
2949 WITH
->ss
[(long)chirality
- (long)symbol
] = '-';
2951 WITH
->ss
[(long)chirality
- (long)symbol
] = '+';
2954 FORLIM
= lchain
- 2;
2956 for (i
= 3; i
<= FORLIM
; i
++) {
2958 if (Nochainbreak(i
- 2, i
+ 2)) {
2959 ckap
= Cosangle(chain
[i
].ca
, chain
[i
- 2].ca
, chain
[i
+ 2].ca
,
2961 skap
= sqrt(1.0 - ckap
* ckap
);
2962 WITH
->kappa
= RADIAN
* Atan2(skap
, ckap
);
2965 } /* Flagchirality */
2970 Local
long Bondenergy(i
, j
)
2973 /*RESIDUE I IS DONOR[=NH],J IS ACCEPTOR[=CO] OF THE PROTON IN THE
2974 HYDROGEN BOND. THE BONDENERGY IS IN CAL/MOL */
2975 double dho
, dhc
, dnc
, dno
;
2981 if (WITH
->aa
== 'P')
2983 dho
= Distance(WITH
->h
, chain
[j
].o
);
2984 dhc
= Distance(WITH
->h
, chain
[j
].c
);
2985 dnc
= Distance(WITH
->n
, chain
[j
].c
);
2986 dno
= Distance(WITH
->n
, chain
[j
].o
);
2987 if (dho
< DIST
|| dhc
< DIST
|| dnc
< DIST
|| dno
< DIST
)
2990 hbe
= (long)floor(Q
/ dho
- Q
/ dhc
+ Q
/ dnc
- Q
/ dno
+ 0.5);
2994 printf(" !!! CONTACT BETWEEN RESIDUES ");
2995 Writeresidue(chain
[i
]);
2997 Writeresidue(chain
[j
]);
2998 printf(" TOO CLOSE !!!\n");
3006 Local Void
Updatebonds(b
, hb
)
3010 if (hb
.energy
< b
[0].energy
) {
3013 } else if (hb
.energy
< b
[1].energy
)
3019 Local Void
Setbonds(i
, j
)
3022 /*I IS NH, J IS CO*/
3025 hb
.energy
= Bondenergy(i
, j
);
3027 /* CO(J) IS ACCEPTOR OF NH(I) */
3028 Updatebonds(chain
[i
].acceptor
, hb
);
3030 Updatebonds(chain
[j
].donor
, hb
);
3035 /*--------------------------------------------------------------------*/
3037 Static Void
Flaghydrogenbonds()
3046 for (i
= 1; i
<= FORLIM
; i
++) {
3047 if (Nochainbreak(i
, i
)) {
3050 for (j
= i
+ 1; j
<= FORLIM1
; j
++) {
3051 if (Nochainbreak(j
, j
)) {
3052 if (Distance(WITH
->ca
, chain
[j
].ca
) < CADIST
) {
3061 } /* Flaghydrogenbonds */
3066 Local Void
Ladder(i
, j
, b
)
3076 if (b
== nobridge
|| i
>= j
)
3079 WITH
= &bridgetable
[k
- 1];
3080 if (WITH
->ib
== 0) {
3091 found
= (WITH
->btyp
== b
&& i
== WITH
->ie
+ 1) & Nochainbreak(WITH
->ie
,
3092 i
) & (((j
== WITH
->je
+ 1 && b
== parallel
) &
3093 Nochainbreak(WITH
->je
, j
)) | ((j
== WITH
->jb
- 1 &&
3094 b
== antiparallel
) & Nochainbreak(j
, WITH
->jb
)));
3095 /* p2c: dssp.p, line 1609: Note:
3096 * Line breaker spent 1.1+0.26 seconds, 3126 tries on line 1540 [251] */
3105 if (k
> MAXBRIDGE
) {
3107 printf(" !!! BRIDGETABLE OVERFLOW !!!\n");
3112 } while (!found
); /* Ladder */
3117 Local Void
Testbridge(i
)
3128 if (!Nochainbreak(i
- 1, i
+ 1))
3130 while (j2
== 0 && j
< lchain
) {
3131 if (Nochainbreak(j
- 1, j
+ 1)) {
3132 if ((Testbond(i
+ 1, j
) & Testbond(j
, i
- 1)) |
3133 (Testbond(j
+ 1, i
) & Testbond(i
, j
- 1)))
3135 else if ((Testbond(i
+ 1, j
- 1) & Testbond(j
+ 1, i
- 1)) |
3136 (Testbond(j
, i
) & Testbond(i
, j
)))
3140 if (b
!= nobridge
) {
3144 } else if (j
!= j1
) {
3156 Local Void
Extendladder()
3158 long i
, j
, ib1
, jb1
, je1
;
3165 for (i
= 1; i
<= FORLIM
; i
++) {
3166 WITH
= &bridgetable
[i
- 1];
3168 while (j
<= nbridge
&& WITH
->towards
== 0) {
3169 ib1
= bridgetable
[j
- 1].ib
;
3170 jb1
= bridgetable
[j
- 1].jb
;
3171 je1
= bridgetable
[j
- 1].je
;
3172 bulge
= (Nochainbreak(WITH
->ie
, ib1
) && ib1
- WITH
->ie
< 6 &&
3173 bridgetable
[j
- 1].btyp
== WITH
->btyp
&&
3174 bridgetable
[j
- 1].from
== 0);
3176 switch (WITH
->btyp
) {
3179 bulge
= (jb1
- WITH
->je
< 6 && ib1
- WITH
->ie
< 3 ||
3180 jb1
- WITH
->je
< 3) & Nochainbreak(WITH
->je
, jb1
);
3184 bulge
= (WITH
->jb
- je1
< 6 && ib1
- WITH
->ie
< 3 ||
3185 WITH
->jb
- je1
< 3) & Nochainbreak(je1
, WITH
->jb
);
3191 bridgetable
[j
- 1].from
= i
;
3197 for (i
= 1; i
<= FORLIM
; i
++) {
3198 WITH
= &bridgetable
[i
- 1];
3199 if (WITH
->from
== 0) {
3200 P_expset(WITH
->linkset
, 0L);
3203 P_addset(WITH
->linkset
, (int)j
);
3204 j
= bridgetable
[j
- 1].towards
;
3208 P_setcpy(bridgetable
[j
- 1].linkset
, WITH
->linkset
);
3209 j
= bridgetable
[j
- 1].towards
;
3213 } /* Extendladder */
3215 /* Local variables for Sheet: */
3217 long ladderset
[MAXBRIDGE
/ 32 + 2], sheetset
[MAXBRIDGE
/ 32 + 2];
3222 Local boolean
Link(l1
, l2
)
3225 /* LINK IS TRUE IF THERE IS A COMMON RESIDUE IN LADDERS L1 AND L2 */
3226 long ib1
, ie1
, jb1
, je1
, ib2
, ie2
, jb2
, je2
;
3228 ib1
= bridgetable
[l1
- 1].ib
;
3229 ie1
= bridgetable
[l1
- 1].ie
;
3230 jb1
= bridgetable
[l1
- 1].jb
;
3231 je1
= bridgetable
[l1
- 1].je
;
3232 ib2
= bridgetable
[l2
- 1].ib
;
3233 ie2
= bridgetable
[l2
- 1].ie
;
3234 jb2
= bridgetable
[l2
- 1].jb
;
3235 je2
= bridgetable
[l2
- 1].je
;
3236 return (ie1
>= ib2
&& ib1
<= ie2
|| ie1
>= jb2
&& ib1
<= je2
||
3237 je1
>= ib2
&& jb1
<= ie2
|| je1
>= jb2
&& jb1
<= je2
);
3242 Local Void
Findsheet(LINK
)
3243 struct LOC_Sheet
*LINK
;
3247 long FORLIM
, FORLIM1
;
3251 P_expset(LINK
->sheetset
, 0L);
3253 if (*LINK
->ladderset
!= 0L) {
3256 } while (!P_inset((int)l1
, LINK
->ladderset
));
3259 P_setcpy(LINK
->sheetset
, bridgetable
[l1
- 1].linkset
);
3265 for (l1
= 1; l1
<= FORLIM
; l1
++) {
3266 if (P_inset((int)l1
, LINK
->sheetset
)) {
3268 for (l2
= 1; l2
<= FORLIM1
; l2
++) {
3269 if (P_inset((int)l2
, LINK
->ladderset
)) {
3271 P_setunion(LINK
->sheetset
, LINK
->sheetset
,
3272 bridgetable
[l2
- 1].linkset
);
3273 P_setdiff(LINK
->ladderset
, LINK
->ladderset
,
3274 bridgetable
[l2
- 1].linkset
);
3281 } while (!finish
); /* Findsheet */
3297 P_expset(V
.ladderset
, 0L);
3299 for (i
= 1; i
<= FORLIM
; i
++)
3300 P_addset(V
.ladderset
, (int)i
);
3303 while (*V
.ladderset
!= 0L) {
3307 printf(" !!! SHEET LABEL RESTART AT A !!!\n");
3312 for (i
= 1; i
<= FORLIM
; i
++) {
3313 WITH
= &bridgetable
[i
- 1];
3314 if (P_inset((int)i
, V
.sheetset
) && WITH
->from
== 0) {
3317 printf(" !!! STRAND LABEL RESTART AT A !!!\n");
3321 if (WITH
->btyp
== parallel
)
3322 WITH
->laddername
= (Char
)(asci
+ 32);
3324 WITH
->laddername
= (Char
)asci
;
3325 WITH
->sheetname
= ccs
;
3326 P_setcpy(WITH
->linkset
, V
.sheetset
);
3329 bridgetable
[j
- 1].laddername
= WITH
->laddername
;
3330 bridgetable
[j
- 1].sheetname
= WITH
->sheetname
;
3331 P_setcpy(bridgetable
[j
- 1].linkset
, V
.sheetset
);
3332 j
= bridgetable
[j
- 1].towards
;
3341 Local Void
Markstrands()
3343 long i
, j
, l
, ib0
, ie0
, jb0
, je0
;
3344 structure beta
, betai
, betaj
;
3345 long iset
[(long)beta2
- (long)beta1
+ 1][9],
3346 jset
[(long)beta2
- (long)beta1
+ 1][9];
3348 long FORLIM
, FORLIM1
;
3357 for (i
= 1; i
<= FORLIM
; i
++) {
3358 if (bridgetable
[i
- 1].from
== 0) {
3361 (long)beta
<= (long)beta2
;
3362 beta
= (structure
)((long)beta
+ 1)) {
3363 P_setcpy(iset
[(long)beta
- (long)beta1
], P_expset(SET
, 0L));
3364 P_setcpy(jset
[(long)beta
- (long)beta1
], P_expset(SET
, 0L));
3371 WITH
= &bridgetable
[j
- 1];
3373 for (l
= WITH
->ib
; l
<= FORLIM1
; l
++) {
3376 (long)beta
<= (long)beta2
;
3377 beta
= (structure
)((long)beta
+ 1))
3378 P_setcpy(iset
[(long)beta
- (long)beta1
], P_setunion(SET1
,
3379 iset
[(long)beta
- (long)beta1
],
3380 P_addset(P_expset(SET
, 0L),
3381 WITH1
->ss
[(long)beta
- (long)symbol
])));
3384 for (l
= WITH
->jb
; l
<= FORLIM1
; l
++) {
3387 (long)beta
<= (long)beta2
;
3388 beta
= (structure
)((long)beta
+ 1))
3389 P_setcpy(jset
[(long)beta
- (long)beta1
], P_setunion(SET1
,
3390 jset
[(long)beta
- (long)beta1
],
3391 P_addset(P_expset(SET
, 0L),
3392 WITH1
->ss
[(long)beta
- (long)symbol
])));
3405 if (P_setequal(iset
[0], P_addset(P_expset(SET2
, 0L), ' ')))
3409 if (P_setequal(jset
[0], P_addset(P_expset(SET2
, 0L), ' ')))
3413 if ((!P_setequal(iset
[(long)betai
- (long)beta1
],
3414 P_addset(P_expset(SET2
, 0L), ' '))) |
3415 (!P_setequal(jset
[(long)betaj
- (long)beta1
],
3416 P_addset(P_expset(SET3
, 0L), ' '))))
3418 printf(" !!! STRAND COLUMN OVERWRITTEN !!!\n");
3420 WITH
= &bridgetable
[j
- 1];
3422 for (l
= WITH
->ib
; l
<= FORLIM1
; l
++) {
3424 WITH1
->ss
[(long)betai
- (long)symbol
] = WITH
->laddername
;
3425 if (WITH
->btyp
== parallel
)
3426 WITH1
->partner
[(long)betai
- (long)beta1
] = WITH
->jb
+ l
- WITH
->ib
;
3428 WITH1
->partner
[(long)betai
- (long)beta1
] = WITH
->je
- l
+ WITH
->ib
;
3431 for (l
= WITH
->jb
; l
<= FORLIM1
; l
++) {
3433 WITH1
->ss
[(long)betaj
- (long)symbol
] = WITH
->laddername
;
3434 if (WITH
->btyp
== parallel
)
3435 WITH1
->partner
[(long)betaj
- (long)beta1
] = WITH
->ib
+ l
- WITH
->jb
;
3437 WITH1
->partner
[(long)betaj
- (long)beta1
] = WITH
->ie
- l
+ WITH
->jb
;
3445 for (j
= ib0
; j
<= ie0
; j
++) {
3447 if (WITH1
->ss
[0] != 'E')
3450 for (j
= jb0
; j
<= je0
; j
++) {
3452 if (WITH1
->ss
[0] != 'E')
3458 for (j
= 0; j
< FORLIM
; j
++) {
3459 WITH
= &bridgetable
[j
];
3461 for (l
= WITH
->ib
; l
<= FORLIM1
; l
++)
3462 chain
[l
].sheetlabel
= WITH
->sheetname
;
3464 for (l
= WITH
->jb
; l
<= FORLIM1
; l
++)
3465 chain
[l
].sheetlabel
= WITH
->sheetname
;
3471 /*--------------------------------------------------------------------*/
3473 Static Void
Flagbridge()
3480 for (i
= 0; i
< MAXBRIDGE
; i
++) {
3481 WITH
= &bridgetable
[i
];
3486 WITH
->btyp
= nobridge
;
3490 for (i
= 2; i
< FORLIM
; i
++)
3502 Local Void
Flagsymbol()
3504 /* FLAGS ALPHA HELICES AND TURNS IN SYMBOL COLUMN */
3513 P_addset(P_expset(nhset
, 0L), '>');
3514 P_addset(nhset
, 'X');
3515 FORLIM
= lchain
- 4;
3516 for (i
= 2; i
<= FORLIM
; i
++) {
3517 if (P_inset(chain
[i
- 1].ss
[(long)turn4
- (long)symbol
], nhset
) &
3518 P_inset(chain
[i
].ss
[(long)turn4
- (long)symbol
], nhset
)) {
3519 for (j
= i
; j
<= i
+ 3; j
++)
3520 chain
[j
].ss
[0] = 'H';
3523 FORLIM
= lchain
- 3;
3524 for (i
= 2; i
<= FORLIM
; i
++) {
3525 if (P_inset(chain
[i
- 1].ss
[(long)turn3
- (long)symbol
], nhset
) &
3526 P_inset(chain
[i
].ss
[(long)turn3
- (long)symbol
], nhset
)) {
3528 for (j
= i
; j
<= i
+ 2; j
++) {
3530 if (WITH
->ss
[0] != 'G' && WITH
->ss
[0] != ' ')
3534 for (j
= i
; j
<= i
+ 2; j
++)
3535 chain
[j
].ss
[0] = 'G';
3539 FORLIM
= lchain
- 5;
3540 for (i
= 2; i
<= FORLIM
; i
++) {
3541 if (P_inset(chain
[i
- 1].ss
[(long)turn5
- (long)symbol
], nhset
) &
3542 P_inset(chain
[i
].ss
[(long)turn5
- (long)symbol
], nhset
)) {
3544 for (j
= i
; j
<= i
+ 4; j
++) {
3546 if (WITH
->ss
[0] != 'I' && WITH
->ss
[0] != ' ')
3550 for (j
= i
; j
<= i
+ 4; j
++)
3551 chain
[j
].ss
[0] = 'I';
3556 for (i
= 2; i
< FORLIM
; i
++) {
3558 if (WITH
->ss
[0] == ' ') {
3562 (long)turn
<= (long)turn5
;
3563 turn
= (structure
)((long)turn
+ 1)) {
3565 for (k
= 1; k
<= j
; k
++) {
3567 if (P_inset(chain
[i
- k
].ss
[(long)turn
- (long)symbol
], nhset
))
3573 cc
= WITH
->ss
[(long)bend
- (long)symbol
];
3581 /*--------------------------------------------------------------------*/
3583 Static Void
Flagturn()
3595 for (turn
= turn3
; (long)turn
<= (long)turn5
; turn
= (structure
)((long)turn
+ 1)) {
3598 FORLIM1
= lchain
- k
;
3599 for (i
= 1; i
<= FORLIM1
; i
++) {
3600 if (Nochainbreak(i
, i
+ k
)) {
3601 if (Testbond(i
+ k
, i
)) {
3602 chain
[i
+ k
].ss
[(long)turn
- (long)symbol
] = '<';
3603 for (j
= 1; j
< k
; j
++) {
3604 WITH
= &chain
[i
+ j
];
3605 if (WITH
->ss
[(long)turn
- (long)symbol
] == ' ')
3606 WITH
->ss
[(long)turn
- (long)symbol
] = cc
;
3609 if (WITH
->ss
[(long)turn
- (long)symbol
] == '<')
3610 WITH
->ss
[(long)turn
- (long)symbol
] = 'X';
3612 WITH
->ss
[(long)turn
- (long)symbol
] = '>';
3618 for (i
= 1; i
<= FORLIM1
; i
++) {
3620 if (WITH
->kappa
!= 360.0 && WITH
->kappa
> 70.0)
3621 WITH
->ss
[(long)bend
- (long)symbol
] = 'S';
3627 /* Local variables for Flagaccess: */
3628 struct LOC_Flagaccess
{
3634 /* Local variables for Polyeder: */
3635 struct LOC_Polyeder
{
3636 struct LOC_Flagaccess
*LINK
;
3641 Local Void
Triangle(x1
, x2
, x3
, level
, LINK
)
3642 double *x1
, *x2
, *x3
;
3644 struct LOC_Polyeder
*LINK
;
3652 for (k
= 0; k
<= 2; k
++) {
3653 x4
[k
] = x1
[k
] + x2
[k
];
3654 x5
[k
] = x2
[k
] + x3
[k
];
3655 x6
[k
] = x1
[k
] + x3
[k
];
3660 Triangle(x1
, x4
, x6
, level1
, LINK
);
3661 Triangle(x4
, x2
, x5
, level1
, LINK
);
3662 Triangle(x4
, x5
, x6
, level1
, LINK
);
3663 Triangle(x5
, x3
, x6
, level1
, LINK
);
3666 for (k
= 0; k
<= 2; k
++)
3667 x6
[k
] = x1
[k
] + x2
[k
] + x3
[k
];
3670 VecCopy(LINK
->LINK
->p
[LINK
->LINK
->np
- 1], x6
);
3675 LINK
->LINK
->wp
[LINK
->LINK
->np
- 1] = xnorm
/ 2.0;
3680 Local Void
Polyeder(LINK
)
3681 struct LOC_Flagaccess
*LINK
;
3682 { /* GENERATES ALL 12 VERTICES OF ICOSAHEDRON */
3683 struct LOC_Polyeder V
;
3686 long i
, j
, k
, level
, FORLIM
;
3694 for (i
= 1; i
<= 2; i
++) {
3696 for (j
= 1; j
<= 2; j
++) {
3714 /* GET ALL 20 FACES OF ICOSAHEDRON */
3715 for (i
= 0; i
<= 9; i
++) { /* FIND INTEGRATION POINTS */
3716 for (j
= i
+ 1; j
<= 10; j
++) {
3717 if (Distance(v
[i
], v
[j
]) < 1.1) {
3718 for (k
= j
+ 1; k
<= 11; k
++) {
3719 if ((Distance(v
[i
], v
[k
]) < 1.1) & (Distance(v
[j
], v
[k
]) < 1.1))
3720 Triangle(v
[i
], v
[j
], v
[k
], level
, &V
);
3727 for (i
= 0; i
< FORLIM
; i
++)
3731 for (i
= 0; i
< FORLIM
; i
++)
3733 } /* Polyeder (enurD idu) */
3735 /* Local variables for Surface: */
3736 struct LOC_Surface
{
3737 struct LOC_Flagaccess
*LINK
;
3745 Local boolean
Step(xx
, LINK
)
3747 struct LOC_Surface
*LINK
;
3755 while (k
<= LINK
->nx
&& one
) {
3756 TEMP
= LINK
->rx
[k
- 1] + RWATER
;
3757 if (Distsq(xx
, LINK
->x
[k
- 1]) < TEMP
* TEMP
)
3765 /* Local variables for Liste: */
3767 struct LOC_Surface
*LINK
;
3772 Local Void
Listentry(xx
, yy
, d
, r
, LINK
)
3775 struct LOC_Liste
*LINK
;
3780 delta
= Distance(xx
, yy
);
3786 if (LINK
->LINK
->nx
> MAXPACK
) {
3788 printf(" !!! TABLE OVERFLOW IN FLAGACCESS !!!\n");
3793 VecCopy(LINK
->LINK
->x
[LINK
->LINK
->nx
- 1], zz
);
3794 LINK
->LINK
->rx
[LINK
->LINK
->nx
- 1] = r
;
3799 Local Void
Liste(xx
, rxx
, LINK
)
3802 struct LOC_Surface
*LINK
;
3815 d
= rxx
+ RWATER
+ RWATER
;
3817 for (i
= 1; i
<= FORLIM
; i
++) {
3818 if (Nochainbreak(i
, i
)) {
3820 if (Distance(xx
, WITH
->ca
) < d
+ RESRAD
) {
3821 Listentry(xx
, WITH
->n
, d
, RN
, &V
);
3822 Listentry(xx
, WITH
->ca
, d
, RCA
, &V
);
3823 Listentry(xx
, WITH
->c
, d
, RC
, &V
);
3824 Listentry(xx
, WITH
->o
, d
, RO
, &V
);
3825 if (WITH
->nsideatoms
> 0) {
3826 FORLIM1
= WITH
->nsideatoms
;
3827 for (k
= 0; k
< FORLIM1
; k
++)
3828 Listentry(xx
, sidechain
[WITH
->atompointer
+ k
], d
, RSIDEATOM
, &V
);
3837 Local
double Surface(xatom
, ratom
, LINK
)
3840 struct LOC_Flagaccess
*LINK
;
3842 struct LOC_Surface V
;
3851 Liste(xatom
, ratom
, &V
);
3852 radius
= ratom
+ RWATER
;
3855 for (i
= 0; i
< FORLIM
; i
++) {
3856 for (j
= 0; j
<= 2; j
++)
3857 xx
[j
] = LINK
->p
[i
][j
] * radius
;
3861 return (radius
* radius
* f
);
3866 /*--------------------------------------------------------------------*/
3868 Static Void
Flagaccess()
3870 struct LOC_Flagaccess V
;
3881 for (i
= 1; i
<= FORLIM
; i
++) {
3882 if (Nochainbreak(i
, i
)) {
3884 f
= Surface(WITH
->n
, RN
, &V
) + Surface(WITH
->ca
, RCA
, &V
) +
3885 Surface(WITH
->c
, RC
, &V
) + Surface(WITH
->o
, RO
, &V
);
3886 if (WITH
->nsideatoms
> 0) {
3887 FORLIM1
= WITH
->nsideatoms
;
3888 for (k
= 0; k
< FORLIM1
; k
++)
3889 f
+= Surface(sidechain
[WITH
->atompointer
+ k
], RSIDEATOM
, &V
);
3891 WITH
->access
= (long)floor(f
+ 0.5);
3899 Local Void
Statistics()
3901 long i
, j
, k
, nchain
, nres
, nhbond
, lhelix
;
3906 long ladderset
[MAXBRIDGE
/ 32 + 2];
3907 long hbridge
[(long)antiparallel
- (long)parallel
+ 1];
3908 long helixhist
[MAXHIST
], sheethist
[MAXHIST
];
3909 long betahist
[(long)antiparallel
- (long)parallel
+ 1][MAXHIST
];
3910 long FORLIM
, FORLIM1
;
3920 for (i
= 0; i
< MAXHIST
; i
++) {
3921 for (b
= parallel
; (long)b
<= (long)antiparallel
; b
= (bridgetyp
)((long)b
+ 1))
3922 betahist
[(long)b
- (long)parallel
][i
] = 0;
3927 for (k
= 0; k
<= 10; k
++)
3929 for (b
= parallel
; (long)b
<= (long)antiparallel
; b
= (bridgetyp
)((long)b
+ 1))
3930 hbridge
[(long)b
- (long)parallel
] = 0;
3932 for (i
= 0; i
<= FORLIM
; i
++) {
3934 if (Nochainbreak(i
, i
)) {
3936 Surface
+= WITH
->access
;
3937 for (j
= 0; j
<= 1; j
++) {
3938 if (WITH
->donor
[j
].energy
< HBHIGH
) {
3940 k
= WITH
->donor
[j
].residue
- i
;
3947 if (WITH
->ss
[0] == 'H')
3949 else if (lhelix
> 0) {
3950 if (lhelix
> MAXHIST
)
3952 helixhist
[lhelix
- 1]++;
3958 for (i
= 1; i
<= FORLIM
; i
++) {
3959 WITH1
= &bridgetable
[i
- 1];
3960 hbridge
[(long)WITH1
->btyp
- (long)parallel
] += WITH1
->ie
- WITH1
->ib
+ 2;
3961 if (WITH1
->from
== 0) {
3965 k
+= bridgetable
[j
- 1].ie
- bridgetable
[j
- 1].ib
+ 1;
3966 j
= bridgetable
[j
- 1].towards
;
3970 betahist
[(long)WITH1
->btyp
- (long)parallel
][k
- 1]++;
3975 P_expset(ladderset
, 0L);
3977 for (i
= 1; i
<= FORLIM
; i
++)
3978 P_addset(ladderset
, (int)i
);
3980 for (i
= 1; i
<= FORLIM
; i
++) {
3981 WITH1
= &bridgetable
[i
- 1];
3982 if ((WITH1
->from
== 0) & P_inset((int)i
, ladderset
)) {
3983 if (!P_setequal(P_addset(P_expset(SET1
, 0L), (int)i
), WITH1
->linkset
) ||
3984 WITH1
->ie
> WITH1
->ib
) {
3987 for (j
= 1; j
<= FORLIM1
; j
++) {
3988 if ((bridgetable
[j
- 1].from
== 0) & P_inset((int)j
, WITH1
->linkset
))
3993 P_setdiff(ladderset
, ladderset
, WITH1
->linkset
);
3998 "%5ld%3ld%3ld%3ld%3ld TOTAL NUMBER OF RESIDUES, NUMBER OF CHAINS, NUMBER OF SS-BRIDGES(TOTAL,INTRACHAIN,INTERCHAIN) .\n",
3999 nres
, nchain
, nssinter
+ nssintra
, nssintra
, nssinter
);
4001 "%8.1f ACCESSIBLE SURFACE OF PROTEIN (ANGSTROM**2) .\n",
4004 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(J) , SAME NUMBER PER 100 RESIDUES .\n",
4005 nhbond
, 100.0 * nhbond
/ nres
);
4007 j
= hbridge
[(long)antiparallel
- (long)parallel
];
4009 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS IN PARALLEL BRIDGES, SAME NUMBER PER 100 RESIDUES .\n",
4010 i
, 100.0 * i
/ nres
);
4012 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS IN ANTIPARALLEL BRIDGES, SAME NUMBER PER 100 RESIDUES .\n",
4013 j
, 100.0 * j
/ nres
);
4014 for (i
= -5; i
<= 5; i
++) {
4021 "%5ld%5.1f TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I%c%ld), SAME NUMBER PER 100 RESIDUES .\n",
4022 nhbturn
[i
+ 5], 100.0 * nhbturn
[i
+ 5] / nres
, cc
, k
);
4024 for (i
= 1; i
<= MAXHIST
; i
++)
4025 fprintf(tapeout
, "%3ld", i
);
4026 fprintf(tapeout
, " *** HISTOGRAMS OF *** .\n");
4027 for (i
= 0; i
< MAXHIST
; i
++)
4028 fprintf(tapeout
, "%3ld", helixhist
[i
]);
4029 fprintf(tapeout
, " RESIDUES PER ALPHA HELIX .\n");
4030 for (i
= 0; i
< MAXHIST
; i
++)
4031 fprintf(tapeout
, "%3ld", betahist
[0][i
]);
4032 fprintf(tapeout
, " PARALLEL BRIDGES PER LADDER .\n");
4033 for (i
= 0; i
< MAXHIST
; i
++)
4034 fprintf(tapeout
, "%3ld", betahist
[(long)antiparallel
- (long)parallel
][i
]);
4035 fprintf(tapeout
, " ANTIPARALLEL BRIDGES PER LADDER .\n");
4036 for (i
= 0; i
< MAXHIST
; i
++)
4037 fprintf(tapeout
, "%3ld", sheethist
[i
]);
4038 fprintf(tapeout
, " LADDERS PER SHEET .\n");
4043 Local Void
Writehb(i
, hb
)
4049 if (hb
.residue
!= 0)
4051 e
= hb
.energy
/ 1000.0;
4052 fprintf(tapeout
, "%4ld,%4.1f", hb
.residue
, e
);
4057 /*--------------------------------------------------------------------*/
4059 Static Void
Printout()
4063 double phi
, psi
, tco
;
4071 " # 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");
4073 for (i
= 1; i
<= FORLIM
; i
++) {
4075 fprintf(tapeout
, "%5ld ", i
);
4076 for (j
= 0; j
<= 5; j
++)
4077 putc(WITH
->aaident
[j
], tapeout
);
4078 fprintf(tapeout
, " %c %c ", WITH
->aa
, WITH
->ss
[0]);
4079 for (s
= turn3
; (long)s
<= (long)beta2
; s
= (structure
)((long)s
+ 1))
4080 putc(WITH
->ss
[(long)s
- (long)symbol
], tapeout
);
4081 for (s
= beta1
; (long)s
<= (long)beta2
; s
= (structure
)((long)s
+ 1))
4082 fprintf(tapeout
, "%4ld", WITH
->partner
[(long)s
- (long)beta1
]);
4083 fprintf(tapeout
, "%c%4ld ", WITH
->sheetlabel
, WITH
->access
);
4084 for (j
= 0; j
<= 1; j
++) {
4085 Writehb(i
, WITH
->acceptor
[j
]);
4086 Writehb(i
, WITH
->donor
[j
]);
4091 if (Nochainbreak(i
- 1, i
)) {
4092 phi
= Dihedralangle(chain
[i
- 1].c
, WITH
->n
, WITH
->ca
, WITH
->c
);
4093 tco
= Cosangle(WITH
->c
, WITH
->o
, chain
[i
- 1].c
, chain
[i
- 1].o
);
4095 if (Nochainbreak(i
, i
+ 1))
4096 psi
= Dihedralangle(WITH
->n
, WITH
->ca
, WITH
->c
, chain
[i
+ 1].n
);
4097 fprintf(tapeout
, "%8.3f%6.1f%6.1f%6.1f%6.1f%7.1f%7.1f%7.1f\n",
4098 tco
, WITH
->kappa
, WITH
->alpha
, phi
, psi
, WITH
->ca
[0], WITH
->ca
[1],
4105 fprintf(stderr
,"Usage: dssp [-na] pdb_file dssp_file\n");
4106 fprintf(stderr
,"the -na flag disables the calculation of accessible surface\n");
4110 /*--------------------------------------------------------------------*/
4116 printf(" by Wolfgang Kabsch and Chris Sander\n");
4118 printf("Defines secondary structure and solvent exposure of proteins from\n");
4119 printf("atomic coordinates as given in Protein Data Bank format. \n");
4121 printf("_________________________________________________________________________\n");
4122 printf("This version licensed to Ethan Benatan at Univ_Pittsburgh \n");
4123 printf("for academic purposes. \n");
4124 printf("Do not redistribute. \n");
4126 printf("Commercial licenses available on request. \n");
4128 printf("Copyright by Wolfgang Kabsch and Chris Sander, 1983, 1985, 1988. \n");
4129 printf("Fax: +49-6221-387 306\n");
4131 printf("Algorithm version October 1988. Refer to Biopolymers 22(1983) 2577-2637.\n");
4132 printf("Do report errors if you find any.\n");
4134 printf("Email: Sander@embl-heidelberg.de \n");
4135 printf(" Kabsch@embl-heidelberg.de \n");
4137 printf("_________________________________________________________________________\n");
4138 printf("Related databases and datasets available from the Protein\n");
4139 printf("Design Group at EMBL via anonymous ftp from embl-heidelberg.de:\n");
4141 printf("pdb_select Representative set of protein structures.\n");
4142 printf(" By U. Hobohm, C. Sander, M. Scharf and R. Schneider.\n");
4143 printf(" See Protein Science 1, 409-417.\n");
4144 printf("DSSP Dictionary of secondary structures of proteins. \n");
4145 printf("HSSP Database of sequence-homology derived protein families.\n");
4146 printf(" By C. Sander and R.Schneider.\n");
4147 printf(" See Proteins 9, 56-68 (1991).\n");
4148 printf("FSSP Database of protein structure families with \n");
4149 printf(" common folding motifs. \n");
4150 printf(" L.Holm, C. Ouzounis, C. Sander, G.Tuparev, G. Vriend\n");
4151 printf(" See Protein Science, in the press (1992).\n");
4152 printf("In the XSSP databases, there is one dataset for each unique or\n");
4153 printf(" representative PDB protein, e.g., 1PPT.HSSP etc.\n");
4155 printf("Restrictions:Commercial users must apply for a license. \n");
4156 printf(" Not to be used for classified research.\n");
4159 void dssp_main(int bDoAcc
, int bSetVerbose
)
4161 int tt
; /*TIMELOCK*/
4162 PASCAL_MAIN(0,NULL
);
4166 bVerbose
=bSetVerbose
;
4168 tt
=time(0); /*TIMELOCK*/
4171 Inputcoordinates(&lchain
);
4172 if (!Nochainbreak(1L, lchain
))
4173 printf(" !!! POLYPEPTIDE CHAIN INTERRUPTED !!!\n");
4174 /* printf("INPUTCOORDINATES DONE%12ld\n", lchain); */
4176 /* printf("FLAGSSBONDS DONE\n"); */
4178 /* printf("FLAGCHIRALITY DONE\n"); */
4179 Flaghydrogenbonds();
4180 /* printf("FLAGHYDROGENBONDS DONE\n"); */
4182 /* printf("FLAGBRIDGE DONE\n"); */
4184 /* printf("FLAGTURN DONE\n"); */
4187 /* printf("FLAGACCESS DONE\n"); */
4190 /* printf("PRINTOUT DONE\n"); */
4195 } /* END OF PROGRAM DSSP */