| 
      babel-1.6
      | 
     
    
     | 
Makefile, 
README.1ST, 
addh.c, 
addh2.c, 
aromatic.c, 
assbnd.c, 
asstypes.c, 
babel.h, 
bblmacs.h, 
bblmast.h, 
bbltyp.h, 
block.c, 
bndord.c, 
bo.c, 
buildct.c, 
combine.c, 
convert.c, 
delatms.c, 
delh2o.c, 
element.lis, 
filesrch.c, 
fileutil.c, 
gastchg.c, 
gauss.hdr, 
htoend.c, 
int2cart.c, 
intcart.c, 
menus.c, 
miniums.c, 
molwt.c, 
new.lis, 
nodummy.c, 
orient.c, 
precip.c, 
printbad.c, 
progress.c, 
psgvb.hdr, 
quanta.lis, 
rdalch.c, 
rdampout.c, 
rdbalst.c, 
rdbgf.c, 
rdboogie.c, 
rdc3d.c, 
rdcacao.c, 
rdcadpac.c, 
rdcharmm.c, 
rdcsd.c, 
rddock.c, 
rddpdb.c, 
rdelmnts.c, 
rdfdat.c, 
rdfeat.c, 
rdfract.c, 
rdg96.c, 
rdgamout.c, 
rdgauout.c, 
rdgzmat.c, 
rdhin.c, 
rdinsite.c, 
rdint.c, 
rdirc.c, 
rdisis.c, 
rdm3d.c, 
rdmacmod.c, 
rdmacmol.c, 
rdmdl.c, 
rdmicro.c, 
rdmm2.c, 
rdmm2in.c, 
rdmm3.c, 
rdmolen.c, 
rdmopac.c, 
rdmopcrt.c, 
rdpcmod.c, 
rdpdb.c, 
rdprep.c, 
rdpsgout.c, 
rdpsgvin.c, 
rdquanta.c, 
rdschak.c, 
rdshelx.c, 
rdsmiles.c, 
rdspart.c, 
rdspmm.c, 
rdspsemi.c, 
rdsybmol.c, 
rdsybyl.c, 
rdtypes.c, 
rdunichm.c, 
rdwiz.c, 
rdxed.c, 
rdxyz.c, 
renum.c, 
report.c, 
rings.c, 
ringutil.c, 
sets.c, 
smilesto.c, 
spline.c, 
strngutl.c, 
tokenst.c, 
tosmiles.c, 
tree.c, 
typbybo.c, 
types.lis, 
umslist.c, 
utils.c, 
vectors.c, 
wralch.c, 
wrbalst.c, 
wrbgf.c, 
wrbmin.c, 
wrbox.c, 
wrc3d.c, 
wrcacao.c, 
wrcache.c, 
wrcacint.c, 
wrchdrw.c, 
wrcontmp.c, 
wrcsr.c, 
wrcssr.c, 
wrdock.c, 
wrdpdb.c, 
wrfeat.c, 
wrfh.c, 
wrg96.c, 
wrgamess.c, 
wrgau.c, 
wrgaucrt.c, 
wrhin.c, 
wricon.c, 
wrint.c, 
wrisis.c, 
wrm3d.c, 
wrmaccs.c, 
wrmacmod.c, 
wrmcmol.c, 
wrmdl.c, 
wrmicro.c, 
wrmimic.c, 
wrmiv.c, 
wrmm2.c, 
wrmm3.c, 
wrmopac.c, 
wrpcmod.c, 
wrpdb.c, 
wrpsgv.c, 
wrpsgvz.c, 
wrsmiles.c, 
wrspart.c, 
wrsybmol.c, 
wrsybyl.c, 
wrtinker.c, 
wrtorlst.c, 
wrunichm.c, 
wrwiz.c, 
wrxed.c, 
wrxyz.c
      | 
     
    
   | 
  
 
   | 
  
