def start(self): dlg = AcquisitionDialog(self, "Manually change the alignment", text="Change the translation, rotation, and pixel size " "of any stream. The display is immediately updated, " "but you need to save the file (as a snapshot) for " "the changes to be permanent.") vah = VAHolder() vah._subscribers = [] vaconf = OrderedDict() tab_data = self.main_app.main_data.tab.value.tab_data_model for i, stream in enumerate(tab_data.streams.value): dlg.addStream(stream) # Add 5 VAs for each stream, to modify the overlay metadata poscor = stream.raw[0].metadata.get(model.MD_POS_COR, (0, 0)) rotation = stream.raw[0].metadata.get(model.MD_ROTATION_COR, 0) scalecor = stream.raw[0].metadata.get(model.MD_PIXEL_SIZE_COR, (1, 1)) vatransx = model.FloatContinuous(-poscor[0], range=(-10e-6, 10e-6), unit="m") vatransy = model.FloatContinuous(-poscor[1], range=(-10e-6, 10e-6), unit="m") varot = model.FloatContinuous(rotation, range=(-math.pi, math.pi), unit="rad") vascalex = model.FloatContinuous(scalecor[0], range=(0.5, 1.5)) vascaley = model.FloatContinuous(scalecor[1], range=(0.5, 1.5)) # Add the VAs to the holder, and to the vaconf mainly to force the order setattr(vah, "%dTransX" % i, vatransx) setattr(vah, "%dTransY" % i, vatransy) setattr(vah, "%dRotation" % i, varot) setattr(vah, "%dScaleX" % i, vascalex) setattr(vah, "%dScaleY" % i, vascaley) vaconf["%dTransX" % i] = {"label": "%s trans X" % stream.name.value} vaconf["%dTransY" % i] = {"label": "%s trans Y" % stream.name.value} vaconf["%dRotation" % i] = {"label": "%s rotation X" % stream.name.value} vaconf["%dScaleX" % i] = {"label": "%s scale X" % stream.name.value} vaconf["%dScaleY" % i] = {"label": "%s scale Y" % stream.name.value} # Create listeners with information of the stream and dimension va_on_transx = functools.partial(self._on_trans, stream, 0) va_on_transy = functools.partial(self._on_trans, stream, 1) va_on_rotation = functools.partial(self._on_rotation, stream) va_on_scalex = functools.partial(self._on_scale, stream, 0) va_on_scaley = functools.partial(self._on_scale, stream, 1) # We hold a reference to the listeners to prevent automatic subscription vah._subscribers.append(va_on_transx) vah._subscribers.append(va_on_transy) vah._subscribers.append(va_on_rotation) vah._subscribers.append(va_on_scalex) vah._subscribers.append(va_on_scaley) vatransx.subscribe(va_on_transx) vatransy.subscribe(va_on_transy) varot.subscribe(va_on_rotation) vascalex.subscribe(va_on_scalex) vascaley.subscribe(va_on_scaley) dlg.addSettings(vah, vaconf) # TODO: add a 'reset' button dlg.addButton("Done", None, face_colour='blue') dlg.ShowModal()
def start(self): dlg = AcquisitionDialog(self, "Remove spikes from CL data", text="Change the threshold value to determine the sensitivity of the spike removal") self._dlg = dlg self.tab_data = self.main_app.main_data.tab.value.tab_data_model # don't allow adding/removing streams dlg.streambar_controller.to_static_mode() for stream in self.tab_data.streams.value: #there must be a better way to do this if isinstance(stream, SpectrumStream): # Check the stream is really _spectrum_ data, CTYX or TYX are not supported raw_shape = stream.raw[0].shape # CTZYX if numpy.prod(raw_shape[1:3]) > 1: # T * Z logging.info("Skipping stream %s of shape %s, as it not a simple spectral stream", stream.name, raw_shape) continue dlg.addStream(stream) self._spec_stream = stream break # Only one stream handled else: # if no spectral data is present spike removal cannot be done (for now) box = wx.MessageDialog(self.main_app.main_frame, "No spectral stream is present, so it's not possible to correct the data", "No spectral stream", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return wx.CallAfter(dlg.viewport_l.canvas.fit_view_to_content) # async, to call after the stream is added dlg.addSettings(self, conf=self.vaconf) # TODO: add a 'reset' button dlg.addButton("Close") dlg.addButton("Correct", self.correct_data, face_colour='red') dlg.addButton("Save", self.save, face_colour='blue') self._update_save_button() # It'll be called _after_ the button is added dlg.Size = (1000, 600) # Make it big enough to fit the view and the stream panel dlg.ShowModal() # The end self._spec_stream = None # drop reference dlg.Close() self._dlg = None if dlg: # If dlg hasn't been destroyed yet dlg.Destroy()
def start(self): """ Called when the menu entry is selected """ main_data = self.main_app.main_data # Stop the streams tab_data = main_data.tab.value.tab_data_model for s in tab_data.streams.value: s.should_update.value = False self.filename.value = self._get_new_filename() self._update_exp_dur() # Special CCD settings to get values as photon counting if model.hasVA(self.ccd, "countConvert"): self.ccd.countConvert.value = 2 # photons dlg = AcquisitionDialog( self, "Super-resolution acquisition", "Acquires a series of shortly exposed images, " "and store them in sequence.\n" "Note, the advanced settings are only applied " "after restarting the stream.") dlg.addStream(self._stream) dlg.addSettings(self, self.vaconf) dlg.addButton("Close") dlg.addButton("Acquire", self.acquire, face_colour='blue') dlg.Maximize() ans = dlg.ShowModal() # Make sure the stream is not playing anymore and CCD is back to normal self._stream.should_update.value = False if model.hasVA(self.ccd, "countConvert"): try: self.ccd.countConvert.value = 0 # normal except Exception: logging.exception("Failed to set back count convert mode") if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans) dlg.Destroy()
def start(self): """ Called when the menu entry is selected """ main_data = self.main_app.main_data # Stop the streams tab_data = main_data.tab.value.tab_data_model for s in tab_data.streams.value: s.should_update.value = False self.filename.value = self._get_new_filename() self._update_exp_dur() # Special CCD settings to get values as photon counting if model.hasVA(self.ccd, "countConvert"): self.ccd.countConvert.value = 2 # photons dlg = AcquisitionDialog(self, "Super-resolution acquisition", "Acquires a series of shortly exposed images, " "and store them in sequence.\n" "Note, the advanced settings are only applied " "after restarting the stream.") dlg.addStream(self._stream) dlg.addSettings(self, self.vaconf) dlg.addButton("Close") dlg.addButton("Acquire", self.acquire, face_colour='blue') dlg.Maximize() ans = dlg.ShowModal() # Make sure the stream is not playing anymore and CCD is back to normal self._stream.should_update.value = False if model.hasVA(self.ccd, "countConvert"): try: self.ccd.countConvert.value = 0 # normal except Exception: logging.exception("Failed to set back count convert mode") if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans) dlg.Destroy()
def start(self): dlg = AcquisitionDialog(self, "Fancy Acquisition", "Enter everything") dlg.addSettings(self, conf={"filename": {"control_type": CONTROL_SAVE_FILE}}) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') stream = FakeFluoStream("Fluo Stream") dlg.addStream(stream) stream = FakeFluoStream("Fluo Stream") dlg.addStream(stream) ans = dlg.ShowModal() if ans == 0: # Ignore errors about a missing analysis tab try: self.showAcquisition(self.filename.value) except AttributeError: pass
def start(self, st): self._stream = st self.filename.value = self._get_new_filename() dlg = AcquisitionDialog(self, "Timelapse acquisition", "The same stream will be acquired multiple times, defined by the 'number of acquisitions'.\n" "The time separating each acquisition is defined by the 'period'.\n") dlg.addSettings(self, self.vaconf) dlg.addStream(st) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') ans = dlg.ShowModal() if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans)
def start(self, st): self._stream = st self.filename.value = self._get_new_filename() dlg = AcquisitionDialog( self, "Timelapse acquisition", "The same stream will be acquired multiple times, defined by the 'number of acquisitions'.\n" "The time separating each acquisition is defined by the 'period'.\n" ) dlg.addSettings(self, self.vaconf) dlg.addStream(st) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') ans = dlg.ShowModal() if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans)
def start(self): dlg = AcquisitionDialog(self, "Fancy Acquisition", "Enter everything") dlg.addSettings(self, conf={"filename": { "control_type": CONTROL_SAVE_FILE }}) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') stream = FakeFluoStream("Fluo Stream") dlg.addStream(stream) stream = FakeFluoStream("Fluo Stream") dlg.addStream(stream) ans = dlg.ShowModal() if ans == 1: # Ignore errors about a missing analysis tab try: self.showAcquisition(self.filename.value) except AttributeError: pass
def start(self): dlg = AcquisitionDialog( self, "Merging channels to RGB image", text="Insert 3 R, G, B files so that they are assigned the tints \n" "and are merged to an RGB image.") # remove the play overlay from the viewport dlg.viewport_l.canvas.remove_view_overlay( dlg.viewport_l.canvas.play_overlay) self._dlg = dlg dlg.addStream(None) dlg.Size = (1000, 600) dlg.addSettings(self, self.vaconf) dlg.addButton("Cancel", None) dlg.addButton("Add", self._updateViewer, face_colour='blue') dlg.pnl_gauge.Hide() dlg.ShowModal() # Blocks until the window is closed # Destroy the dialog and reset the VAs and subscribers dlg.Destroy() self.filenameR.value = " " self.filenameG.value = " " self.filenameB.value = " " self.redShiftX.value = 0 self.redShiftY.value = 0 self.greenShiftX.value = 0 self.greenShiftY.value = 0 self.blueShiftX.value = 0 self.blueShiftY.value = 0 self.cropBottom.value = 0 self._subscribers = [] self._dlg = None self._raw_orig = {}
def start(self): # Fail if the live tab is not selected tab = self.main_app.main_data.tab.value if tab.name not in ("secom_live", "sparc_acqui", "cryosecom-localization"): box = wx.MessageDialog(self.main_app.main_frame, "ZStack acquisition must be done from the acquisition stream.", "ZStack acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return # On SPARC, fail if no ROI selected if hasattr(tab.tab_data_model, "roa") and tab.tab_data_model.roa.value == UNDEFINED_ROI: box = wx.MessageDialog(self.main_app.main_frame, "You need to select a region of acquisition.", "Z stack acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return # Stop the stream(s) playing to not interfere with the acquisition tab.streambar_controller.pauseStreams() self.filename.value = self._get_new_filename() dlg = AcquisitionDialog(self, "Z Stack acquisition", "The same streams will be acquired multiple times at different Z positions, defined starting from Z start, with a step size.\n") self._dlg = dlg dlg.addSettings(self, self.vaconf) ss = self._get_live_streams(tab.tab_data_model) for s in ss: if isinstance(s, (ARStream, SpectrumStream, MonochromatorSettingsStream)): # TODO: instead of hard-coding the list, a way to detect the type # of live image? logging.info("Not showing stream %s, for which the live image is not spatial", s) dlg.addStream(s, index=None) else: dlg.addStream(s) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') # Connect zstart with the actual focus position self.zstart.subscribe(self._on_zstart) self.focus.position.subscribe(self._on_focus_pos, init=True) # Update acq time when streams are added/removed dlg.view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) dlg.hidden_view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) # TODO: update the acquisition time whenever a setting changes # TODO: disable "acquire" button if no stream selected # TODO: also display the repetition and axis settings for the SPARC streams. ans = dlg.ShowModal() if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans) self.focus.position.unsubscribe(self._on_focus_pos) self.zstart.unsubscribe(self._on_zstart) # Don't hold references self._acq_streams = None if dlg: # If dlg hasn't been destroyed yet dlg.Destroy()
def start(self): # Fail if the live tab is not selected tab = self.main_app.main_data.tab.value if tab.name not in ("secom_live", "sparc_acqui"): box = wx.MessageDialog(self.main_app.main_frame, "Timelapse acquisition must be done from the acquisition stream.", "Timelapse acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return # On SPARC, fail if no ROI selected try: if tab.tab_data_model.semStream.roi.value == UNDEFINED_ROI: box = wx.MessageDialog(self.main_app.main_frame, "You need to select a region of acquisition.", "Timelapse acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return except AttributeError: pass # Not a SPARC # Stop the stream(s) playing to not interfere with the acquisition tab.streambar_controller.pauseStreams() self.filename.value = self._get_new_filename() dlg = AcquisitionDialog(self, "Timelapse acquisition", "The same streams will be acquired multiple times, defined by the 'number of acquisitions'.\n" "The time separating each acquisition is defined by the 'period'.\n") self._dlg = dlg dlg.addSettings(self, self.vaconf) ss = self._get_live_streams(tab.tab_data_model) for s in ss: if isinstance(s, (ARStream, SpectrumStream, MonochromatorSettingsStream)): # TODO: instead of hard-coding the list, a way to detect the type # of live image? logging.info("Not showing stream %s, for which the live image is not spatial", s) dlg.addStream(s, index=None) else: dlg.addStream(s) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') # Force to re-check the minimum period time self.period.value = self.period.value # Update acq time when streams are added/removed dlg.view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) dlg.hidden_view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) # TODO: update the acquisition time whenever a setting changes # TODO: disable "acquire" button if no stream selected # TODO: also display the repetition and axis settings for the SPARC streams. ans = dlg.ShowModal() if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans) dlg.Destroy()
def show_dlg(self): # TODO: if there is a chamber, only allow if there is vacuum # Fail if the live tab is not selected self._tab = self.main_app.main_data.tab.value if self._tab.name not in ("secom_live", "sparc_acqui"): box = wx.MessageDialog(self.main_app.main_frame, "Tiled acquisition must be done from the acquisition stream.", "Tiled acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return self._tab.streambar_controller.pauseStreams() # If no ROI is selected, select entire area try: if self._tab.tab_data_model.semStream.roi.value == UNDEFINED_ROI: self._tab.tab_data_model.semStream.roi.value = (0, 0, 1, 1) except AttributeError: pass # Not a SPARC # Disable drift correction (on SPARC) if hasattr(self._tab.tab_data_model, "driftCorrector"): self._tab.tab_data_model.driftCorrector.roi.value = UNDEFINED_ROI ss = self._get_live_streams() self.filename.value = self._get_new_filename() dlg = AcquisitionDialog(self, "Tiled acquisition", "Acquire a large area by acquiring the streams multiple " "times over a grid.") self._dlg = dlg # don't allow adding/removing streams self._dlg.streambar_controller.to_static_mode() dlg.addSettings(self, self.vaconf) for s in ss: if isinstance(s, (ARStream, SpectrumStream, MonochromatorSettingsStream)): # TODO: instead of hard-coding the list, a way to detect the type # of live image? logging.info("Not showing stream %s, for which the live image is not spatial", s) dlg.addStream(s, index=None) else: dlg.addStream(s, index=0) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') # Update acq time and area when streams are added/removed. Add stream settings # to subscribed vas. dlg.view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) dlg.view.stream_tree.flat.subscribe(self._update_total_area, init=True) dlg.view.stream_tree.flat.subscribe(self._on_streams_change, init=True) # Default fineAlign to True if it's possible # Use live streams to make the decision since visible streams might not be initialized yet # TODO: the visibility of the streams seems to be reset when the plugin is started, # a stream that is invisible in the main panel becomes visible. This should be fixed. if self._can_fine_align(ss): self.fineAlign.value = True self._ovrl_stream = self._create_overlay_stream(ss) # This looks tautologic, but actually, it forces the setter to check the # value is within range, and will automatically reduce it if necessary. self.nx.value = self.nx.value self.ny.value = self.ny.value self._memory_check() # TODO: disable "acquire" button if no stream selected. ans = dlg.ShowModal() if ans == 0 or ans == wx.ID_CANCEL: logging.info("Tiled acquisition cancelled") self.ft.cancel() elif ans == 1: logging.info("Tiled acquisition completed") else: logging.warning("Got unknown return code %s", ans) # Don't hold references self._unsubscribe_vas() dlg.Destroy() self._dlg = None
def start(self): dlg = AcquisitionDialog( self, "Manually change the alignment", text="Change the translation, rotation, and pixel size " "of any stream. The display is immediately updated, " "but you need to save the file (as a snapshot) for " "the changes to be permanent.") self._dlg = dlg vah = VAHolder() vah._subscribers = [] vaconf = OrderedDict() tab_data = self.main_app.main_data.tab.value.tab_data_model if not tab_data.streams.value: box = wx.MessageDialog( self.main_app.main_frame, "No stream is present, so it's not possible to modify the alignment.", "No stream", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return for i, stream in enumerate(tab_data.streams.value): dlg.addStream(stream) # Add 5 VAs for each stream, to modify the overlay metadata poscor = stream.raw[0].metadata.get(model.MD_POS_COR, (0, 0)) rotation = stream.raw[0].metadata.get(model.MD_ROTATION_COR, 0) scalecor = stream.raw[0].metadata.get(model.MD_PIXEL_SIZE_COR, (1, 1)) shear = stream.raw[0].metadata.get(model.MD_SHEAR_COR, 0) vatransx = model.FloatContinuous(-poscor[0], range=(-10e-6, 10e-6), unit="m") vatransy = model.FloatContinuous(-poscor[1], range=(-10e-6, 10e-6), unit="m") varot = model.FloatContinuous(rotation, range=(-math.pi, math.pi), unit="rad") vascalex = model.FloatContinuous(scalecor[0], range=(0.5, 1.5)) vascaley = model.FloatContinuous(scalecor[1], range=(0.5, 1.5)) vashear = model.FloatContinuous(shear, range=(-1, 1)) # Add the VAs to the holder, and to the vaconf mainly to force the order setattr(vah, "%dTransX" % i, vatransx) setattr(vah, "%dTransY" % i, vatransy) setattr(vah, "%dRotation" % i, varot) setattr(vah, "%dScaleX" % i, vascalex) setattr(vah, "%dScaleY" % i, vascaley) setattr(vah, "%dShear" % i, vashear) vaconf["%dTransX" % i] = { "label": "%s trans X" % stream.name.value } vaconf["%dTransY" % i] = { "label": "%s trans Y" % stream.name.value } vaconf["%dRotation" % i] = { "label": "%s rotation" % stream.name.value } vaconf["%dScaleX" % i] = { "label": "%s scale X" % stream.name.value } vaconf["%dScaleY" % i] = { "label": "%s scale Y" % stream.name.value } vaconf["%dShear" % i] = {"label": "%s shear" % stream.name.value} # Create listeners with information of the stream and dimension va_on_transx = functools.partial(self._on_trans, stream, 0) va_on_transy = functools.partial(self._on_trans, stream, 1) va_on_rotation = functools.partial(self._on_rotation, stream) va_on_scalex = functools.partial(self._on_scale, stream, 0) va_on_scaley = functools.partial(self._on_scale, stream, 1) va_on_shear = functools.partial(self._on_shear, stream) # We hold a reference to the listeners to prevent automatic subscription vah._subscribers.append(va_on_transx) vah._subscribers.append(va_on_transy) vah._subscribers.append(va_on_rotation) vah._subscribers.append(va_on_scalex) vah._subscribers.append(va_on_scaley) vah._subscribers.append(va_on_shear) vatransx.subscribe(va_on_transx) vatransy.subscribe(va_on_transy) varot.subscribe(va_on_rotation) vascalex.subscribe(va_on_scalex) vascaley.subscribe(va_on_scaley) vashear.subscribe(va_on_shear) dlg.addSettings(vah, vaconf) # TODO: add a 'reset' button dlg.addButton("Done", None, face_colour='blue') dlg.ShowModal() # The end dlg.Destroy() vah._subscribers = [] self._dlg = None
def start(self): # Fail if the live tab is not selected tab = self.main_app.main_data.tab.value if tab.name not in ("secom_live", "sparc_acqui"): box = wx.MessageDialog(self.main_app.main_frame, "ZStack acquisition must be done from the acquisition stream.", "ZStack acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return # On SPARC, fail if no ROI selected if hasattr(tab.tab_data_model, "roa") and tab.tab_data_model.roa.value == UNDEFINED_ROI: box = wx.MessageDialog(self.main_app.main_frame, "You need to select a region of acquisition.", "Z stack acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return # Stop the stream(s) playing to not interfere with the acquisition tab.streambar_controller.pauseStreams() self.filename.value = self._get_new_filename() dlg = AcquisitionDialog(self, "Z Stack acquisition", "The same streams will be acquired multiple times at different Z positions, defined starting from Z start, with a step size.\n") self._dlg = dlg dlg.addSettings(self, self.vaconf) ss = self._get_live_streams(tab.tab_data_model) for s in ss: if isinstance(s, (ARStream, SpectrumStream, MonochromatorSettingsStream)): # TODO: instead of hard-coding the list, a way to detect the type # of live image? logging.info("Not showing stream %s, for which the live image is not spatial", s) dlg.addStream(s, index=None) else: dlg.addStream(s) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') # Update acq time when streams are added/removed dlg.view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) dlg.hidden_view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) # TODO: update the acquisition time whenever a setting changes # TODO: disable "acquire" button if no stream selected # TODO: also display the repetition and axis settings for the SPARC streams. ans = dlg.ShowModal() if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans) # Don't hold references self._acq_streams = None if dlg: # If dlg hasn't been destroyed yet dlg.Destroy()
def start(self): """ Displays the plugin window. """ self._update_filename() str_ctrl = self.main_app.main_data.tab.value.streambar_controller str_ctrl.pauseStreams() dlg = AcquisitionDialog( self, "CL acquisition", "Acquires a CCD image for each e-beam spot.\n") self._dlg = dlg self._survey_stream = self._get_sem_survey() dlg.SetSize((1500, 1000)) # Hack to force the canvas to have a region of acquisition (ROA) and anchor region (drift) overlay. dlg._dmodel.tool.choices = { TOOL_NONE, TOOL_ROA, TOOL_RO_ANCHOR, } dlg._dmodel.roa = self._secom_cl_stream.roi # region of acquisition selected (x_tl, y_tl, x_br, y_br) dlg._dmodel.fovComp = self.main_data.ebeam # size (x, y) of sem image for given magnification dlg._dmodel.driftCorrector = self._driftCorrector dlg.viewport_l.canvas.view = None dlg.viewport_l.canvas.setView(dlg.view, dlg._dmodel) dlg.viewport_r.canvas.allowed_modes = {} dlg.viewport_r.canvas.view = None dlg.viewport_r.canvas.setView(dlg.view_r, dlg._dmodel) self.repetition = self._secom_cl_stream.repetition # ebeam positions to acquire self.repetition.subscribe(self._on_rep, init=True) self.pixelSize = self._secom_cl_stream.pixelSize # pixel size per ebeam pos self.roi_margin = self._secom_cl_stream.roi_margin self.period = self._driftCorrector.period # time between to drift corrections self.tool = dlg._dmodel.tool # tools to select ROA and anchor region for drift correction self._driftCorrector.roi.subscribe(self._on_dc_roi, init=True) # subscribe to update estimated acquisition time self.repetition.subscribe(self._update_exp_dur, init=True) self.period.subscribe(self._update_exp_dur) self._driftCorrector.roi.subscribe(self._update_exp_dur) dlg.addSettings(self, self.vaconf) dlg.addStream(self._survey_stream) dlg.addStream(self._optical_stream) dlg.addButton("Cancel") dlg.addButton("Acquire", self._acquire, face_colour='blue') ans = dlg.ShowModal() if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans) self._dlg = None self._survey_stream = None dlg.Destroy()
def start(self): # Fail if the live tab is not selected tab = self.main_app.main_data.tab.value if tab.name not in ("secom_live", "sparc_acqui"): box = wx.MessageDialog( self.main_app.main_frame, "Timelapse acquisition must be done from the acquisition stream.", "Timelapse acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return # On SPARC, fail if no ROI selected try: if tab.tab_data_model.semStream.roi.value == UNDEFINED_ROI: box = wx.MessageDialog( self.main_app.main_frame, "You need to select a region of acquisition.", "Timelapse acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return except AttributeError: pass # Not a SPARC # Stop the stream(s) playing to not interfere with the acquisition tab.streambar_controller.pauseStreams() self.filename.value = self._get_new_filename() dlg = AcquisitionDialog( self, "Timelapse acquisition", "The same streams will be acquired multiple times, defined by the 'number of acquisitions'.\n" "The time separating each acquisition is defined by the 'period'.\n" ) self._dlg = dlg dlg.addSettings(self, self.vaconf) ss = self._get_live_streams(tab.tab_data_model) for s in ss: if isinstance( s, (ARStream, SpectrumStream, MonochromatorSettingsStream)): # TODO: instead of hard-coding the list, a way to detect the type # of live image? logging.info( "Not showing stream %s, for which the live image is not spatial", s) dlg.addStream(s, index=None) else: dlg.addStream(s) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') # Force to re-check the minimum period time self.period.value = self.period.value # Update acq time when streams are added/removed dlg.view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) dlg.hidden_view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) # TODO: update the acquisition time whenever a setting changes # TODO: disable "acquire" button if no stream selected # TODO: also display the repetition and axis settings for the SPARC streams. ans = dlg.ShowModal() if ans == 0: logging.info("Acquisition cancelled") elif ans == 1: logging.info("Acquisition completed") else: logging.warning("Got unknown return code %s", ans) dlg.view.stream_tree.flat.unsubscribe(self._update_exp_dur) dlg.Destroy()
def show_dlg(self): # TODO: if there is a chamber, only allow if there is vacuum # Fail if the live tab is not selected self._tab = self.main_app.main_data.tab.value if self._tab.name not in ("secom_live", "sparc_acqui"): box = wx.MessageDialog( self.main_app.main_frame, "Tiled acquisition must be done from the acquisition tab.", "Tiled acquisition not possible", wx.OK | wx.ICON_STOP) box.ShowModal() box.Destroy() return self._tab.streambar_controller.pauseStreams() # If no ROI is selected, select entire area try: if self._tab.tab_data_model.semStream.roi.value == UNDEFINED_ROI: self._tab.tab_data_model.semStream.roi.value = (0, 0, 1, 1) except AttributeError: pass # Not a SPARC # Disable drift correction (on SPARC) if hasattr(self._tab.tab_data_model, "driftCorrector"): self._tab.tab_data_model.driftCorrector.roi.value = UNDEFINED_ROI ss = self._get_live_streams() self.filename.value = self._get_new_filename() dlg = AcquisitionDialog( self, "Tiled acquisition", "Acquire a large area by acquiring the streams multiple " "times over a grid.") self._dlg = dlg # don't allow adding/removing streams self._dlg.streambar_controller.to_static_mode() dlg.addSettings(self, self.vaconf) for s in ss: if isinstance( s, (ARStream, SpectrumStream, MonochromatorSettingsStream)): # TODO: instead of hard-coding the list, a way to detect the type # of live image? logging.info( "Not showing stream %s, for which the live image is not spatial", s) dlg.addStream(s, index=None) else: dlg.addStream(s, index=0) dlg.addButton("Cancel") dlg.addButton("Acquire", self.acquire, face_colour='blue') # Update acq time and area when streams are added/removed. Add stream settings # to subscribed vas. dlg.view.stream_tree.flat.subscribe(self._update_exp_dur, init=True) dlg.view.stream_tree.flat.subscribe(self._update_total_area, init=True) dlg.view.stream_tree.flat.subscribe(self._on_streams_change, init=True) # Default fineAlign to True if it's possible # Use live streams to make the decision since visible streams might not be initialized yet # TODO: the visibility of the streams seems to be reset when the plugin is started, # a stream that is invisible in the main panel becomes visible. This should be fixed. if self._can_fine_align(ss): self.fineAlign.value = True self._ovrl_stream = self._create_overlay_stream(ss) # This looks tautologic, but actually, it forces the setter to check the # value is within range, and will automatically reduce it if necessary. self.nx.value = self.nx.value self.ny.value = self.ny.value self._memory_check() # TODO: disable "acquire" button if no stream selected. ans = dlg.ShowModal() if ans == 0 or ans == wx.ID_CANCEL: logging.info("Tiled acquisition cancelled") self.ft.cancel() elif ans == 1: logging.info("Tiled acquisition completed") else: logging.warning("Got unknown return code %s", ans) # Don't hold references self._unsubscribe_vas() dlg.Destroy() self._dlg = None