Exercise 1:
- extra methods for SDict as defined in tutorial:
def has_key(self, key): if type(key) != type(''): raise TypeError return dict.has_key(self, key.lower()) def update(self, odict): keys = odict.keys() values = odict.values() for i in range(len(keys)): if type(keys[i]) != type(''): raise TypeError keys[i] = keys[i].lower() for key, value in zip(keys, values): self[key] = value def get(self, key, value=None): if type(key) != type(''): raise TypeError return dict.get(self, key.lower(), value) def setdefault(self, key, value): if type(key) != type(''): raise TypeError return dict.setdefault(self, key.lower(), value)
Exercise 2:
# Code for transmission function is nearly identical (most of it would be place into # functions called by each). class TabularSource(SourceFunction): def __init__(self, filename, wavecol, fluxcol): '''Assumes use of data in FITS table. wavecol and fluxcol are strings identifying the columns that contain the wavelengths and fluxes ''' tab = pyfits.getdata(filename) self.wave = tab.field(wavecol) self.flux = tab.field(fluxcol) # could add much error checking (e.g., monotonic wavelengths, etc) def __call__(self, wave): '''Use simple linear interpolation''' # Error if wave has values outside of tabulated range # Following to handle case of wave being a simple scalar if type(wave) != type(n.array(0)): awave = n.array([wave]) else: awave = wave if ((awave.min() < self.wave.min()) or (awave.max() > self.wave.max())): print 'wavelengths out of tabulated range' raise ValueError return interpolate(self.wave, self.flux, wave) def interpolate(xtab, ytab, xsamp): # from example in tutorial section 3.7.3 xind = n.searchsorted(xtab, xsamp) xfract = (xsamp-xtab[xind])/(xtab[xind+1]-xtab[xind]) return ytab[xind] + xfract*(ytab[xind+1]-ytab[xind])