/*****
This file is part of the Babel Program
Copyright (C) 1992-96 W. Patrick Walters and Matthew T. Stahl 
All Rights Reserved 
All Rights Reserved 
All Rights Reserved 
All Rights Reserved 
For more information please contact :
babel@mercury.aichem.arizona.edu
--------------------------------------------------------------------------------
FILE : utils.c
AUTHOR(S) : Pat Walters
DATE : 10-93
PURPOSE : General purpose utilities
******/
#include "bbltyp.h"
#ifdef MSDOS
#include 
#define MALLOC  _fmalloc
#define REALLOC _frealloc
#define FREE    _ffree
#else
#define MALLOC  malloc
#define REALLOC realloc
#define FREE    free
#endif
static char wstr[BUFF_SIZE];
void 
uppercase(char *str)
{
  while( *str != '\0')
  {
    if (isalpha(*str))
      if (islower(*str))
        *str = toupper(*str);
    str ++;
  }
}
void 
lowercase(char *str)
{
  while( *str != '\0')
  {
    *str = tolower(*str);
    str ++;
  }
}
void babel_init()
{
  int result;
  
  result = read_element_file();
  if (!result) 
    fatal_error("Error reading element.lis");
  read_types_table();
}
void babel_cleanup()
{
  clean_up_elements();
  clean_up_types_table();
}
void strip_return(char *the_str)
{
  int len;
  
  len = strlen(the_str) - 1;
  if (the_str[len] == '\n')
    the_str[len] = '\0';
}
int 
  print_ums(ums_type *mol)
{
  int count, i;
  char bo_char[6] = {' ','-','=','#',':',':'};
  
  fprintf(stdout,"there are %d atoms and %d bonds in this file\n",Atoms,Bonds);
  fprintf(stdout,"Title = %s\n",Title);
  
  for (count = MIN_ATOM; count <= Atoms; count++)
  {
    /*
      printf("%3datom [%c][%c][%c] %7.3f %7.3f %7.3f %5d %6.3f %5d %5d %5d %5d->",
      count,
      Type(count)[0],
      Type(count)[1],
      Type(count)[2],
      */
    printf("%3d %-6s %7.3f %7.3f %7.3f %5d %6.3f %3d %3d %3d %5d->",
	   count,
	   Type(count),
	   X(count),
	   Y(count),
	   Z(count),
	   Max_bonds(count),
	   Radius(count),
	   Redo(count),
	   count_heavy_atoms(mol, count),
	   count_free_ox(mol, count),
	   Valence(count));
    for (i = 0; i < Valence(count); i++)
    {
      printf(" %3d ",Connection(count,i));
    }
    printf("\n");
  }
  for (count = 0; count < Bonds; count++)
  {
    printf(" [%2d%c%-2d] ",Start(count),bo_char[Bond_order(count)],End(count));
    if (((count+1) % 10) == 0) printf("\n");
  }
  printf("\n");
  return(1);
}
#define MAXLINELEN 1024
      
void
show_warning ( const char *format, ... )
{
   va_list args;
   char str[MAXLINELEN];
   va_start ( args, format );
   vsprintf ( str, format, args );
   va_end ( args );
   fprintf ( stderr, "%s\n", str );
}
void
fatal_error ( const char *format, ... )
{
   va_list args;
   char str[MAXLINELEN];
   va_start ( args, format );
   vsprintf ( str, format, args );
   va_end ( args );
   fprintf ( stderr, "%s\n", str );
   exit(0);
}
#undef MAXLINELEN
int 
print_internal(ums_type *mol)
{
  int count;
  printf("there are %d atoms and %d bonds in this file\n",Atoms,Bonds);
  for (count = MIN_ATOM; count <= Atoms; count++)
  {
    printf("%4d %4s %8.3f %8.3f %8.3f %4d %4d %4d\n",
	   count,
	   Type(count),
	   mol->internal[count].r,
	   mol->internal[count].w,
	   mol->internal[count].t,
	   mol->internal[count].na,
	   mol->internal[count].nb,
	   mol->internal[count].nc);
  }
  return(1);
}
    
