def test_failed_request2(self): """ A request is "failed" if it throws an exception while executing. The exception should be forwarded to ALL waiting requests, which should re-raise it. """ class CustomRuntimeError(RuntimeError): pass def impossible_workload(): time.sleep(0.2) raise CustomRuntimeError("Can't service your request") impossible_req = Request(impossible_workload) def wait_for_impossible(): # This request will fail... impossible_req.wait() # Since there are some exception guards in the code we're testing, # spit something out to stderr just to be sure this error # isn't getting swallowed accidentally. sys.stderr.write("ERROR: Shouldn't get here.") assert False, "Shouldn't get here." req1 = Request(wait_for_impossible) req2 = Request(wait_for_impossible) failed_ids = [] lock = threading.Lock() def handle_failed_req(req_id, failure_exc, exc_info): assert isinstance(failure_exc, CustomRuntimeError) with lock: failed_ids.append(req_id) req1.notify_failed( partial(handle_failed_req, 1) ) req2.notify_failed( partial(handle_failed_req, 2) ) req1.submit() req2.submit() try: req1.wait() except RuntimeError: pass else: assert False, "Expected an exception from that request, but didn't get it." try: req2.wait() except RuntimeError: pass else: assert False, "Expected an exception from that request, but didn't get it." assert 1 in failed_ids assert 2 in failed_ids
def test_failed_request2(self): """ A request is "failed" if it throws an exception while executing. The exception should be forwarded to ALL waiting requests, which should re-raise it. """ class CustomRuntimeError(RuntimeError): pass def impossible_workload(): time.sleep(0.2) raise CustomRuntimeError("Can't service your request") impossible_req = Request(impossible_workload) def wait_for_impossible(): # This request will fail... impossible_req.wait() # Since there are some exception guards in the code we're testing, # spit something out to stderr just to be sure this error # isn't getting swallowed accidentally. sys.stderr.write("ERROR: Shouldn't get here.") assert False, "Shouldn't get here." req1 = Request(wait_for_impossible) req2 = Request(wait_for_impossible) failed_ids = [] lock = threading.Lock() def handle_failed_req(req_id, failure_exc, exc_info): assert isinstance(failure_exc, CustomRuntimeError) with lock: failed_ids.append(req_id) req1.notify_failed(partial(handle_failed_req, 1)) req2.notify_failed(partial(handle_failed_req, 2)) req1.submit() req2.submit() try: req1.wait() except RuntimeError: pass else: assert False, "Expected an exception from that request, but didn't get it." try: req2.wait() except RuntimeError: pass else: assert False, "Expected an exception from that request, but didn't get it." assert 1 in failed_ids assert 2 in failed_ids
def _impl_test_pool_results_discarded(): """ After a RequestPool executes, none of its data should linger if the user didn't hang on to it. """ import weakref from functools import partial import threading result_refs = [] def workload(): # In this test, all results are discarded immediately after the # request exits. Therefore, AT NO POINT IN TIME, should more than N requests be alive. live_result_refs = [w for w in result_refs if w() is not None] assert ( len(live_result_refs) <= Request.global_thread_pool.num_workers ), "There should not be more than {} result references alive at one time!".format( Request.global_thread_pool.num_workers ) return numpy.zeros((10,), dtype=numpy.uint8) + 1 lock = threading.Lock() def handle_result(req, result): with lock: result_refs.append(weakref.ref(result)) def handle_cancelled(req, *args): assert False def handle_failed(req, exc, exc_info): raise exc pool = RequestPool() for _ in range(100): req = Request(workload) req.notify_finished(partial(handle_result, req)) req.notify_cancelled(partial(handle_cancelled, req)) req.notify_failed(partial(handle_failed, req)) pool.add(req) del req pool.wait() # This test verifies that # (1) references to all child requests have been discarded once the pool is complete, and # (2) therefore, all references to the RESULTS in those child requests are also discarded. # There is a tiny window of time between a request being 'complete' (for all intents and purposes), # but before its main execute function has exited back to the main ThreadPool._Worker loop. # The request is not finally discarded until that loop discards it, so let's wait a tiny extra bit of time. time.sleep(0.01) # Now check that ALL results are truly lost. for ref in result_refs: assert ref() is None, "Some data was not discarded."
def _onExportTifButtonPressed(self): options = QFileDialog.Options() if ilastik_config.getboolean("ilastik", "debug"): options |= QFileDialog.DontUseNativeDialog directory = QFileDialog.getExistingDirectory(self, 'Select Directory',os.getenv('HOME'), options=options) if directory is None or len(str(directory)) == 0: print "cancelled." return print 'Saving results as tiffs...' label2color = self.mainOperator.label2color lshape = list(self.mainOperator.LabelImage.meta.shape) def _handle_progress(x): self.applet.progressSignal.emit(x) def _export(): num_files = float(len(label2color)) for t, label2color_at in enumerate(label2color): if len(label2color_at) == 0: continue print 'exporting tiffs for t = ' + str(t) roi = SubRegion(self.mainOperator.LabelImage, start=[t,] + 4*[0,], stop=[t+1,] + list(lshape[1:])) labelImage = self.mainOperator.LabelImage.get(roi).wait() relabeled = relabel(labelImage[0,...,0],label2color_at) for i in range(relabeled.shape[2]): out_im = relabeled[:,:,i] out_fn = str(directory) + '/vis_t' + str(t).zfill(4) + '_z' + str(i).zfill(4) + '.tif' vigra.impex.writeImage(np.asarray(out_im,dtype=np.uint32), out_fn) _handle_progress(t/num_files * 100) print 'Tiffs exported.' def _handle_finished(*args): self._drawer.exportTifButton.setEnabled(True) self.applet.progressSignal.emit(100) def _handle_failure( exc, exc_info ): import traceback, sys traceback.print_exception(*exc_info) sys.stderr.write("Exception raised during export. See traceback above.\n") self.applet.progressSignal.emit(100) self._drawer.exportTifButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(False) self.applet.progressSignal.emit(0) req = Request( _export ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def _onExportTifButtonPressed(self): options = QFileDialog.Options() if ilastik_config.getboolean("ilastik", "debug"): options |= QFileDialog.DontUseNativeDialog directory = encode_from_qstring(QFileDialog.getExistingDirectory(self, 'Select Directory',os.path.expanduser("~"), options=options)) if directory is None or len(str(directory)) == 0: logger.info( "cancelled." ) return logger.info( 'Saving results as tiffs...' ) label2color = self.mainOperator.label2color lshape = list(self.mainOperator.LabelImage.meta.shape) def _handle_progress(x): self.applet.progressSignal.emit(x) def _export(): num_files = float(len(label2color)) for t, label2color_at in enumerate(label2color): if len(label2color_at) == 0: continue logger.info( 'exporting tiffs for t = ' + str(t) ) roi = SubRegion(self.mainOperator.LabelImage, start=[t,] + 4*[0,], stop=[t+1,] + list(lshape[1:])) labelImage = self.mainOperator.LabelImage.get(roi).wait() relabeled = relabel(labelImage[0,...,0],label2color_at) for i in range(relabeled.shape[2]): out_im = relabeled[:,:,i] out_fn = str(directory) + '/vis_t' + str(t).zfill(4) + '_z' + str(i).zfill(4) + '.tif' vigra.impex.writeImage(np.asarray(out_im,dtype=np.uint32), out_fn) _handle_progress(t/num_files * 100) logger.info( 'Tiffs exported.' ) def _handle_finished(*args): self._drawer.exportTifButton.setEnabled(True) self.applet.progressSignal.emit(100) def _handle_failure( exc, exc_info ): msg = "Exception raised during export. See traceback above.\n" log_exception( logger, msg, exc_info ) self.applet.progressSignal.emit(100) self._drawer.exportTifButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(False) self.applet.progressSignal.emit(0) req = Request( _export ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def test_signal_failed_should_be_called_on_exception(self, broken_fn): work, req = self.work_req(broken_fn) recv = mock.Mock() req = Request(work) req.notify_failed(recv) req.submit() with pytest.raises(TExc): assert req.wait() == 42 recv.assert_called_once() assert isinstance(recv.call_args[0][0], TExc)
def test_signal_failed_called_even_when_subscription_happened_after_completion(self, broken_fn): work, req = self.work_req(broken_fn) recv = mock.Mock() req = Request(work) req.submit() with pytest.raises(TExc): assert req.wait() == 42 req.notify_failed(recv) recv.assert_called_once() assert isinstance(recv.call_args[0][0], TExc)
def testExceptionPropagation(self): """ When an exception is generated in a request, the exception should be propagated to all waiting threads. Also, the failure signal should fire. """ class SpecialException(Exception): pass def always_fails(): time.sleep(0.2) raise SpecialException() req1 = Request(always_fails) def wait_for_req1(): req1.wait() req2 = Request(wait_for_req1) req3 = Request(wait_for_req1) signaled_exceptions = [] def failure_handler(ex, exc_info): signaled_exceptions.append(ex) req2.notify_failed( failure_handler ) req3.notify_failed( failure_handler ) caught_exceptions = [] def wait_for_request(req): try: req.wait() except SpecialException as ex: caught_exceptions.append(ex) except: raise # Got some other exception than the one we expected else: assert "Expected to get an exception. Didn't get one." th2 = threading.Thread( target=partial( wait_for_request, req2 ) ) th3 = threading.Thread( target=partial( wait_for_request, req3 ) ) th2.start() th3.start() th2.join() th3.join() assert len(caught_exceptions) == 2, "Expected both requests to catch exceptions." assert len(signaled_exceptions) == 2, "Expected both requests to signal failure." assert isinstance( caught_exceptions[0], SpecialException ), "Caught exception was of the wrong type." assert caught_exceptions[0] == caught_exceptions[1] == signaled_exceptions[0] == signaled_exceptions[1] # Attempting to wait for a request that has already failed will raise the exception that causes the failure wait_for_request(req2) # Subscribing to notify_failed on a request that's already failed should call the failure handler immediately. req2.notify_failed( failure_handler ) assert len(signaled_exceptions) == 3
def testWorkerThreadLoopProtection(self): """ The worker threads should not die due to an exception raised within a request. """ for worker in Request.global_thread_pool.workers: assert worker.is_alive( ), "Something is wrong with this test. All workers should be alive." def always_fails(): raise Exception("This is an intentional exception for this test.") req = Request(always_fails) # Must add a default fail handler or else it will log an exception by default. req.notify_failed(lambda *args: None) try: req.submit() except: if Request.global_thread_pool.num_workers > 0: raise else: if Request.global_thread_pool.num_workers == 0: # In the single-threaded debug mode, the exception should be raised within submit() assert False, "Expected to request to raise an Exception!" try: req.wait() except: pass else: if Request.global_thread_pool.num_workers > 0: # In the single-threaded debug mode, the exception should be raised within submit() assert False, "Expected to request to raise an Exception!" for worker in Request.global_thread_pool.workers: assert worker.is_alive( ), "An exception was propagated to a worker run loop!"
def testWorkerThreadLoopProtection(self): """ The worker threads should not die due to an exception raised within a request. """ for worker in Request.global_thread_pool.workers: assert worker.is_alive(), "Something is wrong with this test. All workers should be alive." def always_fails(): raise Exception("This is an intentional exception for this test.") req = Request(always_fails) # Must add a default fail handler or else it will log an exception by default. req.notify_failed(lambda *args: None) try: req.submit() except: if Request.global_thread_pool.num_workers > 0: raise else: if Request.global_thread_pool.num_workers == 0: # In the single-threaded debug mode, the exception should be raised within submit() assert False, "Expected to request to raise an Exception!" try: req.wait() except: pass else: if Request.global_thread_pool.num_workers > 0: # In the single-threaded debug mode, the exception should be raised within submit() assert False, "Expected to request to raise an Exception!" for worker in Request.global_thread_pool.workers: assert worker.is_alive(), "An exception was propagated to a worker run loop!"
def _onTrackButtonPressed( self ): if not self.mainOperator.ObjectFeatures.ready(): self._criticalMessage("You have to compute object features first.") return def _track(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() maxDist = self._drawer.maxDistBox.value() maxObj = self._drawer.maxObjectsBox.value() divThreshold = self._drawer.divThreshBox.value() from_t = self._drawer.from_time.value() to_t = self._drawer.to_time.value() from_x = self._drawer.from_x.value() to_x = self._drawer.to_x.value() from_y = self._drawer.from_y.value() to_y = self._drawer.to_y.value() from_z = self._drawer.from_z.value() to_z = self._drawer.to_z.value() from_size = self._drawer.from_size.value() to_size = self._drawer.to_size.value() self.time_range = range(from_t, to_t + 1) avgSize = [self._drawer.avgSizeBox.value()] cplex_timeout = None if len(str(self._drawer.timeoutBox.text())): cplex_timeout = int(self._drawer.timeoutBox.text()) withTracklets = self._drawer.trackletsBox.isChecked() sizeDependent = self._drawer.sizeDepBox.isChecked() hardPrior = self._drawer.hardPriorBox.isChecked() classifierPrior = self._drawer.classifierPriorBox.isChecked() divWeight = self._drawer.divWeightBox.value() transWeight = self._drawer.transWeightBox.value() withDivisions = self._drawer.divisionsBox.isChecked() withOpticalCorrection = self._drawer.opticalBox.isChecked() withMergerResolution = self._drawer.mergerResolutionBox.isChecked() borderAwareWidth = self._drawer.bordWidthBox.value() withArmaCoordinates = True appearanceCost = self._drawer.appearanceBox.value() disappearanceCost = self._drawer.disappearanceBox.value() ndim=3 if (to_z - from_z == 0): ndim=2 try: self.mainOperator.track( time_range = self.time_range, x_range = (from_x, to_x + 1), y_range = (from_y, to_y + 1), z_range = (from_z, to_z + 1), size_range = (from_size, to_size + 1), x_scale = self._drawer.x_scale.value(), y_scale = self._drawer.y_scale.value(), z_scale = self._drawer.z_scale.value(), maxDist=maxDist, maxObj = maxObj, divThreshold=divThreshold, avgSize=avgSize, withTracklets=withTracklets, sizeDependent=sizeDependent, divWeight=divWeight, transWeight=transWeight, withDivisions=withDivisions, withOpticalCorrection=withOpticalCorrection, withClassifierPrior=classifierPrior, ndim=ndim, withMergerResolution=withMergerResolution, borderAwareWidth = borderAwareWidth, withArmaCoordinates = withArmaCoordinates, cplex_timeout = cplex_timeout, appearance_cost = appearanceCost, disappearance_cost = disappearanceCost ) except Exception: ex_type, ex, tb = sys.exc_info() traceback.print_tb(tb) self._criticalMessage("Exception(" + str(ex_type) + "): " + str(ex)) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self.applet.progressSignal.emit(100) self._drawer.TrackButton.setEnabled(True) self._drawer.exportButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(True) self._setLayerVisible("Objects", False) def _handle_failure( exc, exc_info ): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self.applet.progressSignal.emit(100) traceback.print_exception(*exc_info) sys.stderr.write("Exception raised during tracking. See traceback above.\n") self._drawer.TrackButton.setEnabled(True) self.applet.progressSignal.emit(0) self.applet.progressSignal.emit(-1) req = Request( _track ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def _onExportButtonPressed(self): options = QFileDialog.Options() if ilastik_config.getboolean("ilastik", "debug"): options |= QFileDialog.DontUseNativeDialog directory = encode_from_qstring(QFileDialog.getExistingDirectory(self, 'Select Directory',os.path.expanduser("~"), options=options)) if directory is None or len(str(directory)) == 0: logger.info( "cancelled." ) return def _handle_progress(x): self.applet.progressSignal.emit(x) def _export(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() if hasattr(self.mainOperator,"RelabeledImage"): labelImageSlot = self.mainOperator.RelabeledImage else: labelImageSlot = self.mainOperator.LabelImage logger.info( "Saving first label image..." ) key = [] for idx, flag in enumerate(axisTagsToString(labelImageSlot.meta.axistags)): if flag is 't': key.append(slice(0,labelImageSlot.meta.shape[idx]))#slice(t_from,t_from+1)) elif flag is 'c': key.append(slice(0,1)) else: key.append(slice(0,labelImageSlot.meta.shape[idx])) try: events = self.mainOperator.EventsVector.value logger.info( "Saving events..." ) logger.info( "Length of events " + str(len(events)) ) num_files = float(len(events)) for i in sorted(events.keys()): events_at = events[i] i = int(i) t = i key[0] = slice(t,t+1) roi = SubRegion(labelImageSlot, key) labelImage = labelImageSlot.get(roi).wait() labelImage = labelImage[0,...,0] write_events(events_at, str(directory), t, labelImage) _handle_progress(i/num_files * 100) except IOError as e: self._criticalMessage("Cannot export the tracking results. Maybe these files already exist. "\ "Please delete them or choose a different directory.") return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self._drawer.exportButton.setEnabled(True) self.applet.progressSignal.emit(100) def _handle_failure( exc, exc_info ): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() msg = "Exception raised during export. See traceback above.\n" log_exception( logger, msg, exc_info=exc_info ) self.applet.progressSignal.emit(100) self._drawer.exportButton.setEnabled(True) self._drawer.exportButton.setEnabled(False) self.applet.progressSignal.emit(0) req = Request( _export ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def _onTrackButtonPressed(self): if not self.mainOperator.ObjectFeatures.ready(): self._criticalMessage("You have to compute object features first.") return def _track(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() maxDist = self._drawer.maxDistBox.value() maxObj = self._drawer.maxObjectsBox.value() divThreshold = self._drawer.divThreshBox.value() from_t = self._drawer.from_time.value() to_t = self._drawer.to_time.value() from_x = self._drawer.from_x.value() to_x = self._drawer.to_x.value() from_y = self._drawer.from_y.value() to_y = self._drawer.to_y.value() from_z = self._drawer.from_z.value() to_z = self._drawer.to_z.value() from_size = self._drawer.from_size.value() to_size = self._drawer.to_size.value() self.time_range = range(from_t, to_t + 1) avgSize = [self._drawer.avgSizeBox.value()] cplex_timeout = None if len(str(self._drawer.timeoutBox.text())): cplex_timeout = int(self._drawer.timeoutBox.text()) withTracklets = self._drawer.trackletsBox.isChecked() sizeDependent = self._drawer.sizeDepBox.isChecked() hardPrior = self._drawer.hardPriorBox.isChecked() classifierPrior = self._drawer.classifierPriorBox.isChecked() divWeight = self._drawer.divWeightBox.value() transWeight = self._drawer.transWeightBox.value() withDivisions = self._drawer.divisionsBox.isChecked() withOpticalCorrection = self._drawer.opticalBox.isChecked() withMergerResolution = self._drawer.mergerResolutionBox.isChecked() borderAwareWidth = self._drawer.bordWidthBox.value() withArmaCoordinates = True appearanceCost = self._drawer.appearanceBox.value() disappearanceCost = self._drawer.disappearanceBox.value() ndim = 3 if (to_z - from_z == 0): ndim = 2 try: self.mainOperator.track( time_range=self.time_range, x_range=(from_x, to_x + 1), y_range=(from_y, to_y + 1), z_range=(from_z, to_z + 1), size_range=(from_size, to_size + 1), x_scale=self._drawer.x_scale.value(), y_scale=self._drawer.y_scale.value(), z_scale=self._drawer.z_scale.value(), maxDist=maxDist, maxObj=maxObj, divThreshold=divThreshold, avgSize=avgSize, withTracklets=withTracklets, sizeDependent=sizeDependent, divWeight=divWeight, transWeight=transWeight, withDivisions=withDivisions, withOpticalCorrection=withOpticalCorrection, withClassifierPrior=classifierPrior, ndim=ndim, withMergerResolution=withMergerResolution, borderAwareWidth=borderAwareWidth, withArmaCoordinates=withArmaCoordinates, cplex_timeout=cplex_timeout, appearance_cost=appearanceCost, disappearance_cost=disappearanceCost) except Exception: ex_type, ex, tb = sys.exc_info() traceback.print_tb(tb) self._criticalMessage("Exception(" + str(ex_type) + "): " + str(ex)) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self.applet.progressSignal.emit(100) self._drawer.TrackButton.setEnabled(True) self._drawer.exportButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(True) self._setLayerVisible("Objects", False) def _handle_failure(exc, exc_info): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self.applet.progressSignal.emit(100) traceback.print_exception(*exc_info) sys.stderr.write( "Exception raised during tracking. See traceback above.\n") self._drawer.TrackButton.setEnabled(True) self.applet.progressSignal.emit(0) self.applet.progressSignal.emit(-1) req = Request(_track) req.notify_failed(_handle_failure) req.notify_finished(_handle_finished) req.submit()
def _onRunStructuredLearningButtonPressed(self, withBatchProcessing=False): if not self.mainOperator.ObjectFeatures.ready(): self._criticalMessage("You have to compute object features first.") return numStages = 6 # object features # detection probabilities # creating traxel store # generating probabilities # insert energies # structured learning if self._drawer.divisionsBox.isChecked(): # division probabilities numStages +=1 self.progressWindow = TrackProgressDialog(parent=self,numStages=numStages) self.progressWindow.run() self.progressWindow.show() self.progressVisitor = GuiProgressVisitor(progressWindow=self.progressWindow) def _learn(): self.applet.busy = True self.applet.appletStateUpdateRequested() try: self.topLevelOperatorView._runStructuredLearning( (self._drawer.from_z.value(),self._drawer.to_z.value()), self._maxNumObj, self._maxNearestNeighbors, self._drawer.maxDistBox.value(), self._drawer.divThreshBox.value(), (self._drawer.x_scale.value(), self._drawer.y_scale.value(), self._drawer.z_scale.value()), (self._drawer.from_size.value(), self._drawer.to_size.value()), self._drawer.divisionsBox.isChecked(), self._drawer.bordWidthBox.value(), self._drawer.classifierPriorBox.isChecked(), withBatchProcessing, progressWindow=self.progressWindow, progressVisitor=self.progressVisitor ) except Exception: ex_type, ex, tb = sys.exc_info() traceback.print_tb(tb) self._criticalMessage("Exception(" + str(ex_type) + "): " + str(ex)) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested() def _handle_failure( exc, exc_info ): self.applet.busy = False self.applet.appletStateUpdateRequested() traceback.print_exception(*exc_info) sys.stderr.write("Exception raised during learning. See traceback above.\n") if self.progressWindow is not None: self.progressWindow.onTrackDone() req = Request( _learn ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def _onTrackButtonPressed( self ): if not self.mainOperator.ObjectFeatures.ready(): self._criticalMessage("You have to compute object features first.") return withMergerResolution = self._drawer.mergerResolutionBox.isChecked() withTracklets = True numStages = 6 # creating traxel store # generating probabilities # insert energies # convexify costs # solver # compute lineages if withMergerResolution: numStages += 1 # merger resolution if withTracklets: numStages += 3 # initializing tracklet graph, finding tracklets, contracting edges in tracklet graph self.progressWindow = TrackProgressDialog(parent=self,numStages=numStages) self.progressWindow.run() self.progressWindow.show() self.progressVisitor = GuiProgressVisitor(progressWindow=self.progressWindow) def _track(): self.applet.busy = True self.applet.appletStateUpdateRequested() maxDist = self._drawer.maxDistBox.value() maxObj = self._drawer.maxObjectsBox.value() divThreshold = self._drawer.divThreshBox.value() from_t = self._drawer.from_time.value() to_t = self._drawer.to_time.value() from_x = self._drawer.from_x.value() to_x = self._drawer.to_x.value() from_y = self._drawer.from_y.value() to_y = self._drawer.to_y.value() from_z = self._drawer.from_z.value() to_z = self._drawer.to_z.value() from_size = self._drawer.from_size.value() to_size = self._drawer.to_size.value() self.time_range = list(range(from_t, to_t + 1)) avgSize = [self._drawer.avgSizeBox.value()] cplex_timeout = None if len(str(self._drawer.timeoutBox.text())): cplex_timeout = int(self._drawer.timeoutBox.text()) withTracklets = True sizeDependent = self._drawer.sizeDepBox.isChecked() hardPrior = self._drawer.hardPriorBox.isChecked() classifierPrior = self._drawer.classifierPriorBox.isChecked() detWeight = self._drawer.detWeightBox.value() divWeight = self._drawer.divWeightBox.value() transWeight = self._drawer.transWeightBox.value() withDivisions = self._drawer.divisionsBox.isChecked() withOpticalCorrection = self._drawer.opticalBox.isChecked() withMergerResolution = self._drawer.mergerResolutionBox.isChecked() borderAwareWidth = self._drawer.bordWidthBox.value() withArmaCoordinates = True appearanceCost = self._drawer.appearanceBox.value() disappearanceCost = self._drawer.disappearanceBox.value() solverName = self._drawer.solverComboBox.currentText() ndim=3 if (to_z - from_z == 0): ndim=2 try: self.mainOperator.track( time_range = self.time_range, x_range = (from_x, to_x + 1), y_range = (from_y, to_y + 1), z_range = (from_z, to_z + 1), size_range = (from_size, to_size + 1), x_scale = self._drawer.x_scale.value(), y_scale = self._drawer.y_scale.value(), z_scale = self._drawer.z_scale.value(), maxDist=maxDist, maxObj = maxObj, divThreshold=divThreshold, avgSize=avgSize, withTracklets=withTracklets, sizeDependent=sizeDependent, detWeight=detWeight, divWeight=divWeight, transWeight=transWeight, withDivisions=withDivisions, withOpticalCorrection=withOpticalCorrection, withClassifierPrior=classifierPrior, ndim=ndim, withMergerResolution=withMergerResolution, borderAwareWidth = borderAwareWidth, withArmaCoordinates = withArmaCoordinates, cplex_timeout = cplex_timeout, appearance_cost = appearanceCost, disappearance_cost = disappearanceCost, #graph_building_parameter_changed = True, #trainingToHardConstraints = self._drawer.trainingToHardConstraints.isChecked(), max_nearest_neighbors = self._maxNearestNeighbors, solverName=solverName, progressWindow=self.progressWindow, progressVisitor=self.progressVisitor ) except Exception: self.progressWindow.onTrackDone() ex_type, ex, tb = sys.exc_info() traceback.print_tb(tb) self._criticalMessage("Exception(" + str(ex_type) + "): " + str(ex)) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested() self._drawer.TrackButton.setEnabled(True) self._drawer.exportButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(True) self._setLayerVisible("Objects", False) def _handle_failure( exc, exc_info ): self.applet.busy = False self.applet.appletStateUpdateRequested() traceback.print_exception(*exc_info) sys.stderr.write("Exception raised during tracking. See traceback above.\n") self._drawer.TrackButton.setEnabled(True) if self.progressWindow is not None: self.progressWindow.onTrackDone() req = Request( _track ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def _onExportButtonPressed(self): options = QFileDialog.Options() if ilastik_config.getboolean("ilastik", "debug"): options |= QFileDialog.DontUseNativeDialog directory = encode_from_qstring( QFileDialog.getExistingDirectory(self, 'Select Directory', os.path.expanduser("~"), options=options)) if directory is None or len(str(directory)) == 0: logger.info("cancelled.") return def _handle_progress(x): self.applet.progressSignal.emit(x) def _export(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() t_from = None # determine from_time (it could has been changed in the GUI meanwhile) for t_from, label2color_at in enumerate( self.mainOperator.label2color): if len(label2color_at) == 0: continue else: break if t_from is None: self._criticalMessage("There is nothing to export.") return t_from = int(t_from) logger.info("Saving first label image...") key = [] for idx, flag in enumerate( axisTagsToString( self.mainOperator.LabelImage.meta.axistags)): if flag is 't': key.append(slice(t_from, t_from + 1)) elif flag is 'c': key.append(slice(0, 1)) else: key.append( slice(0, self.mainOperator.LabelImage.meta.shape[idx])) roi = SubRegion(self.mainOperator.LabelImage, key) labelImage = self.mainOperator.LabelImage.get(roi).wait() labelImage = labelImage[0, ..., 0] try: # write_events([], str(directory), t_from, labelImage) events = self.mainOperator.EventsVector.value logger.info("Saving events...") logger.info("Length of events " + str(len(events))) num_files = float(len(events)) for i in sorted(events.keys()): events_at = events[i] i = int(i) t = t_from + i key[0] = slice(t, t + 1) roi = SubRegion(self.mainOperator.LabelImage, key) labelImage = self.mainOperator.LabelImage.get(roi).wait() labelImage = labelImage[0, ..., 0] if self.withMergers: write_events(events_at, str(directory), t, labelImage, self.mainOperator.mergers) else: write_events(events_at, str(directory), t, labelImage) _handle_progress(i / num_files * 100) except IOError as e: self._criticalMessage("Cannot export the tracking results. Maybe these files already exist. "\ "Please delete them or choose a different directory.") return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self._drawer.exportButton.setEnabled(True) self.applet.progressSignal.emit(100) def _handle_failure(exc, exc_info): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() msg = "Exception raised during export. See traceback above.\n" log_exception(logger, msg, exc_info=exc_info) self.applet.progressSignal.emit(100) self._drawer.exportButton.setEnabled(True) self._drawer.exportButton.setEnabled(False) self.applet.progressSignal.emit(0) req = Request(_export) req.notify_failed(_handle_failure) req.notify_finished(_handle_finished) req.submit()
def _onTrackButtonPressed( self ): if not self.mainOperator.ObjectFeatures.ready(): self._criticalMessage("You have to compute object features first.") return def _track(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() maxDist = self._drawer.maxDistBox.value() maxObj = self._drawer.maxObjectsBox.value() divThreshold = self._drawer.divThreshBox.value() from_t = self._drawer.from_time.value() to_t = self._drawer.to_time.value() from_x = self._drawer.from_x.value() to_x = self._drawer.to_x.value() from_y = self._drawer.from_y.value() to_y = self._drawer.to_y.value() from_z = self._drawer.from_z.value() to_z = self._drawer.to_z.value() from_size = self._drawer.from_size.value() to_size = self._drawer.to_size.value() self.time_range = range(from_t, to_t + 1) avgSize = [self._drawer.avgSizeBox.value()] cplex_timeout = None if len(str(self._drawer.timeoutBox.text())): cplex_timeout = int(self._drawer.timeoutBox.text()) withTracklets = self._drawer.trackletsBox.isChecked() sizeDependent = self._drawer.sizeDepBox.isChecked() hardPrior = self._drawer.hardPriorBox.isChecked() classifierPrior = self._drawer.classifierPriorBox.isChecked() divWeight = self._drawer.divWeightBox.value() transWeight = self._drawer.transWeightBox.value() withDivisions = self._drawer.divisionsBox.isChecked() withOpticalCorrection = self._drawer.opticalBox.isChecked() withMergerResolution = self._drawer.mergerResolutionBox.isChecked() borderAwareWidth = self._drawer.bordWidthBox.value() withArmaCoordinates = True appearanceCost = self._drawer.appearanceBox.value() disappearanceCost = self._drawer.disappearanceBox.value() motionModelWeight = self._drawer.motionModelWeightBox.value() solver = self._drawer.solverComboBox.currentText() ndim=3 if (to_z - from_z == 0): ndim=2 try: self.mainOperator.track( time_range = self.time_range, x_range = (from_x, to_x + 1), y_range = (from_y, to_y + 1), z_range = (from_z, to_z + 1), size_range = (from_size, to_size + 1), x_scale = self._drawer.x_scale.value(), y_scale = self._drawer.y_scale.value(), z_scale = self._drawer.z_scale.value(), maxDist=maxDist, maxObj = maxObj, divThreshold=divThreshold, avgSize=avgSize, withTracklets=withTracklets, sizeDependent=sizeDependent, divWeight=divWeight, transWeight=transWeight, withDivisions=withDivisions, withOpticalCorrection=withOpticalCorrection, withClassifierPrior=classifierPrior, ndim=ndim, withMergerResolution=withMergerResolution, borderAwareWidth = borderAwareWidth, withArmaCoordinates = withArmaCoordinates, cplex_timeout = cplex_timeout, appearance_cost = appearanceCost, disappearance_cost = disappearanceCost, motionModelWeight=motionModelWeight, force_build_hypotheses_graph = False, max_nearest_neighbors=self._drawer.maxNearestNeighborsSpinBox.value(), solverName=solver ) # update showing the merger legend, # as it might be (no longer) needed if merger resolving # is disabled(enabled) self._setMergerLegend(self.mergerLabels, self._drawer.maxObjectsBox.value()) except Exception as ex: log_exception(logger, "Error during tracking. See above error traceback.") self._criticalMessage("Error during tracking. See error log.\n\n" "Exception was:\n\n{})".format( ex )) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self.applet.progressSignal.emit(100) self._drawer.TrackButton.setEnabled(True) self._drawer.exportButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(True) self._setLayerVisible("Objects", False) def _handle_failure( exc, exc_info ): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self.applet.progressSignal.emit(100) traceback.print_exception(*exc_info) sys.stderr.write("Exception raised during tracking. See traceback above.\n") self._drawer.TrackButton.setEnabled(True) self.applet.progressSignal.emit(0) self.applet.progressSignal.emit(-1) req = Request( _track ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def _onExportButtonPressed(self): options = QFileDialog.Options() if ilastik_config.getboolean("ilastik", "debug"): options |= QFileDialog.DontUseNativeDialog directory = QFileDialog.getExistingDirectory(self, 'Select Directory', os.getenv('HOME'), options=options) if directory is None or len(str(directory)) == 0: print "cancelled." return def _handle_progress(x): self.applet.progressSignal.emit(x) def _export(): t_from = None # determine from_time (it could has been changed in the GUI meanwhile) for t_from, label2color_at in enumerate( self.mainOperator.label2color): if len(label2color_at) == 0: continue else: break if t_from == None: return print "Saving first label image..." key = [] for idx, flag in enumerate( axisTagsToString( self.mainOperator.LabelImage.meta.axistags)): if flag is 't': key.append(slice(t_from, t_from + 1)) elif flag is 'c': key.append(slice(0, 1)) else: key.append( slice(0, self.mainOperator.LabelImage.meta.shape[idx])) roi = SubRegion(self.mainOperator.LabelImage, key) labelImage = self.mainOperator.LabelImage.get(roi).wait() labelImage = labelImage[0, ..., 0] try: write_events([], str(directory), t_from, labelImage) events = self.mainOperator.events print "Saving events..." print "Length of events " + str(len(events)) num_files = float(len(events)) for i, events_at in enumerate(events): t = t_from + i key[0] = slice(t + 1, t + 2) roi = SubRegion(self.mainOperator.LabelImage, key) labelImage = self.mainOperator.LabelImage.get(roi).wait() labelImage = labelImage[0, ..., 0] if self.withMergers: write_events(events_at, str(directory), t + 1, labelImage, self.mainOperator.mergers) else: write_events(events_at, str(directory), t + 1, labelImage) _handle_progress(i / num_files * 100) except IOError as e: self._criticalMessage("Cannot export the tracking results. Maybe these files already exist. "\ "Please delete them or choose a different directory.") return def _handle_finished(*args): self._drawer.exportButton.setEnabled(True) self.applet.progressSignal.emit(100) def _handle_failure(exc, exc_info): import traceback, sys traceback.print_exception(*exc_info) sys.stderr.write( "Exception raised during export. See traceback above.\n") self.applet.progressSignal.emit(100) self._drawer.exportButton.setEnabled(True) self._drawer.exportButton.setEnabled(False) self.applet.progressSignal.emit(0) req = Request(_export) req.notify_failed(_handle_failure) req.notify_finished(_handle_finished) req.submit()
def _onTrackButtonPressed(self): if not self.mainOperator.ObjectFeatures.ready(): self._criticalMessage("You have to compute object features first.") return withMergerResolution = self._drawer.mergerResolutionBox.isChecked() withTracklets = True numStages = 6 # creating traxel store # generating probabilities # insert energies # convexify costs # solver # compute lineages if withMergerResolution: numStages += 1 # merger resolution if withTracklets: numStages += 3 # initializing tracklet graph, finding tracklets, contracting edges in tracklet graph if WITH_HYTRA: self.progressWindow = TrackProgressDialog(parent=self, numStages=numStages) self.progressWindow.run() self.progressWindow.show() self.progressVisitor = GuiProgressVisitor( progressWindow=self.progressWindow) else: self.progressWindow = None self.progressVisitor = DefaultProgressVisitor() def _track(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() maxDist = self._drawer.maxDistBox.value() maxObj = self._drawer.maxObjectsBox.value() divThreshold = self._drawer.divThreshBox.value() from_t = self._drawer.from_time.value() to_t = self._drawer.to_time.value() from_x = self._drawer.from_x.value() to_x = self._drawer.to_x.value() from_y = self._drawer.from_y.value() to_y = self._drawer.to_y.value() from_z = self._drawer.from_z.value() to_z = self._drawer.to_z.value() from_size = self._drawer.from_size.value() to_size = self._drawer.to_size.value() self.time_range = range(from_t, to_t + 1) avgSize = [self._drawer.avgSizeBox.value()] cplex_timeout = None if len(str(self._drawer.timeoutBox.text())): cplex_timeout = int(self._drawer.timeoutBox.text()) withTracklets = True sizeDependent = self._drawer.sizeDepBox.isChecked() hardPrior = self._drawer.hardPriorBox.isChecked() classifierPrior = self._drawer.classifierPriorBox.isChecked() detWeight = self._drawer.detWeightBox.value() divWeight = self._drawer.divWeightBox.value() transWeight = self._drawer.transWeightBox.value() withDivisions = self._drawer.divisionsBox.isChecked() withOpticalCorrection = self._drawer.opticalBox.isChecked() withMergerResolution = self._drawer.mergerResolutionBox.isChecked() borderAwareWidth = self._drawer.bordWidthBox.value() withArmaCoordinates = True appearanceCost = self._drawer.appearanceBox.value() disappearanceCost = self._drawer.disappearanceBox.value() solverName = self._drawer.solverComboBox.currentText() ndim = 3 if (to_z - from_z == 0): ndim = 2 try: self.mainOperator.track( time_range=self.time_range, x_range=(from_x, to_x + 1), y_range=(from_y, to_y + 1), z_range=(from_z, to_z + 1), size_range=(from_size, to_size + 1), x_scale=self._drawer.x_scale.value(), y_scale=self._drawer.y_scale.value(), z_scale=self._drawer.z_scale.value(), maxDist=maxDist, maxObj=maxObj, divThreshold=divThreshold, avgSize=avgSize, withTracklets=withTracklets, sizeDependent=sizeDependent, detWeight=detWeight, divWeight=divWeight, transWeight=transWeight, withDivisions=withDivisions, withOpticalCorrection=withOpticalCorrection, withClassifierPrior=classifierPrior, ndim=ndim, withMergerResolution=withMergerResolution, borderAwareWidth=borderAwareWidth, withArmaCoordinates=withArmaCoordinates, cplex_timeout=cplex_timeout, appearance_cost=appearanceCost, disappearance_cost=disappearanceCost, #graph_building_parameter_changed = True, #trainingToHardConstraints = self._drawer.trainingToHardConstraints.isChecked(), max_nearest_neighbors=self._maxNearestNeighbors, solverName=solverName, progressWindow=self.progressWindow, progressVisitor=self.progressVisitor) except Exception: ex_type, ex, tb = sys.exc_info() traceback.print_tb(tb) self._criticalMessage("Exception(" + str(ex_type) + "): " + str(ex)) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self._drawer.TrackButton.setEnabled(True) self._drawer.exportButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(True) self._setLayerVisible("Objects", False) def _handle_failure(exc, exc_info): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() traceback.print_exception(*exc_info) sys.stderr.write( "Exception raised during tracking. See traceback above.\n") self._drawer.TrackButton.setEnabled(True) if self.progressWindow is not None: self.progressWindow.onTrackDone() req = Request(_track) req.notify_failed(_handle_failure) req.notify_finished(_handle_finished) req.submit()
def _onRunStructuredLearningButtonPressed(self, withBatchProcessing=False): numStages = 4 # creating traxel store # generating probabilities # insert energies # structured learning if WITH_HYTRA: self.progressWindow = TrackProgressDialog(parent=self, numStages=numStages) self.progressWindow.run() self.progressWindow.show() self.progressVisitor = GuiProgressVisitor( progressWindow=self.progressWindow) else: self.progressWindow = None self.progressVisitor = DefaultProgressVisitor() def _learn(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() try: self.topLevelOperatorView._runStructuredLearning( (self._drawer.from_z.value(), self._drawer.to_z.value()), self._maxNumObj, self._maxNearestNeighbors, self._drawer.maxDistBox.value(), self._drawer.divThreshBox.value(), (self._drawer.x_scale.value(), self._drawer.y_scale.value(), self._drawer.z_scale.value()), (self._drawer.from_size.value(), self._drawer.to_size.value()), self._drawer.divisionsBox.isChecked(), self._drawer.bordWidthBox.value(), self._drawer.classifierPriorBox.isChecked(), withBatchProcessing, progressWindow=self.progressWindow, progressVisitor=self.progressVisitor) except Exception: ex_type, ex, tb = sys.exc_info() traceback.print_tb(tb) self._criticalMessage("Exception(" + str(ex_type) + "): " + str(ex)) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() def _handle_failure(exc, exc_info): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() traceback.print_exception(*exc_info) sys.stderr.write( "Exception raised during learning. See traceback above.\n") if self.progressWindow is not None: self.progressWindow.onTrackDone() req = Request(_learn) req.notify_failed(_handle_failure) req.notify_finished(_handle_finished) req.submit()
def _onTrackButtonPressed( self ): if not self.mainOperator.ObjectFeatures.ready(): self._criticalMessage("You have to compute object features first.") return def _track(): self.applet.busy = True self.applet.appletStateUpdateRequested.emit() maxDist = self._drawer.maxDistBox.value() maxObj = self._drawer.maxObjectsBox.value() divThreshold = self._drawer.divThreshBox.value() from_t = self._drawer.from_time.value() to_t = self._drawer.to_time.value() from_x = self._drawer.from_x.value() to_x = self._drawer.to_x.value() from_y = self._drawer.from_y.value() to_y = self._drawer.to_y.value() from_z = self._drawer.from_z.value() to_z = self._drawer.to_z.value() from_size = self._drawer.from_size.value() to_size = self._drawer.to_size.value() self.time_range = range(from_t, to_t + 1) avgSize = [self._drawer.avgSizeBox.value()] cplex_timeout = None if len(str(self._drawer.timeoutBox.text())): cplex_timeout = int(self._drawer.timeoutBox.text()) withTracklets = self._drawer.trackletsBox.isChecked() sizeDependent = self._drawer.sizeDepBox.isChecked() hardPrior = self._drawer.hardPriorBox.isChecked() classifierPrior = self._drawer.classifierPriorBox.isChecked() divWeight = self._drawer.divWeightBox.value() transWeight = self._drawer.transWeightBox.value() withDivisions = self._drawer.divisionsBox.isChecked() withOpticalCorrection = self._drawer.opticalBox.isChecked() withMergerResolution = self._drawer.mergerResolutionBox.isChecked() borderAwareWidth = self._drawer.bordWidthBox.value() withArmaCoordinates = True appearanceCost = self._drawer.appearanceBox.value() disappearanceCost = self._drawer.disappearanceBox.value() motionModelWeight = self._drawer.motionModelWeightBox.value() solver = self._drawer.solverComboBox.currentText() ndim=3 if (to_z - from_z == 0): ndim=2 try: self.mainOperator.track( time_range = self.time_range, x_range = (from_x, to_x + 1), y_range = (from_y, to_y + 1), z_range = (from_z, to_z + 1), size_range = (from_size, to_size + 1), x_scale = self._drawer.x_scale.value(), y_scale = self._drawer.y_scale.value(), z_scale = self._drawer.z_scale.value(), maxDist=maxDist, maxObj = maxObj, divThreshold=divThreshold, avgSize=avgSize, withTracklets=withTracklets, sizeDependent=sizeDependent, detWeight=10.0, divWeight=divWeight, transWeight=transWeight, withDivisions=withDivisions, withOpticalCorrection=withOpticalCorrection, withClassifierPrior=classifierPrior, ndim=ndim, withMergerResolution=withMergerResolution, borderAwareWidth =borderAwareWidth, withArmaCoordinates =withArmaCoordinates, cplex_timeout =cplex_timeout, appearance_cost =appearanceCost, disappearance_cost =disappearanceCost, motionModelWeight=motionModelWeight, force_build_hypotheses_graph =False, max_nearest_neighbors=self._drawer.maxNearestNeighborsSpinBox.value(), numFramesPerSplit=self._drawer.numFramesPerSplitSpinBox.value(), solverName=solver ) except Exception as ex: log_exception(logger, "Error during tracking. See above error traceback.") self._criticalMessage("Error during tracking. See error log.\n\n" "Exception was:\n\n{})".format( ex )) return def _handle_finished(*args): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() self._drawer.TrackButton.setEnabled(True) self._drawer.exportButton.setEnabled(True) self._drawer.exportTifButton.setEnabled(True) self._setLayerVisible("Objects", False) # update showing the merger legend, # as it might be (no longer) needed if merger resolving # is disabled(enabled) self._setMergerLegend(self.mergerLabels, self._drawer.maxObjectsBox.value()) def _handle_failure( exc, exc_info ): self.applet.busy = False self.applet.appletStateUpdateRequested.emit() traceback.print_exception(*exc_info) sys.stderr.write("Exception raised during tracking. See traceback above.\n") self._drawer.TrackButton.setEnabled(True) req = Request( _track ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()
def _onExportButtonPressed(self): options = QFileDialog.Options() if ilastik_config.getboolean("ilastik", "debug"): options |= QFileDialog.DontUseNativeDialog directory = QFileDialog.getExistingDirectory(self, 'Select Directory',os.getenv('HOME'), options=options) if directory is None or len(str(directory)) == 0: print "cancelled." return def _handle_progress(x): self.applet.progressSignal.emit(x) def _export(): t_from = None # determine from_time (it could has been changed in the GUI meanwhile) for t_from, label2color_at in enumerate(self.mainOperator.label2color): if len(label2color_at) == 0: continue else: break if t_from == None: return print "Saving first label image..." key = [] for idx, flag in enumerate(axisTagsToString(self.mainOperator.LabelImage.meta.axistags)): if flag is 't': key.append(slice(t_from,t_from+1)) elif flag is 'c': key.append(slice(0,1)) else: key.append(slice(0,self.mainOperator.LabelImage.meta.shape[idx])) roi = SubRegion(self.mainOperator.LabelImage, key) labelImage = self.mainOperator.LabelImage.get(roi).wait() labelImage = labelImage[0,...,0] try: write_events([], str(directory), t_from, labelImage) events = self.mainOperator.events print "Saving events..." print "Length of events " + str(len(events)) num_files = float(len(events)) for i, events_at in enumerate(events): t = t_from + i key[0] = slice(t+1,t+2) roi = SubRegion(self.mainOperator.LabelImage, key) labelImage = self.mainOperator.LabelImage.get(roi).wait() labelImage = labelImage[0,...,0] if self.withMergers: write_events(events_at, str(directory), t+1, labelImage, self.mainOperator.mergers) else: write_events(events_at, str(directory), t+1, labelImage) _handle_progress(i/num_files * 100) except IOError as e: self._criticalMessage("Cannot export the tracking results. Maybe these files already exist. "\ "Please delete them or choose a different directory.") return def _handle_finished(*args): self._drawer.exportButton.setEnabled(True) self.applet.progressSignal.emit(100) def _handle_failure( exc, exc_info ): import traceback, sys traceback.print_exception(*exc_info) sys.stderr.write("Exception raised during export. See traceback above.\n") self.applet.progressSignal.emit(100) self._drawer.exportButton.setEnabled(True) self._drawer.exportButton.setEnabled(False) self.applet.progressSignal.emit(0) req = Request( _export ) req.notify_failed( _handle_failure ) req.notify_finished( _handle_finished ) req.submit()