def test_fromtodict(): SiIIcomp1,_ = mk_comp('SiII',vlim=[-300.,50.]*u.km/u.s, add_spec=True) cdict = SiIIcomp1.to_dict() # assert isinstance(cdict, dict) assert cdict['Zion'] == (14, 2) # And instantiate newcomp = AbsComponent.from_dict(cdict) assert isinstance(newcomp, AbsComponent) newcomp = AbsComponent.from_dict(cdict, coord=SkyCoord(0,0, unit='deg'))
def test_fromtodict(): SiIIcomp1, _ = mk_comp('SiII', vlim=[-300., 50.] * u.km / u.s, add_spec=True) cdict = SiIIcomp1.to_dict() # assert isinstance(cdict, dict) assert cdict['Zion'] == (14, 2) # And instantiate newcomp = AbsComponent.from_dict(cdict) assert isinstance(newcomp, AbsComponent) newcomp = AbsComponent.from_dict(cdict, coord=SkyCoord(0, 0, unit='deg'))
def complist_from_igmgjson(igmguesses_json): """Creates a list of AbsComponenbts from a igmguesses_json file Parameters ---------- igmguesses_json : str Name of the json file genereted by IGMGUESSES Returns ------- comp_list : list of AbsComponents A list of AbsComponents """ return ltiio.read_igmg_to_components(igmguesses_json, linelist='ISM') # Read the JSON file with open(igmguesses_json) as data_file: igmg_dict = json.load(data_file) # Components comp_list = [] for ii, key in enumerate(igmg_dict['cmps'].keys()): comp_dict = igmg_dict['cmps'][key] comp_dict['flag_N'] = 1 comp_dict['logN'] = comp_dict['Nfit'] comp_dict['sig_logN'] = -1 # import pdb; pdb.set_trace() try: comp = AbsComponent.from_dict(comp_dict, chk_sep=False, chk_data=False, chk_vel=False, linelist="ISM") except: comp = AbsComponent.from_dict(comp_dict, chk_sep=False, chk_data=False, chk_vel=False, linelist='H2') # add extra attributes manually comp.attrib['b'] = comp_dict['bfit'] comp.attrib['sig_b'] = -1 comp.attrib['reliability'] = comp_dict['Reliability'] comp_list += [comp] return comp_list
def json_eqw(json_file, fits_file, outfile, overwrite=False): ion_name = [] restwave = [] col = [] col_err = [] flag = [] zcomp = [] if not os.path.isfile(json_file): return np.array(ion_name), np.array(restwave), np.array(col), \ np.array(col_err), np.array(flag), np.array(zcomp) if not os.path.isfile(outfile) or overwrite == True: out = open(outfile, 'w') out.write('#ion_name, restwave, logN, logN_err, flag_N, zcomp\n') with open(json_file) as data_file: igmg_dict = json.load(data_file) comp_list = [] for ii, key in enumerate(igmg_dict['cmps'].keys()): comp = AbsComponent.from_dict(igmg_dict['cmps'][key], chk_sep=False, chk_data=False, chk_vel=False) comp_list += [comp] spec = readspec(fits_file) for i, cc in enumerate(comp_list): for j, al in enumerate(cc._abslines): al.analy['spec'] = spec al.measure_ew() al.measure_aodm() ion_name.append(al.ion_name) restwave.append(al.wrest.value) col.append(al.attrib['logN']) sig_logN = al.attrib['sig_logN'] if np.isnan(sig_logN): sig_logN = 0.0 col_err.append(sig_logN) flag.append(al.attrib['flag_N']) zcomp.append(al.z) out.write('%s\t%f\t%e\t%e\t%d\t%0.6f\n'%(al.ion_name, al.wrest.value, \ al.attrib['logN'], sig_logN, al.attrib['flag_N'], al.z)) out.close() if os.path.isfile(outfile) and len(open(outfile).readlines()) > 1: ion_name = np.loadtxt(outfile, unpack=True, skiprows=1, usecols=0, dtype='str') restwave, col, col_err, flag, zcomp = \ np.loadtxt(outfile, unpack = True, skiprows = 1, usecols = (1, 2, 3, 4, 5)) return np.array(ion_name), np.array(restwave), np.array(col), np.array( col_err), np.array(flag), np.array(zcomp)
def complist_from_igmgjson(igmguesses_json): """Creates a list of AbsComponenbts from a igmguesses_json file Parameters ---------- igmguesses_json : str Name of the json file genereted by IGMGUESSES Returns ------- comp_list : list of AbsComponents A list of AbsComponents """ return ltiio.read_igmg_to_components(igmguesses_json, linelist='ISM') # Read the JSON file with open(igmguesses_json) as data_file: igmg_dict = json.load(data_file) # Components comp_list = [] for ii, key in enumerate(igmg_dict['cmps'].keys()): comp_dict = igmg_dict['cmps'][key] comp_dict['flag_N'] = 1 comp_dict['logN'] = comp_dict['Nfit'] comp_dict['sig_logN'] = -1 # import pdb; pdb.set_trace() try: comp = AbsComponent.from_dict(comp_dict, chk_sep=False, chk_data=False, chk_vel=False, linelist="ISM") except: comp = AbsComponent.from_dict(comp_dict, chk_sep=False, chk_data=False, chk_vel=False, linelist='H2') # add extra attributes manually comp.attrib['b'] = comp_dict['bfit'] comp.attrib['sig_b'] = -1 comp.attrib['reliability'] = comp_dict['Reliability'] comp_list += [comp] return comp_list
def build_components_from_dict(idict, coord=None, **kwargs): """ Generate a list of components from an input dict Parameters ---------- idict : dict Must contain either components or lines as a key coord : SkyCoord, optional Returns ------- components : list of AbsComponent objects Sorted by zcomp """ from linetools.spectralline import AbsLine components = [] if 'components' in idict.keys(): # Components for key in idict['components']: components.append( AbsComponent.from_dict(idict['components'][key], coord=coord, **kwargs)) elif 'lines' in idict.keys(): # to be deprecated lines = [] for key in idict['lines']: if isinstance(idict['lines'][key], AbsLine): line = idict['lines'][key] elif isinstance(idict['lines'][key], dict): line = AbsLine.from_dict(idict['lines'][key], coord=coord, **kwargs) else: raise IOError("Need those lines") if coord is not None: line.attrib['coord'] = coord lines.append(line) components = build_components_from_abslines(lines, **kwargs) else: warnings.warn("No components in this dict") # Sort by z -- Deals with dict keys being random z = [comp.zcomp for comp in components] isrt = np.argsort(np.array(z)) srt_comps = list(np.array(components)[isrt]) # Return return srt_comps
def build_components_from_dict(idict, coord=None, **kwargs): """ Generate a list of components from an input dict Parameters ---------- idict : dict Must contain either components or lines as a key coord : SkyCoord, optional Returns ------- components : list of AbsComponent objects Sorted by zcomp """ from linetools.spectralline import AbsLine components = [] if 'components' in idict.keys(): # Components for key in idict['components']: components.append(AbsComponent.from_dict(idict['components'][key], coord=coord, **kwargs)) elif 'lines' in idict.keys(): # to be deprecated lines = [] for key in idict['lines']: if isinstance(idict['lines'][key], AbsLine): line = idict['lines'][key] elif isinstance(idict['lines'][key], dict): line = AbsLine.from_dict(idict['lines'][key], coord=coord) else: raise IOError("Need those lines") if coord is not None: line.attrib['coord'] = coord lines.append(line) components = build_components_from_abslines(lines, **kwargs) else: warnings.warn("No components in this dict") # Sort by z -- Deals with dict keys being random z = [comp.zcomp for comp in components] isrt = np.argsort(np.array(z)) srt_comps = [] for idx in isrt: srt_comps.append(components[idx]) # Return return srt_comps
def from_igmguesses_to_complist(infile): """Reads .json file generated by IGMGuesses and return a list of AbsComponent objects Parameters ---------- infile : str Name of the .json file from IGMGuesses Returns: complist : list of AbsComponent """ import json # Read the JSON file with open(infile) as data_file: igmg_dict = json.load(data_file) # Components comp_list = [] for ii, key in enumerate(igmg_dict['cmps'].keys()): # QtCore.pyqtRemoveInputHook() # pdb.set_trace() # QtCore.pyqtRestoreInputHook() # import pdb; pdb.set_trace() idict = igmg_dict['cmps'][key] idict['logN'] = idict['attrib']['logN'] try: idict['flag_N'] = idict['attrib']['flag_N'] except: idict['flag_N'] = 0. try: idict['sig_logN'] = idict['attrib']['sig_logN'] except: idict['sig_logN'] = 0. comp = AbsComponent.from_dict(idict, skip_abslines=False, chk_sep=False, chk_data=False, chk_vel=False) comp_list += [comp] return comp_list
def build_components_from_dict(idict, coord=None, **kwargs): """ Generate a list of components from an input dict Parameters ---------- idict : dict Must contain either components or lines as a key coord : SkyCoord, optional Returns ------- components : list of AbsComponent objects """ from linetools.spectralline import AbsLine components = [] if 'components' in idict.keys(): # Components for key in idict['components']: components.append(AbsComponent.from_dict(idict['components'][key])) elif 'lines' in idict.keys(): # to be deprecated lines = [] for key in idict['lines']: if isinstance(idict['lines'][key], AbsLine): line = idict['lines'][key] elif isinstance(idict['lines'][key], dict): line = AbsLine.from_dict(idict['lines'][key]) else: raise IOError("Need those lines") if coord is not None: line.attrib['coord'] = coord lines.append(line) components = build_components_from_abslines(lines, **kwargs) else: warnings.warn("No components in this dict") # Return return components
def from_igmguesses_to_complist(infile): """Reads .json file generated by IGMGuesses and return a list of AbsComponent objects Parameters ---------- infile : str Name of the .json file from IGMGuesses Returns: complist : list of AbsComponent """ import json # Read the JSON file with open(infile) as data_file: igmg_dict = json.load(data_file) # Components comp_list = [] for ii, key in enumerate(igmg_dict['cmps'].keys()): # QtCore.pyqtRemoveInputHook() # pdb.set_trace() # QtCore.pyqtRestoreInputHook() # import pdb; pdb.set_trace() idict = igmg_dict['cmps'][key] idict['logN'] = idict['attrib']['logN'] try: idict['flag_N'] = idict['attrib']['flag_N'] except: idict['flag_N'] = 0. try: idict['sig_logN'] = idict['attrib']['sig_logN'] except: idict['sig_logN'] = 0. comp = AbsComponent.from_dict(idict, skip_abslines=False, chk_sep=False, chk_data=False, chk_vel=False) comp_list += [comp] return comp_list
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()