int 
  initialize_ums(ums_type **mol)
{
  long int byte_count;
  (**mol).num_connections_initialized = 0;
  (**mol).num_residues_initialized = 0;
  (**mol).num_internal_initialized = 0;
  
  (**mol).atoms = (atom_type HUGEPTR *)MALLOC((long int )((**mol).num_atoms + 1) * (long int)sizeof(atom_type));
  if ((**mol).atoms == NULL) 
  {
    byte_count = ((long int )((**mol).num_atoms + 1) * (long int)sizeof(atom_type));
    sprintf(wstr,"Unable to allocate memory for %d atoms requires %ld bytes\n",
	   (**mol).num_atoms,byte_count);
    if ((**mol).num_atoms > 0)
      fatal_error(wstr);
  }
  memset((**mol).atoms,0,(long int )((**mol).num_atoms + 1) * (long int)sizeof(atom_type));
  (**mol).connections = (connect_type HUGEPTR *)MALLOC((long int)(4 * (**mol).num_atoms) * (long int)sizeof(connect_type));
  if ((**mol).connections == NULL) 
  {
    byte_count = ((long int)(4 * (**mol).num_atoms) * (long int)sizeof(connect_type));
    sprintf(wstr,"Unable to allocate memory for %d bonds requires %ld bytes\n",
	    (**mol).num_atoms,byte_count);
    if ((**mol).num_bonds > 0)
      fatal_error(wstr);
  }
  memset((**mol).connections,0,(long int)((**mol).num_atoms + 1) * (long int)sizeof(connect_type));
  (**mol).num_connections_initialized = 4 * (**mol).num_atoms;
  (**mol).fract = NULL;
  (**mol).internal = NULL;
  (**mol).residues = NULL;
  (**mol).atoms[0].pos[0] = -1;
  zero_out_ums(*mol,0);
  return(1);
}
void
  zero_out_ums(ums_type *mol, int start)
{
  int i, j;
  
  Energy = 0.0;
  Next = NULL;
  
  strcpy(Title,"");
  for (i = start; i <= Atoms; i++)
  {
    X(i) = 0.0;
    Y(i) = 0.0;
    Z(i) = 0.0;
    Max_bonds(i) = 0;
    Atomic_number(i) = 0;
    for (j = 0; j < MAX_CONNECTIONS; j++)
    {
      Connection(i,j) = 0;
      BO(i,j) = 0;
    }
    Valence(i) = 0;
    BORadius(i) = 0.0;
    Radius(i) = 0.0;
    Redo(i) = 0;
    Charge(i) = 0.0;
    for (j = 0; j < 3; j++)
      mol->atoms[i].pos[j] = 0;
  }
}
    
