def womrebindriver(hop, mode): """input info to call womrebin functions""" import matplotlib.pyplot as plt import numpy as np from tmath.wombat.inputter import inputter from tmath.wombat.waveparse import waveparse from tmath.wombat.yesno import yesno from tmath.wombat.womashrebin import womashrebin from tmath.wombat.womscipyrebin import womscipyrebin print('Current A/pix is {}'.format(hop[0].wave[1] - hop[0].wave[0])) print('Wavelength rage: {} to {}'.format(hop[0].wave[0], hop[0].wave[-1])) plt.cla() plt.plot(hop[0].wave, hop[0].flux, drawstyle='steps-mid') plt.xlabel('Wavelength') plt.ylabel('Flux') plt.title(hop[0].obname) done = False while (not done): newdelt=inputter('Rebin to how many Angstroms per pixel? ', \ 'float',False) waveb, waver = waveparse() if (waveb > waver): waveb, waver = waver, waveb if (newdelt > 0): newbin = (waver - waveb) / newdelt + 1.0 frac, whole = np.modf(newbin) if (frac > 0.000001): print('NON-INTEGER number of bins') testwave = newdelt * whole + waveb print('Closest match is: {} to {}'.format(waveb, testwave)) print('Would you like this wavelength range?') answer = yesno('y') if (answer == 'y'): waver = testwave done = True else: print('Rebinning to {} A/pix, {} to {}'.format(newdelt,waveb,\ waver)) print('Is this OK?') answer = yesno('y') if (answer == 'y'): done = True nwave = np.arange(0, whole) * newdelt + waveb if (mode == 'ash'): nflux = womashrebin(hop[0].wave, hop[0].flux, nwave) nvar = womashrebin(hop[0].wave, hop[0].var, nwave) else: nflux = womscipyrebin(hop[0].wave, hop[0].flux, nwave) nvar = womscipyrebin(hop[0].wave, hop[0].var, nwave) print('Overplotting rebinned spectrum') plt.cla() plt.plot(hop[0].wave, hop[0].flux, drawstyle='steps-mid') plt.plot(nwave, nflux, drawstyle='steps-mid') #FIX header hop[0].wave = nwave.copy() hop[0].flux = nflux.copy() hop[0].var = nvar.copy() return hop
def womwaverange(wave, flux, mode): import matplotlib.pyplot as plt from tmath.wombat.waveparse import waveparse from tmath.wombat.womget_element import womget_element from tmath.wombat.inputter_single import inputter_single from tmath.wombat.yesno import yesno from tmath.wombat.wshow import wshow if (mode == 'none'): print('Enter method to select wavelength range') mode = inputter_single( 'Enter (w)avelengths or mark with the (m)ouse? (w/m) ', 'wm') print(mode) print('Spectrum runs from {} to {}.'.format(wave[0], wave[-1])) plt.cla() plt.plot(wave, flux, drawstyle='steps-mid') plt.ylabel('Flux') plt.xlabel('Wavelength') wshow() done = False while (not done): if (mode == 'w'): waveb, waver = waveparse() else: pickpoints = plt.ginput(2, timeout=-1) waveb = pickpoints[0][0] waver = pickpoints[1][0] if (waveb > waver): waveb, waver = waver, waveb indexblue = womget_element(wave, waveb) indexred = womget_element(wave, waver) print('Range selected: {} to {}'.format(wave[indexblue], wave[indexred])) plt.plot(wave[indexblue:indexred+1],flux[indexblue:indexred+1], \ drawstyle='steps-mid',color='r') plt.pause(0.01) print('Is this range correct?') answer = yesno('y') if (answer == 'n'): plt.cla() plt.plot(wave, flux, drawstyle='steps-mid') plt.ylabel('Flux') plt.xlabel('Wavelength') wshow() else: done = True return wave[indexblue:indexred + 1], flux[indexblue:indexred + 1], mode
def wommkbb(hop): import numpy as np import matplotlib.pyplot as plt from tmath.wombat.waveparse import waveparse from tmath.wombat.inputter import inputter from tmath.wombat.inputter_single import inputter_single light_speed = 2.99792458e10 h_planck = 6.6260755e-27 k_boltzmann = 1.380658e-16 print('This routine will create a blackbody curve for a given temperature') print('with 1 Angstrom bins') print('\n') temp = inputter('Enter temperature in degrees Kelvin: ', 'float', False) if (temp <= 0): temp = 1.0 waveb, waver = waveparse() if (waver < waveb): waveb, waver = waver, waveb if (waver == waveb): waver = waver + 1. wave = np.arange(waveb, waver + 1) wavecm = wave / 1.e8 answer = inputter_single('Calculate B_nu(n) or B_lambda(l) ', 'nl') if (answer.lower()[0] == 'l'): flux=(2.0*h_planck*light_speed*light_speed/wavecm**5)/ \ (np.exp((h_planck*light_speed)/(wavecm*k_boltzmann*temp))-1.0) flux = np.pi * flux / (1.e8) ext = 'flm' else: nu = light_speed / wavecm flux=(2.0*h_planck*nu**3/light_speed/light_speed)/ \ (np.exp((h_planck*nu)/(k_boltzmann*temp))-1.0) flux = np.pi * flux * 1.e11 ext = 'fnu' spectxt = 'bb{}.{}'.format(temp, ext) plt.cla() plt.plot(wave, flux, drawstyle='steps-mid') plt.title(spectxt) hop[0].wave = wave.copy() hop[0].flux = flux.copy() hop[0].obname = spectxt hop[0].var = np.ones(wave.shape) hop[0].header = '' return hop
def womblo(hop, fig): """blotch out bad data""" import logging import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import splrep, splev from tmath.wombat.inputter_single import inputter_single from tmath.wombat.waveparse import waveparse from tmath.wombat.womwaverange import womwaverange from tmath.wombat.womget_element import womget_element from tmath.wombat.yesno import yesno global nsplinepoints, tmpsplptsx, tmpsplptsy, pflag print('Select regions to blotch') wave = hop[0].wave.copy() flux = hop[0].flux.copy() done = False while (not done): plt.cla() plt.plot(wave, flux, drawstyle='steps-mid') plt.xlabel('Wavelength') plt.ylabel('Flux') plt.title(hop[0].obname) wavesub, fluxsub, mode = womwaverange(wave, flux, 'none') wavebind = womget_element(wave, wavesub[0]) waverind = womget_element(wave, wavesub[-1]) plt.cla() plt.plot(wave[wavebind:waverind+1],flux[wavebind:waverind+1], \ drawstyle='steps-mid') plt.xlabel('Wavelength') plt.ylabel('Flux') plt.title(hop[0].obname) plt.pause(0.01) print('Do you want to enter blotch wavelengths by hand (w),') print('mark points (m), fit a spline (s), or quit (q)?') choice = inputter_single('(w/m/s/q): ', 'wmsq') if (choice == 'w') or (choice == 'm'): blotchgood = False while (not blotchgood): wavechoicedone = False while (not wavechoicedone): if (choice == 'w'): waveselb, waveselr = waveparse() else: print('Mark the two endpoints of the blotch region') endpoints = plt.ginput(2, timeout=-1) waveselb = endpoints[0][0] waveselr = endpoints[1][0] if (waveselb > waveselr): waveselb, waveselr = waveselr, waveselb waveselbind = womget_element(wave, waveselb) waveselrind = womget_element(wave, waveselr) print(waveselb, waveselr, waveselbind, waveselrind) if (waveselbind == 0) or (waveselrind == (len(wave) - 1)): print('Wavelengths incorrect--too close to endpoints') else: wavechoicedone = True contblue = flux[waveselbind - 1] contred = flux[waveselrind + 1] delta = (contred - contblue) / (waveselrind - waveselbind + 1) fluxcor = flux.copy() for i in range(waveselbind, waveselrind + 1): fluxcor[i] = contblue + (i - waveselbind + 1) * delta plt.plot(wave[wavebind:waverind+1],fluxcor[wavebind:waverind+1], \ drawstyle='steps-mid') plt.pause(0.01) print('Is this acceptable') answer = yesno('y') if (answer == 'y'): flux = fluxcor.copy() blotchgood = True logging.info('File {} blotched from {} to {}'.format( hop[0].obname, wave[waveselbind], wave[waveselrind])) elif (choice == 's'): xmin, xmax = plt.xlim() ymin, ymax = plt.ylim() plt.xlim([xmin, xmax]) plt.ylim([ymin, ymax]) nsplinepoints = 0 tmpsplptsx = [] tmpsplptsy = [] spldone = False while (not spldone): plt.cla() plt.plot(wave[wavebind:waverind+1],flux[wavebind:waverind+1], \ drawstyle='steps-mid') if (len(tmpsplptsx) > 0): plt.plot(tmpsplptsx, tmpsplptsy, 'ro') plt.xlabel('Wavelength') plt.ylabel('Flux') plt.title(hop[0].obname) plt.xlim([xmin, xmax]) plt.ylim([ymin, ymax]) cid = fig.canvas.mpl_connect('button_press_event', onclick) print('\nClick on continuum points for spline fit.') print( 'Spline will replace values between first and last point') print('Left button = add point') print('Middle button = delete point') print('Right button = done\n') pflag = '' while (pflag != 'done'): plt.pause(0.01) fig.canvas.mpl_disconnect(cid) splptsy = [z for _, z in sorted(zip(tmpsplptsx, tmpsplptsy))] splptsx = sorted(tmpsplptsx) spline = splrep(splptsx, splptsy, k=3) splblueindex = womget_element(wave, splptsx[0]) splredindex = womget_element(wave, splptsx[-1]) splwave = wave[splblueindex:splredindex + 1].copy() splineresult = splev(splwave, spline) fluxcor = flux.copy() fluxcor[splblueindex:splredindex + 1] = splineresult.copy() plt.plot(splwave, splineresult, drawstyle='steps-mid') print('Is this acceptable') answer = yesno('y') if (answer == 'y'): flux = fluxcor.copy() spldone = True logging.info( 'File {} blotched with spline from {} to {}'.format( hop[0].obname, wave[splblueindex], wave[splredindex])) else: done = True print('Do another region?') another = yesno('n') if (another == 'n'): done = True hop[0].flux = flux.copy() return hop
def wommkatmdisp(hop): import numpy as np import matplotlib.pyplot as plt from tmath.wombat.waveparse import waveparse from tmath.wombat.inputter import inputter from tmath.wombat.airtovac import airtovac light_speed = 2.99792458e10 h_planck = 6.6260755e-27 k_boltzmann = 1.380658e-16 print('This routine will create a curve of the dispersion of light') print('by the atmosphere in arc seconds per 1 Angstrom bin') print('\n') print('Enter airmass for the calculation: ') airmass = inputter('(default = 1.5): ', 'float', True, 1.5) if (airmass < 1.0) or (airmass > 7.0): airmass = 1.5 print('Enter temperature at telescope in degrees Celsius: ') temp = inputter('(default = 7C [45F]): ', 'float', True, 7.0) if (temp <= -100) or (temp >= 100): temp = 7.0 print('Enter barometric pressure at telescope in mm of Hg: ') press = inputter('(default = 600 mm Hg): ', 'float', True, 600.0) if (press <= 0): press = 600.0 print('Enter water vapor pressure at telescope in mm of Hg: ') water = inputter('(default = 8 mm Hg): ', 'float', True, 8.0) if (water <= 0): water = 8.0 waveb, waver = waveparse() if (waver < waveb): waveb, waver = waver, waveb if (waver == waveb): waver = waver + 1. print('\nOK, calculating dispersion of light in arc seconds over the') print('range {}A to {}A at temperature {}C, pressure {} mm Hg,'.format( waveb, waver, temp, press)) print('and water vapor pressure {} mm Hg at airmass {}.'.format( water, airmass)) print('Zero is set at 5000A.') wave = np.arange(waveb, waver + 1.) vacuum = airtovac(wave) lfactor = (1.e4 / vacuum)**2 waterfactor = water * ((0.0624 - 0.000680 * lfactor) / (1.0 + 0.003661 * temp)) nstp = 1E-6 * (64.328 + (29498.1 / (146.0 - lfactor)) + (255.4 / (41 - lfactor))) n = (nstp)*((press*(1.0+(1.049-0.0157*temp)*1E-6*press))/ \ (720.883*(1.0+0.003661*temp)))-waterfactor*1.0E-6 n = n + 1.0 five = airtovac(np.array([5000.0])) fivefact = (1.e4 / five)**2 wfive = water * ((0.0624 - 0.000680 * fivefact) / (1.0 + 0.003661 * temp)) nstpfive = 1E-6 * (64.328 + (29498.1 / (146.0 - fivefact)) + (255.4 / (41 - fivefact))) nfive = (nstpfive)*((press*(1.0+(1.049-0.0157*temp)*1E-6*press))/ \ (720.883*(1.0+0.003661*temp)))-wfive*1.0E-6 nfive = nfive + 1.0 cosz = 1. / airmass tanz = (np.sqrt(1 - cosz**2)) / cosz flux = 206265. * (n - nfive) * tanz spectxt = 'Atmospheric dispersion curve at z = {}'.format(airmass) plt.cla() plt.plot(wave, flux, drawstyle='steps-mid') plt.title(spectxt) hop[0].wave = wave.copy() hop[0].flux = flux.copy() hop[0].obname = spectxt hop[0].var = np.ones(wave.shape) hop[0].header = '' return hop