 (defn acquire-processor-sequence []
   (map tagged-image-to-processor (acquire-tagged-image-sequence)))
 
+(defn acquire-at
+  "Move the stage to position x,y and acquire a multi-dimensional
+   sequence of images using the acquisition engine."
+  ([x y]
+    (acquire-at (Point2D$Double. x y)))
+  ([^Point2D$Double stage-pos]
+    (let [xy-stage (core getXYStageDevice)]
+      (set-xy-position stage-pos)
+      (core waitForDevice xy-stage)
+      (acquire-processor-sequence))))
+
 ;; stage communications
 
 (defn get-xy-position []

        (for [[chan lut-map] (initial-channel-display-settings tagged-image-processors)]
          [chan {:lut (lut-object lut-map)}])))

(defn acquire-at
  ([x y]
    (acquire-at (Point2D$Double. x y)))
  ([^Point2D$Double stage-pos]
    (let [xy-stage (core getXYStageDevice)]
      (set-xy-position stage-pos)
      (core waitForDevice xy-stage)
      (acquire-processor-sequence))))

(defn origin-here-stage-to-pixel-transform []
  (set-destination-origin
    (get-stage-to-pixel-transform)
    (.getXYStagePosition gui)))

(defn add-tiles-at [available-tiles [nx ny] affine-stage-to-pixel]
  (doseq [image (acquire-at (inverse-transform (Point. (* 512 nx) (* 512 ny)) affine-stage-to-pixel))]
    (add-to-available-tiles available-tiles
                            {:nx nx :ny ny :nz (get-in image [:tags "SliceIndex"]) :nt 0
                             :nc (or (get-in image [:tags "Channel"]) "Default")}
                            (image :proc)))
  (await available-tiles))

(defn available-tile-coords [available-tiles]

  (core setXYPosition (core getXYStageDevice) (.x position) (.y position)))
  
;; run using acquisitions

;;; channel setup

(defn initial-channel-display-settings [tagged-image-processors]
  (merge-with merge
