in utils/indigo-deco/main.cpp [143:397]
int main(int argc, const char** argv)
{
int i;
int done_with_options = 0;
int approximate = 0;
int scaffold = 0;
int aromatic = 1;
const char* outfile_hl = 0;
const char* outfile_rg = 0;
const char* outfile_maxscaf = 0;
const char* outfile_allscafs = 0;
const char* outfile_scaf_r = 0;
int deco = 0;
int structures = 0;
const qword session = indigoAllocSessionId();
indigoSetErrorHandler(onError, 0);
printf("R-Group deconvolution utility, powered by Indigo API version %s\n", indigoVersion());
structures = indigoCreateArray();
indigoSetOptionBool("treat-x-as-pseudoatom", 1);
indigoSetOptionBool("ignore-stereochemistry-errors", 1);
for (i = 1; i < argc; i++)
{
if (!done_with_options && argv[i][0] == '-')
{
if (strcmp(argv[i], "--") == 0)
done_with_options = 1;
else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "/?") == 0 || strcmp(argv[i], "-help") == 0 ||
strcmp(argv[i], "--help") == 0)
{
_printHelpMessage();
return 0;
}
else if (strcmp(argv[i], "-a") == 0)
approximate = 1;
else if (strcmp(argv[i], "-l") == 0)
{
if (++i == argc)
{
fprintf(stderr, "expecting filename after -l\n");
return -1;
}
scaffold = indigoLoadMoleculeFromFile(argv[i]);
}
else if (strcmp(argv[i], "-o") == 0)
{
if (++i == argc)
{
fprintf(stderr, "expecting filename after -o\n");
return -1;
}
outfile_hl = argv[i];
}
else if (strcmp(argv[i], "-r") == 0)
{
if (++i == argc)
{
fprintf(stderr, "expecting filename after -r\n");
return -1;
}
outfile_rg = argv[i];
}
else if (strcmp(argv[i], "-s") == 0)
{
if (++i == argc)
{
fprintf(stderr, "expecting filename after -s\n");
return -1;
}
outfile_maxscaf = argv[i];
}
else if (strcmp(argv[i], "-sr") == 0)
{
if (++i == argc)
{
fprintf(stderr, "expecting filename after -sr\n");
return -1;
}
outfile_scaf_r = argv[i];
}
else if (strcmp(argv[i], "-S") == 0)
{
if (++i == argc)
{
fprintf(stderr, "expecting filename after -S\n");
return -1;
}
outfile_allscafs = argv[i];
}
else if (strcmp(argv[i], "-na") == 0)
aromatic = 0;
else
{
fprintf(stderr, "Unknown option: %s", argv[i]);
_printHelpMessage();
return -1;
}
}
else
{
char dirname[1024];
char errbuf[1024];
const char* pattern = 0;
int k;
for (k = (int)strlen(argv[i]) - 1; k >= 0; k--)
if (argv[i][k] == '/' || argv[i][k] == '\\')
break;
if (k == -1)
strncpy(dirname, ".", sizeof(dirname));
else if (k == 0)
{
dirname[0] = argv[i][0];
dirname[1] = 0;
}
else if (k == strlen(argv[i]) - 1)
{
fprintf(stderr, "can not handle filenames ending with a slash\n");
return -1;
}
else if (k > sizeof(dirname) - 1)
{
fprintf(stderr, "filename too long\n");
return -1;
}
else
{
memcpy(dirname, argv[i], k);
dirname[k] = 0;
}
_replaceSlashes(dirname);
pattern = argv[i] + k + 1;
for (const auto& path : std::filesystem::directory_iterator(dirname))
{
const char* current_filename = path.path().filename().string().c_str();
if (!matchesPattern(current_filename, pattern))
{
continue;
}
_handleInputFile(path.path().string().c_str(), structures);
}
}
}
if (indigoCount(structures) < 1)
{
fprintf(stderr, "no input structures\n");
_printHelpMessage();
return -1;
}
printf("got %d input structures\n", indigoCount(structures));
indigoSetOptionBool("deconvolution-aromatization", aromatic);
if (scaffold == 0)
{
printf("calculating scaffold... ");
fflush(stdout);
if (approximate)
scaffold = indigoExtractCommonScaffold(structures, "approximate");
else
scaffold = indigoExtractCommonScaffold(structures, "exact");
printf("done\n");
fflush(stdout);
}
if (outfile_maxscaf != 0)
{
printf("saving the scaffold to %s\n", outfile_maxscaf);
indigoSaveMolfileToFile(scaffold, outfile_maxscaf);
}
if (outfile_allscafs != 0)
{
int output = indigoWriteFile(outfile_allscafs);
int allscafs = indigoAllScaffolds(scaffold);
int item, iter = indigoIterateArray(allscafs);
printf("saving all obtained scaffolds (%d total) to %s\n", indigoCount(allscafs), outfile_allscafs);
while ((item = indigoNext(iter)))
{
indigoSdfAppend(output, item);
indigoFree(item);
}
indigoFree(iter);
indigoFree(output);
}
if (outfile_hl == 0 && outfile_rg == 0 && outfile_scaf_r == 0)
{
printf("none of -o, -r, -sr specified, nothing left to do\n");
return 0;
}
printf("decomposing the structures... ");
fflush(stdout);
deco = indigoDecomposeMolecules(scaffold, structures);
printf("done\n");
fflush(stdout);
if (outfile_scaf_r != 0)
{
int sr = indigoDecomposedMoleculeScaffold(deco);
indigoLayout(sr);
printf("saving the scaffold with R-sites to %s\n", outfile_scaf_r);
indigoSaveMolfileToFile(sr, outfile_scaf_r);
}
if (outfile_hl != 0)
{
int output = indigoWriteFile(outfile_hl);
int item, iter = indigoIterateDecomposedMolecules(deco);
printf("saving the highlighted structures to %s\n", outfile_hl);
while ((item = indigoNext(iter)))
{
indigoSdfAppend(output, indigoDecomposedMoleculeHighlighted(item));
indigoFree(item);
}
indigoFree(iter);
indigoFree(output);
}
if (outfile_rg != 0)
{
int output = indigoWriteFile(outfile_rg);
int item, iter = indigoIterateDecomposedMolecules(deco);
printf("saving the structures with R-groups to %s\n", outfile_rg);
while ((item = indigoNext(iter)))
{
indigoSdfAppend(output, indigoDecomposedMoleculeWithRGroups(item));
indigoFree(item);
}
indigoFree(iter);
indigoFree(output);
}
indigoReleaseSessionId(session);
return 0;
};