def _acq_hook_startup_fn(pull_port, push_port, hook_connected_evt, event_queue, hook_fn, debug): bridge = Bridge(debug=debug) push_socket = bridge._connect_push(pull_port) pull_socket = bridge._connect_pull(push_port) hook_connected_evt.set() while True: event_msg = pull_socket.receive() if 'special' in event_msg and event_msg['special'] == 'acquisition-end': push_socket.send({}) push_socket.close() pull_socket.close() return else: params = signature(hook_fn).parameters if len(params) == 1 or len(params) == 3: try: if len(params) == 1: new_event_msg = hook_fn(event_msg) elif len(params) == 3: new_event_msg = hook_fn(event_msg, bridge, event_queue) except Exception as e: warnings.warn( 'exception in acquisition hook: {}'.format(e)) continue else: raise Exception( 'Incorrect number of arguments for hook function. Must be 1 or 3' ) push_socket.send(new_event_msg)
def _acq_hook_startup_fn(pull_port, push_port, hook_connected_evt, event_queue, hook_fn, debug): """ Parameters ---------- pull_port : push_port : hook_connected_evt : event_queue : hook_fn : debug : Returns ------- """ bridge = Bridge(debug=debug) push_socket = bridge._connect_push(pull_port) pull_socket = bridge._connect_pull(push_port) hook_connected_evt.set() while True: event_msg = pull_socket.receive() if "special" in event_msg and event_msg["special"] == "acquisition-end": push_socket.send({}) push_socket.close() pull_socket.close() return else: if "events" in event_msg.keys(): event_msg = event_msg["events"] # convert from sequence params = signature(hook_fn).parameters if len(params) == 1 or len(params) == 3: try: if len(params) == 1: new_event_msg = hook_fn(event_msg) elif len(params) == 3: new_event_msg = hook_fn(event_msg, bridge, event_queue) except Exception as e: warnings.warn("exception in acquisition hook: {}".format(e)) continue else: raise Exception("Incorrect number of arguments for hook function. Must be 1 or 3") if isinstance(new_event_msg, list): new_event_msg = { "events": new_event_msg } # convert back to the expected format for a sequence push_socket.send(new_event_msg)
def _processor_startup_fn(pull_port, push_port, sockets_connected_evt, process_fn, event_queue, debug): bridge = Bridge(debug=debug) push_socket = bridge._connect_push(pull_port) pull_socket = bridge._connect_pull(push_port) if debug: print('image processing sockets connected') sockets_connected_evt.set() def process_and_sendoff(image_tags_tuple): if len(image_tags_tuple) != 2: raise Exception('If image is returned, it must be of the form (pixel, metadata)') if not image_tags_tuple[0].dtype == pixels.dtype: raise Exception('Processed image pixels must have same dtype as input image pixels, ' 'but instead they were {} and {}'.format(image_tags_tuple[0].dtype, pixels.dtype)) processed_img = {'pixels': serialize_array(image_tags_tuple[0]), 'metadata': image_tags_tuple[1]} push_socket.send(processed_img) while True: message = None while message is None: message = pull_socket.receive(timeout=30) #check for new message if 'special' in message and message['special'] == 'finished': push_socket.send(message) #Continue propagating the finihsed signal push_socket.close() pull_socket.close() return metadata = message['metadata'] pixels = deserialize_array(message['pixels']) image = np.reshape(pixels, [metadata['Height'], metadata['Width']]) params = signature(process_fn).parameters if len(params) == 2 or len(params) == 4: processed = None try: if len(params) == 2: processed = process_fn(image, metadata) elif len(params) == 4: processed = process_fn(image, metadata, bridge, event_queue) except Exception as e: warnings.warn('exception in image processor: {}'.format(e)) continue else: raise Exception('Incorrect number of arguments for image processing function, must be 2 or 4') if processed is None: continue if type(processed) == list: for image in processed: process_and_sendoff(image) else: process_and_sendoff(processed)
def _storage_monitor_fn(dataset, storage_monitor_push_port, connected_event, callback_fn, debug=False): bridge = Bridge(debug=debug) monitor_socket = bridge._connect_pull(storage_monitor_push_port) connected_event.set() while True: message = monitor_socket.receive() if "finished" in message: # Poison, time to shut down monitor_socket.close() return index_entry = message["index_entry"] axes = dataset._add_index_entry(index_entry) if callback_fn is not None: callback_fn(axes)
def _processor_startup_fn(pull_port, push_port, sockets_connected_evt, process_fn, event_queue, debug): """ Parameters ---------- pull_port : push_port : sockets_connected_evt : process_fn : event_queue : debug : Returns ------- """ bridge = Bridge(debug=debug) push_socket = bridge._connect_push(pull_port) pull_socket = bridge._connect_pull(push_port) if debug: print("image processing sockets connected") sockets_connected_evt.set() def process_and_sendoff(image_tags_tuple, original_dtype): """ Parameters ---------- image_tags_tuple : Returns ------- """ if len(image_tags_tuple) != 2: raise Exception( "If image is returned, it must be of the form (pixel, metadata)" ) pixels = image_tags_tuple[0] metadata = image_tags_tuple[1] # only accepts same pixel type as original if not np.issubdtype(image_tags_tuple[0].dtype, original_dtype) and not np.issubdtype( original_dtype, image_tags_tuple[0].dtype): raise Exception( "Processed image pixels must have same dtype as input image pixels, " "but instead they were {} and {}".format( image_tags_tuple[0].dtype, pixels.dtype)) metadata[ "PixelType"] = "GRAY8" if pixels.dtype.itemsize == 1 else "GRAY16" processed_img = { "pixels": pixels.tobytes(), "metadata": metadata, } push_socket.send(processed_img) while True: message = None while message is None: message = pull_socket.receive(timeout=30) # check for new message if "special" in message and message["special"] == "finished": push_socket.send( message) # Continue propagating the finihsed signal push_socket.close() pull_socket.close() return metadata = message["metadata"] pixels = deserialize_array(message["pixels"]) image = np.reshape(pixels, [metadata["Height"], metadata["Width"]]) params = signature(process_fn).parameters if len(params) == 2 or len(params) == 4: processed = None try: if len(params) == 2: processed = process_fn(image, metadata) elif len(params) == 4: processed = process_fn(image, metadata, bridge, event_queue) except Exception as e: warnings.warn("exception in image processor: {}".format(e)) continue else: raise Exception( "Incorrect number of arguments for image processing function, must be 2 or 4" ) if processed is None: continue if type(processed) == list: for image in processed: process_and_sendoff(image, pixels.dtype) else: process_and_sendoff(processed, pixels.dtype)