def bindctrl(self,ctrlnames,type,validatef): for i,v in enumerate(ctrlnames): if type[i] == 'int': wxvt.setup_validated_integer_callback(self.control(v), xrc.XRCID(v), validatef, pending_color=params.params.wxvt_bg) else: wxvt.setup_validated_float_callback(self.control(v), xrc.XRCID(v), validatef, pending_color=params.params.wxvt_bg)
def bindctrl(self, ctrlnames, type, validatef): for i, v in enumerate(ctrlnames): if type[i] == 'int': wxvt.setup_validated_integer_callback( self.control(v), xrc.XRCID(v), validatef, pending_color=params.params.wxvt_bg) else: wxvt.setup_validated_float_callback( self.control(v), xrc.XRCID(v), validatef, pending_color=params.params.wxvt_bg)
def __init__(self, parent=None): # it looks like this is dead code, because RSRC_FILE is undefined -JAB 2/27/16 rsrc = xrc.XmlResource(RSRC_FILE) self.frame = rsrc.LoadFrame(parent, "frame_Ctrax_settings") # input box handles self.vel_bins_box = xrc.XRCCTRL(self.frame, "text_vel_bins") self.orn_bins_box = xrc.XRCCTRL(self.frame, "text_orn_bins") self.space_bins_box = xrc.XRCCTRL(self.frame, "text_space_bins") self.pos_binsize_box = xrc.XRCCTRL(self.frame, "text_pos_binsize") self.vel_axes_box = xrc.XRCCTRL(self.frame, "text_vel_axes") self.orn_axes_box = xrc.XRCCTRL(self.frame, "text_orn_axes") self.space_axes_box = xrc.XRCCTRL(self.frame, "text_space_axes") self.pos_axes_box = xrc.XRCCTRL(self.frame, "text_pos_axes") # initial values self.vel_bins_box.SetValue(str(const.vel_bins)) self.orn_bins_box.SetValue(str(const.orn_bins)) self.space_bins_box.SetValue(str(const.space_bins)) self.pos_binsize_box.SetValue(str(const.pos_binsize)) self.vel_axes_box.SetValue("a,a,a,a") self.orn_axes_box.SetValue("a,a,a,a") self.space_axes_box.SetValue("a,a,a,a") self.pos_axes_box.SetValue("a,a,a,a") # bind to wxvalidatedtext wxvt.setup_validated_integer_callback(self.vel_bins_box, xrc.XRCID("text_vel_bins"), self.OnTextValidated, pending_color=params.wxvt_bg) wxvt.setup_validated_integer_callback(self.orn_bins_box, xrc.XRCID("text_orn_bins"), self.OnTextValidated, pending_color=params.wxvt_bg) wxvt.setup_validated_integer_callback(self.space_bins_box, xrc.XRCID("text_space_bins"), self.OnTextValidated, pending_color=params.wxvt_bg) wxvt.setup_validated_integer_callback(self.pos_binsize_box, xrc.XRCID("text_pos_binsize"), self.OnTextValidated, pending_color=params.wxvt_bg) wxvt.Validator(self.vel_axes_box, xrc.XRCID("text_vel_axes"), self.OnTextValidated, self.ParseAxes, pending_color=params.wxvt_bg) wxvt.Validator(self.orn_axes_box, xrc.XRCID("text_orn_axes"), self.OnTextValidated, self.ParseAxes, pending_color=params.wxvt_bg) wxvt.Validator(self.space_axes_box, xrc.XRCID("text_space_axes"), self.OnTextValidated, self.ParseAxes, pending_color=params.wxvt_bg) wxvt.Validator(self.pos_axes_box, xrc.XRCID("text_pos_axes"), self.OnTextValidated, self.ParseAxes, pending_color=params.wxvt_bg) self.frame.Show()
def InitGUI(self): """Load XML resources, create handles, bind callbacks.""" rsrc = xrc.XmlResource(RSRC_FILE) self.frame = rsrc.LoadFrame(None, "frame_Ctrax") self.frame.SetIcon(wx.Icon(ICON_FILE, wx.BITMAP_TYPE_ICO)) # make references to useful objects self.menu = self.frame.GetMenuBar() if DEBUG: self.debugmenu = wx.Menu() self.debugmenu.Append( ID_PRINTINTERVALS, "Print Intervals", "Print frame intervals tracked, buffered, and written." ) self.debugmenu.Append( ID_PRINTBUFFEREL, "Print Buffer...", "Print ellipses stored at specified element of buffer." ) self.debugmenu.Append(ID_PRINTFRAME, "Print Frame...", "Pring ellipses for specified frame.") self.menu.Append(self.debugmenu, "DEBUG") self.status = xrc.XRCCTRL(self.frame, "bar_status") self.framenumber_text = xrc.XRCCTRL(self.frame, "text_framenumber") self.num_flies_text = xrc.XRCCTRL(self.frame, "text_num_flies") self.rate_text = xrc.XRCCTRL(self.frame, "text_refresh_rate") self.slider = xrc.XRCCTRL(self.frame, "slider_frame") self.slider.Enable(False) # make image window self.img_panel = xrc.XRCCTRL(self.frame, "panel_img") box = wx.BoxSizer(wx.VERTICAL) self.img_panel.SetSizer(box) self.img_wind = wxvideo.DynamicImageCanvas(self.img_panel, -1) box.Add(self.img_wind, 1, wx.EXPAND) self.img_panel.SetAutoLayout(True) self.img_panel.Layout() self.zoommode = False # set up tools self.toolbar = xrc.XRCCTRL(self.frame, "toolbar") # other tools self.zoom_id = xrc.XRCID("zoom") self.play_id = xrc.XRCID("play") self.stop_id = xrc.XRCID("stop") self.speedup_id = xrc.XRCID("speed_up") self.slowdown_id = xrc.XRCID("slow_down") self.refresh_id = xrc.XRCID("refresh") # set up appearances for toolbar self.toolbar.SetToggle(self.zoommode, self.zoom_id) self.stop_tracking_tooltip = "Stop Tracking" self.stop_playback_tooltip = "Stop Video Playback" self.start_playback_tooltip = "Start Video Playback" self.speedup_tracking_tooltip = "Increase Refresh Rate" self.speedup_playback_tooltip = "Increase Playback Speed" self.slowdown_tracking_tooltip = "Decrease Refresh Rate" self.slowdown_playback_tooltip = "Decrease Playback Speed" self.play_speed = 1.0 self.UpdateToolBar("stopped") # bind callbacks # file menu self.frame.Bind(wx.EVT_MENU, self.OnOpen, id=xrc.XRCID("menu_file_open")) self.frame.Bind(wx.EVT_MENU, self.OnLoadSettings, id=xrc.XRCID("menu_load_settings")) self.frame.Bind(wx.EVT_MENU, self.OnBatch, id=xrc.XRCID("menu_file_batch")) self.frame.Bind(wx.EVT_MENU, self.OnSave, id=xrc.XRCID("menu_file_export")) self.frame.Bind(wx.EVT_MENU, self.OnSaveTimestamps, id=xrc.XRCID("menu_file_write_timestamps")) self.frame.Bind(wx.EVT_MENU, self.OnSaveAvi, id=xrc.XRCID("menu_file_save_avi")) self.frame.Bind(wx.EVT_MENU, self.OnQuit, id=xrc.XRCID("menu_file_quit")) # help menu self.frame.Bind(wx.EVT_MENU, self.OnHelp, id=xrc.XRCID("menu_help_help")) self.frame.Bind(wx.EVT_MENU, self.OnAbout, id=xrc.XRCID("menu_help_about")) # track menu self.frame.Bind(wx.EVT_MENU, self.OnStartTrackingMenu, id=xrc.XRCID("menu_track_start")) self.frame.Bind(wx.EVT_MENU, self.OnStartTrackingMenu, id=xrc.XRCID("menu_track_resume")) self.frame.Bind(wx.EVT_MENU, self.OnStartTrackingMenu, id=xrc.XRCID("menu_track_resume_here")) self.frame.Bind(wx.EVT_MENU, self.OnWriteSBFMF, id=xrc.XRCID("menu_track_writesbfmf")) self.frame.Bind(wx.EVT_MENU, self.OnComputeBg, id=xrc.XRCID("menu_compute_background")) self.frame.Bind(wx.EVT_MENU, self.OnComputeShape, id=xrc.XRCID("menu_compute_shape")) # settings menu self.frame.Bind(wx.EVT_MENU, self.OnSettingsBGModel, id=xrc.XRCID("menu_settings_bg_model")) self.frame.Bind(wx.EVT_MENU, self.OnSettingsBG, id=xrc.XRCID("menu_settings_bg")) self.frame.Bind(wx.EVT_MENU, self.OnSettingsTracking, id=xrc.XRCID("menu_settings_tracking")) self.frame.Bind(wx.EVT_MENU, self.OnChooseOrientations, id=xrc.XRCID("menu_choose_orientations")) # self.frame.Bind( wx.EVT_MENU, self.OnEllipseSize, id=xrc.XRCID("menu_settings_ellipses") ) # self.frame.Bind( wx.EVT_MENU, self.OnCheckColorblind, id=xrc.XRCID("menu_settings_use_colorblind") ) self.frame.Bind(wx.EVT_MENU, self.OnCheckShowAnn, id=xrc.XRCID("menu_playback_show_ann")) self.frame.Bind(wx.EVT_MENU, self.OnCheckRefresh, id=xrc.XRCID("menu_do_refresh")) self.frame.Bind(wx.EVT_MENU, self.OnTailLength, id=xrc.XRCID("menu_playback_tails")) self.frame.Bind(wx.EVT_MENU, self.OnCheckDim, id=xrc.XRCID("menu_playback_dim")) self.frame.Bind(wx.EVT_MENU, self.OnCheckZoom, id=xrc.XRCID("menu_settings_zoom")) # DEBUG if DEBUG: self.frame.Bind(wx.EVT_MENU, self.OnDebugPrintIntervals, id=ID_PRINTINTERVALS) self.frame.Bind(wx.EVT_MENU, self.OnDebugPrintBufferElement, id=ID_PRINTBUFFEREL) self.frame.Bind(wx.EVT_MENU, self.OnDebugPrintFrame, id=ID_PRINTFRAME) # stats menu # self.frame.Bind( wx.EVT_MENU, self.OnStats, id=xrc.XRCID("menu_stats_vel") ) # self.frame.Bind( wx.EVT_MENU, self.OnStats, id=xrc.XRCID("menu_stats_orn") ) # self.frame.Bind( wx.EVT_MENU, self.OnStats, id=xrc.XRCID("menu_stats_space") ) # self.frame.Bind( wx.EVT_MENU, self.OnStats, id=xrc.XRCID("menu_stats_pos") ) # self.frame.Bind( wx.EVT_MENU, self.OnSettingsStats, id=xrc.XRCID("menu_stats_settings") ) # self.frame.Bind( wx.EVT_MENU, self.OnCheckBatchStats, id=xrc.XRCID("menu_stats_batch") ) # miscellaneous events self.frame.Bind(wx.EVT_CLOSE, self.OnQuit) self.frame.Bind(wx.EVT_SCROLL, self.OnSlider, self.slider) self.frame.Bind(wx.EVT_SIZE, self.OnResize) self.frame.Bind(wx.EVT_MAXIMIZE, self.OnResize) # not called in Gnome? # toolbar self.frame.Bind(wx.EVT_TOOL, self.ZoomToggle, id=self.zoom_id) self.frame.Bind(wx.EVT_TOOL, self.OnPlayButton, id=self.play_id) self.frame.Bind(wx.EVT_TOOL, self.OnStopButton, id=self.stop_id) self.frame.Bind(wx.EVT_TOOL, self.OnSpeedUpButton, id=self.speedup_id) self.frame.Bind(wx.EVT_TOOL, self.OnSlowDownButton, id=self.slowdown_id) self.frame.Bind(wx.EVT_TOOL, self.OnRefreshButton, id=self.refresh_id) wxvt.setup_validated_integer_callback( self.framenumber_text, xrc.XRCID("text_framenumber"), self.OnFrameNumberValidated, pending_color=params.status_blue, ) # default settings if sys.platform == "win32": homedir = os.path.join(os.environ["HOMEDRIVE"], os.environ["HOMEPATH"]) else: homedir = os.environ["HOME"] self.dir = homedir self.ellipse_thickness = params.ellipse_thickness # read saved settings, overwriting defaults self.ReadUserfile() self.OnResize(None)
def camera_starting_notification(self, cam_id, pixel_format=None, max_width=None, max_height=None): """ cam_id is simply used as a dict key """ self.xrcid2validator[cam_id] = {} bunch = BunchClass() bunch.max_num_points = SharedValue() bunch.max_num_points.set(10) self.bunches[cam_id]=bunch self.pixel_format[cam_id]=pixel_format # setup GUI stuff if len(self.cam_ids)==0: # adding first camera self.frame_nb.DeleteAllPages() # make new per-camera wx panel per_cam_panel = RES.LoadPanel(self.frame_nb,"PER_CAM_PANEL") self.per_cam_panel[cam_id] = per_cam_panel per_cam_panel.SetAutoLayout(True) self.frame_nb.AddPage(per_cam_panel,cam_id) ctrl = xrc.XRCCTRL(per_cam_panel,"TAKE_BG_IMAGE") self.widget2cam_id[ctrl]=cam_id wx.EVT_BUTTON(ctrl, ctrl.GetId(), self.OnTakeBgImage) self.ongoing_bg_image_update_interval[cam_id] = LockedValue(50) ctrl = xrc.XRCCTRL(per_cam_panel,"BACKGROUND_IMAGE_UPDATE_INTERVAL") ctrl.SetValue( str(self.ongoing_bg_image_update_interval[cam_id].get())) self.widget2cam_id[ctrl]=cam_id validator = wxvt.setup_validated_integer_callback( ctrl, ctrl.GetId(), self.OnSetBackgroundUpdateInterval) self.xrcid2validator[cam_id]["BACKGROUND_IMAGE_UPDATE_INTERVAL"] = validator ctrl = xrc.XRCCTRL(per_cam_panel,"CLEAR_THRESHOLD") self.widget2cam_id[ctrl]=cam_id validator = wxvt.setup_validated_float_callback( ctrl, ctrl.GetId(), self.OnClearThreshold, ignore_initial_value=True) self.xrcid2validator[cam_id]["CLEAR_THRESHOLD"] = validator ctrl = xrc.XRCCTRL(per_cam_panel,"DIFF_THRESHOLD") self.widget2cam_id[ctrl]=cam_id validator = wxvt.setup_validated_integer_callback( ctrl, ctrl.GetId(), self.OnDiffThreshold, ignore_initial_value=True) self.xrcid2validator[cam_id]["DIFF_THRESHOLD"] = validator ctrl = xrc.XRCCTRL(per_cam_panel,"ROI2_RADIUS") self.widget2cam_id[ctrl]=cam_id validator = wxvt.setup_validated_integer_callback( ctrl, ctrl.GetId(), self.OnRoi2Radius, ignore_initial_value=True) self.xrcid2validator[cam_id]["ROI2_RADIUS"] = validator ctrl = xrc.XRCCTRL(per_cam_panel,"INVERSE_ALPHA") self.widget2cam_id[ctrl]=cam_id validator = wxvt.setup_validated_float_callback( ctrl, ctrl.GetId(), self.OnInverseAlpha, ignore_initial_value=True) self.xrcid2validator[cam_id]["INVERSE_ALPHA"] = validator ctrl = xrc.XRCCTRL(per_cam_panel,"N_SIGMA") self.widget2cam_id[ctrl]=cam_id validator = wxvt.setup_validated_float_callback( ctrl, ctrl.GetId(), self.OnNSigma, ignore_initial_value=True) self.xrcid2validator[cam_id]["N_SIGMA"] = validator ctrl = xrc.XRCCTRL(per_cam_panel,"MAX_NUM_POINTS") self.widget2cam_id[ctrl]=cam_id validator = wxvt.setup_validated_integer_callback( ctrl, ctrl.GetId(), self.OnMaxNPoints, ignore_initial_value=True) self.xrcid2validator[cam_id]["MAX_NUM_POINTS"] = validator ctrl.SetValue(str(bunch.max_num_points.get_nowait())) validator.set_state('valid') start_recording_widget = xrc.XRCCTRL(per_cam_panel,"START_RECORDING") self.widget2cam_id[start_recording_widget]=cam_id wx.EVT_BUTTON(start_recording_widget, start_recording_widget.GetId(), self.OnStartRecording) stop_recording_widget = xrc.XRCCTRL(per_cam_panel,"STOP_RECORDING") self.widget2cam_id[stop_recording_widget]=cam_id wx.EVT_BUTTON(stop_recording_widget, stop_recording_widget.GetId(), self.OnStopRecording) tracking_enabled_widget = xrc.XRCCTRL(per_cam_panel,"ENABLED_CHECKBOX") self.widget2cam_id[tracking_enabled_widget]=cam_id wx.EVT_CHECKBOX(tracking_enabled_widget, tracking_enabled_widget.GetId(), self.OnToggleTrackingEnabled) save_status_widget = xrc.XRCCTRL(per_cam_panel,"SAVE_STATUS") self.save_status_widget[cam_id] = save_status_widget self.save_data_prefix_widget[cam_id] = xrc.XRCCTRL( per_cam_panel,"SAVE_DATA_PREFIX") self.widget2cam_id[self.save_data_prefix_widget[cam_id]]=cam_id ctrl = xrc.XRCCTRL(per_cam_panel,"SAVE_DATA_DIR_BUTTON") self.widget2cam_id[ctrl]=cam_id wx.EVT_BUTTON(ctrl, ctrl.GetId(), self.OnSetSavePath) ##################### # setup non-GUI stuff self.cam_ids.append(cam_id) self.display_active[cam_id] = threading.Event() if len(self.cam_ids) > 1: raise NotImplementedError('if >1 camera supported, implement setting display_active on notebook page change') else: self.display_active[cam_id].set() self.clear_and_take_bg_image[cam_id] = threading.Event() self.clear_and_take_bg_image[cam_id].set() # start off setting background self.ticks_since_last_update[cam_id] = 0 lbrt = (0,0,max_width-1,max_height-1) roi2_radius=int(xrc.XRCCTRL(per_cam_panel,"ROI2_RADIUS").GetValue()) ra = realtime_image_analysis.RealtimeAnalyzer(lbrt, max_width, max_height, bunch.max_num_points.get_nowait(), roi2_radius) self.realtime_analyzer[cam_id] = ra self.new_clear_threshold[cam_id] = threading.Event() self.new_diff_threshold[cam_id] = threading.Event() self.new_roi2_radius[cam_id] = threading.Event() self.clear_threshold_value[cam_id] = ra.clear_threshold self.diff_threshold_value[cam_id] = ra.diff_threshold self.roi2_radius_value[cam_id] = ra.roi2_radius ctrl = xrc.XRCCTRL(per_cam_panel,"CLEAR_THRESHOLD") validator = self.xrcid2validator[cam_id]["CLEAR_THRESHOLD"] ctrl.SetValue( '%.2f'%ra.clear_threshold ) validator.set_state('valid') ctrl = xrc.XRCCTRL(per_cam_panel,"DIFF_THRESHOLD") validator = self.xrcid2validator[cam_id]["DIFF_THRESHOLD"] ctrl.SetValue( '%d'%ra.diff_threshold ) validator.set_state('valid') ctrl = xrc.XRCCTRL(per_cam_panel,"ROI2_RADIUS") validator = self.xrcid2validator[cam_id]["ROI2_RADIUS"] ctrl.SetValue( '%d'%ra.roi2_radius ) validator.set_state('valid') max_frame_size = FastImage.Size( max_width, max_height ) self.max_frame_size[cam_id] = max_frame_size bunch.inverse_alpha = SharedValue() bunch.inverse_alpha.set( float(xrc.XRCCTRL(per_cam_panel,"INVERSE_ALPHA").GetValue()) ) validator = self.xrcid2validator[cam_id]["INVERSE_ALPHA"] validator.set_state('valid') bunch.n_sigma = SharedValue() bunch.n_sigma.set( float(xrc.XRCCTRL(per_cam_panel,"N_SIGMA").GetValue()) ) validator = self.xrcid2validator[cam_id]["N_SIGMA"] validator.set_state('valid') self.frame.Fit() bunch.initial_take_bg_state = None bunch.running_mean_im_full = FastImage.FastImage32f(max_frame_size) bunch.running_sumsqf_full = FastImage.FastImage32f(max_frame_size) bunch.running_sumsqf_full.set_val(0,max_frame_size) bunch.fastframef32_tmp_full = FastImage.FastImage32f(max_frame_size) bunch.mean2_full = FastImage.FastImage32f(max_frame_size) bunch.std2_full = FastImage.FastImage32f(max_frame_size) bunch.running_stdframe_full = FastImage.FastImage32f(max_frame_size) bunch.noisy_pixels_mask_full = FastImage.FastImage8u(max_frame_size) bunch.last_running_mean_im = None dummy_file = DummyFile() with self.dummy_ufmf_writer_lock: self.dummy_ufmf_writer[cam_id] = ufmf.AutoShrinkUfmfSaverV3( dummy_file, coding = self.pixel_format[cam_id], max_width=self.max_frame_size[cam_id].w, max_height=self.max_frame_size[cam_id].h, )
def __init__(self,parent,bg): #self.const = bg.const #const.n_frames = bg.n_frames self.bg = bg # copy some settings #self.use_median = bg.use_median #self.n_bg_frames = bg.n_bg_frames #self.bg_firstframe = bg.bg_firstframe #self.bg_lastframe = bg.bg_lastframe # clear buffer self.bg.initialize_buffer() rsrc = xrc.XmlResource( SETTINGS_RSRC_FILE ) self.frame = rsrc.LoadFrame(parent, "bg_settings") self.algorithm = xrc.XRCCTRL( self.frame, "algorithm" ) self.nframes = xrc.XRCCTRL( self.frame, "nframes" ) self.firstframe_box = xrc.XRCCTRL( self.frame, "bg_firstframe" ) self.lastframe_box = xrc.XRCCTRL( self.frame, "bg_lastframe" ) self.expbgfgmodel_checkbox = xrc.XRCCTRL( self.frame, "expbgfgmodel_checkbox") self.expbgfgmodel_text = xrc.XRCCTRL( self.frame, "expbgfgmodel_text") self.expbgfgmodel_button = xrc.XRCCTRL( self.frame, "expbgfgmodel_button") self.expbgfgmodel_llr_thresh = xrc.XRCCTRL(self.frame, "llr_thresh") self.expbgfgmodel_llr_thresh_low = xrc.XRCCTRL(self.frame, "llr_thresh_low") self.calculate = xrc.XRCCTRL( self.frame, "calculate_button" ) if self.bg.use_median: self.algorithm.SetSelection(params.ALGORITHM_MEDIAN) else: self.algorithm.SetSelection(params.ALGORITHM_MEAN) self.nframes.SetValue( str(self.bg.n_bg_frames)) wxvt.setup_validated_integer_callback( self.nframes, xrc.XRCID("nframes"), self.OnTextValidatedNFrames, pending_color=params.wxvt_bg ) self.firstframe_box.SetValue( str(self.bg.bg_firstframe)) wxvt.setup_validated_integer_callback( self.firstframe_box, xrc.XRCID("bg_firstframe"), self.OnTextValidatedFirstframe, pending_color=params.wxvt_bg ) self.lastframe_box.SetValue( str(self.bg.bg_lastframe)) wxvt.setup_validated_integer_callback( self.lastframe_box, xrc.XRCID("bg_lastframe"), self.OnTextValidatedLastframe, pending_color=params.wxvt_bg ) self.frame.Bind( wx.EVT_CHOICE, self.OnAlgorithmChoice, self.algorithm) self.frame.Bind( wx.EVT_BUTTON, self.OnCalculate, self.calculate ) self.expbgfgmodel_text.SetEditable(False) self.frame.Bind(wx.EVT_BUTTON, self.OnChooseExpBGFGModelFileName, self.expbgfgmodel_button) self.frame.Bind(wx.EVT_CHECKBOX, self.OnCheckExpBGFGModel, self.expbgfgmodel_checkbox) wxvt.setup_validated_integer_callback( self.expbgfgmodel_llr_thresh, xrc.XRCID("llr_thresh"), self.OnTextValidatedLLRThresh, pending_color=params.wxvt_bg ) wxvt.setup_validated_integer_callback( self.expbgfgmodel_llr_thresh_low, xrc.XRCID("llr_thresh_low"), self.OnTextValidatedLLRThresh, pending_color=params.wxvt_bg ) if 'darwin' in sys.platform: fix_text_sizes( self.frame ) self.UpdateExpBGFGModelControls() self.frame.Show()
def ShowBG( self, parent, framenumber, old_thresh, dosub_callback=None ): # clear buffer self.initialize_buffer() self.old_thresh = params.n_bg_std_thresh self.show_frame = framenumber self.dosub_callback = dosub_callback rsrc = xrc.XmlResource( THRESH_RSRC_FILE ) self.frame = rsrc.LoadFrame( parent, "frame_Ctrax_bg" ) if 'darwin' in sys.platform: fix_text_sizes( self.frame ) # calculate background image, if not already done if not hasattr( self, 'center' ): success = self.OnCalculate( parent=parent ) if not success: return # event bindings self.hf.SetFrame(self.frame) self.hf.frame.Bind( wx.EVT_BUTTON, self.OnQuitHF, id=xrc.XRCID("hm_done_button") ) self.hf.frame.Bind( wx.EVT_CLOSE, self.OnQuitHF ) self.menu = self.frame.GetMenuBar() #self.frame.Bind( wx.EVT_MENU, self.OnShowBG, id=xrc.XRCID("menu_show_bg") ) #self.frame.Bind( wx.EVT_MENU, self.OnShowThresh, id=xrc.XRCID("menu_show_thresh") ) #self.frame.Bind( wx.EVT_MENU, self.OnFrameSlider, id=xrc.XRCID("menu_show_bin") ) #self.frame.Bind( wx.EVT_BUTTON, self.OnCalcButton, id=xrc.XRCID("button_calculate") ) #self.frame.Bind( wx.EVT_BUTTON, self.OnResetButton, id=xrc.XRCID("button_reset") ) # control handles self.frame_text = xrc.XRCCTRL( self.frame, "text_frame" ) self.range_text = xrc.XRCCTRL( self.frame, "text_range" ) #self.reset_button = xrc.XRCCTRL( self.frame, "button_reset" ) #if self.old_thresh is None: # self.reset_button.Enable( False ) # set threshold self.thresh_slider = xrc.XRCCTRL( self.frame, "slider_thresh" ) self.thresh_slider.SetScrollbar(self.GetThresholdScrollbar(),0,255,255-25) self.thresh_low_slider = xrc.XRCCTRL( self.frame, "slider_low_thresh" ) self.thresh_low_slider.SetScrollbar(self.GetThresholdLowScrollbar(),0,255,255-25) # we can also input the threshold by typing it; make sure slider and text input # show the same value self.thresh_textinput = xrc.XRCCTRL( self.frame, "threshold_text_input" ) self.frame.Bind( wx.EVT_SCROLL, self.OnThreshSlider, self.thresh_slider ) wxvt.setup_validated_float_callback( self.thresh_textinput, xrc.XRCID("threshold_text_input"), self.OnThreshTextEnter, pending_color=params.wxvt_bg ) self.thresh_low_textinput = xrc.XRCCTRL( self.frame, "low_threshold_text_input" ) self.frame.Bind( wx.EVT_SCROLL, self.OnThreshSlider, self.thresh_low_slider ) wxvt.setup_validated_float_callback( self.thresh_low_textinput, xrc.XRCID("low_threshold_text_input"), self.OnThreshTextEnter, pending_color=params.wxvt_bg ) self.SetThreshold() self.frame_slider = xrc.XRCCTRL( self.frame, "slider_frame" ) self.frame.Bind( wx.EVT_SCROLL, self.OnFrameSlider, self.frame_slider ) self.frame_slider.SetScrollbar(self.show_frame,0,params.n_frames-1,params.n_frames/10) # which image are we showing self.bg_img_chooser = xrc.XRCCTRL( self.frame, "view_type_input" ) if params.use_expbgfgmodel: self.bg_img_chooser.SetItems(params.BG_SHOW_STRINGS+params.EXPBGFGMODEL_SHOW_STRINGS) else: self.bg_img_chooser.SetItems(params.BG_SHOW_STRINGS) if self.show_img_type > self.bg_img_chooser.GetCount(): self.show_img_type = 0 self.bg_img_chooser.SetSelection(self.show_img_type) self.frame.Bind( wx.EVT_CHOICE, self.OnImgChoice, self.bg_img_chooser) # background type self.bg_type_chooser = xrc.XRCCTRL(self.frame,"bg_type_input") if self.bg_type == 'light_on_dark': self.bg_type_chooser.SetSelection( 0 ) elif self.bg_type == 'dark_on_light': self.bg_type_chooser.SetSelection( 1 ) else: self.bg_type_chooser.SetSelection( 2 ) self.frame.Bind(wx.EVT_CHOICE,self.OnBgTypeChoice, self.bg_type_chooser) # minimum bg std self.bg_minstd_textinput = xrc.XRCCTRL(self.frame,"bg_min_std_input") wxvt.setup_validated_float_callback( self.bg_minstd_textinput, xrc.XRCID("bg_min_std_input"), self.OnMinStdTextEnter, pending_color=params.wxvt_bg ) self.bg_minstd_textinput.SetValue( str(params.bg_std_min) ) # maximum bg std self.bg_maxstd_textinput = xrc.XRCCTRL(self.frame,"bg_max_std_input") wxvt.setup_validated_float_callback( self.bg_maxstd_textinput, xrc.XRCID("bg_max_std_input"), self.OnMinStdTextEnter, pending_color=params.wxvt_bg ) self.bg_maxstd_textinput.SetValue( str(params.bg_std_max) ) # normalization type self.bg_norm_chooser = xrc.XRCCTRL(self.frame,"bg_normalization_input") if self.norm_type == 'homomorphic': self.bg_norm_chooser.SetSelection( 2 ) elif self.norm_type == 'intensity': self.bg_norm_chooser.SetSelection( 1 ) else: self.bg_norm_chooser.SetSelection( 0 ) self.frame.Bind( wx.EVT_CHOICE, self.OnNormChoice, self.bg_norm_chooser) # homomorphic filter settings dialog self.hf_button = xrc.XRCCTRL(self.frame,"homomorphic_settings") self.hf_button.Enable(False) self.frame.Bind(wx.EVT_BUTTON,self.OnHFClick,self.hf_button) self.hf_window_open = False # detect arena button self.detect_arena_button = xrc.XRCCTRL(self.frame,"detect_arena_button") self.detect_arena_checkbox = xrc.XRCCTRL(self.frame,"detect_arena_checkbox") self.detect_arena_button.Enable(params.do_set_circular_arena) self.detect_arena_checkbox.SetValue(params.do_set_circular_arena) self.frame.Bind(wx.EVT_BUTTON,self.OnDetectArenaClick,self.detect_arena_button) self.frame.Bind(wx.EVT_CHECKBOX,self.OnDetectArenaCheck,self.detect_arena_checkbox) self.detect_arena_window_open = False # min value for isarena self.min_nonarena_textinput = xrc.XRCCTRL(self.frame,"min_nonfore_intensity_input") wxvt.setup_validated_float_callback( self.min_nonarena_textinput, xrc.XRCID("min_nonfore_intensity_input"), self.OnMinNonArenaTextEnter, pending_color=params.wxvt_bg ) self.min_nonarena_textinput.SetValue( str(params.min_nonarena )) # min value for isarena self.max_nonarena_textinput = xrc.XRCCTRL(self.frame,"max_nonfore_intensity_input") wxvt.setup_validated_float_callback( self.max_nonarena_textinput, xrc.XRCID("max_nonfore_intensity_input"), self.OnMaxNonArenaTextEnter, pending_color=params.wxvt_bg ) self.max_nonarena_textinput.SetValue( str(params.max_nonarena )) # morphology self.morphology_checkbox = xrc.XRCCTRL(self.frame,"morphology_checkbox") self.morphology_checkbox.SetValue(params.do_use_morphology) self.frame.Bind(wx.EVT_CHECKBOX,self.OnMorphologyCheck,self.morphology_checkbox) self.opening_radius_textinput = xrc.XRCCTRL(self.frame,"opening_radius") wxvt.setup_validated_integer_callback( self.opening_radius_textinput, xrc.XRCID("opening_radius"), self.OnOpeningRadiusTextEnter, pending_color=params.wxvt_bg ) self.opening_radius_textinput.SetValue( '%d'%params.opening_radius ) self.opening_radius_textinput.Enable(params.do_use_morphology) self.closing_radius_textinput = xrc.XRCCTRL(self.frame,"closing_radius") self.opening_struct = self.create_morph_struct(params.opening_radius) wxvt.setup_validated_integer_callback( self.closing_radius_textinput, xrc.XRCID("closing_radius"), self.OnClosingRadiusTextEnter, pending_color=params.wxvt_bg ) self.closing_radius_textinput.SetValue( '%d'%params.closing_radius ) self.closing_radius_textinput.Enable(params.do_use_morphology) self.closing_struct = self.create_morph_struct(params.closing_radius) # prior model stuff # whether to show the panel self.expbgfgmodel_panel = xrc.XRCCTRL(self.frame,"expbgfgmodel_panel") self.expbgfgmodel_panel.Show(params.use_expbgfgmodel) # minimum fraction of frames nec. for estimating bg model self.min_frac_frames_isback_textinput = xrc.XRCCTRL(self.frame,"min_frac_frames_isback") wxvt.setup_validated_float_callback( self.min_frac_frames_isback_textinput, xrc.XRCID("min_frac_frames_isback"), self.OnMinFracFramesIsBackTextEnter, pending_color=params.wxvt_bg ) # fill self.expbgfgmodel_fill_chooser = xrc.XRCCTRL(self.frame,"expbgfgmodel_fill") self.expbgfgmodel_fill_chooser.SetItems(params.EXPBGFGMODEL_FILL_STRINGS) self.expbgfgmodel_fill_chooser.SetSelection(params.EXPBGFGMODEL_FILL_STRINGS.index(params.expbgfgmodel_fill)) self.frame.Bind( wx.EVT_CHOICE, self.OnExpBGFGModelFillChoice, self.expbgfgmodel_fill_chooser) self.fixbg_button = xrc.XRCCTRL(self.frame,"fixbg_button") self.frame.Bind(wx.EVT_BUTTON,self.OnFixBgClick,self.fixbg_button) self.fixbg_window_open = False self.roi_button = xrc.XRCCTRL(self.frame,"roi_button") self.frame.Bind(wx.EVT_BUTTON,self.OnROIClick,self.roi_button) self.roi_window_open = False # make image window self.img_panel = xrc.XRCCTRL( self.frame, "panel_img" ) box = wx.BoxSizer( wx.VERTICAL ) self.img_panel.SetSizer( box ) self.img_wind = ZoomableImageCanvas( self.img_panel, -1 ) box.Add( self.img_wind, 1, wx.EXPAND ) self.img_panel.SetAutoLayout( True ) self.img_panel.Layout() self.OnNormChoice( None )
def __init__(self,parent,bg): #self.const = bg.const #const.n_frames = bg.n_frames self.bg = bg # copy some settings #self.use_median = bg.use_median #self.n_bg_frames = bg.n_bg_frames #self.bg_firstframe = bg.bg_firstframe #self.bg_lastframe = bg.bg_lastframe # clear buffer self.bg.initialize_buffer() rsrc = xrc.XmlResource( SETTINGS_RSRC_FILE ) self.frame = rsrc.LoadFrame(parent, "bg_settings") self.algorithm = xrc.XRCCTRL( self.frame, "algorithm" ) self.nframes = xrc.XRCCTRL( self.frame, "nframes" ) self.firstframe_box = xrc.XRCCTRL( self.frame, "bg_firstframe" ) self.lastframe_box = xrc.XRCCTRL( self.frame, "bg_lastframe" ) self.expbgfgmodel_checkbox = xrc.XRCCTRL( self.frame, "expbgfgmodel_checkbox") self.expbgfgmodel_text = xrc.XRCCTRL( self.frame, "expbgfgmodel_text") self.expbgfgmodel_button = xrc.XRCCTRL( self.frame, "expbgfgmodel_button") self.expbgfgmodel_llr_thresh = xrc.XRCCTRL(self.frame, "llr_thresh") self.expbgfgmodel_llr_thresh_low = xrc.XRCCTRL(self.frame, "llr_thresh_low") self.calculate = xrc.XRCCTRL( self.frame, "calculate_button" ) if self.bg.use_median: self.algorithm.SetSelection(params.ALGORITHM_MEDIAN) else: self.algorithm.SetSelection(params.ALGORITHM_MEAN) self.nframes.SetValue( str(self.bg.n_bg_frames)) wxvt.setup_validated_integer_callback( self.nframes, xrc.XRCID("nframes"), self.OnTextValidatedNFrames, pending_color=params.wxvt_bg ) self.firstframe_box.SetValue( str(self.bg.bg_firstframe)) wxvt.setup_validated_integer_callback( self.firstframe_box, xrc.XRCID("bg_firstframe"), self.OnTextValidatedFirstframe, pending_color=params.wxvt_bg ) self.lastframe_box.SetValue( str(self.bg.bg_lastframe)) wxvt.setup_validated_integer_callback( self.lastframe_box, xrc.XRCID("bg_lastframe"), self.OnTextValidatedLastframe, pending_color=params.wxvt_bg ) self.frame.Bind( wx.EVT_CHOICE, self.OnAlgorithmChoice, self.algorithm) self.frame.Bind( wx.EVT_BUTTON, self.OnCalculate, self.calculate ) self.expbgfgmodel_text.SetEditable(False) self.frame.Bind(wx.EVT_BUTTON, self.OnChooseExpBGFGModelFileName, self.expbgfgmodel_button) self.frame.Bind(wx.EVT_CHECKBOX, self.OnCheckExpBGFGModel, self.expbgfgmodel_checkbox) wxvt.setup_validated_integer_callback( self.expbgfgmodel_llr_thresh, xrc.XRCID("llr_thresh"), self.OnTextValidatedLLRThresh, pending_color=params.wxvt_bg ) wxvt.setup_validated_integer_callback( self.expbgfgmodel_llr_thresh_low, xrc.XRCID("llr_thresh_low"), self.OnTextValidatedLLRThresh, pending_color=params.wxvt_bg ) self.UpdateExpBGFGModelControls() self.frame.Show()
def ShowBG( self, parent, framenumber, old_thresh, dosub_callback=None ): # clear buffer self.initialize_buffer() self.old_thresh = params.n_bg_std_thresh self.show_frame = framenumber self.bg_idx = -1 self.dosub_callback = dosub_callback rsrc = xrc.XmlResource( THRESH_RSRC_FILE ) self.frame = rsrc.LoadFrame( parent, "frame_Ctrax_bg" ) # calculate background image, if not already done if not hasattr( self, 'center' ): success = self.OnCalculate( parent=parent ) if not success: return # event bindings self.hf.SetFrame(self.frame) self.hf.frame.Bind( wx.EVT_BUTTON, self.OnQuitHF, id=xrc.XRCID("hm_done_button") ) self.hf.frame.Bind( wx.EVT_CLOSE, self.OnQuitHF ) self.menu = self.frame.GetMenuBar() #self.frame.Bind( wx.EVT_MENU, self.OnShowBG, id=xrc.XRCID("menu_show_bg") ) #self.frame.Bind( wx.EVT_MENU, self.OnShowThresh, id=xrc.XRCID("menu_show_thresh") ) #self.frame.Bind( wx.EVT_MENU, self.OnFrameSlider, id=xrc.XRCID("menu_show_bin") ) #self.frame.Bind( wx.EVT_BUTTON, self.OnCalcButton, id=xrc.XRCID("button_calculate") ) #self.frame.Bind( wx.EVT_BUTTON, self.OnResetButton, id=xrc.XRCID("button_reset") ) # control handles self.frame_text = xrc.XRCCTRL( self.frame, "text_frame" ) self.range_text = xrc.XRCCTRL( self.frame, "text_range" ) #self.reset_button = xrc.XRCCTRL( self.frame, "button_reset" ) #if self.old_thresh is None: # self.reset_button.Enable( False ) # set threshold self.thresh_slider = xrc.XRCCTRL( self.frame, "slider_thresh" ) self.thresh_slider.SetScrollbar(self.GetThresholdScrollbar(),0,255,255-25) self.thresh_low_slider = xrc.XRCCTRL( self.frame, "slider_low_thresh" ) self.thresh_low_slider.SetScrollbar(self.GetThresholdLowScrollbar(),0,255,255-25) # we can also input the threshold by typing it; make sure slider and text input # show the same value self.thresh_textinput = xrc.XRCCTRL( self.frame, "threshold_text_input" ) self.frame.Bind( wx.EVT_SCROLL, self.OnThreshSlider, self.thresh_slider ) wxvt.setup_validated_float_callback( self.thresh_textinput, xrc.XRCID("threshold_text_input"), self.OnThreshTextEnter, pending_color=params.wxvt_bg ) self.thresh_low_textinput = xrc.XRCCTRL( self.frame, "low_threshold_text_input" ) self.frame.Bind( wx.EVT_SCROLL, self.OnThreshSlider, self.thresh_low_slider ) wxvt.setup_validated_float_callback( self.thresh_low_textinput, xrc.XRCID("low_threshold_text_input"), self.OnThreshTextEnter, pending_color=params.wxvt_bg ) self.SetThreshold() self.frame_slider = xrc.XRCCTRL( self.frame, "slider_frame" ) self.frame.Bind( wx.EVT_SCROLL, self.OnFrameSlider, self.frame_slider ) self.frame_slider.SetScrollbar(self.show_frame,0,params.n_frames-1,params.n_frames/10) # which image are we showing self.bg_img_chooser = xrc.XRCCTRL( self.frame, "view_type_input" ) if params.use_expbgfgmodel: self.bg_img_chooser.SetItems(params.BG_SHOW_STRINGS+params.EXPBGFGMODEL_SHOW_STRINGS) else: self.bg_img_chooser.SetItems(params.BG_SHOW_STRINGS) if self.show_img_type > self.bg_img_chooser.GetCount(): self.show_img_type = 0 self.bg_img_chooser.SetSelection(self.show_img_type) self.frame.Bind( wx.EVT_CHOICE, self.OnImgChoice, self.bg_img_chooser) # background type self.bg_type_chooser = xrc.XRCCTRL(self.frame,"bg_type_input") if self.bg_type == 'light_on_dark': self.bg_type_chooser.SetSelection( 0 ) elif self.bg_type == 'dark_on_light': self.bg_type_chooser.SetSelection( 1 ) else: self.bg_type_chooser.SetSelection( 2 ) self.frame.Bind(wx.EVT_CHOICE,self.OnBgTypeChoice, self.bg_type_chooser) # minimum bg std self.bg_minstd_textinput = xrc.XRCCTRL(self.frame,"bg_min_std_input") wxvt.setup_validated_float_callback( self.bg_minstd_textinput, xrc.XRCID("bg_min_std_input"), self.OnMinStdTextEnter, pending_color=params.wxvt_bg ) self.bg_minstd_textinput.SetValue( str(params.bg_std_min) ) # maximum bg std self.bg_maxstd_textinput = xrc.XRCCTRL(self.frame,"bg_max_std_input") wxvt.setup_validated_float_callback( self.bg_maxstd_textinput, xrc.XRCID("bg_max_std_input"), self.OnMinStdTextEnter, pending_color=params.wxvt_bg ) self.bg_maxstd_textinput.SetValue( str(params.bg_std_max) ) # normalization type self.bg_norm_chooser = xrc.XRCCTRL(self.frame,"bg_normalization_input") if self.norm_type == 'homomorphic': self.bg_norm_chooser.SetSelection( 2 ) elif self.norm_type == 'intensity': self.bg_norm_chooser.SetSelection( 1 ) else: self.bg_norm_chooser.SetSelection( 0 ) self.frame.Bind( wx.EVT_CHOICE, self.OnNormChoice, self.bg_norm_chooser) # homomorphic filter settings dialog self.hf_button = xrc.XRCCTRL(self.frame,"homomorphic_settings") self.hf_button.Enable(False) self.frame.Bind(wx.EVT_BUTTON,self.OnHFClick,self.hf_button) self.hf_window_open = False # detect arena button self.detect_arena_button = xrc.XRCCTRL(self.frame,"detect_arena_button") self.detect_arena_checkbox = xrc.XRCCTRL(self.frame,"detect_arena_checkbox") self.detect_arena_button.Enable(params.do_set_circular_arena) self.detect_arena_checkbox.SetValue(params.do_set_circular_arena) self.frame.Bind(wx.EVT_BUTTON,self.OnDetectArenaClick,self.detect_arena_button) self.frame.Bind(wx.EVT_CHECKBOX,self.OnDetectArenaCheck,self.detect_arena_checkbox) self.detect_arena_window_open = False # min value for isarena self.min_nonarena_textinput = xrc.XRCCTRL(self.frame,"min_nonfore_intensity_input") wxvt.setup_validated_float_callback( self.min_nonarena_textinput, xrc.XRCID("min_nonfore_intensity_input"), self.OnMinNonArenaTextEnter, pending_color=params.wxvt_bg ) self.min_nonarena_textinput.SetValue( str(params.min_nonarena )) # min value for isarena self.max_nonarena_textinput = xrc.XRCCTRL(self.frame,"max_nonfore_intensity_input") wxvt.setup_validated_float_callback( self.max_nonarena_textinput, xrc.XRCID("max_nonfore_intensity_input"), self.OnMaxNonArenaTextEnter, pending_color=params.wxvt_bg ) self.max_nonarena_textinput.SetValue( str(params.max_nonarena )) # morphology self.morphology_checkbox = xrc.XRCCTRL(self.frame,"morphology_checkbox") self.morphology_checkbox.SetValue(params.do_use_morphology) self.frame.Bind(wx.EVT_CHECKBOX,self.OnMorphologyCheck,self.morphology_checkbox) self.opening_radius_textinput = xrc.XRCCTRL(self.frame,"opening_radius") wxvt.setup_validated_integer_callback( self.opening_radius_textinput, xrc.XRCID("opening_radius"), self.OnOpeningRadiusTextEnter, pending_color=params.wxvt_bg ) self.opening_radius_textinput.SetValue( '%d'%params.opening_radius ) self.opening_radius_textinput.Enable(params.do_use_morphology) self.closing_radius_textinput = xrc.XRCCTRL(self.frame,"closing_radius") self.opening_struct = self.create_morph_struct(params.opening_radius) wxvt.setup_validated_integer_callback( self.closing_radius_textinput, xrc.XRCID("closing_radius"), self.OnClosingRadiusTextEnter, pending_color=params.wxvt_bg ) self.closing_radius_textinput.SetValue( '%d'%params.closing_radius ) self.closing_radius_textinput.Enable(params.do_use_morphology) self.closing_struct = self.create_morph_struct(params.closing_radius) # prior model stuff # whether to show the panel self.expbgfgmodel_panel = xrc.XRCCTRL(self.frame,"expbgfgmodel_panel") self.expbgfgmodel_panel.Show(params.use_expbgfgmodel) # minimum fraction of frames nec. for estimating bg model self.min_frac_frames_isback_textinput = xrc.XRCCTRL(self.frame,"min_frac_frames_isback") wxvt.setup_validated_float_callback( self.min_frac_frames_isback_textinput, xrc.XRCID("min_frac_frames_isback"), self.OnMinFracFramesIsBackTextEnter, pending_color=params.wxvt_bg ) # fill self.expbgfgmodel_fill_chooser = xrc.XRCCTRL(self.frame,"expbgfgmodel_fill") self.expbgfgmodel_fill_chooser.SetItems(params.EXPBGFGMODEL_FILL_STRINGS) self.expbgfgmodel_fill_chooser.SetSelection(params.EXPBGFGMODEL_FILL_STRINGS.index(params.expbgfgmodel_fill)) self.frame.Bind( wx.EVT_CHOICE, self.OnExpBGFGModelFillChoice, self.expbgfgmodel_fill_chooser) self.fixbg_button = xrc.XRCCTRL(self.frame,"fixbg_button") self.frame.Bind(wx.EVT_BUTTON,self.OnFixBgClick,self.fixbg_button) self.fixbg_window_open = False self.roi_button = xrc.XRCCTRL(self.frame,"roi_button") self.frame.Bind(wx.EVT_BUTTON,self.OnROIClick,self.roi_button) self.roi_window_open = False # make image window self.img_panel = xrc.XRCCTRL( self.frame, "panel_img" ) box = wx.BoxSizer( wx.VERTICAL ) self.img_panel.SetSizer( box ) self.img_wind = ZoomableImageCanvas( self.img_panel, -1 ) box.Add( self.img_wind, 1, wx.EXPAND ) self.img_panel.SetAutoLayout( True ) self.img_panel.Layout()