// // Copyright (C) 2003-2019 Greg Landrum and Rational Discovery LLC // // @@ 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. // #define NO_IMPORT_ARRAY #include #include // ours #include #include #include #include "MolSupplier.h" #include "ContextManagers.h" namespace python = boost::python; namespace RDKit { void setDataHelper(SDMolSupplier &self, const std::string &text, bool sanitize, bool removeHs, bool strictParsing) { self.setData(text, sanitize, removeHs, strictParsing); } void setStreamIndices(SDMolSupplier &self, python::object arg) { std::vector loc; PySequenceHolder seq(arg); loc.reserve(seq.size()); for (unsigned int i = 0; i < seq.size(); ++i) { loc.push_back(static_cast(seq[i])); } self.setStreamIndices(loc); } std::string sdMolSupplierClassDoc = "A class which supplies molecules from an SD file.\n\ \n\ Usage examples:\n\ \n\ 1) Lazy evaluation: the molecules are not constructed until we ask for them:\n\n\ >>> suppl = SDMolSupplier('in.sdf')\n\ >>> for mol in suppl:\n\ ... mol.GetNumAtoms()\n\ \n\ 2) Lazy evaluation 2:\n\n\ >>> suppl = SDMolSupplier('in.sdf')\n\ >>> mol1 = next(suppl)\n\ >>> mol2 = next(suppl)\n\ >>> suppl.reset()\n\ >>> mol3 = next(suppl)\n\ # mol3 and mol1 are the same:\n\ >>> MolToSmiles(mol3)==MolToSmiles(mol1)\n\ \n\ 3) Random Access:\n\n\ >>> suppl = SDMolSupplier('in.sdf')\n\ >>> mol1 = suppl[0] \n\ >>> mol2 = suppl[1] \n\ # NOTE: this will generate an IndexError if the supplier doesn't have that many\n\ molecules.\n\ \n\ 4) Random Access 2: looping over all molecules \n\n\ >>> suppl = SDMolSupplier('in.sdf')\n\ >>> nMols = len(suppl)\n\ >>> for i in range(nMols):\n\ ... suppl[i].GetNumAtoms()\n\ \n\ Properties in the SD file are used to set properties on each molecule.\n\ The properties are accessible using the mol.GetProp(propName) method.\n\ \n"; struct sdmolsup_wrap { static void wrap() { python::class_( "SDMolSupplier", sdMolSupplierClassDoc.c_str(), python::init<>(python::args("self"))) .def(python::init( (python::arg("self"), python::arg("fileName"), python::arg("sanitize") = true, python::arg("removeHs") = true, python::arg("strictParsing") = true))) .def("__enter__", &MolIOEnter, python::return_internal_reference<>()) .def("__exit__", &MolIOExit) .def("__iter__", &MolSupplIter, python::return_internal_reference<1>(), python::args("self")) .def("__next__", &MolSupplNext, "Returns the next molecule in the file. Raises _StopIteration_ " "on EOF.\n", python::return_value_policy(), python::args("self")) .def("__getitem__", &MolSupplGetItem, python::return_value_policy(), python::args("self", "idx")) .def("reset", &SDMolSupplier::reset, python::args("self"), "Resets our position in the file to the beginning.\n") .def("__len__", &SDMolSupplier::length, python::args("self")) .def("SetData", setDataHelper, "Sets the text to be parsed", (python::arg("self"), python::arg("data"), python::arg("sanitize") = true, python::arg("removeHs") = true, python::arg("strictParsing") = true)) .def("_SetStreamIndices", setStreamIndices, "Sets the locations of mol beginnings in the input stream. Be " "*very* careful with this method.", (python::arg("self"), python::arg("locs"))) .def("GetItemText", &SDMolSupplier::getItemText, "returns the text for an item", (python::arg("self"), python::arg("index"))) .def("atEnd", &SDMolSupplier::atEnd, python::args("self"), "Returns whether or not we have hit EOF.\n") .def("GetProcessPropertyLists", &SDMolSupplier::getProcessPropertyLists, python::args("self"), "returns whether or not any property lists that are present will " "be processed when reading molecules") .def("SetProcessPropertyLists", &SDMolSupplier::setProcessPropertyLists, python::args("self", "val"), "sets whether or not any property lists that are present will be " "processed when reading molecules"); }; }; } // namespace RDKit void wrap_sdsupplier() { RDKit::sdmolsup_wrap::wrap(); }