1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/**********************************************************************
obtautomer - Enumerate tautomer smiles and canonical tautomer smiles
Copyright (C) 2011 Tim Vandermeersch
This file is part of the Open Babel project.
For more information, see <http://openbabel.org/>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
***********************************************************************/
// used to set import/export for Cygwin DLLs
#ifdef WIN32
#define USING_OBDLL
#endif
#include <cstdlib>
#include <openbabel/mol.h>
#include <openbabel/obconversion.h>
#include <openbabel/tautomer.h>
using namespace std;
/**
* TautomerFunctor to print out smiles for each found tautomer.
*/
class Functor : public OpenBabel::UniqueTautomerFunctor
{
public:
void operator()(OpenBabel::OBMol *mol, const std::string &smiles)
{
std::cout << smiles << std::endl;
}
};
int main(int argc,char **argv)
{
char *program_name= argv[0];
int c;
char *FileIn = nullptr;
if (argc < 2) {
string err = "Usage: ";
err += program_name;
err += " [-c] <filename>\n";
err += "-c: Canonical tautomer only\n";
cerr << err; //Why not do directly
exit(-1);
} else {
FileIn = argv[argc-1];
}
// Find Input filetype
OpenBabel::OBConversion conv;
OpenBabel::OBFormat *format = conv.FormatFromExt(FileIn);
if (!format || !conv.SetInFormat(format)) {
cerr << program_name << ": cannot read input format!" << endl;
exit (-1);
}
if (!conv.SetOutFormat("can")) {
cerr << program_name << ": cannot find output format!" << endl;
exit (-1);
}
ifstream ifs;
// Read the file
ifs.open(FileIn);
if (!ifs) {
cerr << program_name << ": cannot read input file!" << endl;
exit (-1);
}
OpenBabel::OBMol mol;
for (c = 1;; ++c) {
mol.Clear();
conv.Read(&mol, &ifs);
if (mol.Empty())
break;
if (std::string(argv[1]) == "-c") {
CanonicalTautomer(&mol);
std::cout << conv.WriteString(&mol);
} else {
Functor f;
EnumerateTautomers(&mol, f);
}
} // end for loop
return(0);
}
|