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
For more information please contact :
babel@mercury.aichem.arizona.edu
------------------------------------------------------------------------
FILE : convert.c
AUTHOR(S) : Pat Walters
DATE : 4-93
PURPOSE : main program
******/
#include "bbltyp.h"
#include "bblmast.h"
#undef MAC
#ifdef MAC
#include
#endif
static warning wstr;
static char *program_name;
int use_title = FALSE;
#ifdef MSDOS
#define UPPER_LIMIT 10000
#else
#define UPPER_LIMIT 1000000
#endif
#ifndef LIBRARY
int main(int argc, char *argv[])
{
ums_type *mol = NULL;
int need_to_do_outputs = FALSE;
#ifdef MAC
argc = ccommand(&argv);
#endif
babel_init();
program_name = argv[0];
if (argc == 1)
{
usage();
exit(0);
}
mol = (ums_type *)malloc(sizeof(ums_type));
mol->control = (bbl_control *)malloc(sizeof(bbl_control));
if (mol == NULL)
fatal_error("Could not allocate memory for UMS");
init_babel_control(mol);
Size = MASTERSIZE;
process_command_line_args(argc,argv,mol);
if ((InfileType == none) && (UseMenus == FALSE))
fatal_error("No input flag specified");
if ((OutfileType == none) && (UseMenus == FALSE))
fatal_error("No output flag specified");
if (Spline)
{
do_spline(mol);
return(0);
}
if (UseMenus)
babel_menus(mol);
else
{
mol = do_inputs(mol);
}
if (mol->control)
free(mol->control);
if (mol)
free(mol);
return(0);
}
#endif
void new_control(ums_type *mol)
{
mol->control = (bbl_control *)malloc(sizeof(bbl_control));
if (!mol->control)
fatal_error("Unable to allocate memory for babel control");
init_babel_control(mol);
}
void init_babel_control(ums_type *mol)
{
strcpy(InfileName,"");
strcpy(OutfileName,"");
strcpy(InputKeywords,NOKEY);
strcpy(OutputKeywords,NOKEY);
strcpy(DeleteStr,"");
InfileType = none;
OutfileType = none;
UseMenus = FALSE;
Verbose = FALSE;
AddHydrogens = FALSE;
DeleteAtoms = FALSE;
ReaderFunction = NULL;
WriterFunction = NULL;
LowerLimit = 1;
UpperLimit = UPPER_LIMIT;
Multi = single_struct;
Spline = FALSE;
Align = FALSE;
CenterMol = FALSE;
Increment = 0;
DoRenum = FALSE;
Precipitate = FALSE;
MakeNewFile = TRUE;
CalcCharges = FALSE;
StdOrientation = FALSE;
PushHydrogens = FALSE;
NoDummy = FALSE;
}
void
process_command_line_args(int argc, char *argv[],ums_type *mol)
{
char tempstr[BUFF_SIZE], target[BUFF_SIZE];
while (argc > 1)
{
if (argv[1][0] == '-')
{
switch (argv[1][1])
{
case 'a' :
lowercase(&argv[1][1]);
if EQ(&argv[1][1],"align")
Align = TRUE;
break;
case 'b' :
if (EQ(&argv[1][1],"blurb"))
write_blurb();
if (EQ(&argv[1][1],"bbldef"))
write_bbldef();
exit(0);
break;
case 'c' :
lowercase(&argv[1][1]);
if (EQ(&argv[1][1],"center"))
CenterMol = TRUE;
if (EQ(&argv[1][1],"charge"))
CalcCharges = TRUE;
break;
case 'd':
DeleteAtoms = TRUE;
if ((argv[2] != NULL) && (argv[2][0] != '-'))
strcpy(DeleteStr,argv[2]);
else
{
sprintf(wstr,"Default type to be deleted is hydrogen");
show_warning(wstr);
strcpy(DeleteStr,"default");
}
break;
case 'h':
lowercase(&argv[1][1]);
if (EQ(&argv[1][1],"help"))
{
if (argv[2] == NULL)
usage();
else
{
if (EQ(argv[2],"inputs"))
show_inputs();
else
if (EQ(argv[2],"outputs"))
show_outputs();
}
exit(0);
}
else
AddHydrogens = TRUE;
break;
case 'i':
translate_input_code(&argv[1][2],mol);
if (InfileType == none)
{
sprintf(wstr,"%s is not a supported input file type \n",argv[1]);
fatal_error(wstr);
}
if (argv[2][0] == '-')
strcpy(InfileName,"CON");
else
strcpy(InfileName,argv[2]);
if ((argv[3] != NULL) && (argv[3][0] != '-'))
strcpy(InputKeywords,argv[3]);
else
strcpy(InputKeywords,"KEYWORDS GO HERE");
set_limits(mol);
break;
case 'm':
Verbose = TRUE;
UseMenus = TRUE;
break;
case 'n' :
lowercase(&argv[1][1]);
if (EQ(&argv[1][1],"nodummy"))
NoDummy = TRUE;
break;
case 'o':
if (EQ(&argv[1][1],"orient"))
{
StdOrientation = TRUE;
}
else
{
translate_output_code(&argv[1][2],mol);
if (OutfileType == none)
{
sprintf(wstr,"%s is not a supported output file type \n",argv[1]);
fatal_error(wstr);
}
if (argv[2] != NULL)
{
strcpy(OutfileName,argv[2]);
strcpy(BaseName,OutfileName);
strcpy(tempstr,OutfileName);
uppercase(tempstr);
get_token(target,tempstr,". \n\t",1);
if (EQ(target,"TITLE"))
{
Multi = multi_struct;
use_title = TRUE;
get_token(target,OutfileName,". \n\t",2);
if (target != NULL)
strcpy(DefaultExtension,target);
else
DefaultExtension[0] = '\0';
}
else
Multi = multi_conf;
}
else
strcpy(OutfileName,"CON");
if ((argv[3] != NULL) && (argv[3][0] != '-'))
strcpy(OutputKeywords,argv[3]);
else
strcpy(OutputKeywords,"KEYWORDS GO HERE");
}
break; /* case 'o' */
case 'p' :
if (EQ(&argv[1][1],"precip"))
Precipitate = TRUE;
if (EQ(&argv[1][1],"push"))
PushHydrogens = TRUE;
break;
case 'r' :
lowercase(&argv[1][1]);
if EQ(&argv[1][1],"renum")
DoRenum = TRUE;
if ((argv[2] != NULL) && (argv[2][0] != '-'))
{
if (isdigit(argv[2][0]))
NewBase = atoi(argv[2]);
else
NewBase = 1;
}
else
NewBase = 1;
break;
case 's':
if (EQ(&argv[1][1],"spline"))
{
Spline = TRUE;
if ((argv[2] != NULL) && (argv[2][0] != '-'))
Increment = atoi(argv[2]) + 2;
}
if (EQ(&argv[1][1],"split"))
{
Multi = multi_struct;
}
break;
case 'v':
lowercase(&argv[1][1]);
if (EQ(&argv[1][1],"version"))
{
printf("Babel version %s %s %s \n",BABEL_VERSION,__DATE__,__TIME__);
exit(0);
}
else
Verbose = TRUE;
break;
}
}
argv++;
argc--;
}
}
void translate_input_code(char *code, ums_type *mol)
{
int i;
for (i = 0; i < MASTERSIZE; i++)
if (EQ(code,master[i].code) && (master[i].operation == input))
{
InputInfo = master[i];
}
}
void translate_output_code(char *code,ums_type *mol)
{
int i;
for (i = 0; i < MASTERSIZE; i++)
if (EQ(code,master[i].code) && (master[i].operation == output))
{
OutputInfo = master[i];
}
}
ums_type *do_inputs(ums_type *mol)
{
FILE *infile, *outfile;
int end = FALSE, result = 0;
int in_count = 1;
int out_count = 1;
if (EQ(InfileName,OutfileName) && NOTEQ(InfileName,"CON"))
{
fatal_error("FATAL ERROR : Input and Output file names are the same !!");
}
if (Verbose)
{
sprintf(wstr,"Reading %s file %s",InputTypeName,InfileName);
show_warning(wstr);
}
if (NOTEQ(InfileName,"CON"))
infile = open_read(InfileName);
else
infile = stdin;
if ((Multi != multi_struct) && (UseMenus == FALSE))
outfile = open_write(OutfileName);
while (!end)
{
if (in_count > UpperLimit)
{
end = TRUE;
break;
}
result = ReaderFunction(infile,mol);
end = check_for_eof(infile);
if (UseMenus)
{
fclose(infile);
return(mol);
}
if (want_this_file(mol,in_count,end))
{
if (Verbose)
{
fprintf(stderr,"Structure %5d ",in_count,Multi);
}
if (Multi == multi_struct)
{
puts("Multi == multi_struct");
generate_outfile_name(mol,out_count);
outfile = open_write(OutfileName);
do_outputs(outfile,mol);
close_file(OutfileName,outfile);
}
else
{
mol = do_outputs(outfile,mol);
}
out_count++;
}
in_count++;
}
if (Multi != multi_struct)
close_file(OutfileName,outfile);
if (infile)
close_file(InfileName,infile);
return(mol);
}
ums_type *do_outputs(FILE *outfile, ums_type *mol)
{
int result = 0;
vect_type v;
ums_type *temp;
if (AddHydrogens)
{
if (OutfileType == smiles)
add_2d_hydrogens(mol);
else
add_hydrogens(mol);
}
if (CalcCharges)
{
calc_gasteiger_charges(mol);
}
if (DoRenum)
{
temp = renum_for_zmat(mol,NewBase);
temp->control = mol->control;
release_ums(mol);
free(mol);
mol = temp;
}
if (CenterMol)
center_at_origin(mol,&v);
if (Align)
AlignMol(mol);
if (StdOrientation)
set_std_orientation(mol);
if (Atoms > 0)
{
if (DeleteAtoms)
{
temp = delete_atoms(mol,DeleteStr);
temp->control = mol->control;
release_ums(mol);
free(mol);
mol = temp;
}
if (Precipitate)
{
temp = precipitate(mol);
temp->control = mol->control;
release_ums(mol);
free(mol);
mol = temp;
}
if (PushHydrogens)
{
push_hydrogens_to_end(mol);
temp = build_new_ums(mol,Atoms);
temp->control = mol->control;
release_ums(mol);
free(mol);
mol = temp;
}
if (Title[0] == '\0')
strcpy(Title,OutfileName);
if (Verbose)
{
fprintf(stderr,"%s Writing %d Atoms and %d Bonds to %s file %s\n",
Title,Atoms,Bonds,OutfileTypeName,OutfileName);
}
if (!(NoDummy) || dummy_check(mol))
{
result = WriterFunction(outfile,mol);
}
else
{
fprintf(stderr,"%s rejected because of dummy atoms\n",Title);
}
}
else
{
show_warning("No atoms found in this structure");
}
release_ums(mol);
return(mol);
}
void generate_outfile_name(ums_type *mol,int count)
{
if (NOTEQ(OutfileName,"CON"))
{
if (Multi == multi_struct)
{
if (use_title)
{
strcpy(Title,trim_spaces(Title));
if (DefaultExtension[0] != '\0')
sprintf(OutfileName,"%s.%s",Title,DefaultExtension);
else
sprintf(OutfileName,"%s",Title);
}
else
if ((UpperLimit - LowerLimit) > 0)
make_output_name(BaseName,OutfileName,count);
}
else
if ((UpperLimit - LowerLimit) > 0)
make_output_name(BaseName,OutfileName,count);
lowercase(OutfileName);
}
}
void set_limits(ums_type *mol)
{
char token1[25],token2[25];
uppercase(InputKeywords);
if (EQ(InputKeywords,"ALL"))
{
LowerLimit = 1;
UpperLimit = UPPER_LIMIT - 1;
}
else
if (strchr(InputKeywords,'-'))
{
get_token(token1,InputKeywords,"-",1);
get_token(token2,InputKeywords,"-",2);
if ((isdigit(token1[0])) && (isdigit(token2[0])))
{
LowerLimit = atoi(token1);
UpperLimit = atoi(token2);
}
}
}
int want_this_file(ums_type *mol, int counter, int end)
{
/* single structure -- write it out */
if ((counter == 1) && (end == 1))
{
Multi = single_struct;
return(TRUE);
}
/* no keywords -- do all structures */
if ((EQ(InputKeywords,NOKEY)) || (EQ(InputKeywords,"ALL")))
return(TRUE);
/* just do the last structure */
if (EQ(InputKeywords,"LAST"))
if (end)
{
return(TRUE);
}
else
return(FALSE);
if ((strlen(Title) > 0) && (strstr(InputKeywords,Title) != NULL))
return(TRUE);
switch(Multi)
{
case multi_conf :
if ((counter >= LowerLimit) && (counter <= UpperLimit))
return(TRUE);
break;
case multi_struct :
return(TRUE);
break;
default :
return(FALSE);
}
return(FALSE);
}
void
usage()
{
sprintf(wstr,"Babel %s -- %s -- %s",BABEL_VERSION,__DATE__,__TIME__);
puts(wstr);
sprintf(wstr,"for menus type -- %s -m\n",program_name);
puts(wstr);
sprintf(wstr,"Usage is : \n%s [-v] -i -o \"\"\n",program_name);
puts(wstr);
sprintf(wstr,"\nCurrently supported input types\n");
puts(wstr);
show_inputs();
sprintf(wstr,"\nCurrently supported output types\n");
puts(wstr);
show_outputs();
}
void write_bbldef()
{
int i;
char bbldef[256];
FILE *fp;
if (getenv("HOME"))
sprintf(bbldef,"%s/.bbldef",getenv("HOME"));
else
fatal_error("Please define HOME environment variable");
fp = open_write(bbldef);
for (i = 0; i < MASTERSIZE; i++)
{
if (master[i].operation == input)
fprintf(fp,"input %s\n",master[i].type_name);
if (master[i].operation == output)
fprintf(fp,"output %s\n",master[i].type_name);
}
fprintf(fp,"default input MDL Isis\n");
fprintf(fp,"default output Sybyl Mol2\n");
if (fp)
fclose(fp);
}
void show_inputs()
{
int i;
for (i = 0; i < MASTERSIZE; i++)
if (master[i].operation == input)
{
sprintf(wstr,"\t%s -- %s file",master[i].code,master[i].type_name);
puts(wstr);
}
}
void show_outputs()
{
int i;
for (i = 0; i < MASTERSIZE; i++)
if (master[i].operation == output)
{
sprintf(wstr,"\t%s -- %s file",master[i].code,master[i].type_name);
puts(wstr);
}
}
int output_all_formats(FILE *fp,ums_type *mol)
{
int i;
int result;
for (i = 0; i < MASTERSIZE; i++)
if ((master[i].operation == output) && (master[i].type != diagnostics) && (master[i].type != gaussian_template))
{
fprintf(stdout,"\n%s FILE\n",master[i].type_name);
strcpy(Title,"TITLE");
result = master[i].func(stdout,mol);
}
return(TRUE);
}
void write_blurb()
{
int i,j;
printf("Babel will read the following file types :\n");
j = 0;
for (i = 0; i < MASTERSIZE; i++)
if (master[i].operation == input)
{
j++;
printf("%-25s",master[i].type_name);
if (((j % 3) == 0) && j > 0)
printf("\n");
}
printf("\n");
printf("\nBabel will write the following file types :\n");
j = 0;
for (i = 0; i < MASTERSIZE; i++)
if ((master[i].operation == output) && (master[i].type != diagnostics))
{
j++;
printf("%-25s",master[i].type_name);
if (((j % 3) == 0) && j > 0)
printf("\n");
}
printf("\n");
}
|