@Override
 public float getValueAtPoint(P3 pt, boolean getSource) {
   if (haveOneProperty && !getSource) return theProperty;
   float dmin = Float.MAX_VALUE;
   float dminNearby = Float.MAX_VALUE;
   float value = (doSmoothProperty ? 0 : Float.NaN);
   float vdiv = 0;
   atomDataServer.setIteratorForPoint(iter, modelIndex, pt, maxDistance);
   iAtomSurface = -1;
   while (iter.hasNext()) {
     int ia = iter.next();
     int myAtom = myIndex[ia];
     boolean isNearby = (myAtom >= firstNearbyAtom);
     P3 ptA = atomXyz[myAtom];
     float p = atomProp[myAtom];
     // System.out.println(iAtom + " " + ia + ptA + " " + isNearby + " " + p);
     if (Float.isNaN(p)) continue;
     float d2 = pt.distanceSquared(ptA);
     if (isNearby) {
       if (d2 < dminNearby) {
         dminNearby = d2;
         if (!doSmoothProperty && dminNearby < dmin) {
           dmin = d2;
           value = Float.NaN;
         }
       }
     } else if (d2 < dmin) {
       dmin = d2;
       iAtomSurface = ia;
       if (!doSmoothProperty) value = p;
     }
     if (mepCalc != null) {
       value += mepCalc.valueFor(p, d2, calcType);
     } else if (doSmoothProperty) {
       d2 = (float) Math.pow(d2, smoothingPower);
       vdiv += d2;
       value += d2 * p;
     }
   }
   // System.out.println(pt + " " + value + " " + vdiv + " " + value / vdiv);
   return (mepCalc != null
       ? value
       : doSmoothProperty ? (vdiv == 0 || dminNearby < dmin ? Float.NaN : value / vdiv) : value);
 }
 @Override
 protected void finalizeMapping() {
   iter.release();
   iter = null;
   if (params.showTiming) Logger.checkTimer("property mapping", false);
 }
 @Override
 protected void finalizeMapping() {
   iter.release();
   iter = null;
   if (Logger.debugging) Logger.checkTimer("property mapping time");
 }