public int compute(IRectangle query) {
    System.gc();
    then = System.currentTimeMillis();
    // convert into a hypercube for processing.
    Hypercube hc =
        new Hypercube(
            new double[] {query.getLeft(), query.getBottom()},
            new double[] {query.getRight(), query.getTop()});

    model.deselectAll();
    CounterKDTree ct =
        new CounterKDTree() {

          /** Mark as being drained. */
          public void drain(DimensionalNode node) {
            super.drain(node);
            ((SelectableMultiPoint) node.point).select(1);
          }

          /** Mark as routine selection. */
          public void visit(DimensionalNode node) {
            super.visit(node);
            ((SelectableMultiPoint) node.point).select(true);
          }
        };

    tree.range(hc, ct);
    now = System.currentTimeMillis();
    return ct.getCount();
  }