Files
x11ma/script/devices/eiger.py
gac-x11ma 27152efce8
2020-02-04 12:08:13 +01:00

194 lines
6.0 KiB
Python

from ijutils import *
from ch.psi.pshell.imaging.Overlays import *
from ch.psi.pshell.imaging.Utils import *
import ch.psi.pshell.imaging.Pen as Pen
import java.awt.Rectangle as Rectangle
import ch.psi.pshell.imaging.Data as Data
import ch.psi.pshell.device.Camera.DataType as DataType
eiger.setDataType(DataType.Float32)
eiger.getDataArray().monitored=True
###############################################################################
# ROI Integration
###############################################################################
def integrate_roi(source, x,y, w, h):
if source.data is None:
source.update()
roi = source.data.getRoi(Rectangle(x,y, w, h))
return roi.integrate(False)
class RoiIntensitySourceListener (ImageListener):
def __init__(self, parent):
self.parent = parent
def onImage(self, origin, image, data):
self.parent.update()
def onError(self, origin, ex):
pass
class RoiIntensity(ReadonlyRegisterBase):
def __init__(self, name, source, x,y, w, h):
ReadonlyRegisterBase.__init__(self, name)
self.source=source
self.roi = x,y, w, h
self.source_listener = RoiIntensitySourceListener(self)
def doRead(self):
x,y, w, h = self.roi
return integrate_roi(self.source, x,y, w, h)
def doSetMonitored(self, value):
if value:
self.source.addListener(self.source_listener)
else:
self.source.removeListener(self.source_listener)
def doClose(self):
self.source.removeListener(self.source_listener)
def create_roi_devices(roi_list, add = True):
rois = []
for r in roi_list:
roi = RoiIntensity(r, image, roi_list[r][0], roi_list[r][1], roi_list[r][2], roi_list[r][3])
if add:
add_device(roi, True)
rois.append(roi)
return rois
###############################################################################
# Frame integration
###############################################################################
"""
def get_image(source, roi=None, wait_next=False):
if wait_next:
source.waitNext(-1)
elif wait_next:
if str(source.camera)=="Single":
eiger.start()
eiger.waitCacheChange(20000)
ret = load_image(Utils.grayscale(source.output, Rectangle(roi[0], roi[1], roi[2], roi[3]) if (roi is not None) else None))
return ret
def grab_frames(source, samples, roi=None, wait_next=False, sleep=0):
frames = []
for i in range(samples):
if sleep>0:
time.sleep(sleep)
aux = get_image(source, roi, wait_next)
frames.append(aux)
return frames
def average_frames(source, samples=1, roi=None, wait_next=False, sleep=0, as_float=True):
return average_ips(grab_frames(source, samples, roi, wait_next, sleep), as_float)
def integrate_frames(source, samples=1, roi=None, wait_next=False, sleep=0, as_float=True):
return integrate_ips(grab_frames(source, samples, roi, wait_next, sleep), as_float)
"""
def grab_frame(source, roi=None, wait_next=False, rmv_outliers=True):
if wait_next:
if str(eiger.grabMode)=="Single":
eiger.start()
#eigar.waitCacheChange(20000)
source.waitNext(20000)
#ret = load_image(Utils.grayscale(source.output, Rectangle(roi[0], roi[1], roi[2], roi[3]) if (roi is not None) else None))
time.sleep(1.0)
data=source.data
if roi is not None:
data = data.getRoi(Rectangle(roi[0], roi[1], roi[2], roi[3]))
#ret = load_image(img)
if rmv_outliers:
#data = remove_outliers(data)
data.threshold(1e9, False, None)
return data
def grab_frames(source, samples, roi=None, wait_next=False, sleep=0, rmv_outliers=True):
frames = []
for i in range(samples):
if (i>0) and (sleep>0):
time.sleep(sleep)
aux = grab_frame(source, roi, wait_next, rmv_outliers)
frames.append(aux)
return frames
def integrate_frames(frames):
if frames is None or (len(frames)==0):
return None
ret = frames[0].copy()
for data in frames[1:]:
ret.sum(data)
return ret
def average_frames(frames):
ret = integrate_frames(frames)
if ret is not None:
ret.div(len(frames))
return ret
"""
def remove_outliers(imgdata, threshold = 1e9, replace_value=None):
if replace_value is None:
if str(imgdata.getType()) in ('float', 'double'):
replace_value = float('NaN')
else:
replace_value = 0
data = imgdata.copy()
for i in range(data.width):
for j in range(data.height):
if data.getElementDbl(j,i, False) >=threshold:
data.setElement(j*data.width + i, replace_value)
return data
"""
def save_as_tiff(data, filename, check=False, show = False):
if type(data) == Data:
ip = load_array(data.matrix)
else:
ip = data
data = get_ip_array(ip)
#ip.show()
#plot(data)
if not os.path.exists(os.path.dirname(filename)):
os.makedirs(os.path.dirname(filename))
save_image(ip, filename,"tiff")
if check:
import java.util.Arrays as Arrays
ip=open_image(filename)
read = get_ip_array(ip)
if not Arrays.deepEquals(read, data):
raise Exception("Error reading array")
#plot(read)
def trigger_eiger(wait=False):
eiger.start()
if wait:
eiger.waitNewImage(20000)
if False:
integrate_roi(image, 10, 5, 20, 10)
add_device(RoiIntensity("Region1", image, 10, 5, 20, 10), True)
add_device(RoiIntensity("Region2", image, 10, 5, 40, 20), True)
import ch.psi.pshell.data.ProviderCSV as ProviderCSV
ProviderCSV.setDefaultItemSeparator(" ")
tscan((Region1, Region2), 10, 0.1, layout="table", provider = "csv")
ret = grab_frames(image, 10, sleep=0.1)
av = integrate_frames(ret)
save_as_tiff(av,"{images}/data.tif", True)
print "Success"