int 
reinitialize_ums(ums_type **mol)
{
  (**mol).num_connections_initialized = 0;
  (**mol).num_residues_initialized = 0;
  (**mol).num_internal_initialized = 0;
  (**mol).atoms = (atom_type HUGEPTR *)REALLOC((**mol).atoms,((long int)(**mol).num_atoms + 1) * (long int)sizeof(atom_type));
  if ((**mol).atoms == NULL) 
  {
    printf("Unable to reallocate memory for atoms\n");
    exit(0);
  }
  
  (**mol).connections = (connect_type HUGEPTR *)REALLOC((**mol).connections,4 * (long int)(**mol).num_atoms * (long int)sizeof(connect_type));
  if ((**mol).connections == NULL) 
  {
    printf("Unable to reallocate memory for connections\n");
    exit(0);
  }
  
  if ((**mol).residues)
  {
    (**mol).residues = (res_list HUGEPTR *)REALLOC((**mol).residues,(long int)((**mol).num_atoms + 1) * (long int)sizeof(res_list));
    if ((**mol).residues == NULL) 
    {
      printf("Unable to reallocate memory for residues\n");
      exit(0);
    }
  }
  (**mol).num_connections_initialized = 4 * (**mol).num_atoms;
  (**mol).num_residues_initialized = (**mol).num_atoms + 1;
  
  return(1);
}
int 
initialize_internal(ums_type **mol)
{
  (**mol).internal = (int_type HUGEPTR *)MALLOC((long int)((**mol).num_atoms + 1) * (long int)sizeof(int_type));
  if ((**mol).internal == NULL) 
  {
    printf("Unable to allocate memory for internal coordinates\n");
    exit(0);
  }
  (**mol).num_internal_initialized = (**mol).num_atoms + 1;
  return(1);
}		
int 
initialize_fractional(ums_type **mol)
{
  (**mol).fract = (fract_type HUGEPTR *)MALLOC(sizeof(fract_type));
  if ((**mol).fract == NULL) 
  {
    printf("Unable to allocate memory for cell_parameters\n");
    exit(0);
  }
  return(1);
}		
int 
initialize_residues(ums_type **mol)
{
  (**mol).residues = (res_list HUGEPTR *)MALLOC((long int)((**mol).num_atoms + 1) * (long int)sizeof(res_list));
  if ((**mol).residues == NULL) 
  {
    printf("Unable to allocate memory for residues\n");
    exit(0);
  }
  (**mol).num_residues_initialized = (**mol).num_atoms + 1;
  return(1);
}		
int 
release_ums(ums_type *mol)
{
  (*mol).num_connections_initialized = 0;
  (*mol).num_residues_initialized = 0;
  (*mol).num_internal_initialized = 0;
  if ((*mol).atoms != NULL)
  {
    FREE((*mol).atoms);
    mol->atoms = NULL;
  }
  if ((*mol).connections != NULL)
  {
    FREE((*mol).connections);
    mol->connections = NULL;
  }
  
  if ((*mol).residues != NULL)
  {
    FREE((*mol).residues);
    mol->residues = NULL;
  }
  
  if ((*mol).internal != NULL)
  {
    FREE((*mol).internal);
    mol->internal = NULL;
  }
  
  if ((*mol).fract != NULL)
  {
    FREE((*mol).fract);
    mol->fract = NULL;
  }
  
  return(1);
}
  
void 
clean_atom_type(char id[])
{
  id[0] = toupper(id[0]);
  id[1] = tolower(id[1]);
  if (isalpha(id[1]) == 0)
    id[1] = NULL_CHAR;
  else
    id[2] = NULL_CHAR;
}   
double 
torsion(coord_type a, coord_type b, coord_type c, coord_type d)
{
  vect_type b1,b2,b3;
  vect_type c1,c2,c3;
  double l1,l2;
  vect_type v1,v2,v3,v4;
  double angle;
  
  point_to_vect(a,&v1);
  point_to_vect(b,&v2);
  point_to_vect(c,&v3);
  point_to_vect(d,&v4);
  vect_diff(&v1,&v2,&b1);
  vect_diff(&v2,&v3,&b2);
  vect_diff(&v3,&v4,&b3);
  
  cross_prod(&b1,&b2,&c1);
  cross_prod(&b2,&b3,&c2);
  cross_prod(&c1,&c2,&c3);
  
  l1 = magnitude(&c1);
  l2 = magnitude(&c2);
  if ((l1 * l2) < 0.001)
    return(0.0);
  else
  {
    angle = vect_ang(&c1,&c2);
    if (dot(&b2,&c3) > 0.0) 
      angle = angle * -1.0;
  }
  return(angle);
}
void free_line(char *the_line)
{
  if (the_line)
    free(the_line);
}
int check_for_eof(FILE *file1)
{
  int end = FALSE;
  long int position;
  char buffer[BUFF_SIZE];
  position = ftell(file1);  
  if ((fgets(buffer,sizeof(buffer),file1) == NULL))
    end = TRUE;
  else
  {
    if ((fgets(buffer,sizeof(buffer),file1) == NULL))
      if (count_tokens(buffer,"\t\n ") == 0)
	end = TRUE;
  }
  if (!end)
  {
    fseek(file1,position,0);
  }
  
  return (end);
}
void read_to_eof(FILE *file1)
{
  char buffer[BUFF_SIZE];
  
  while(fgets(buffer,sizeof(buffer),file1) != NULL);
}
  
