/* -*-C-*- */
/**********************************************************************
* This source code is public domain, and may be freely distributed, *
* modified, and used for any purpose. IT COMES WITH ABSOLUTELY NO *
* WARRANTY OF ANY KIND. *
**********************************************************************/
/*+======================================================================
| FILE: trantest2.c
| DESCRIPTION:
| Use this to debug transformations. Prompts for a transform
| and molecules repeatedly. Prints the resulting matches.
+======================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dt_smiles.h"
#include "dt_smarts.h"
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
/***************************************************************************
* FUNCTION: dump_errors
*
* RETURNS: (void)
***************************************************************************/
void dump_errors(void)
{
dt_Handle errseq, errob;
dt_String errstr;
dt_Integer elen, first = TRUE;
errseq = dt_errors(DX_ERR_WARN);
while (NULL_OB != (errob = dt_next(errseq)))
{
errstr = dt_stringvalue(&elen, errob);
if ((elen > 0) && (errstr != NULL))
{
if (first)
printf("\nError queue:\n");
first = FALSE;
printf(" %.*s\n", elen, errstr);
}
dt_dealloc(errob);
}
dt_dealloc(errseq);
dt_errorclear();
return;
}
/***************************************************************************
* FUNCTION: main
*
* RETURNS: (int)
***************************************************************************/
int main()
{
dt_Integer count, rlen, plen, templen, counter;
char *reactant, *product, *tempstr;
dt_Handle mols, mol, som, seq, reaction, atoms, atom, tempmol, strob;
dt_Handle trx, pattern, matches, sor, temprxn;
char smirk_string[1000];
char mol_string[1000];
/*** Loop forever. ***/
while(1)
{
/*** Get transform ***/
printf("Enter Transformation (<cr> terminates):\n");
if (!gets(smirk_string)) break;
if (strlen(smirk_string) == 0) break;
trx = dt_smirkin(strlen(smirk_string), smirk_string);
dump_errors();
/*** Good transform object ***/
if (trx != NULL_OB)
{
while(1)
{
/*** Get molecules. ***/
printf("Enter dot-separated molecules (<cr> terminates):\n");
if (!gets(mol_string)) break;
if (strlen(mol_string) == 0) break;
som = dt_smilin(strlen(mol_string), mol_string);
if (som == NULL_OB) break;
/*** Do the transformation. ***/
sor = dt_transform(trx, som, DX_FORWARD, FALSE);
if (sor != NULL_OB)
{
count = dt_count(sor, TYP_REACTION);
printf("Count of specific reactions found= %d\n\n", count);
while(NULL_OB != (reaction = dt_next(sor)))
{
product = dt_cansmiles(&plen, reaction, TRUE);
if (product != NULL)
printf("Absolute cansmiles: %.*s\n", plen, product);
else
printf("ERROR: Absolute cansmiles is NULL.\n");
atoms = dt_canstream(reaction, TYP_ATOM, TRUE, FALSE);
while (NULL_OB != (atom = dt_next(atoms)))
printf("Atom: %d, tmap: %d, torder: %d\n",
dt_uid(atom), dt_integer(atom, 4, "tmap"),
dt_integer(atom, 6, "torder"));
dt_dealloc(atoms);
product = dt_cansmiles(&plen, reaction, FALSE);
if (product != NULL)
printf("Unique cansmiles: %.*s\n", plen, product);
else
printf("ERROR: Unique cansmiles is NULL.\n");
dt_dealloc(reaction);
}
}
else
printf("Transform doesn't apply.\n");
dump_errors();
dt_dealloc(som);
}
dt_dealloc(trx);
}
else
printf("Transform barfed: %s\n", smirk_string);
}
return(1);
}