import os
from ij import IJ, ImagePlus
from ij.io import OpenDialog
from ij.plugin import ImageCalculator
from ij.process import FloatProcessor

path = 'images\\ORCA_calib\\'
calib_files = os.listdir(path)

print calib_files

for img in calib_files:
    if img[0] == 'a':
        a = IJ.openImage(path + img)
    elif img[0] == 'n':
        b = IJ.openImage(path + img)
    elif img[0] == 'y':
        y0 = IJ.openImage(path + img)
    elif img[0] == 'm':
        m = IJ.openImage(path + img)
    else:
        raise Exception('Calibration data not found')

od = OpenDialog('Select Image')
img = IJ.openImage(od.getPath())
# img.show()
calc = ImageCalculator()

img_stack = img.getStack().duplicate()
img_stack.deleteLastSlice()
bx = ImagePlus('x', img_stack)
# x.show()

mx = calc.run("Multiply create 32-bit stack", bx, m)
calc.run("Add 32-bit stack", mx, y0)

calc.run("Multiply create 32-bit stack", bx, b)
bx_stack = bx.getStack()
for frame in xrange(1, bx.getNSlices() + 1):
    proc = bx_stack.getProcessor(frame)
    proc.exp()
    bx_stack.setProcessor(proc, frame)
bx.setStack(bx_stack)

IJ.freeMemory()
calc.run("Multiply 32-bit stack", bx, a)
calc.run("Subtract create 32-bit stack", mx, bx)
bx.close()
IJ.freeMemory()
corr_stack = mx.getStack()
blank = FloatProcessor(mx.getWidth(), mx.getHeight())
corr_stack.addSlice('', blank, 0)
mx.setStack(corr_stack)
# corr.show()

calc.run("Subtract stack", img, mx)
mx.close()
IJ.freeMemory()
img.show()
IJ.freeMemory()
print 'Done'
