#include "pdb.h" int debugging = 0 ; double maximum_x, maximum_y,maximum_z, maximum_r,minimum_x,minimum_y,minimum_z ,minimum_r ; void print_an_atom(atom_record * atom, FILE *ff) { if(atom == NULL) fprintf(ff, " NULL atom") ; else fprintf(ff , " %3.3s%-4d/%4.4s", atom->resname,atom->resnum, atom->name); } void serious_error (int arg_type, char *major_message, void *minor) { switch (arg_type) { case ARG_TYPE_STRING : fprintf(stderr, "serious error: %s [ %s ]\n" , major_message, minor) ; break; case ARG_TYPE_INTEGER : fprintf(stderr, "serious error: %s [ %d ]\n" , major_message, minor) ; break; case ARG_TYPE_ATOM : fprintf(stderr, "serious error: %s [ ", major_message); print_an_atom(minor,stderr) ; fprintf(stderr," ]\n") ; break ; } call_exit(100) ; } int give_warning = 0 ; void warning (int arg_type, char *major_message, void *minor) { switch (arg_type) { case ARG_TYPE_STRING : fprintf(stderr,"warning: %s [ %s ]\n" , major_message, minor) ; break; case ARG_TYPE_INTEGER: fprintf(stderr, "warning : %s [ %d ]\n" , major_message, minor) ; break; case ARG_TYPE_ATOM : fprintf(stderr, "warning : %s [ ", major_message); print_an_atom(minor,stderr) ; fprintf(stderr," ]\n") ; break ; } } void soft_warning (int arg_type, char *major_message, void *minor) { if(!give_warning) return ; warning(arg_type,major_message,minor) ; } atom_record * nth_atom(file_records * file, int index) { if (file->atomnum > index) return file->atoms[index] ; return NULL ; } atom_record *atom_by_number (file_records *file,int number) { int atomnum = file->atomnum; atom_record * atom ; atom_record **atoms = file->atoms; int ii ; if((atomnum > number) && atoms[number]->number == number) return atoms[number] ; for (ii = 0 ; ii< atomnum ; ii++) if (atoms[ii]->number == number) return atoms[ii] ; return NULL; } double atoms_distance (atom_record *atoma, atom_record *atomb) { double xdist = atoma->x - atomb->x ; double ydist = atoma->y - atomb->y ; double zdist = atoma->z - atomb->z ; return sqrt (xdist * xdist + ydist * ydist + zdist * zdist) ; } int is_cb(atom_record *atom) { return ( atom->name[0]== 'C' && atom->name[1]== 'B') ; } int is_ca(atom_record *atom) { return ( atom->name[0]== 'C' && atom->name[1]== 'A') ; } int is_c(atom_record *atom) { return ( atom->name[0]== 'C' && atom->name[1]== ' ') ; } int is_n(atom_record *atom) { return ( atom->name[0]== 'N' && atom->name[1]== ' ') ; } int is_o(atom_record *atom) { return ( atom->name[0]== 'O' && atom->name[1]== ' ') ; } /** ** MBG: Added this 2.II.94 to handle nucleic acids. */ int isCAorP(atom_record *a) { # ifdef OFF return (is_ca(a) || (a->name[0] == 'P')); # endif return (is_ca(a) || (a->name[0] == 'O' && a->name[1] == '5' && a->name[2] == '*')); } void maybe_free(void *pointer) { if (pointer != NULL) free(pointer) ; } /* Take a string and return a FILE * to read from it. This is quite a stupid way of doing this, and there should be a standard C function to do this, but I didn't fint It. */ FILE *stream_from_string (char *string) { FILE * tt = tmpfile() ; fwrite(string,1,strlen(string), tt) ; rewind (tt); return tt ; } /* if malloc reset the area it allocates, this is redundant. */ char * malloc_and_zero (int len) { char *new = (char *)malloc(len) ; bzero(new, len) ; return new; } char *new_string (char *string) { char *nn = (char *)malloc(strlen (string) + 1) ; strcpy(nn,string); return nn; } void read_residue_spec(char *string, int *number, int *chain, int * x_char) { int ii = 0 ; *chain = string[ii++]; *number = atoi(string+ii); while (isspace(string[ii])) ii++; while (isdigit(string[ii])) ii++; if (string[ii] && string[ii] != '\n') * x_char = string[ii++] ; }