def __init__(self, ispec, guessfile=None, parent=None, zsys=None, norm=None, exten=None, rsp_kwargs={}, unit_test=False, screen_scale=1., **kwargs): QMainWindow.__init__(self, parent) """ ispec = str, XSpectrum1D or tuple of arrays Input spectrum or spectrum filename. If tuple then (wave, fx), (wave, fx, sig) or (wave, fx, sig, co) guessfile : str, optional name of the .json file generated with igmguesses GUI in Pyigm (see https://github.com/pyigm/pyigm/blob/master/docs/igmguesses.rst) if not None - overplot fitted line profiles from igmguesses parent : Widget parent, optional zsys : float, optional intial redshift exten : int, optional extension for the spectrum in multi-extension FITS file norm : bool, optional True if the spectrum is normalized screen_scale : float, optional Scale the default sizes for the gui size """ #reload(ltgl) #reload(ltgsp) # INIT #QtCore.pyqtRemoveInputHook() #xdb.set_trace() #QtCore.pyqtRestoreInputHook() self.scale = screen_scale # Needed to avoid crash in large spectral files rcParams['agg.path.chunksize'] = 20000 rcParams[ 'axes.formatter.useoffset'] = False # avoid scientific notation in axes tick labels # Build a widget combining several others self.main_widget = QWidget() # Status bar self.create_status_bar() # Grab the pieces and tie together self.pltline_widg = ltgl.PlotLinesWidget(status=self.statusBar, init_z=zsys, screen_scale=self.scale) self.pltline_widg.setMaximumWidth(300 * self.scale) ## Abs sys abs_sys = None voigtsfit = None if guessfile is not None: # Load ism = LineList('ISM') igm_guess = ltu.loadjson(guessfile) comps = [] for key in igm_guess['cmps'].keys(): comp = AbsComponent.from_dict(igm_guess['cmps'][key], chk_vel=False, linelist=ism) comps.append(comp) abs_sys = ltiu.build_systems_from_components( comps, vsys=500. * u.km / u.s) # ,chk_z=False) ### 100000.*u.km/u.s ok ### voigt fit - added # Spectrum spec, spec_fil = ltgu.read_spec(ispec, exten=exten, norm=norm, rsp_kwargs=rsp_kwargs) voigtsfit = np.asarray([0] * len(spec.wavelength)) alllines = [] for iabs_sys in abs_sys: lines = iabs_sys.list_of_abslines() alllines = alllines + lines if len(alllines) > 0: voigtsfit = lav.voigt_from_abslines(spec.wavelength, alllines, fwhm=3.).flux.value if not norm: voigtsfit = voigtsfit * spec.co # Hook the spec widget to Plot Line self.spec_widg = ltgsp.ExamineSpecWidget(ispec, guessfile=guessfile, voigtsfit=voigtsfit, status=self.statusBar, parent=self, llist=self.pltline_widg.llist, zsys=zsys, norm=norm, exten=exten, abs_sys=abs_sys, screen_scale=self.scale, rsp_kwargs=rsp_kwargs, **kwargs) # Reset redshift from spec if zsys is None: if hasattr(self.spec_widg.spec, 'z'): self.pltline_widg.setz( str(self.spec_widg.spec.z[self.spec_widg.select])) # Auto set line list if spec has proper object type if hasattr(self.spec_widg.spec, 'stypes'): if self.spec_widg.spec.stypes[ self.spec_widg.select].lower() == 'galaxy': self.pltline_widg.llist = ltgu.set_llist( 'Galaxy', in_dict=self.pltline_widg.llist) elif self.spec_widg.spec.stypes[ self.spec_widg.select].lower() == 'absorber': self.pltline_widg.llist = ltgu.set_llist( 'Strong', in_dict=self.pltline_widg.llist) self.pltline_widg.llist['Plot'] = True idx = self.pltline_widg.lists.index( self.pltline_widg.llist['List']) self.pltline_widg.llist_widget.setCurrentRow(idx) # self.pltline_widg.spec_widg = self.spec_widg # Multi spec self.mspec_widg = ltgsp.MultiSpecWidget(self.spec_widg) self.spec_widg.canvas.mpl_connect('button_press_event', self.on_click) # Layout # Extras extras = QWidget() extras.setMinimumWidth(180 * self.scale) extras.setMaximumWidth(280 * self.scale) vbox = QVBoxLayout() qbtn = QPushButton(self) qbtn.setText('Quit') qbtn.clicked.connect(self.quit) vbox.addWidget(self.pltline_widg) vbox.addWidget(self.mspec_widg) vbox.addWidget(qbtn) extras.setLayout(vbox) # Main window hbox = QHBoxLayout() hbox.addWidget(self.spec_widg) hbox.addWidget(extras) self.main_widget.setLayout(hbox) # Point MainWindow self.setCentralWidget(self.main_widget) if unit_test: self.quit()
def __init__(self, ispec, z=None, parent=None, llist=None, norm=True, vmnx=[-300., 300.]*u.km/u.s, abs_sys=None, outfil='dum_kin.json', sel_wv=None): """ spec : Filename or Spectrum1D Norm : Bool (False) Normalized spectrum? abs_sys : AbsSystem Absorption system class sel_wv : Selected wavelength. Used to inspect a single, unknown line """ super(AbsKinGui, self).__init__(parent) # Initialize self.abs_sys = abs_sys if self.abs_sys is not None: self.z = self.abs_sys.zabs else: if z is None: raise ValueError('AbsKin: Need to set abs_sys or z!') self.z = z self.vmnx = vmnx self.outfil = outfil self.norm = norm self.sel_wv = sel_wv # Grab the pieces and tie together self.vplt_widg = xspw.VelPlotWidget(ispec, abs_sys=self.abs_sys, llist=llist, vmnx=self.vmnx, z=self.z, norm=self.norm) self.pltline_widg = ltgl.PlotLinesWidget(init_llist=self.vplt_widg.llist, init_z=self.z) #self.pltline_widg.spec_widg = self.vplt_widg self.slines = ltgl.SelectedLinesWidget(self.vplt_widg.llist[self.vplt_widg.llist['List']], init_select=self.vplt_widg.llist['show_line'], plot_widget=self.vplt_widg) # Connections self.pltline_widg.llist_widget.currentItemChanged.connect(self.on_llist_change) self.connect(self.pltline_widg.zbox, QtCore.SIGNAL('editingFinished ()'), self.setz) self.vplt_widg.canvas.mpl_connect('key_press_event', self.on_key) # Outfil wbtn = QtGui.QPushButton('Write', self) wbtn.setAutoDefault(False) wbtn.clicked.connect(self.write_out) self.out_box = QtGui.QLineEdit() self.out_box.setText(self.outfil) self.connect(self.out_box, QtCore.SIGNAL('editingFinished ()'), self.set_outfil) #QtCore.pyqtRemoveInputHook() #xdb.set_trace() #QtCore.pyqtRestoreInputHook() # Quit buttons = QtGui.QWidget() wqbtn = QtGui.QPushButton('Write+Quit', self) wqbtn.setAutoDefault(False) wqbtn.clicked.connect(self.write_quit) qbtn = QtGui.QPushButton('Quit', self) qbtn.setAutoDefault(False) qbtn.clicked.connect(self.quit) # Sizes lines_widg = QtGui.QWidget() lines_widg.setMaximumWidth(300) lines_widg.setMinimumWidth(200) # Layout vbox = QtGui.QVBoxLayout() vbox.addWidget(self.pltline_widg) vbox.addWidget(self.slines) vbox.addWidget(wbtn) vbox.addWidget(self.out_box) # Write/Quit buttons hbox1 = QtGui.QHBoxLayout() hbox1.addWidget(wqbtn) hbox1.addWidget(qbtn) buttons.setLayout(hbox1) # vbox.addWidget(buttons) lines_widg.setLayout(vbox) hbox = QtGui.QHBoxLayout() hbox.addWidget(self.vplt_widg) hbox.addWidget(lines_widg) self.setLayout(hbox) # Initial draw self.vplt_widg.on_draw()
def __init__(self, ispec, abs_sys, parent=None, llist=None, norm=True, vmnx=[-300., 300.] * u.km / u.s, outfil=None): """ spec : Filename or Spectrum1D abs_sys : AbsSystem Absorption system class Norm : bool, optional Normalized spectrum? """ from linetools.guis import spec_widgets as ltgs super(XAbsSysGui, self).__init__(parent) # Initialize self.abs_sys = abs_sys self.z = self.abs_sys.zabs abs_lines = abs_sys.list_of_abslines() self.vmnx = vmnx if outfil is None: self.outfil = 'tmp_abskin.json' warnings.warn( "Outfil not specified. Using {:s} as the default".format( self.outfil)) else: self.outfil = outfil self.norm = norm # Grab the pieces and tie together newfont = QtGui.QFont("Times", 10, QtGui.QFont.Bold) sys_label = QtGui.QLabel('Name: \n {:s}'.format(abs_sys.name)) sys_label.setFont(newfont) self.vplt_widg = ltgs.VelPlotWidget(ispec, self.z, abs_lines=abs_lines, llist=llist, vmnx=self.vmnx, norm=self.norm) self.pltline_widg = ltgl.PlotLinesWidget( init_llist=self.vplt_widg.llist, init_z=self.z, edit_z=False) #self.pltline_widg.spec_widg = self.vplt_widg self.slines = ltgl.SelectedLinesWidget( self.vplt_widg.llist[self.vplt_widg.llist['List']], init_select=self.vplt_widg.llist['show_line'], plot_widget=self.vplt_widg) # Connections self.pltline_widg.llist_widget.currentItemChanged.connect( self.on_llist_change) #self.connect(self.pltline_widg.zbox, QtCore.SIGNAL('editingFinished ()'), self.setz) self.vplt_widg.canvas.mpl_connect('key_press_event', self.on_key) # Outfil wbtn = QtGui.QPushButton('Write', self) wbtn.setAutoDefault(False) wbtn.clicked.connect(self.write_out) self.out_box = QtGui.QLineEdit() self.out_box.setText(self.outfil) self.connect(self.out_box, QtCore.SIGNAL('editingFinished ()'), self.set_outfil) #QtCore.pyqtRemoveInputHook() #pdb.set_trace() #QtCore.pyqtRestoreInputHook() # Quit buttons = QtGui.QWidget() wqbtn = QtGui.QPushButton('Write+Quit', self) wqbtn.setAutoDefault(False) wqbtn.clicked.connect(self.write_quit) qbtn = QtGui.QPushButton('Quit', self) qbtn.setAutoDefault(False) qbtn.clicked.connect(self.quit) # Sizes lines_widg = QtGui.QWidget() lines_widg.setMaximumWidth(300) lines_widg.setMinimumWidth(200) # Layout vbox = QtGui.QVBoxLayout() vbox.addWidget(sys_label) vbox.addWidget(self.pltline_widg) vbox.addWidget(self.slines) vbox.addWidget(wbtn) vbox.addWidget(self.out_box) # Write/Quit buttons hbox1 = QtGui.QHBoxLayout() hbox1.addWidget(wqbtn) hbox1.addWidget(qbtn) buttons.setLayout(hbox1) # vbox.addWidget(buttons) lines_widg.setLayout(vbox) hbox = QtGui.QHBoxLayout() hbox.addWidget(self.vplt_widg) hbox.addWidget(lines_widg) self.setLayout(hbox) # Initial draw self.vplt_widg.on_draw()
def __init__(self, ispec, parent=None, zsys=None, norm=None, exten=None, rsp_kwargs={}, unit_test=False, screen_scale=1., **kwargs): QMainWindow.__init__(self, parent) """ ispec = str, XSpectrum1D or tuple of arrays Input spectrum or spectrum filename. If tuple then (wave, fx), (wave, fx, sig) or (wave, fx, sig, co) parent : Widget parent, optional zsys : float, optional intial redshift exten : int, optional extension for the spectrum in multi-extension FITS file norm : bool, optional True if the spectrum is normalized screen_scale : float, optional Scale the default sizes for the gui size """ #reload(ltgl) #reload(ltgsp) # INIT #QtCore.pyqtRemoveInputHook() #xdb.set_trace() #QtCore.pyqtRestoreInputHook() self.scale = screen_scale # Needed to avoid crash in large spectral files rcParams['agg.path.chunksize'] = 20000 rcParams['axes.formatter.useoffset'] = False # avoid scientific notation in axes tick labels # Build a widget combining several others self.main_widget = QWidget() # Status bar self.create_status_bar() # Grab the pieces and tie together self.pltline_widg = ltgl.PlotLinesWidget(status=self.statusBar, init_z=zsys, screen_scale=self.scale) self.pltline_widg.setMaximumWidth(300*self.scale) # Hook the spec widget to Plot Line self.spec_widg = ltgsp.ExamineSpecWidget(ispec,status=self.statusBar, parent=self, llist=self.pltline_widg.llist, zsys=zsys, norm=norm, exten=exten, screen_scale=self.scale, rsp_kwargs=rsp_kwargs, **kwargs) self.pltline_widg.spec_widg = self.spec_widg self.spec_widg.canvas.mpl_connect('button_press_event', self.on_click) extras = QWidget() extras.setMaximumWidth(130*self.scale) vbox = QVBoxLayout() qbtn = QPushButton(self) qbtn.setText('Quit') qbtn.clicked.connect(self.quit) vbox.addWidget(self.pltline_widg) vbox.addWidget(qbtn) extras.setLayout(vbox) hbox = QHBoxLayout() hbox.addWidget(self.spec_widg) hbox.addWidget(extras) self.main_widget.setLayout(hbox) # Point MainWindow self.setCentralWidget(self.main_widget) if unit_test: self.quit()
def __init__(self, redrock_file, parent=None, zdict=None, coadd_dict=None, outfile='tmp.json', unit_test=False, screen_scale=1., **kwargs): QMainWindow.__init__(self, parent) """ redrock_file = str Input RedRock output FITS file from our redrock script parent : Widget parent, optional zsys : float, optional intial redshift either from a previous vet_rr json or the original rr guesses screen_scale : float, optional Scale the default sizes for the gui size """ # Load up self.outfile = outfile self.rr_hdul = fits.open(redrock_file) if coadd_dict is not None: self.slit_info = {} for key in coadd_dict.keys(): if isinstance(coadd_dict[key], dict): if '2D_xval' in coadd_dict[key].keys(): name = coadd_dict[key]['outfile'].replace('.fits', '') self.slit_info[name] = {} self.slit_info[name]['xval'] = coadd_dict[key][ '2D_xval'] self.slit_info[name]['Gslit'] = coadd_dict[key][ 'Gemini_slit'] else: self.slit_info = None # names, spectra, zs = [], [], [] names, spectra = [], [] if zdict is None: self.zdict = OrderedDict() load_z = True else: self.zdict = OrderedDict() load_z = False for hdu in self.rr_hdul[1:]: # Grab the spectrum spec_file = hdu.name # tmp = XSpectrum1D.from_file(spec_file.replace('FITS','fits')) spectra.append( XSpectrum1D.from_file(spec_file.replace('FITS', 'fits'), masking='edges')) names.append(spec_file.replace('.FITS', '')) # RedRock data = hdu.data # Init the dict if load_z: self.zdict[names[-1]] = {} self.zdict[names[-1]]['zRR'] = data['z'] self.zdict[names[-1]]['ZQ'] = -99 self.zdict[names[-1]]['Comment'] = '' self.zdict[names[-1]]['z'] = data['z'][0] else: self.zdict[names[-1]] = zdict[names[-1]] # Collate ispec = lspu.collate(spectra, masking='edges') # Fill ispec.labels = names ispec.stypes = ['galaxy'] * ispec.nspec # ispec.z = zs # DO NOT SET THE REDSHIFT HERE self.RRi = 0 self.scale = screen_scale # Needed to avoid crash in large spectral files rcParams['agg.path.chunksize'] = 20000 # avoid scientific notation in axes tick labels rcParams['axes.formatter.useoffset'] = False # Build a widget combining several others self.main_widget = QWidget() # Status bar self.create_status_bar() # ZQ window self.ZQ_widg = ltgsm.EditBox(-99, 'ZQ', '{:d}') self.ZQ_values = [-99, -1, 0, 1, 3, 4] # Comment window self.comment_widg = ltgsm.EditBox('', 'Comment', '{:s}') # Grab the pieces and tie together self.pltline_widg = ltgl.PlotLinesWidget(status=self.statusBar, screen_scale=self.scale) self.pltline_widg.setMaximumWidth(300 * self.scale) # Hook the spec widget to Plot Line self.spec_widg = ltgsp.ExamineSpecWidget(ispec, status=self.statusBar, parent=self, llist=self.pltline_widg.llist, screen_scale=self.scale, **kwargs) # Reset redshift from spec # Auto set line list if spec has proper object type if hasattr(self.spec_widg.spec, 'stypes'): if self.spec_widg.spec.stypes[ self.spec_widg.select].lower() == 'galaxy': self.pltline_widg.llist = ltgu.set_llist( 'Galaxy', in_dict=self.pltline_widg.llist) elif self.spec_widg.spec.stypes[ self.spec_widg.select].lower() == 'absorber': self.pltline_widg.llist = ltgu.set_llist( 'Strong', in_dict=self.pltline_widg.llist) self.pltline_widg.llist['Plot'] = True idx = self.pltline_widg.lists.index( self.pltline_widg.llist['List']) self.pltline_widg.llist_widget.setCurrentRow(idx) # self.pltline_widg.spec_widg = self.spec_widg # Multi spec self.mspec_widg = ltgsp.MultiSpecWidget(self.spec_widg, extra_method=self) self.spec_widg.canvas.mpl_connect('key_press_event', self.on_key) self.spec_widg.canvas.mpl_connect('button_press_event', self.on_click) self.prev_select = 0 # Index of previous spectrum; starts at 0 # Legend -- specific to this GUI self.legend = {} self.wv_dict = {'*': 3727., '(': 3950., ')': 4940., '_': 6564.} self.legend['zoom'] = self.wv_dict self.legend['&'] = 'Toggle through ZQ' self.legend[ '#'] = 'Toggle through zRR (WARNING: will not necessary start at the first one)' self.legend['%'] = 'Set z=0 (for stars)' self.legend['9'] = 'Skip to next spectrum with ZQ=-99' self.legend['x'] = 'Next spectrum' for key, value in self.legend.items(): print(key, value) # Extras extras = QWidget() extras.setMinimumWidth(180 * self.scale) extras.setMaximumWidth(280 * self.scale) vbox = QVBoxLayout() qbtn = QPushButton(self) qbtn.setText('Quit') qbtn.clicked.connect(self.quit) vbox.addWidget(self.pltline_widg) vbox.addWidget(self.ZQ_widg) vbox.addWidget(self.comment_widg) vbox.addWidget(self.mspec_widg) vbox.addWidget(qbtn) extras.setLayout(vbox) # Main window hbox = QHBoxLayout() hbox.addWidget(self.spec_widg) hbox.addWidget(extras) self.main_widget.setLayout(hbox) # Point MainWindow self.setCentralWidget(self.main_widget) if unit_test: self.quit() # Giddy up self.run_with_select(save=False)