Molecule * OpenbabelWrapper::openFile(const QString &fileName, const QString &fileType, const QString &fileOptions) { // Check that the file can be read from disk if (!canOpen(fileName, QFile::ReadOnly | QFile::Text)) return 0; // Construct the OpenBabel objects, set the file type OBConversion conv; OBFormat *inFormat; if (!fileType.isEmpty() && !conv.SetInFormat(fileType.toAscii().data())) // Input format not supported return 0; else { inFormat = conv.FormatFromExt(fileName.toAscii().data()); if (!conv.SetInFormat(inFormat)) // Input format not supported return 0; } // set any options if (!fileOptions.isEmpty()) { foreach(const QString &option, fileOptions.split('\n', QString::SkipEmptyParts)) { conv.AddOption(option.toAscii().data(), OBConversion::INOPTIONS); } }
void testPdbOccupancies() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test08.cif")); string pdb = conv.WriteString(&mol); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("HETATM 1 NA UNL 1 0.325 0.000 4.425 0.36") != string::npos); OB_ASSERT(pdb.find("HETATM 17 O UNL 8 1.954 8.956 3.035 1.00") != string::npos); OBMol mol_pdb; conv.SetInFormat("pdb"); conv.ReadFile(&mol_pdb, GetFilename("test09.pdb")); pdb = conv.WriteString(&mol_pdb); OB_ASSERT(pdb.find("HETATM 1 NA UNL 1 0.325 0.000 4.425 0.36") != string::npos); OB_ASSERT(pdb.find("HETATM 2 NA UNL 1 0.002 8.956 1.393 0.10") != string::npos); OB_ASSERT(pdb.find("HETATM 17 O UNL 8 1.954 8.956 3.035 1.00") != string::npos); }
void testSpaceGroupClean() { // See https://github.com/openbabel/openbabel/pull/254 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test02.cif")); OBUnitCell* pUC = (OBUnitCell*)mol.GetData(OBGenericDataType::UnitCell); const SpaceGroup* pSG = pUC->GetSpaceGroup(); SpaceGroup* sg = new SpaceGroup(*pSG); pSG = SpaceGroup::Find(sg); OB_ASSERT( pSG != NULL ); // Check also for errors and warnings string summary = obErrorLog.GetMessageSummary(); OB_ASSERT( summary.find("error") == string::npos); OB_ASSERT( summary.find("warning") == string::npos); OB_ASSERT( pSG->GetId() == 166 ); string pdb = conv.WriteString(&mol); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("H -3 m") != string::npos); }
void testIsomorphism1() { OBMol mol; OBConversion conv; conv.SetInFormat("smi"); conv.ReadString(&mol, "CC1CCC(C)CC1"); OBQuery *query = CompileMoleculeQuery(&mol); OBIsomorphismMapper *mapper = OBIsomorphismMapper::GetInstance(query); OBIsomorphismMapper::Mappings maps; mapper->MapAll(&mol, maps); OB_ASSERT( maps.size() == 4 ); delete query; delete mapper; query = CompileSmilesQuery("C1(C)CCC(C)CC1"); mapper = OBIsomorphismMapper::GetInstance(query); OBIsomorphismMapper::Mapping map; mapper->MapFirst(&mol, map); OB_ASSERT( map.size() == 8 ); mapper->MapUnique(&mol, maps); OB_ASSERT( maps.size() == 1 ); mapper->MapAll(&mol, maps); OB_ASSERT( maps.size() == 4 ); delete query; delete mapper; }
void LinMorphExtension::loadFile(QString file) { qDebug("LinMorphExtension::loadFile()"); if (file.isEmpty()) return; if (!m_secondMolecule) m_secondMolecule = new Molecule; OBConversion conv; OBFormat *inFormat = OBConversion::FormatFromExt(( file.toAscii() ).data() ); if ( !inFormat || !conv.SetInFormat( inFormat ) ) { QMessageBox::warning( NULL, tr( "Avogadro" ), tr( "Cannot read file format of file %1." ) .arg( file ) ); return; } if (!conv.ReadFile(m_secondMolecule, file.toStdString())) { QMessageBox::warning( NULL, tr( "Avogadro" ), tr( "Read mol file %1 failed." ) .arg( file ) ); return; } qDebug("LinMorphExtension::loadFile complete"); computeConformers(m_secondMolecule); m_linMorphDialog->setFrame(1); m_timeLine->setFrameRange(1, m_frameCount); setDuration(m_linMorphDialog->fps()); }
bool MakeQueriesFromMolInFile(vector<OBQuery*>& queries, const std::string& filename, int* pnAtoms, bool noH) { OBMol patternMol; patternMol.SetIsPatternStructure(); OBConversion patternConv; OBFormat* pFormat; //Need to distinguish between filename and SMARTS. Not infallable... if( filename.empty() || filename.find('.')==string::npos || !(pFormat = patternConv.FormatFromExt(filename.c_str())) || !patternConv.SetInFormat(pFormat) || !patternConv.ReadFile(&patternMol, filename) || patternMol.NumAtoms()==0) return false; if(noH) patternMol.DeleteHydrogens(); do { *pnAtoms = patternMol.NumHvyAtoms(); queries.push_back(CompileMoleculeQuery(&patternMol)); }while(patternConv.Read(&patternMol)); return true; }
// Helper function to read molecule from file shared_ptr<OBMol> GetMol(const std::string &filename) { // Create the OBMol object. shared_ptr<OBMol> mol(new OBMol); // Create the OBConversion object. OBConversion conv; OBFormat *format = conv.FormatFromExt(filename.c_str()); if (!format || !conv.SetInFormat(format)) { std::cout << "Could not find input format for file " << filename << std::endl; return mol; } // Open the file. std::ifstream ifs(filename.c_str()); if (!ifs) { std::cout << "Could not open " << filename << " for reading." << std::endl; return mol; } // Read the molecule. if (!conv.Read(mol.get(), &ifs)) { std::cout << "Could not read molecule from file " << filename << std::endl; return mol; } return mol; }
void testTetrahedralStereo1() { cout << "testTetrahedralStereo1()" << endl; // read a smiles string OBMol mol; OBConversion conv; OB_REQUIRE( conv.SetInFormat("smi") ); cout << "smiles: C[C@H](O)N" << endl; OB_REQUIRE( conv.ReadString(&mol, "C[C@H](O)N") ); // get the stereo data OB_REQUIRE( mol.HasData(OBGenericDataType::StereoData) ); std::vector<OBGenericData *> stereoData = mol.GetAllData(OBGenericDataType::StereoData); OB_REQUIRE( stereoData.size() == 1 ); // convert to tetrahedral data OB_REQUIRE( ((OBStereoBase*)stereoData[0])->GetType() == OBStereo::Tetrahedral ); OBTetrahedralStereo *ts = dynamic_cast<OBTetrahedralStereo*>(stereoData[0]); OB_REQUIRE( ts ); // print the configuration cout << *ts << endl; // construct a valid configuration here // // C[C@H](O)N // 0 1 2 3 4 <- ids // OBTetrahedralStereo::Config cfg(1, 0, OBStereo::MakeRefs(4, 3, 2), OBStereo::Clockwise); // compare stereochemistry OB_REQUIRE( ts->GetConfig() == cfg ); cout << endl; }
void InputFileExtension::readOutputFile(const QString filename) { QApplication::setOverrideCursor(Qt::WaitCursor); OBConversion conv; OBFormat *inFormat = conv.FormatFromExt( filename.toAscii() ); if ( !inFormat || !conv.SetInFormat( inFormat ) ) { QApplication::restoreOverrideCursor(); QMessageBox::warning(m_widget, tr("Avogadro"), tr("Cannot read file format of file %1.").arg(filename)); return; } // TODO: Switch to MoleculeFile ifstream ifs; ifs.open(QFile::encodeName(filename)); if (!ifs) { // shouldn't happen, already checked file above QApplication::restoreOverrideCursor(); QMessageBox::warning(m_widget, tr("Avogadro"), tr("Cannot read file %1.").arg( filename ) ); return; } OBMol *obmol = new OBMol; if (conv.Read(obmol, &ifs)) { Molecule *mol = new Molecule; mol->setOBMol(obmol); mol->setFileName(filename); emit moleculeChanged(mol, Extension::DeleteOld); m_molecule = mol; } QApplication::restoreOverrideCursor(); }
void ColoredMol::color() { OBConversion conv; std::string ext = boost::filesystem::extension(ligName); if(ext.compare(".pdb") == 0) { conv.SetInFormat("PDB"); } else if(ext.compare(".pdbqt") == 0) { conv.SetInFormat("PDBQT"); } else { std::cout << "File extension not supported: " << ligName << '\n'; std::cout << "Please use .pdb or .pdbqt for ligand\n"; exit(0); } conv.ReadFile(&ligMol, ligName); ext = boost::filesystem::extension(recName); if(ext.compare(".pdb") == 0) { conv.SetInFormat("PDB"); } else { std::cout << "File extension not supported: " << recName << '\n'; std::cout << "Please use .pdb for receptor\n"; exit(0); } conv.ReadFile(&recMol, recName); addHydrogens(); ligCenter(); removeResidues(); removeEachAtom(); }
int main(int argc,char **argv) { char *program_name= argv[0]; int c; char *FileIn = NULL; if (argc != 2) { cerr << " Usage: " << program_name << " <input file>\n"; exit(-1); } else { FileIn = argv[1]; } // Find Input filetype OBConversion conv; OBFormat *inFormat = conv.FormatFromExt(FileIn); if (!inFormat || !conv.SetInFormat(inFormat)) { cerr << program_name << ": cannot read input format!" << endl; exit (-1); } ifstream ifs; // Read the file ifs.open(FileIn); if (!ifs) { cerr << program_name << ": cannot read input file!" << endl; exit (-1); } OBMol mol; OBPointGroup pg; for (c = 1;; ++c) { mol.Clear(); conv.Read(&mol, &ifs); if (mol.Empty()) break; // not needed by OBPointGroup, but useful for external programs mol.Center(); mol.ToInertialFrame(); pg.Setup(&mol); cout << "Point Group: " << pg.IdentifyPointGroup() << endl; } // end for loop return(1); }
// Reading an InChI and then adding hydrogens messed up the structure void test_Issue134_InChI_addH() { OBConversion conv; conv.SetInFormat("inchi"); OBMol mol; conv.ReadString(&mol, "InChI=1S/C2H7NO/c1-2(3)4/h2,4H,3H2,1H3/t2-/m0/s1"); OB_ASSERT(!mol.HasData(OBGenericDataType::VirtualBondData)); mol.AddHydrogens(); conv.SetOutFormat("smi"); std::string res = conv.WriteString(&mol, true); OB_COMPARE(res, "C[C@@H](N)O"); }
int main(int argc, char **argv) { OBFunctionFactory *factory = OBFunctionFactory::GetFactory("MMFF94"); OBFunction *function = factory->NewInstance(); if (!function) { cout << "ERROR: could not find MMFF94 function" << endl; return -1; } if (argc < 2) { cout << "Usage: " << argv[0] << " <filename>" << endl; return -1; } OBMol mol; OBConversion conv; OBFormat *format = conv.FormatFromExt(argv[1]); if (!format || !conv.SetInFormat(format)) { cout << "ERROR: could not find format for file " << argv[1] << endl; return -1; } std::ifstream ifs; ifs.open(argv[1]); conv.Read(&mol, &ifs); ifs.close(); cout << "# atoms = " << mol.NumAtoms() << endl; function->GetLogFile()->SetOutputStream(&std::cout); function->GetLogFile()->SetLogLevel(OBLogFile::Low); // read options file if (argc == 3) { std::ifstream cifs; cifs.open(argv[2]); std::stringstream options; std::string line; while (std::getline(cifs, line)) options << line << std::endl; function->SetOptions(options.str()); } function->Setup(mol); OBMinimize minimize(function); minimize.SteepestDescent(50); }
void testAutomorphismMask() { // read file: 3 6-rings // // /\ /\ /\ // | | | | // \/ \/ \/ // cout << "testAutomorphismMask" << endl; OBMol mol; OBConversion conv; conv.SetInFormat("cml"); std::ifstream ifs(OBTestUtil::GetFilename("isomorphism1.cml").c_str()); OB_REQUIRE( ifs ); conv.Read(&mol, &ifs); OBIsomorphismMapper::Mappings maps; // First of all, how many automorphisms are there without any mask? // This takes about 20 seconds, so you may want to comment this out while debugging FindAutomorphisms(&mol, maps); cout << maps.size() << endl; OB_ASSERT( maps.size() == 4 ); // Now, let's remove the bridge (atomId 6) of the central ring. // // /\ /\ /\ // | | | | // \/ \/ // both rings can be flipped around exocyclic bond, the whole molecule can be mirrored // horizontally, this results in 2 x 2 x 2 = 8 automorphisms OBBitVec mask; mask.SetRangeOn(1, mol.NumAtoms()); mask.SetBitOff(6+1); FindAutomorphisms(&mol, maps, mask); cout << maps.size() << endl; for (unsigned int i = 0; i < maps.size(); ++i) { OBIsomorphismMapper::Mapping::const_iterator j; for (j = maps[i].begin(); j != maps[i].end(); ++j) cout << j->second << " "; cout << endl; } OB_ASSERT( maps.size() == 8 ); // Verify that atom Id 6 does not occur anywhere in the mappings OBIsomorphismMapper::Mappings::const_iterator a; OBIsomorphismMapper::Mapping::const_iterator b; for (a = maps.begin(); a != maps.end(); ++a) for (b = a->begin(); b!= a->end(); ++b) { OB_ASSERT( b->first != 6 ); OB_ASSERT( b->second != 6 ); } }
void testCIFMolecules() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("smi"); // check for disconnected fragments conv.ReadFile(&mol, GetFilename("1519159.cif")); string smi = conv.WriteString(&mol); // never, never disconnected fragments from a molecule OB_ASSERT(smi.find(".") == string::npos); }
void testAutomorphismPreMapping() { cout << "testAutomorphismPreMapping" << endl; OBMol mol; OBConversion conv; conv.SetInFormat("smi"); conv.ReadString(&mol, "c1(C)c(C)c(C)c(C)c(C)c1"); Automorphisms aut; FindAutomorphisms((OBMol*)&mol, aut); cout << aut.size() << endl; OB_ASSERT( aut.size() == 2 ); }
void testIsomorphismMask() { // read file: 3 6-rings // // /\ /\ /\ // | | | | // \/ \/ \/ // OBMol mol; OBConversion conv; conv.SetInFormat("cml"); std::ifstream ifs(OBTestUtil::GetFilename("isomorphism1.cml").c_str()); OB_REQUIRE( ifs ); conv.Read(&mol, &ifs); OBQuery *query = CompileSmilesQuery("C1CCCCC1"); OBIsomorphismMapper *mapper = OBIsomorphismMapper::GetInstance(query); // no mask OBIsomorphismMapper::Mappings maps; mapper->MapUnique(&mol, maps); cout << maps.size() << endl; OB_ASSERT( maps.size() == 3 ); // mask first ring OBBitVec mask; for (int i = 0; i < 6; ++i) mask.SetBitOn(i+1); mapper->MapUnique(&mol, maps, mask); cout << maps.size() << endl; OB_ASSERT( maps.size() == 1 ); // mask second ring also for (int i = 6; i < 10; ++i) mask.SetBitOn(i+1); mapper->MapUnique(&mol, maps, mask); cout << maps.size() << endl; OB_ASSERT( maps.size() == 2 ); // just mask last ring (atomIds 7-8, 10-13) mask.Clear(); for (int i = 10; i < 14; ++i) mask.SetBitOn(i+1); mask.SetBitOn(7 + 1); mask.SetBitOn(8 + 1); mapper->MapUnique(&mol, maps, mask); cout << maps.size() << endl; OB_ASSERT( maps.size() == 1 ); // Should be same result as masking just the first ring delete query; delete mapper; }
// A segfault was occuring when a Universal SMILES was output after an InChIfied SMILES. // This was due to short-circuit caching of InChIs on reading. The fix was to limit // the situations when the cached value was used, but also to delete the cached value // in this particular instance. void test_Issue135_UniversalSmiles() { // Test writing U smiles after I smiles OBConversion conv; conv.SetInFormat("smi"); OBMol mol; conv.ReadString(&mol, "C(=O)([O-])C(=O)O"); conv.SetOutFormat("smi"); conv.SetOptions("I", OBConversion::OUTOPTIONS); std::string res = conv.WriteString(&mol, true); OB_COMPARE(res, "C(=O)(C(=O)O)[O-]"); conv.SetOptions("U", OBConversion::OUTOPTIONS); res = conv.WriteString(&mol, true); OB_COMPARE(res, "C(=O)(C(=O)[O-])O"); }
void testPdbOutHexagonalAlternativeOrigin2() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test06.cif")); string pdb = conv.WriteString(&mol); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("H -3 m") != string::npos); }
void testPdbRemSpacesHMName() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test07.cif")); string pdb = conv.WriteString(&mol); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("I41/amd:2") != string::npos); }
// Delete hydrogens should not remove charged or isotopic hydrogens or [H][H] or [Cu][H][Cu] // or hydrogens with assigned atom classes void test_Issue178_DeleteHydrogens() { OBConversion conv; conv.SetInFormat("smi"); OBMol mol; // Test DeleteHydrogens() and DeleteNonPolarHydrogens() static const char *smi[] = { "C[H]", "[H][H]", "C[1H]", "C[H]C", "C[H+]" }; int numHs[] = { 0, 2, 1, 1, 1 }; for (int i = 0; i < 5; ++i) { for (int j = 0; j < 2; ++j) { conv.ReadString(&mol, smi[i]); if (j == 0) mol.DeleteHydrogens(); else mol.DeleteNonPolarHydrogens(); int myNumHs = 0; FOR_ATOMS_OF_MOL(atom, mol) if (atom->IsHydrogen()) myNumHs++; OB_COMPARE(myNumHs, numHs[i]); } } // Test DeletePolarHydrogens() static const char *smiB[] = { "N[H]", "[H][H]", "N[1H]", "N[H]C", "N[H+]" }; int numHsB[] = { 0, 2, 1, 1, 1 }; for (int i = 0; i < 5; ++i) { conv.ReadString(&mol, smiB[i]); mol.DeletePolarHydrogens(); int myNumHs = 0; FOR_ATOMS_OF_MOL(atom, mol) if (atom->IsHydrogen()) myNumHs++; OB_COMPARE(myNumHs, numHsB[i]); } // Test atom class // Currently, the SMILES parser does not retain atom classes for hydrogens on reading so... conv.ReadString(&mol, "C[H]"); OBAtomClassData *ac = new OBAtomClassData; ac->Add(2, 99); // Assign the hydrogen (atom 2) a class of 99 mol.SetData(ac); mol.DeleteHydrogens(); int myNumHs = 0; FOR_ATOMS_OF_MOL(atom, mol) if (atom->IsHydrogen()) myNumHs++; OB_COMPARE(myNumHs, 1); }
void testAlternativeOrigin() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.ReadFile(&mol, GetFilename("test04.cif")); OBUnitCell* pUC = (OBUnitCell*)mol.GetData(OBGenericDataType::UnitCell); const SpaceGroup* pSG = pUC->GetSpaceGroup(); SpaceGroup* sg = new SpaceGroup(*pSG); pSG = SpaceGroup::Find(sg); string summary = obErrorLog.GetMessageSummary(); OB_ASSERT( summary.find("warning") == string::npos); OB_ASSERT( pSG != NULL ); OB_ASSERT( pSG->GetOriginAlternative() == 1); }
int main(int argc, char **argv) { // Define location of file formats for testing #ifdef FORMATDIR char env[BUFF_SIZE]; snprintf(env, BUFF_SIZE, "BABEL_LIBDIR=%s", FORMATDIR); putenv(env); #endif std::ifstream ifs(GetFilename("canonstable.can").c_str()); OB_REQUIRE( ifs ); OBMol mol; OBConversion conv; conv.SetInFormat("smi"); conv.SetOutFormat("can"); std::string line; while (std::getline(ifs, line)) { OB_REQUIRE( conv.ReadString(&mol, line.c_str()) ); std::vector<OBAtom*> atoms; FOR_ATOMS_OF_MOL(atom, mol) atoms.push_back(&*atom); for (int i = 0; i < 5; ++i) { // shuffle the atoms std::random_shuffle(atoms.begin(), atoms.end()); mol.RenumberAtoms(atoms); // get can smiles mol.SetTitle(""); std::string cansmi = conv.WriteString(&mol, true); // comapare with ref if (cansmi != line) { cout << "ref = " << line << endl; cout << "can = " << cansmi << endl; OB_ASSERT( cansmi == line ); } } } return 0; }
void testPdbOutAlternativeOrigin() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test04.cif")); string pdb = conv.WriteString(&mol); // ending space is needed to check that there is no origin set OB_ASSERT(pdb.find("P 4/n b m ") != string::npos); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("P 4/n b m:1") != string::npos); }
char *serializeMolecule(const char *molecule) { string instring(molecule); string outstring; istringstream inStream(instring); LibHandler ob_lib; if (!ob_lib.isLoaded()) { return NULL; } OBMol mol; OBConversion conv; conv.SetInFormat(MOLECULE_TYPE); conv.Read(&mol,&inStream); return serializeOBMol(mol); }
int main(int argc, char **argv) { if (argc < 2) { std::cerr << "Usage: " << argv[0] << " filename" << std::endl; return -1; } // read a molecule OBConversion conv; OBFormat *format = conv.FormatFromExt(argv[1]); conv.SetInFormat(format); std::string filename(argv[1]); std::ifstream ifs; ifs.open(filename.c_str()); if (!ifs) { std::cerr << "Could not open " << filename << std::endl; return -1; } CairoPainter *painter = new CairoPainter; OBDepict depictor(painter); string::size_type pos = filename.find_last_of("."); if (pos != string::npos) filename = filename.substr(0, pos); OBMol mol; unsigned int count = 1; while (conv.Read(&mol, &ifs)) { // depict the molecule depictor.DrawMolecule(&mol); depictor.AddAtomLabels(OBDepict::AtomSymmetryClass); std::stringstream ss; ss << filename << count << ".png"; painter->WriteImage(ss.str()); count++; } return 0; }
void testDecayToP1() { // See https://github.com/openbabel/openbabel/pull/261 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.ReadFile(&mol, GetFilename("test03.cif")); OBUnitCell* pUC = (OBUnitCell*)mol.GetData(OBGenericDataType::UnitCell); const SpaceGroup* pSG = pUC->GetSpaceGroup(); SpaceGroup* sg = new SpaceGroup(*pSG); pSG = SpaceGroup::Find(sg); OB_ASSERT( pSG != NULL ); // Check also for errors and warnings string summary = obErrorLog.GetMessageSummary(); OB_ASSERT( summary.find("2 warnings") != string::npos); OB_ASSERT( pSG->GetId() == 1 ); }
void testIsomorphism4() { cout << "testIsomorphism4" << endl; OBMol mol; OBConversion conv; conv.SetInFormat("smi"); conv.ReadString(&mol, "C12C(C2)C1"); OBQuery *query = CompileSmilesQuery("C1CC1"); OBIsomorphismMapper *mapper = OBIsomorphismMapper::GetInstance(query); OBIsomorphismMapper::Mappings maps; mapper->MapUnique(&mol, maps); cout << maps.size() << endl; OB_ASSERT( maps.size() == 2 ); delete query; delete mapper; }
int main() { // Create an OBConversion object. OBConversion conv; // Set the input format. if (!conv.SetInFormat("smi")) { // Handle error. return 1; } // Create the OBMol object. OBMol mol; // Read the smiles string. if (conv.ReadString(&mol, "CCCC")) { // Handle error. return 1; } // ...Use OBMol object... }
bool verifyLSSR(const std::string &filename, const LSSR &ref) { cout << "Verify LSSR: " << filename << endl; std::string file = OBTestUtil::GetFilename(filename); // read a smiles string OBMol mol; OBConversion conv; OBFormat *format = conv.FormatFromExt(file.c_str()); OB_REQUIRE( format ); OB_REQUIRE( conv.SetInFormat(format) ); std::ifstream ifs; ifs.open(file.c_str()); OB_REQUIRE( ifs ); OB_REQUIRE( conv.Read(&mol, &ifs) ); std::vector<int> ringSizeCount(20, 0); std::vector<OBRing*> lssr = mol.GetLSSR(); for (unsigned int i = 0; i < lssr.size(); ++i) { ringSizeCount[lssr[i]->_path.size()]++; } /* cout << "ringSize: ringCount" << endl; cout << "3: " << ringSizeCount[3] << endl; cout << "4: " << ringSizeCount[4] << endl; cout << "5: " << ringSizeCount[5] << endl; cout << "6: " << ringSizeCount[6] << endl; */ bool fail = false; for (unsigned int i = 0; i < ref.size_count.size(); ++i) { const LSSR::Size_Count &size_count = ref.size_count[i]; OB_ASSERT( ringSizeCount[size_count.ringSize] == size_count.ringCount ); } return true; }