// // Copyright (C) 2015-2017 Greg Landrum // // @@ All Rights Reserved @@ // This file is part of the RDKit. // The contents are covered by the terms of the BSD license // which is included in the file license.txt, found at the root // of the RDKit source tree. // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace RDKit; void test1() { std::cout << " ----------------- Test 1" << std::endl; { std::string smiles = "CO[C@@H](O)C1=C(O[C@H](F)Cl)C(C#N)=C1ONNC[NH3+]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); std::ofstream outs("test1_1.svg"); MolDraw2DSVG drawer(300, 300, outs); drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); delete m; } { // make sure this works with the stringstream too: std::string smiles = "CO[C@@H](O)C1=C(O[C@H](F)Cl)C=C1ONNC[NH3+]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string text = drawer.getDrawingText(); TEST_ASSERT(text.find("") != std::string::npos); delete m; } { std::string smiles = "Cc1c(C(=O)NCCO)[n+](=O)c2ccccc2n1[O-]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); std::ofstream outs("test1_2.svg"); MolDraw2DSVG drawer(300, 300, outs); drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); delete m; } { std::string smiles = "Cc1c(C(=O)NCCO)[n+](=O)c2ccccc2n1[O-]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); std::ofstream outs("test1_3.svg"); MolDraw2DSVG drawer(300, 300, outs); std::vector highlights; highlights.push_back(0); highlights.push_back(4); highlights.push_back(5); drawer.drawMolecule(*m, &highlights); drawer.finishDrawing(); outs.flush(); delete m; } { std::string smiles = "CO[C@@H](O)C1=C(O[C@H](F)Cl)C(C#N)=C1ONNC[NH3+]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); std::ofstream outs("test1_4.svg"); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions().additionalAtomLabelPadding = 0.25; drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); delete m; } std::cout << " Done" << std::endl; } #ifdef RDK_CAIRO_BUILD #include #include "MolDraw2DCairo.h" void test2() { std::cout << " ----------------- Test 2" << std::endl; { std::string smiles = "CO[C@@H](O)C1=C(O[C@H](F)Cl)C(C#N)=C1ONNC[NH3+]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolDraw2DCairo drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText("test2_1.png"); delete m; } { std::string smiles = "Cc1c(C(=O)NCCO)[n+](=O)c2ccccc2n1[O-]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolDraw2DCairo drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string drawing = drawer.getDrawingText(); std::ofstream ofs("test2_2.png"); ofs.write(drawing.c_str(), drawing.size()); delete m; } { // ensure we still work with a client-provided drawing context std::string smiles = "Cc1c(C(=O)NCCO)[n+](=O)c2ccccc2n1[O-]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 300, 300); cairo_t *cr = cairo_create(surface); MolDraw2DCairo drawer(300, 300, cr); std::vector highlights; highlights.push_back(0); highlights.push_back(4); highlights.push_back(5); drawer.drawMolecule(*m, &highlights); drawer.finishDrawing(); cairo_destroy(cr); cairo_surface_write_to_png(surface, "test2_3.png"); cairo_surface_destroy(surface); delete m; } std::cout << " Done" << std::endl; } #else // RDK_CAIRO_BUILD void test2() {} #endif void test3() { std::cout << " ----------------- Test 3" << std::endl; { std::string smiles = "C1CC1CC1ON1"; std::string nameBase = "test3_1"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); static const int ha[] = {0, 3, 4, 5}; std::vector highlight_atoms(ha, ha + sizeof(ha) / sizeof(int)); std::map atomLabels; atomLabels[2] = "C1"; atomLabels[1] = "a34"; atomLabels[0] = "[CH2;X2:4]"; atomLabels[6] = "[NH2+:7]"; #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions().atomLabels = atomLabels; drawer.drawMolecule(*m, &highlight_atoms); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions().atomLabels = atomLabels; drawer.drawMolecule(*m, &highlight_atoms); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "C1CC1CC1ON1"; std::string nameBase = "test3_2"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); static const int ha[] = {0, 3, 4, 5}; std::vector highlight_atoms(ha, ha + sizeof(ha) / sizeof(int)); #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions().circleAtoms = false; drawer.drawMolecule(*m, &highlight_atoms); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions().circleAtoms = false; drawer.drawMolecule(*m, &highlight_atoms); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "Cc1c(C(=O)NCCO)[n+](=O)c2ccccc2n1[O-]"; std::string nameBase = "test3_3"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); static const int ha[] = {11, 12, 13, 14, 15, 16}; std::vector highlight_atoms(ha, ha + sizeof(ha) / sizeof(int)); std::map highlight_colors; highlight_colors[12] = DrawColour(0, 0, 1); highlight_colors[13] = DrawColour(0, 1, 0); #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions().circleAtoms = true; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions().circleAtoms = true; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "Cc1c(C(=O)NCCO)[n+](=O)c2ccccc2n1[O-]"; std::string nameBase = "test3_4"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); static const int ha[] = {11, 12, 13, 14, 15, 16, 3}; std::vector highlight_atoms(ha, ha + sizeof(ha) / sizeof(int)); std::map highlight_colors; highlight_colors[12] = DrawColour(.5, .5, 1); highlight_colors[13] = DrawColour(.5, 1, .5); MolDrawOptions options; options.circleAtoms = true; options.highlightColour = DrawColour(1, .5, .5); options.continuousHighlight = true; #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions() = options; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions() = options; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "CCOC(=O)Nc1ccc(SCC2COC(Cn3ccnc3)(c3ccc(Cl)cc3Cl)O2)cc1"; std::string nameBase = "test3_5"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); static const int ha[] = {17, 18, 19, 20, 21, 6, 7, 8, 9, 31, 32}; std::vector highlight_atoms(ha, ha + sizeof(ha) / sizeof(int)); std::map highlight_colors; MolDrawOptions options; options.circleAtoms = true; options.highlightColour = DrawColour(1, .5, .5); options.continuousHighlight = true; #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(200, 200); drawer.drawOptions() = options; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(200, 200, outs); drawer.drawOptions() = options; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "CCOC(=O)Nc1ccc(SCC2COC(Cn3ccnc3)(c3ccc(Cl)cc3Cl)O2)cc1"; std::string nameBase = "test3_6"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolDrawOptions options; static const int ha1[] = {17, 18, 19, 20, 21}; std::vector highlight_atoms1(ha1, ha1 + sizeof(ha1) / sizeof(int)); options.atomRegions.push_back(highlight_atoms1); static const int ha2[] = {6, 7, 8, 9, 31, 32}; std::vector highlight_atoms2(ha2, ha2 + sizeof(ha2) / sizeof(int)); options.atomRegions.push_back(highlight_atoms2); options.includeAtomTags = true; #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "CCOC(=O)Nc1ccc(SCC2COC(Cn3ccnc3)(c3ccc(Cl)cc3Cl)O2)cc1"; std::string nameBase = "test3_7"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolDrawOptions options; options.continuousHighlight = true; static const int ha[] = {17, 20, 25}; std::vector highlight_atoms(ha, ha + sizeof(ha) / sizeof(int)); std::map highlight_radii; highlight_radii[17] = 0.5; highlight_radii[20] = 1.0; std::map highlight_colors; highlight_colors[17] = DrawColour(.5, .5, 1.); #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions() = options; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors, &highlight_radii); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions() = options; drawer.drawMolecule(*m, &highlight_atoms, &highlight_colors, &highlight_radii); drawer.finishDrawing(); outs.flush(); } delete m; } std::cout << " Done" << std::endl; } void test4() { std::cout << " ----------------- Test 4" << std::endl; { std::string fName = getenv("RDBASE"); fName += "/Code/GraphMol/MolDraw2D/test_dir"; fName += "/clash.mol"; ROMol *m = MolFileToMol(fName); std::string nameBase = "test4_1"; TEST_ASSERT(m); #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); } delete m; } std::cout << " Done" << std::endl; } void test5() { std::cout << " ----------------- Test 5" << std::endl; { std::string smiles = "*c1cc(*)cc(*)c1"; std::string nameBase = "test5_1"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolDrawOptions options; options.dummiesAreAttachments = true; options.atomLabels[0] = "R1"; #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "*C"; std::string nameBase = "test5_2"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m, 0, true); WedgeMolBonds(*m, &(m->getConformer())); MolDrawOptions options; options.dummiesAreAttachments = true; #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); } delete m; } { std::string smiles = "CC(F)(Cl)Br"; std::string nameBase = "test5_3"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); m->getBondBetweenAtoms(1, 2)->setBondDir(Bond::UNKNOWN); RDDepict::compute2DCoords(*m, 0, true); WedgeMolBonds(*m, &(m->getConformer())); MolDrawOptions options; options.dummiesAreAttachments = true; #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawOptions() = options; drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); } delete m; } std::cout << " Done" << std::endl; } #ifdef RDK_TEST_MULTITHREADED #include #include #include namespace { void runblock(const std::vector &mols, const std::vector &refData, unsigned int count, unsigned int idx) { for (unsigned int j = 0; j < 200; j++) { for (unsigned int i = 0; i < mols.size(); ++i) { if (i % count != idx) continue; ROMol *mol = mols[i]; MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*mol); drawer.finishDrawing(); std::string text = drawer.getDrawingText(); TEST_ASSERT(text == refData[i]); } } } } void testMultiThreaded() { std::cout << " ----------------- Test multi-threaded drawing" << std::endl; std::string fName = getenv("RDBASE"); fName += "/Data/NCI/first_200.props.sdf"; RDKit::SDMolSupplier suppl(fName); std::cerr << "reading molecules" << std::endl; std::vector mols; while (!suppl.atEnd() && mols.size() < 100) { ROMol *mol = 0; try { mol = suppl.next(); } catch (...) { continue; } if (!mol) continue; mols.push_back(mol); } std::cerr << "generating reference drawings" << std::endl; std::vector refData(mols.size()); for (unsigned int i = 0; i < mols.size(); ++i) { MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*(mols[i])); drawer.finishDrawing(); refData[i] = drawer.getDrawingText(); TEST_ASSERT(refData[i].find("") != std::string::npos); } boost::thread_group tg; unsigned int count = 4; std::cerr << "processing" << std::endl; for (unsigned int i = 0; i < count; ++i) { std::cerr << " launch :" << i << std::endl; std::cerr.flush(); tg.add_thread(new boost::thread(runblock, mols, refData, count, i)); } tg.join_all(); std::cerr << " Done" << std::endl; } #else void testMultiThreaded() {} #endif void test6() { std::cout << " ----------------- Test 6 (atom labels)" << std::endl; { std::string smiles = "CC[13CH2][CH2:7][CH-]C[15NH2+]C"; std::string nameBase = "test5_1"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string txt = drawer.getDrawingText(); std::ofstream outs("test6_1.svg"); outs << txt; // TEST_ASSERT(txt.find("getBondType() != Bond::AROMATIC); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getIsAromatic()); TEST_ASSERT(nm.getBondBetweenAtoms(6, 7)->getBondType() == Bond::SINGLE); TEST_ASSERT(nm.getBondBetweenAtoms(6, 7)->getBondDir() == Bond::BEGINWEDGE); // make sure we can do it again: MolDraw2DUtils::prepareMolForDrawing(nm); TEST_ASSERT(nm.getNumAtoms() == 9); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getBondType() != Bond::AROMATIC); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getIsAromatic()); } { RWMol nm(*m); TEST_ASSERT(nm.getNumAtoms() == 9) MolDraw2DUtils::prepareMolForDrawing(nm, false); TEST_ASSERT(nm.getNumAtoms() == 9); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getBondType() == Bond::AROMATIC); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getIsAromatic()); } { RWMol nm(*m); TEST_ASSERT(nm.getNumAtoms() == 9) MolDraw2DUtils::prepareMolForDrawing(nm, false, false); TEST_ASSERT(nm.getNumAtoms() == 9); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getBondType() == Bond::AROMATIC); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getIsAromatic()); } { RWMol nm(*m); TEST_ASSERT(nm.getNumAtoms() == 9) MolDraw2DUtils::prepareMolForDrawing(nm, false, true); TEST_ASSERT(nm.getNumAtoms() == 9); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getBondType() == Bond::AROMATIC); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getIsAromatic()); } { RWMol nm(*m); TEST_ASSERT(nm.getNumAtoms() == 9) MolDraw2DUtils::prepareMolForDrawing(nm, true, true, false); TEST_ASSERT(nm.getNumAtoms() == 9); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getBondType() != Bond::AROMATIC); TEST_ASSERT(nm.getBondBetweenAtoms(0, 1)->getIsAromatic()); TEST_ASSERT(nm.getBondBetweenAtoms(6, 7)->getBondType() == Bond::SINGLE); TEST_ASSERT(nm.getBondBetweenAtoms(6, 7)->getBondDir() == Bond::NONE); } { // by default we don't force conformer generation RWMol nm(*m); RDDepict::compute2DCoords(nm); nm.getConformer().set3D(true); // it's not really, we're cheating TEST_ASSERT(nm.getNumAtoms() == 9) MolDraw2DUtils::prepareMolForDrawing(nm); TEST_ASSERT(nm.getNumAtoms() == 9); TEST_ASSERT(nm.getNumConformers() == 1); // we have a conformer anyway TEST_ASSERT(nm.getConformer().is3D()); // but if we do force, it blows out that conformer: MolDraw2DUtils::prepareMolForDrawing(nm, true, true, true, true); TEST_ASSERT(!nm.getConformer().is3D()); } delete m; } { std::string smiles = "C1CC[C@H]2NCCCC2C1"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); { RWMol nm(*m); TEST_ASSERT(nm.getNumAtoms() == 10) MolDraw2DUtils::prepareMolForDrawing(nm); TEST_ASSERT(nm.getNumAtoms() == 11); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(!nm.getConformer().is3D()); TEST_ASSERT(nm.getBondBetweenAtoms(3, 10)->getBondType() == Bond::SINGLE); TEST_ASSERT(nm.getBondBetweenAtoms(3, 10)->getBondDir() == Bond::BEGINDASH); // make sure we can do it again: MolDraw2DUtils::prepareMolForDrawing(nm); TEST_ASSERT(nm.getNumAtoms() == 11); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(nm.getBondBetweenAtoms(3, 10)->getBondType() == Bond::SINGLE); TEST_ASSERT(nm.getBondBetweenAtoms(3, 10)->getBondDir() == Bond::BEGINDASH); } { RWMol nm(*m); TEST_ASSERT(nm.getNumAtoms() == 10) MolDraw2DUtils::prepareMolForDrawing(nm, false, false); TEST_ASSERT(nm.getNumAtoms() == 10); TEST_ASSERT(nm.getNumConformers() == 1); TEST_ASSERT(nm.getBondBetweenAtoms(3, 2)->getBondType() == Bond::SINGLE); TEST_ASSERT(nm.getBondBetweenAtoms(3, 2)->getBondDir() == Bond::BEGINWEDGE); } delete m; } std::cerr << " Done" << std::endl; } void testGithub781() { std::cout << " ----------------- Test Github #781: Rendering single-atom " "molecules" << std::endl; { std::string smiles = "C"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string txt = drawer.getDrawingText(); TEST_ASSERT(txt.find("CH") != std::string::npos); delete m; } { std::string smiles = "O"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string txt = drawer.getDrawingText(); TEST_ASSERT(txt.find("OH") == std::string::npos); delete m; } { std::string smiles = "[C]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string txt = drawer.getDrawingText(); TEST_ASSERT(txt.find("C") != std::string::npos); delete m; } { std::string smiles = "C.CC.[Cl-]"; ROMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string txt = drawer.getDrawingText(); TEST_ASSERT(txt.find("CH") != std::string::npos); TEST_ASSERT(txt.find("Cl") != std::string::npos); delete m; } { // empty molecule ROMol *m = new ROMol(); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string txt = drawer.getDrawingText(); TEST_ASSERT(txt.find("") == std::string::npos); delete m; } std::cerr << " Done" << std::endl; } void testGithub774() { std::cout << " ----------------- Test Github774" << std::endl; { std::string smiles = "Cc1c(C(=O)NCC[NH3+])[n+](=O)c2cc(CC[C@](F)(Cl)Br)ccc2n1[O-]"; std::string nameBase = "test774_1"; RWMol *m = SmilesToMol(smiles); TEST_ASSERT(m); RDDepict::compute2DCoords(*m); WedgeMolBonds(*m, &(m->getConformer())); MolOps::Kekulize(*m); #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); Point2D ocoords(1.0, 2.0); Point2D dcoords = drawer.getAtomCoords(std::make_pair(ocoords.x, ocoords.y)); Point2D acoords = drawer.getDrawCoords(dcoords); TEST_ASSERT(feq(acoords.x, 1.0)); TEST_ASSERT(feq(acoords.y, 2.0)); } // m->setProp("_Name","mol"); // std::cerr<getConformer())); MolOps::Kekulize(*m); #ifdef RDK_CAIRO_BUILD { MolDraw2DCairo drawer(300, 300); drawer.drawMolecule(*m); drawer.finishDrawing(); drawer.writeDrawingText(nameBase + ".png"); } #endif { std::ofstream outs((nameBase + ".svg").c_str()); MolDraw2DSVG drawer(300, 300, outs); drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); } // m->setProp("_Name","mol"); // std::cerr<getConformer())); MolDraw2DSVG drawer(300, 300); drawer.drawMolecule(*m, "mol legend"); drawer.finishDrawing(); std::string txt = drawer.getDrawingText(); std::ofstream outs("test9_1.svg"); outs << txt; // TEST_ASSERT(txt.find("getConformer())); std::ofstream outs("test910_1.svg"); MolDraw2DSVG drawer(600, 300, outs); drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); delete m; } { // now with Hs // this is a ChEMBL molecule std::string smiles = "CSCC[C@H](NC(=O)[C@@H](CCC(N)=O)NC(=O)[C@@H](N)Cc1c[nH]c2ccccc12)C(=" "O)" "NCC(=O)N[C@@H](Cc1c[nH]cn1)C(=O)N[C@@H](CO)C(=O)O"; RWMol *m = SmilesToMol(smiles); TEST_ASSERT(m); MolDraw2DUtils::prepareMolForDrawing(*m); std::ofstream outs("test910_2.svg"); MolDraw2DSVG drawer(600, 300, outs); drawer.drawMolecule(*m); drawer.finishDrawing(); outs.flush(); delete m; } std::cerr << " Done" << std::endl; } void testGithub932() { std::cout << " ----------------- Test Github #932: mistake in SVG for " "wedged bonds" << std::endl; { std::string smiles = "CC[C@](F)(Cl)Br"; RWMol *m = SmilesToMol(smiles); TEST_ASSERT(m); MolDraw2DUtils::prepareMolForDrawing(*m); MolDraw2DSVG drawer(200, 200); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string text = drawer.getDrawingText(); TEST_ASSERT(text.find("evenoddstroke") == std::string::npos); delete m; } std::cerr << " Done" << std::endl; } void testGithub953() { std::cout << " ----------------- Test Github #953: default color should " "not be cyan" << std::endl; { std::string smiles = "[Nb]"; RWMol *m = SmilesToMol(smiles); TEST_ASSERT(m); MolDraw2DUtils::prepareMolForDrawing(*m); MolDraw2DSVG drawer(200, 200); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string text = drawer.getDrawingText(); TEST_ASSERT(text.find("#00FFFF") == std::string::npos); delete m; } std::cerr << " Done" << std::endl; } void testGithub983() { std::cout << " ----------------- Test Github #983: wedged bonds between " "chiral centers drawn improperly" << std::endl; { // this has an ugly drawing (wedged bond between chiral centers) but we // force it to be drawn that way just to check. std::string mb = "\n\ Mrv1561 07241608122D\n\ \n\ 6 5 0 0 0 0 999 V2000\n\ 8.6830 -9.5982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n\ 9.3975 -9.1857 0.0000 C 0 0 2 0 0 0 0 0 0 0 0 0\n\ 10.1120 -9.5982 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0\n\ 9.3975 -8.3607 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n\ 10.8264 -9.1857 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n\ 10.1120 -10.4232 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n\ 1 2 1 0 0 0 0\n\ 3 5 1 0 0 0 0\n\ 3 2 1 1 0 0 0\n\ 2 4 1 1 0 0 0\n\ 3 6 1 0 0 0 0\n\ M END"; RWMol *m = MolBlockToMol(mb, false, false); TEST_ASSERT(m); MolOps::sanitizeMol(*m); MolDraw2DUtils::prepareMolForDrawing(*m); MolDraw2DSVG drawer(200, 200); drawer.drawMolecule(*m); drawer.finishDrawing(); std::string text = drawer.getDrawingText(); std::ofstream outs("test983_1.svg"); outs << text; outs.flush(); TEST_ASSERT(text.find("