/***************************************************************************** *** thorcommonsmi.c - how many & which smiles in common in dbs. *** Other primary ids not counted. *** *** Author: Jeremy Yang *** 6 Feb 2001 *****************************************************************************/ #include #include #include #include "dt_smiles.h" #include "dt_thor.h" #include "du_utils.h" struct database { dt_Handle db; dt_Handle svr; char dbname[12]; char dbpw[12]; char host[12]; char service[12]; char user[12]; char userpw[12]; int size; dt_Handle smitype; }; main(int argc,char *argv[]) { struct database *dbs; struct database *pdb; dt_Handle tdts,tdt,tdt2; char *prog=*argv; char *p,*q,*p2,*q2,*smi; char c[] = "|/-\\|/-\\"; int i,j,ndb,is=0; /*** "is" = i-smallest ***/ int printsmi=0; int tdtcount=0,len,isnew,hitcount=0,ci=0; /****************************************************************** *** parse command line ******************************************************************/ if (argc<3 || 0==strcmp(argv[1],"-help")) { printf("syntax: %s [-printsmi] db1 db2 [db3...]\n",prog); exit(1); } if (0==strcmp(argv[1],"-printsmi")) { printsmi=1; argv++; --argc; } dbs = (struct database *)malloc((argc-1)*sizeof(struct database)); for (argv++,i=0;--argc;++argv,++i) { if (!du_parse_db(*argv, dbs[i].dbname, dbs[i].dbpw, dbs[i].host, dbs[i].service, dbs[i].user, dbs[i].userpw)) { fprintf(stderr,"ERROR: Can't parse db spec \"%s\"\n",*argv); exit(1); } } ndb=i; /****************************************************************** *** open databases ******************************************************************/ for (i=0;isvr = du_server(pdb->host,pdb->service,pdb->user,pdb->userpw); pdb->db = du_dbopen(pdb->svr,pdb->dbname,pdb->dbpw,"r"); if (NULL_OB==pdb->svr || NULL_OB== pdb->db) { fprintf(stderr,"ERROR: Can't open \"%s@%s\"\n",pdb->dbname,pdb->host); exit(1); } pdb->size = dt_count(pdb->db,TYP_DATATREE); if (pdb->size < dbs[is].size) is = i; pdb->smitype = dt_thor_getdatatype(pdb->db,4,"$SMI"); if (NULL_OB==pdb->smitype) { fprintf(stderr,"ERROR: No $SMI dtype in \"%s@%s\"\n",pdb->dbname,pdb->host); exit(1); } } fprintf(stderr,"NOTE: Smallest db is %s@%s with %d datatrees.\n", dbs[is].dbname,dbs[is].host,dbs[is].size); fprintf(stderr,"NOTE: Looking up all %s@%s smiles in other (%d) dbs...\n", dbs[is].dbname,dbs[is].host,ndb-1); /****************************************************************** *** main loop - tdts of smallest database. ******************************************************************/ tdts = dt_stream(dbs[is].db,TYP_DATATREE); for (tdtcount=0;NULL_OB!=(tdt=dt_next(tdts));++tdtcount) { smi=NULL; p = dt_thor_tdt2str(&len,tdt,0); if (strncmp(p,"$SMI<",5)) goto NEXTTDT; if (*(p+5)=='"') p2=p+6; else p2=p+5; q = du_find_character(len,p,">"); if (*(q-1)=='"') --q; smi = du_strndup(p2,q-p2); for (i=0;idb,pdb->smitype,strlen(smi),smi,0,&isnew); if (NULL_OB==tdt2) goto NEXTTDT; /***Not a common smi.***/ dt_dealloc(tdt2); } hitcount++; if (printsmi) printf("%s\n",smi); NEXTTDT: if (!(tdtcount%100)) { fprintf(stderr,"%c%c",tdtcount?8:'\t',c[ci++%8]); } if (NULL_OB!=tdt) dt_dealloc(tdt); if (smi) free(smi); } dt_dealloc(tdts); fputc(8,stderr); fprintf(stderr,"\nRESULTS(%s): %d smiles shared by:\n",prog,hitcount); for (i=0;i