void 
make_output_name(char *file_name, char *out_name, int counter)
{
  int indx;
  int name_length;
  int i, j = 0;
  char base[50];
  char ext[50];
  
  name_length = strlen(file_name);
  if (strchr(file_name,'.') != NULL)
  {
    indx = name_length - strlen(strchr(file_name,'.')); 
    strncpy(base,file_name,indx);
    base[indx] = '\0';
    for ( i = (indx + 1); i <= name_length; i++)
    {
      ext[j] = file_name[i];
      j ++;
    }
    sprintf(out_name,"%s%*.*d.%s",base,4,4,counter,ext);
  }
  else
  {
    strcpy(base,file_name);
    sprintf(out_name,"%s%04d",base,counter);
  }
}
  /*need to release list of mols if input doesn't match multi */
void
usage_multi_struct(void)
{
  show_warning("This appears to be a multi-structure or multi-conformer file ");
  show_warning("");
  show_warning("For multi-structure files the syntax is : ");
  show_warning("babel -i infile all -o extension");
  show_warning("where all of the files will be extracted");
  show_warning("--or--");
  show_warning("babel -i infile \"refcode ...\" -o extension");
  show_warning("where all of the recodes listed in the input-keywords will be extracted");
  show_warning("");
  show_warning("For multi-conformer files the syntax is : ");
  show_warning("babel -i infile \"N1-N2\" -o outfile");
  show_warning("where the \"N1st\" through \"N2nd\" files will be extracted");
  show_warning("--or--");
  show_warning("babel -i infile all -o outfile");
  show_warning("where all of the files will be extracted");
}
void toss(FILE *file1, int num)
{
  int i;
  char buffer[BUFF_SIZE];
  for (i = 0; i < num; i++)
    fgets(buffer,sizeof(buffer),file1);
}
int is_blank_line(char *the_line)
{
  int tokens;
  
  tokens = (count_tokens(the_line," \n\t"));
  if (tokens == 0)
    return(TRUE);
  else
    return(FALSE);
}
      
char *new_extension(char *filename,char *extension)
{
   char *last_period;
   last_period=strrchr(filename,'.');	     
   if (last_period!=NULL) *last_period=0;	
   if (extension[0]!='.') strcat(filename,".");	
   strcat(filename,extension);	  
   return(filename);
}
int is_one_three(ums_type *mol, int a, int b)
{
  int i,j;
  int conn;
  
  for (i = 0; i < Valence(a); i++)
  {
    conn = Connection(a,i);
    for (j = 0; j < Valence(conn); j++)	
      if (Connection(conn,j) == b)
	return(TRUE);
  }
  return(FALSE);
}
double out_of_plane(ums_type *mol, int atm)
{
  int c1, c2, c3, c4;  
  vect_type v,v1,sum,ck;
  c1 = atm;
  c2 = Connection(c1,0);
  c3 = Connection(c1,1);
  c4 = Connection(c1,2);
  pts_2_vect(mol,&v,c1,c2);
  normalize_vect(&v);
  pts_2_vect(mol,&v1,c1,c3);
  normalize_vect(&v1);
  vect_sum(&v,&v1,&sum);
  pts_2_vect(mol,&ck,c1,c4);
  return(180.0 - vect_ang(&sum,&ck));
}
 
   |