void testUFFBuilderSpecialCases(){ BOOST_LOG(rdErrorLog) << "-------------------------------------" << std::endl; BOOST_LOG(rdErrorLog) << " Testing UFF special cases." << std::endl; RWMol *mol; std::string key; int needMore; RDGeom::Point3D v1,v2; ForceFields::ForceField *field; std::string pathName=getenv("RDBASE"); pathName += "/Code/GraphMol/ForceFieldHelpers/UFF/test_data"; // ---------- // Trigonal bipyramid // ---------- mol = MolFileToMol(pathName+"/tbp.mol",false); TEST_ASSERT(mol); MolOps::sanitizeMol(*mol); const Conformer &conf = mol->getConformer(); field=UFF::constructForceField(*mol); TEST_ASSERT(field); field->initialize(); needMore = field->minimize(200,1e-8,1e-4); TEST_ASSERT(!needMore); v1 = conf.getAtomPos(0).directionVector(conf.getAtomPos(1)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(2)); TEST_ASSERT(feq(v1.dotProduct(v2),-1.0,1e-3)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(3)); TEST_ASSERT(feq(v1.dotProduct(v2),0.0,1e-3)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(4)); TEST_ASSERT(feq(v1.dotProduct(v2),0.0,1e-3)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(5)); TEST_ASSERT(feq(v1.dotProduct(v2),0.0,1e-3)); v1 = conf.getAtomPos(0).directionVector(conf.getAtomPos(2)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(3)); TEST_ASSERT(feq(v1.dotProduct(v2),0.0,1e-3)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(4)); TEST_ASSERT(feq(v1.dotProduct(v2),0.0,1e-3)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(5)); TEST_ASSERT(feq(v1.dotProduct(v2),0.0,1e-3)); v1 = conf.getAtomPos(0).directionVector(conf.getAtomPos(3)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(4)); TEST_ASSERT(feq(v1.dotProduct(v2),-0.5,1e-3)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(5)); TEST_ASSERT(feq(v1.dotProduct(v2),-0.5,1e-3)); v1 = conf.getAtomPos(0).directionVector(conf.getAtomPos(4)); v2 = conf.getAtomPos(0).directionVector(conf.getAtomPos(5)); TEST_ASSERT(feq(v1.dotProduct(v2),-0.5,1e-3)); delete mol; delete field; BOOST_LOG(rdErrorLog) << " done" << std::endl; }
void prepareMolForDrawing(RWMol &mol, bool kekulize, bool addChiralHs, bool wedgeBonds, bool forceCoords) { if (kekulize) { MolOps::Kekulize(mol, false); // kekulize, but keep the aromatic flags! } if (addChiralHs) { std::vector<unsigned int> chiralAts; for (RWMol::AtomIterator atIt = mol.beginAtoms(); atIt != mol.endAtoms(); ++atIt) { if ((*atIt)->getChiralTag() == Atom::CHI_TETRAHEDRAL_CCW || (*atIt)->getChiralTag() == Atom::CHI_TETRAHEDRAL_CW) { chiralAts.push_back((*atIt)->getIdx()); } } if (chiralAts.size()) { bool addCoords = false; if (!forceCoords && mol.getNumConformers()) addCoords = true; MolOps::addHs(mol, false, addCoords, &chiralAts); } } if (forceCoords || !mol.getNumConformers()) { RDDepict::compute2DCoords(mol); } if (wedgeBonds) { WedgeMolBonds(mol, &mol.getConformer()); } }
void prepareMolForDrawing(RWMol &mol, bool kekulize, bool addChiralHs, bool wedgeBonds, bool forceCoords) { if (kekulize) { MolOps::Kekulize(mol, false); // kekulize, but keep the aromatic flags! } if (addChiralHs) { std::vector<unsigned int> chiralAts; for (RWMol::AtomIterator atIt = mol.beginAtoms(); atIt != mol.endAtoms(); ++atIt) { if (isAtomCandForChiralH(mol, *atIt)) { chiralAts.push_back((*atIt)->getIdx()); } } if (chiralAts.size()) { bool addCoords = false; if (!forceCoords && mol.getNumConformers()) addCoords = true; MolOps::addHs(mol, false, addCoords, &chiralAts); } } if (forceCoords || !mol.getNumConformers()) { // compute 2D coordinates in a standard orientation: const bool canonOrient = true; RDDepict::compute2DCoords(mol, NULL, canonOrient); } if (wedgeBonds) { WedgeMolBonds(mol, &mol.getConformer()); } }
void test3CubeFiles () { std::string path = getenv ("RDBASE"); path += "/Code/GraphMol/MIF/test_data/"; RWMol mol = *MolFileToMol(path + "HCl.mol", true, false); RealValueVect *data = new RealValueVect (0.0, 125); UniformRealValueGrid3D grd (5.0, 5.0, 5.0, 1.0, new Point3D (0.0, 0.0, 0.0), data); for (unsigned int i = 0; i < grd.getSize (); i++) { grd.setVal (i, double (i / 10.0)); } writeToCubeFile (grd, mol, path + "test3.cube"); UniformRealValueGrid3D grd2; RWMol mol2 = *readFromCubeFile (grd2, path + "test3.cube"); CHECK_INVARIANT(grd.getSize() == grd2.getSize(), "I/O: grid sizes are not the same."); for (unsigned int i = 0; i < grd2.getSize (); i++) { CHECK_INVARIANT(feq(grd2.getVal(i), double(i / 10.0)), "I/O: values in grid are not correct."); } CHECK_INVARIANT(grd.getNumX() == grd2.getNumX(), "I/O: grids are not the same."); CHECK_INVARIANT(grd.getNumY() == grd2.getNumY(), "I/O: grids are not the same."); CHECK_INVARIANT(grd.getNumZ() == grd2.getNumZ(), "I/O: grids are not the same."); CHECK_INVARIANT(feq(grd.getOffset().x, grd2.getOffset().x), "I/O: grids are not the same."); CHECK_INVARIANT(feq(grd.getSpacing(), grd2.getSpacing()), "I/O: grids are not the same."); CHECK_INVARIANT(grd.compareVectors(grd2), "I/O: grids are not the same."); CHECK_INVARIANT(grd.compareParams(grd2), "I/O: grids are not the same."); CHECK_INVARIANT(grd.compareGrids(grd2), "I/O: grids are not the same."); CHECK_INVARIANT(mol.getNumAtoms() == mol2.getNumAtoms(), "I/O: number of atoms are not the same."); for (unsigned int i = 0; i < mol.getNumAtoms (); i++) { CHECK_INVARIANT(mol.getAtomWithIdx (i)->getAtomicNum () == mol2.getAtomWithIdx (i)->getAtomicNum (), "I/O: atoms are not the same"); CHECK_INVARIANT(feq (mol.getConformer ().getAtomPos (i).x, mol2.getConformer ().getAtomPos (i).x), "I/O: atom positions are not the same"); CHECK_INVARIANT(feq (mol.getConformer ().getAtomPos (i).y, mol2.getConformer ().getAtomPos (i).y), "I/O: atom positions are not the same"); CHECK_INVARIANT(feq (mol.getConformer ().getAtomPos (i).z, mol2.getConformer ().getAtomPos (i).z), "I/O: atom positions are not the same"); } }
void test4Coulomb () { std::string path = getenv("RDBASE"); path += "/Code/GraphMol/MIF/test_data/"; RWMol mol = *MolFileToMol(path + "HCl.mol", true, false); computeGasteigerCharges(mol); std::vector<double> charges; std::vector<Point3D> pos; Conformer conf = mol.getConformer(0); for (int i = 0; i < mol.getNumAtoms(); ++i) { charges.push_back(mol.getAtomWithIdx (i)->getProp<double> ("_GasteigerCharge")); pos.push_back(conf.getAtomPos(i)); } UniformRealValueGrid3D grd = *constructGrid(mol); UniformRealValueGrid3D grd2 = *constructGrid(mol); Coulomb coul(mol); calculateDescriptors<Coulomb>(grd, coul); calculateDescriptors<Coulomb>(grd2, Coulomb (charges, pos)); CHECK_INVARIANT(grd.compareGrids(grd2), "Coulomb: Different constructors do not yield the same descriptor."); CHECK_INVARIANT(feq (coul(0.0,0.0,0.0, 1000), 0.0), "Coulomb: Potential between atoms wrong.(should be 0)"); CHECK_INVARIANT(coul(2.0,0.0,0.0, 1000) < 0, "Coulomb: Potential between positive charges not positive."); CHECK_INVARIANT(coul(-2.0,0.0,0.0, 1000) > 0, "Coulomb: Potential between positive and negative charges not negative."); CHECK_INVARIANT(feq(coul(0.0,0.0,0.0, 0.1), 0.0), "Coulomb: Small threshold dist does not give 0."); calculateDescriptors<Coulomb>(grd, Coulomb(mol, 0, 1.0, true)); for (unsigned int i = 0; i < grd.getSize(); i++) { CHECK_INVARIANT(grd.getVal (i) <= 0.0, "Coulomb: Absolute value field not negative"); } Coulomb coul1(mol, 0, -1.0, false, "_GasteigerCharge", 0.0, 0.01); CHECK_INVARIANT(coul1(-2.0, 0.0, 0.0, 1000) < 0, "Coulomb: Potential between negative charges not positive."); CHECK_INVARIANT(coul1(2.0, 0.0, 0.0, 1000) > 0, "Coulomb: Potential between positive and negative charges not negative."); Coulomb coul2 = Coulomb(mol, 0, -.5, false, "_GasteigerCharge", 0.0, 0.01); CHECK_INVARIANT(coul1(-2.0, 0.0, 0.0, 1000) < coul2 (-2.0, 0.0, 0.0, 1000), "Coulomb: Higher probecharge does not result in stronger forces."); Coulomb coul3(mol, 0, 1.0, false, "_GasteigerCharge", 0.01, 1.0); CHECK_INVARIANT(coul3(0.0, 0.0, 0.0, 1000) > coul3(0.1, 0.0, 0.0, 1000), "Coulomb: Softcore interaction wrong."); CHECK_INVARIANT(coul3(0.66, 0.0, 0.0, 1000) > coul3(0.68, 0.0, 0.0, 1000), "Coulomb: Softcore interaction wrong."); CHECK_INVARIANT(coul3(0.70, 0.0, 0.0, 1000) > coul3(0.68, 0.0, 0.0, 1000), "Coulomb: Softcore interaction wrong."); CHECK_INVARIANT(feq(coul3(0.0,0.0,0.0, 0.1), 0.0), "Coulomb: Small threshold dist does not give 0."); }
void test1ConstructGrid() { std::string path = getenv("RDBASE"); path += "/Code/GraphMol/MIF/test_data/"; // //Generate Molecule with 3D Coordinates and Partial Charges // RWMol mol=*SmilesToMol("Cl"); // MolOps::addHs(mol); // DGeomHelpers::EmbedMolecule(mol); // MolToMolFile(mol, path + "HCl.mol"); RWMol mol = *MolFileToMol(path + "HCl.mol", true, false); UniformRealValueGrid3D grd = *constructGrid(mol, 0, 5.0, 0.5); Point3D bond = mol.getConformer().getAtomPos(1) - mol.getConformer().getAtomPos(0); CHECK_INVARIANT(feq(grd.getSpacing (), 0.5), "Spacing of grid is not correct."); CHECK_INVARIANT(feq(grd.getNumX (), std::floor ((fabs (bond.x) + 10.0) / 0.5 + 0.5)), "X length of grid is incorrect."); CHECK_INVARIANT(feq(grd.getNumY (), std::floor ((fabs (bond.y) + 10.0) / 0.5 + 0.5)), "Y length of grid is incorrect."); CHECK_INVARIANT(feq(grd.getNumZ (), std::floor ((fabs (bond.z) + 10.0) / 0.5 + 0.5)), "Z length of grid is incorrect."); }
void testGetSetBondLength() { std::string rdbase = getenv("RDBASE"); std::string fName = rdbase + "/Code/GraphMol/MolTransforms/test_data/3-cyclohexylpyridine.mol"; RWMol *m = MolFileToMol(fName, true, false); TEST_ASSERT(m); Conformer &conf = m->getConformer(); double dist = getBondLength(conf, 0, 19); TEST_ASSERT(RDKit::feq(dist, 1.36)); setBondLength(conf, 0, 19, 2.5); dist = getBondLength(conf, 0, 19); TEST_ASSERT(RDKit::feq(dist, 2.5)); setBondLength(conf, 19, 0, 3.0); dist = getBondLength(conf, 0, 19); TEST_ASSERT(RDKit::feq(dist, 3.0)); }
void testGetSetAngle() { std::string rdbase = getenv("RDBASE"); std::string fName = rdbase + "/Code/GraphMol/MolTransforms/test_data/3-cyclohexylpyridine.mol"; RWMol *m = MolFileToMol(fName, true, false); TEST_ASSERT(m); Conformer &conf = m->getConformer(); double angle = getAngleDeg(conf, 0, 19, 21); TEST_ASSERT(RDKit::feq(RDKit::round(angle * 10) / 10, 109.7)); setAngleDeg(conf, 0, 19, 21, 125.0); angle = getAngleDeg(conf, 0, 19, 21); TEST_ASSERT(RDKit::feq(angle, 125.0)); setAngleRad(conf, 21, 19, 0, M_PI / 2.); angle = getAngleRad(conf, 0, 19, 21); TEST_ASSERT(RDKit::feq(angle, M_PI / 2.)); angle = getAngleDeg(conf, 0, 19, 21); TEST_ASSERT(RDKit::feq(angle, 90.0)); }
void testGetSetDihedral() { std::string rdbase = getenv("RDBASE"); std::string fName = rdbase + "/Code/GraphMol/MolTransforms/test_data/3-cyclohexylpyridine.mol"; RWMol *m = MolFileToMol(fName, true, false); TEST_ASSERT(m); Conformer &conf = m->getConformer(); double dihedral = getDihedralDeg(conf, 0, 19, 21, 24); TEST_ASSERT(RDKit::feq(RDKit::round(dihedral * 100) / 100, 176.05)); setDihedralDeg(conf, 8, 0, 19, 21, 65.0); dihedral = getDihedralDeg(conf, 8, 0, 19, 21); TEST_ASSERT(RDKit::feq(dihedral, 65.0)); setDihedralDeg(conf, 8, 0, 19, 21, -130.0); dihedral = getDihedralDeg(conf, 8, 0, 19, 21); TEST_ASSERT(RDKit::feq(dihedral, -130.0)); setDihedralRad(conf, 21, 19, 0, 8, -2. / 3. * M_PI); dihedral = getDihedralRad(conf, 8, 0, 19, 21); TEST_ASSERT(RDKit::feq(dihedral, -2. / 3. * M_PI)); dihedral = getDihedralDeg(conf, 8, 0, 19, 21); TEST_ASSERT(RDKit::feq(dihedral, -120.0)); }
void testGeneral(std::string rdbase){ BOOST_LOG(rdInfoLog) << "---------------------------------------" << std::endl; BOOST_LOG(rdInfoLog) << "-- testing general mol2 file parsing --" << std::endl; BOOST_LOG(rdInfoLog) << "---------------------------------------" << std::endl; { bool ok=false; std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/nonExistFile.mol2"; try{ RWMol *m = Mol2FileToMol(fName); delete m; } catch(const BadFileException &e){ ok=true; } TEST_ASSERT(ok); } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/pyrazole_pyridine.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getNumAtoms()==5); // this was sf.net issue 2727976: TEST_ASSERT(m->getNumConformers()==1); TEST_ASSERT(m->getConformer().is3D()); TEST_ASSERT(feq(m->getConformer().getAtomPos(0).x,1.5019)); TEST_ASSERT(feq(m->getConformer().getAtomPos(0).y,1.0435)); TEST_ASSERT(feq(m->getConformer().getAtomPos(0).z,0.0000)); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/benzene.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getNumAtoms()==6); delete m; } { bool ok=false; std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/mol_noatoms.mol2"; try { RWMol *m = Mol2FileToMol(fName); delete m; } catch(const FileParseException &e){ ok=true; } TEST_ASSERT(ok); } { bool ok=false; std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/mol_nomol.mol2"; try { RWMol *m = Mol2FileToMol(fName); delete m; } catch(const FileParseException &e){ ok=true; } TEST_ASSERT(ok); } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/lonePairMol.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getNumAtoms()==5 && m->getNumBonds()==4); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/symmetricGuanidine.mol2"; RWMol *m = Mol2FileToMol(fName,false); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(1)->getFormalCharge()==1); TEST_ASSERT(m->getAtomWithIdx(8)->getFormalCharge()==1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/highlySymmetricGuanidine.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(4)->getFormalCharge()==1); TEST_ASSERT(m->getAtomWithIdx(12)->getFormalCharge()==1); TEST_ASSERT(m->getAtomWithIdx(20)->getFormalCharge()==1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/Noxide.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(8)->getFormalCharge()==1); TEST_ASSERT(m->getAtomWithIdx(9)->getFormalCharge()==-1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/Noxide.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(8)->getFormalCharge()==1); TEST_ASSERT(m->getAtomWithIdx(9)->getFormalCharge()==-1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/fusedRing.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(0)->getFormalCharge()==0); TEST_ASSERT(m->getAtomWithIdx(5)->getFormalCharge()==0); TEST_ASSERT(m->getAtomWithIdx(8)->getFormalCharge()==0); TEST_ASSERT(m->getAtomWithIdx(13)->getFormalCharge()==0); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/pyridiniumPhenyl.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(5)->getFormalCharge()==1); TEST_ASSERT(m->getAtomWithIdx(6)->getFormalCharge()==0); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/sulfonAmide.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(1)->getFormalCharge()==0); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/chargedAmidineRWH.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(6)->getFormalCharge()==1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/chargedAmidineEC.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(3)->getFormalCharge()==1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/chargedAmidine.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(9)->getFormalCharge()==1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/dbtranslateCharged.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(8)->getFormalCharge()==1); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/dbtranslateUncharged.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(8)->getFormalCharge()==0); delete m; } { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/dbtranslateUnchargedRing.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); TEST_ASSERT(m->getAtomWithIdx(2)->getFormalCharge()==0); delete m; } #if 0 { std::string fName = rdbase + "/Code/GraphMol/FileParsers/test_data/Sulfonate.mol2"; RWMol *m = Mol2FileToMol(fName); TEST_ASSERT(m); BOOST_LOG(rdInfoLog) <<MolToSmiles(*m)<<std::endl; delete m; } #endif BOOST_LOG(rdInfoLog) << "------------------------------------" << std::endl; BOOST_LOG(rdInfoLog) << "-- DONE general mol2 file parsing --" << std::endl; BOOST_LOG(rdInfoLog) << "------------------------------------" << 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<<MolToMolBlock(*m)<<std::endl; delete m; } { std::string smiles = "CC(=O)\\C=C\\CC1[C@H]2N([C@@H](C(=O)O)C(C)(C)S2(=O)=O)C1=O"; std::string nameBase = "test774_2"; 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(); } // m->setProp("_Name","mol"); // std::cerr<<MolToMolBlock(*m)<<std::endl; delete m; } std::cerr << " Done" << std::endl; }