In this tutorial, you will learn how to pre-process a conformer database file for FastROCS TK, allowing for faster database load times with OEShapeDatabase.Open. Load times could be up to 10x faster. See the figure below for an eMolecules dataset of 14 million conformers.
To gain this extra loading performance, you need to use the following functions:
OEPRECompress – this function works on the output molecule stream object allowing the molecules to be stored in a ‘pre-compressed’ format:
- Writes rotor-offset-compressed molecules in the perfect-rotor-encoding format
- There is no need to Gzip which means faster OEMolDatabase.Open.
- Sets the energy of each conformer to 0.0 to avoid writing it to OEB.
- Suppresses hydrogens and reorders reference conformers for compression.
- Pre-calculates color atoms.
- Pre-calculates self-color and self-shape terms for all conformers.
Further reduction in file-size can be achieved by using an OEMCMolType_HalfFloatCartesian molecule to store reference coordinates and torsions as 16-bit floating point.
Here is some example code showing how to pre-process a database with OEPrepareFastROCSMol, save to a precompessed format, and reduce the file size by using half precision:
#!/usr/bin/env python # (C) 2017 OpenEye Scientific Software Inc. All rights reserved. # # TERMS FOR USE OF SAMPLE CODE The software below ("Sample Code") is # provided to current licensees or subscribers of OpenEye products or # SaaS offerings (each a "Customer"). # Customer is hereby permitted to use, copy, and modify the Sample Code, # subject to these terms. OpenEye claims no rights to Customer's # modifications. Modification of Sample Code is at Customer's sole and # exclusive risk. Sample Code may require Customer to have a then # current license or subscription to the applicable OpenEye offering. # THE SAMPLE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED. OPENEYE DISCLAIMS ALL WARRANTIES, INCLUDING, BUT # NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A # PARTICULAR PURPOSE AND NONINFRINGEMENT. In no event shall OpenEye be # liable for any damages or liability in connection with the Sample Code # or its use. from __future__ import print_function import os import sys from openeye import oechem from openeye import oefastrocs oepy = os.path.join(os.path.dirname(__file__), "..", "python") sys.path.insert(0, os.path.realpath(oepy)) def main(argv=[__name__]): if len(argv) < 3: oechem.OEThrow.Usage("%s input.oeb output_prepped_database.oeb" % argv) return 0 # Input mol stream ifs = oechem.oemolistream() ifs.open(argv) # PRE-Compress output mol stream ofs = oechem.oemolostream() oechem.OEPRECompress(ofs) ofs.open(argv) # Prepare mol & write to stream for mol in ifs.GetOEMols(): oefastrocs.OEPrepareFastROCSMol(mol) halfMol = oechem.OEMol(mol, oechem.OEMCMolType_HalfFloatCartesian) oechem.OEWriteMolecule(ofs, halfMol) ofs.close() if __name__ == '__main__': sys.exit(main(sys.argv))
For added convenience, we have created a ShapeDatabasePrep.py example script which can be modified to meet your exact needs: