#!/usr/bin/env python
# (C) 2022 Cadence Design Systems, Inc. (Cadence) 
# All rights reserved.
# TERMS FOR USE OF SAMPLE CODE The software below ("Sample Code") is
# provided to current licensees or subscribers of Cadence products or
# SaaS offerings (each a "Customer").
# Customer is hereby permitted to use, copy, and modify the Sample Code,
# subject to these terms. Cadence 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 Cadence 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 Cadence be
# liable for any damages or liability in connection with the Sample Code
# or its use.

# @ <SNIPPET>
import sys
from openeye import oechem
from openeye import oegrid

ifs = oechem.oemolistream(sys.argv[1])
mol = oechem.OEGraphMol()
oechem.OEReadMolecule(ifs, mol)

grid = oegrid.OEScalarGrid()
oegrid.OEMakeMolecularGaussianGrid(grid, mol, 0.5)

for atom in mol.GetAtoms():
    # @ <SNIPPET-NeighborPoints>
    x, y, z = mol.GetCoords(atom)

    ix, iy, iz = grid.SpatialCoordToGridIdx(x, y, z)

    # Make sure not to go past grid bounds
    mini = max(ix - 1, 0)
    minj = max(iy - 1, 0)
    mink = max(iz - 1, 0)
    maxi = min(ix + 2, grid.GetXDim())
    maxj = min(iy + 2, grid.GetYDim())
    maxk = min(iz + 2, grid.GetZDim())

    for k in range(mink, maxk):
        for j in range(minj, maxj):
            for i in range(mini, maxi):
                print("value = %.5f" % grid.GetValue(i, j, k))
    # @ </SNIPPET-NeighborPoints>
# @ </SNIPPET>
