def on_click(self,event): if event.button == 3: # Set redshift # Line list? try: self.pltline_widg.llist['List'] except KeyError: print('Set a line list first!!') return # if self.pltline_widg.llist[self.pltline_widg.llist['List']] == 'None': return self.select_line_widg = xspw.SelectLineWidget( self.pltline_widg.llist[self.pltline_widg.llist['List']]._data) self.select_line_widg.exec_() line = self.select_line_widg.line if line.strip() == 'None': return # quant = line.split('::')[1].lstrip() spltw = quant.split(' ') wrest = Quantity(float(spltw[0]), unit=spltw[1]) z = event.xdata/wrest.value - 1. self.pltline_widg.llist['z'] = z self.statusBar().showMessage('z = {:f}'.format(z)) self.pltline_widg.zbox.setText(self.pltline_widg.zbox.z_frmt.format( self.pltline_widg.llist['z'])) # Draw self.spec_widg.on_draw()
def on_key(self, event): if event.key == 'z': self.z = self.vplt_widg.z self.pltline_widg.llist['z'] = self.z self.pltline_widg.zbox.setText( self.pltline_widg.zbox.z_frmt.format(self.z)) if event.key == 'T': # Try another rest wavelength for input line # Get line from User self.select_line_widg = xspw.SelectLineWidget( self.pltline_widg.llist[self.pltline_widg.llist['List']]._data) self.select_line_widg.exec_() line = self.select_line_widg.line quant = line.split('::')[1].lstrip() spltw = quant.split(' ') wrest = Quantity(float(spltw[0]), unit=spltw[1]) # Set redshift self.z = self.sel_wv / wrest - 1. print('Setting z = {:g}'.format(self.z)) self.pltline_widg.llist['z'] = self.z self.pltline_widg.zbox.setText( self.pltline_widg.zbox.z_frmt.format(self.z)) self.vplt_widg.z = self.pltline_widg.llist['z'] # Reset self.vplt_widg.init_lines() self.vplt_widg.on_draw()
def on_click(self,event): if event.button == 3: # Set redshift if self.pltline_widg.llist['List'] is None: return self.select_line_widg = xspw.SelectLineWidget( self.pltline_widg.llist[self.pltline_widg.llist['List']]) self.select_line_widg.exec_() line = self.select_line_widg.line if line.strip() == 'None': return # wrest = float(line.split('::')[1].lstrip()) z = event.xdata/wrest - 1. self.pltline_widg.llist['z'] = z self.statusBar().showMessage('z = {:f}'.format(z)) self.pltline_widg.zbox.setText('{:.5f}'.format(self.pltline_widg.llist['z'])) # Draw self.spec_widg.on_draw()
def on_key(self, event): # Init rescale = True fig_clear = False wrest = None flg = 1 sv_idx = self.idx_line ## Change rows/columns if event.key == 'k': self.sub_xy[0] = max(0, self.sub_xy[0] - 1) if event.key == 'K': self.sub_xy[0] = self.sub_xy[0] + 1 if event.key == 'c': self.sub_xy[1] = max(1, self.sub_xy[1] - 1) if event.key == 'C': self.sub_xy[1] = max(1, self.sub_xy[1] + 1) ## NAVIGATING if event.key in self.psdict['nav']: flg = xxgu.navigate(self.psdict, event) if event.key == '-': self.idx_line = max(0, self.idx_line - self.sub_xy[0] * self.sub_xy[1]) # Min=0 if self.idx_line == sv_idx: print('Edge of list') if event.key == '=': self.idx_line = min( len(self.llist['show_line']) - self.sub_xy[0] * self.sub_xy[1], self.idx_line + self.sub_xy[0] * self.sub_xy[1]) if self.idx_line == sv_idx: print('Edge of list') # Find line try: wrest = event.inaxes.get_gid() except AttributeError: return else: wvobs = wrest * (1 + self.z) pass ## Fiddle with a Component if event.key in ['N', 'n', 'v', 'V', 'R']: if self.parent.fiddle_widg.component is None: print('Need to generate a component first!') return if event.key == 'N': self.parent.fiddle_widg.component.attrib['N'] += 0.05 elif event.key == 'n': self.parent.fiddle_widg.component.attrib['N'] -= 0.05 elif event.key == 'v': self.parent.fiddle_widg.component.attrib['b'] -= 2 * u.km / u.s elif event.key == 'V': self.parent.fiddle_widg.component.attrib['b'] += 2 * u.km / u.s elif event.key == 'R': # Refit self.fit_component(self.parent.fiddle_widg.component) # Updates (this captures them all and redraws) self.parent.fiddle_widg.update_component() ## Grab/Delete a component if event.key in ['D', 'S']: components = self.parent.comps_widg.all_comp iwrest = np.array([comp.init_wrest.value for comp in components]) * u.AA mtc = np.where(wrest == iwrest)[0] if len(mtc) == 0: return #QtCore.pyqtRemoveInputHook() #xdb.set_trace() #QtCore.pyqtRestoreInputHook() dvz = np.array([ 3e5 * (self.z - components[mt].zcomp) / (1 + self.z) for mt in mtc ]) # Find minimum mindvz = np.argmin(np.abs(dvz + event.xdata)) if event.key == 'S': self.parent.fiddle_widg.init_component(components[mtc[mindvz]]) elif event.key == 'D': self.parent.delete_component(components[mtc[mindvz]]) #absline = self.abs_sys.grab_line((self.z,wrest)) #kwrest = wrest.value ## Reset z if event.key == 'z': from xastropy.relativity import velocities newz = velocities.z_from_v(self.z, event.xdata) self.z = newz #self.abs_sys.zabs = newz # Drawing self.psdict['xmnx'] = self.vmnx.value if event.key == "%": # GUI self.select_line_widg = xspw.SelectLineWidget( self.llist[self.llist['List']]._data) self.select_line_widg.exec_() line = self.select_line_widg.line if line.strip() == 'None': return # quant = line.split('::')[1].lstrip() spltw = quant.split(' ') wrest = Quantity(float(spltw[0]), unit=spltw[1]) # self.z = (wvobs / wrest - 1.).value #self.statusBar().showMessage('z = {:f}'.format(z)) self.init_lines() ## Velocity limits unit = u.km / u.s if event.key in ['1', '2']: if event.key == '1': self.vmin = event.xdata * unit if event.key == '2': #QtCore.pyqtRemoveInputHook() #xdb.set_trace() #QtCore.pyqtRestoreInputHook() absline.analy['vlim'][1] = event.xdata * unit self.update_component() ## Add component if event.key == 'A': # Add to lines if self.flag_add is False: self.vtmp = event.xdata self.flag_add = True self.wrest = wrest else: self.avmnx = np.array([ np.minimum(self.vtmp, event.xdata), np.maximum(self.vtmp, event.xdata) ]) * unit self.add_component(wrest) # Reset self.flag_add = False self.wrest = 0. # Fiddle with analysis mask if event.key in ['x']: if self.flag_mask is False: self.wrest = wrest self.wtmp = wvobs * (1 + event.xdata / 3e5) self.vtmp = event.xdata self.flag_mask = True else: wtmp2 = wvobs * (1 + event.xdata / 3e5) twvmnx = [ np.minimum(self.wtmp, wtmp2), np.maximum(self.wtmp, wtmp2) ] # Modify mask mskp = np.where((self.spec.dispersion > twvmnx[0]) & (self.spec.dispersion < twvmnx[1]))[0] #print(twvmnx,len(mskp)) if event.key == 'x': self.spec.mask[mskp] = 0 # Reset self.flag_mask = False self.wrest = 0. # Labels if event.key == 'L': # Toggle ID lines self.flag_idlbl = ~self.flag_idlbl # AODM plot if event.key == ':': # # Grab good lines from xastropy.xguis import spec_guis as xsgui gdl = [ iline.wrest for iline in self.abs_sys.lines if iline.analy['do_analysis'] > 0 ] # Launch AODM if len(gdl) > 0: gui = xsgui.XAODMGui(self.spec, self.z, gdl, vmnx=self.vmnx, norm=self.norm) gui.exec_() else: print('VelPlot.AODM: No good lines to plot') #QtCore.pyqtRemoveInputHook() #xdb.set_trace() #QtCore.pyqtRestoreInputHook() #if wrest is not None: # Single window # flg = 3 if event.key in [ 'c', 'C', 'k', 'K', 'W', '!', '@', '=', '-', 'X', 'z', 'R' ]: # Redraw all flg = 1 if event.key in ['Y']: rescale = False if event.key in ['k', 'c', 'C', 'K', 'R']: fig_clear = True if flg == 1: # Default is to redraw self.on_draw(rescale=rescale, fig_clear=fig_clear) elif flg == 2: # Layer (no clear) self.on_draw(replot=False, rescale=rescale) elif flg == 3: # Layer (no clear) self.on_draw(in_wrest=wrest, rescale=rescale)