示例#1
0
    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()
示例#2
0
 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()
示例#3
0
    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()
示例#4
0
    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)