Skip to content

Commit

Permalink
Merge pull request #212 from linetools/exspec_gui
Browse files Browse the repository at this point in the history
ExamineSpec
  • Loading branch information
nhmc committed May 6, 2016
2 parents f0b40e4 + 3e338e8 commit 264d5b4
Showing 1 changed file with 18 additions and 12 deletions.
30 changes: 18 additions & 12 deletions linetools/guis/spec_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,9 @@ def on_key(self, event):
lya_line.attrib['z'] = zlya
lya_line.attrib['N'] = NHI
lya_line.attrib['b'] = 30. * u.km/u.s
self.lya_line = ltv.voigt_from_abslines(self.spec.wavelength,
lya_line, fwhm=3.)
lya_spec = ltv.voigt_from_abslines(self.spec.wavelength, lya_line, fwhm=3.)
lconti = event.ydata
self.lya_line = XSpectrum1D.from_tuple((lya_spec.wavelength, lya_spec.flux*lconti))
self.adict['flg'] = 4
# QtCore.pyqtRemoveInputHook()
# import pdb; pdb.set_trace()
Expand All @@ -226,7 +227,7 @@ def on_key(self, event):
return
flg = 1

if self.adict['flg'] == 0:
if (self.adict['flg'] == 0) or (self.adict['flg'] > 2):
self.adict['wv_1'] = event.xdata # wavelength
self.adict['C_1'] = event.ydata # local continuum
self.adict['flg'] = 1 # Plot dot
Expand All @@ -244,27 +245,27 @@ def on_key(self, event):
# Calculate the continuum (linear fit)
param = np.polyfit(iwv, ic, 1)
cfunc = np.poly1d(param)
self.spec.conti = cfunc(self.spec.wavelength)
lconti = cfunc(self.spec.wavelength.value) # Local continuum

if event.key == '$': # Simple stats
pix = self.spec.pix_minmax(iwv)[0]
mean = np.mean(self.spec.flux[pix])
median = np.median(self.spec.flux[pix])
stdv = np.std(self.spec.flux[pix]-self.spec.conti[pix])
stdv = np.std(self.spec.flux[pix]-lconti[pix])
S2N = median / stdv
mssg = 'Mean={:g}, Median={:g}, S/N={:g}'.format(
mean,median,S2N)
elif event.key == 'G': # Fit a Gaussian
# Good pixels
pix = self.spec.pix_minmax(iwv)[0]
# EW
EW = np.sum(self.spec.conti[pix]-self.spec.flux[pix])
EW = np.sum(lconti[pix]-self.spec.flux[pix])
if EW > 0.: # Absorption line
sign=-1
else: # Emission
sign=1
# Amplitude
Aguess = np.max(self.spec.flux[pix]-self.spec.conti[pix])
Aguess = np.max(self.spec.flux[pix]-lconti[pix])
Cguess = np.mean(self.spec.wavelength[pix])
sguess = 0.1*np.abs(self.adict['wv_1']-self.adict['wv_2'])
#QtCore.pyqtRemoveInputHook()
Expand All @@ -273,16 +274,17 @@ def on_key(self, event):
g_init = models.Gaussian1D(amplitude=Aguess, mean=Cguess, stddev=sguess)
fitter = fitting.LevMarLSQFitter()
parm = fitter(g_init, self.spec.wavelength[pix].value,
sign*(self.spec.flux[pix]-self.spec.conti[pix]))
g_final = models.Gaussian1D(amplitude=parm.amplitude.value, mean=parm.mean.value, stddev=parm.stddev.value)
sign*(self.spec.flux[pix]-lconti[pix]))
g_final = models.Gaussian1D(amplitude=parm.amplitude.value,
mean=parm.mean.value, stddev=parm.stddev.value)
# Plot
model_Gauss = g_final(self.spec.wavelength.value)
self.model = XSpectrum1D.from_tuple((self.spec.wavelength, self.spec.conti + sign*model_Gauss))
self.model = XSpectrum1D.from_tuple((self.spec.wavelength, lconti + sign*model_Gauss))
# Message
mssg = 'Gaussian Fit: '
mssg = mssg+' :: Mean={:g}, Amplitude={:g}, sigma={:g}, flux={:g}'.format(
parm.mean.value, parm.amplitude.value, parm.stddev.value,
parm.stddev.value*(parm.amplitude.value-np.median(self.spec.conti[pix]))*np.sqrt(2*np.pi))
parm.stddev.value*(parm.amplitude.value-np.median(lconti[pix]))*np.sqrt(2*np.pi))
else:
# Find the spectral line (or request it!)
rng_wrest = iwv / (self.llist['z']+1)
Expand All @@ -308,7 +310,11 @@ def on_key(self, event):
# Generate the Spectral Line
aline = AbsLine(wrest,linelist=self.llist[self.llist['List']])
aline.attrib['z'] = self.llist['z']
aline.analy['spec'] = self.spec
# Generate a temporary spectrum for analysis and apply the local continuum
tspec = XSpectrum1D.from_tuple((self.spec.wavelength,
self.spec.flux, self.spec.sig))
tspec.normalize(lconti)
aline.analy['spec'] = tspec

# AODM
if event.key == 'N':
Expand Down

0 comments on commit 264d5b4

Please sign in to comment.