(ns funimage.stan-splitmerge
 (:require [clojure.string :as string])
 (:import [mpicbg.imglib.image Image]
          [mpicbg.imglib.cursor Cursor]
          [script.imglib ImgLib]
          [mpicbg.imglib.type.numeric NumericType]
          [ij IJ]
          [ij.process ImageConverter]))
 
;(set! *warn-on-reflection* true)

(def std-dev-k 1)
(def filesep "/")

(def imp (IJ/getImage))
(def orig-name (.getTitle imp))
(def basename (string/replace orig-name ".lsm" ""))
(println "Base filename:" basename)
(def orig-directory (IJ/getDirectory "image"));(.directory (.getFileInfo imp)))
(println "Directory:" orig-directory)

(IJ/run "Split Channels")

(defn imp-from-title [title]
	(IJ/selectWindow title)
    (let [imp (IJ/getImage)
    	  iconv (ImageConverter. imp)]
    	(.convertToRGB iconv)
    	imp))

(def num-channels (.getNChannels imp))

(if (= num-channels 3)
	(do
		(def split-names 
			(for [cid (range 1 4)]
				(str "C" cid "-" orig-name)))
		
		(def red-name (last split-names))
		(def red (imp-from-title red-name))
		(def green-name (second split-names))
		(def green (imp-from-title green-name)) 
		(def blue-name (first split-names))
		(def blue (imp-from-title blue-name))
		(def gray-name nil)
		(def gray (when gray-name (imp-from-title gray-name))))
	(do
		(def split-names 
			(for [cid (range 1 5)]
				(str "C" cid "-" orig-name)))
		
		(def red-name (last split-names))
		(def red (imp-from-title red-name))
		(def green-name (nth split-names 2))
		(def green (imp-from-title green-name)) 
		(def blue-name (nth split-names 1))
		(def blue (imp-from-title blue-name))
		(def gray-name (first split-names))
		(def gray (when gray-name (imp-from-title gray-name)))))

(defn select-dup [inname outname]
	(IJ/selectWindow inname)
	(IJ/run "Duplicate..." (str "title=" outname)))

; RG
(select-dup red-name "redchan")
(select-dup green-name "greenchan")
(IJ/run "Merge Channels...",
    (str "red=redchan" ;red-name 
    	" green=greenchan" ;green-name
    	" blue=*None*"
    	" gray=*None*"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RG_" basename ".tiff"))

; GB
(select-dup green-name "greenchan")
(select-dup blue-name "bluechan")
(IJ/run "Merge Channels...",
    (str "red=*None*"  
    	" green=greenchan"; green-name
    	" blue=bluechan" ;blue-name
    	" gray=*None*"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "GB_" basename ".tiff"))

; RB
(select-dup red-name "redchan")
(select-dup blue-name "bluechan")
(IJ/run "Merge Channels...",
    (str "red=redchan"; red-name 
    	" green=*None*"
    	" blue=bluechan"; blue-name
    	" gray=*None*"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RB_" basename ".tiff"))

(when (= num-channels 4)
	; RGy
	(select-dup red-name "redchan")
	(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=redchan" ;red-name 
	    	" green=*None*" ;green-name
	    	" blue=*None*"
	    	" gray=graychan"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RGy_" basename ".tiff"))
	
	; GGy
	(select-dup green-name "greenchan")
	(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=*None*"  
	    	" green=greenchan"; green-name
	    	" blue=*None*" ;blue-name
	    	" gray=graychan"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "GGy_" basename ".tiff"))
	
	; BGy
	(select-dup red-name "redchan")
	(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=redchan"; red-name 
	    	" green=*None*"
	    	" blue=*None*"; blue-name
	    	" gray=graychan"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "BGy_" basename ".tiff"))

	; RGB
	(select-dup red-name "redchan")
	(select-dup green-name "greenchan")
	(select-dup blue-name "bluechan")
	(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=redchan"; red-name 
	    	" green=greenchan" ;green-name
	    	" blue=bluechan" ;blue-name
	    	" gray=graychan"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RGBGy_" basename ".tiff"))
	)

; RGB
(select-dup red-name "redchan")
(select-dup green-name "greenchan")
(select-dup blue-name "bluechan")
(IJ/run "Merge Channels...",
    (str "red=redchan"; red-name 
    	" green=greenchan" ;green-name
    	" blue=bluechan" ;blue-name
    	" gray=*None*"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RGB_" basename ".tiff"))

; Individual channels
(IJ/saveAsTiff red (str orig-directory filesep "R_" basename ".tiff"))
(IJ/saveAsTiff green (str orig-directory filesep "G_" basename ".tiff"))
(IJ/saveAsTiff blue (str orig-directory filesep "B_" basename ".tiff"))
(when gray (IJ/saveAsTiff gray (str orig-directory filesep "Gy_" basename ".tiff")))


(IJ/run "Close All")
