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 ############################################################################### # 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, outliers_threshold=None, outliers_mask=None): if outliers_threshold is None: outliers_threshold = get_outliers_threshold() if outliers_mask is None: outliers_mask = get_outliers_mask() if wait_next: if str(eiger.grabMode)=="Single": eiger.start() #eiger.getDataArray().waitCacheChange(2000) source.waitNext(20000 + int(eiger.exposure * 1000)) #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(0.01) 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 outliers_mask is not None: data.mult(outliers_mask) if outliers_threshold>0: data.threshold(outliers_threshold, False, None) return data def grab_frames(source, samples, roi=None, wait_next=False, sleep=0, outliers_threshold=None, outliers_mask=None): frames = [] for i in range(samples): if (i>0) and (sleep>0): time.sleep(sleep) aux = grab_frame(source, roi, wait_next, outliers_threshold, outliers_mask) 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 _timestamp(prec=0): t = time.time() s = time.strftime("%y/%m/%d %H:%M:%S", time.localtime(t)) if prec > 0: s += ("%.9f" % (t % 1,))[1:2+prec] return s def _save_as_tiff(data, filename, check=False, show = False, metadata={}): if type(data) == Data: ip = load_array(data.matrix) else: ip = data #info = "Timestamp: " + _timestamp(3) #for key,val in metadata.items(): # info = info + "\n" + str(key) + ": " + str(val) #print "Info:" ,info #ip.setProperty("Info", info) metadata["Timestamp"] = time.strftime("%y/%m/%d %H:%M:%S",time.localtime()) if not os.path.exists(os.path.dirname(filename)): os.makedirs(os.path.dirname(filename)) save_image(ip, filename,"tiff", metadata) #finfo = open(filename + ".info", "w") #for k, v in metadata.items(): # finfo.write(str(k) + ': '+ str(v) + '\n') #info.close() if check: data = get_ip_array(ip) import java.util.Arrays as Arrays ip=open_image(filename) read = get_ip_array(ip) #print (" ------> Error reading array: " + str(filename)) #TODO: Original checkcode was deleted! def save_as_tiff(data, filename, check=False, show = False, parallel=True, metadata={}): if parallel: return fork((_save_as_tiff,(data, filename, check, show, metadata)),) else: _save_as_tiff(data, filename, check, show, metadata) def trigger_eiger(wait=False): eiger.start() if wait: eiger.waitNewImage(20000) def set_exposure_time(exposure): if exposure == eiger.getExposure(): return started = eiger.isStarted() if started: eiger.stop() time.sleep(0.2) eiger.setExposure(exposure) if started: if eiger.grabMode==eiger.GrabMode.Continuous: eiger.start() def restore_eiger(): """ Set Eiger default mode """ if eiger.isStarted(): eiger.stop() time.sleep(0.2) eiger.grabMode=eiger.GrabMode.Continuous eiger.setExposure(0.2) eiger.setNumImages(1) eiger.start() _outliers_mask_timestamp = 0 _outliers_mask = None def get_outliers_mask(data_type='f'): global _outliers_mask_timestamp, _outliers_mask if get_exec_pars().start == _outliers_mask_timestamp: return _outliers_mask _outliers_mask_timestamp = get_exec_pars().start try: _outliers_mask = None filename = get_outliers_mask_file() if filename: ip=open_image(filename) #TRANSPOSE - ImageJ stores the data transposed ip.getProcessor().rotate(-90) ip.getProcessor().flipVertical() array = get_ip_array(ip) array = Convert.toPrimitiveArray(array, ScriptUtils.getType(data_type)) _outliers_mask = Data(array) print "Generated outliers mask" except: pass return _outliers_mask eiger.setDataType(DataType.Float32) eiger.getDataArray().monitored=True 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"